Избегайте дублирования столбца даты для дочерней сущности
У меня есть простой набор сущностей parent1 <- child -> parent2
и необходимость использования отрезанного кадра данных. Моя цель - parent1
и это доступно в любое время предсказаний. Я хочу указать date
столбец только для parent2
так что это time
информация может быть присоединена к child
, Это не работает таким образом, и я получаю утечку данных о функциях первого уровня из parent1-child
юридические лица. Единственное, что я могу сделать, это продублировать date
столбец к child
тоже. Можно ли нормализовать child
избегая date
столбец?
Пример. Представьте, что у нас есть 3 объекта. Информация об игроке в боксе (parent1 с "именем"), информация о совпадении (parent2 с "страной") и их комбинация (потомок с "n_hits" в одном конкретном совпадении):
import featuretools as ft
import pandas as pd
players = pd.DataFrame({"player_id": [1, 2, 3], "player_name": ["Oleg", "Kirill", "Max"]})
player_stats = pd.DataFrame({
"match_player_id": [101, 102, 103, 104], "player_id": [1, 2, 1, 3],
"match_id": [11, 11, 12, 12], "n_hits": [20, 30, 40, 50]})
matches = pd.DataFrame({
"match_id": [11, 12], "match_date": pd.to_datetime(['2014-1-10', '2014-1-20']),
"country": ["Russia", "Germany"]})
es = ft.EntitySet()
es.entity_from_dataframe(
entity_id="players", dataframe=players,
index="player_id",
variable_types={"player_id": ft.variable_types.Categorical})
es = es.entity_from_dataframe(
entity_id="player_stats", dataframe=player_stats,
index="match_player_id",
variable_types={"match_player_id": ft.variable_types.Categorical,
"player_id": ft.variable_types.Categorical,
"match_id": ft.variable_types.Categorical})
es = es.entity_from_dataframe(
entity_id="matches", dataframe=matches,
index="match_id",
time_index="match_date",
variable_types={"match_id": ft.variable_types.Categorical})
es = es.add_relationship(ft.Relationship(es["players"]["player_id"],
es["player_stats"]["player_id"]))
es = es.add_relationship(ft.Relationship(es["matches"]["match_id"],
es["player_stats"]["match_id"]))
Здесь я хочу использовать всю доступную информацию, которая у меня есть на 15 января. Таким образом, единственной законной является информация для первого матча, а не для второго.
cutoff_df = pd.DataFrame({
"player_id":[1, 2, 3],
"match_date": pd.to_datetime(['2014-1-15', '2014-1-15', '2014-1-15'])})
fm, features = ft.dfs(entityset=es, target_entity='players', cutoff_time=cutoff_df,
cutoff_time_in_index=True, agg_primitives = ["mean"])
fm
я получил
player_name MEAN(player_stats.n_hits)
player_id time
1 2014-01-15 Oleg 30
2 2014-01-15 Kirill 30
3 2014-01-15 Max 50
Единственный способ, которым я знаю, чтобы установить правильное match_date
в player_stats
это присоединиться к этой информации от matches
player_stats = pd.DataFrame({
"match_player_id": [101, 102, 103, 104], "player_id": [1, 2, 1, 3],
"match_id": [11, 11, 12, 12], "n_hits": [20, 30, 40, 50],
"match_date": pd.to_datetime(
['2014-1-10', '2014-1-10', '2014-1-20', '2014-1-20']) ## a result of join
})
...
es = es.entity_from_dataframe(
entity_id="player_stats", dataframe=player_stats,
index="match_player_id",
time_index="match_date", ## a change here too
variable_types={"match_player_id": ft.variable_types.Categorical,
"player_id": ft.variable_types.Categorical,
"match_id": ft.variable_types.Categorical})
И я получаю ожидаемый результат
player_name MEAN(player_stats.n_hits)
player_id time
1 2014-01-15 Oleg 20.0
2 2014-01-15 Kirill 30.0
3 2014-01-15 Max NaN
1 ответ
Featuretools очень консервативен, когда дело доходит до индекса времени сущности. Мы стараемся не выводить временной индекс, если он не указан. Таким образом, вы должны создать дубликат столбца, как вы предлагаете.