Избегайте дублирования столбца даты для дочерней сущности

У меня есть простой набор сущностей 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 очень консервативен, когда дело доходит до индекса времени сущности. Мы стараемся не выводить временной индекс, если он не указан. Таким образом, вы должны создать дубликат столбца, как вы предлагаете.

Другие вопросы по тегам