Избегайте дублирования столбца даты для дочерней сущности - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть простой набор сущностей 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_dateplayer_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 Ответ

0 голосов
/ 28 февраля 2019

Featuretools очень консервативен, когда дело доходит до индекса времени сущности.Мы стараемся не выводить временной индекс, если он не указан.Таким образом, вы должны создать дубликат столбца, как вы предлагаете.

...