0

我有一个简单的实体集parent1 <- child -> parent2,需要使用截止数据框。我的目标是parent1并且在预测的任何时候都可以访问。我只想为 指定一date列,parent2以便time可以将这些信息加入到child. 它不是这样工作的,我从parent1-child实体的第一级特征上得到数据泄漏。我唯一能做的就是将该date列复制到child。是否可以标准化child避免date列?

例子。假设我们有 3 个实体。盒子球员信息(parent1 带有“name”)、比赛信息(parent2 带有“country”)以及它们的组合(在一场特定比赛中的 child 带有“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"]))

在这里,我想使用我在 1 月 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_statsmatches

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
4

1 回答 1

0

对于实体的时间索引,Featuretools 非常保守。如果没有提供时间索引,我们尽量不去推断它。因此,您必须按照建议创建重复列。

于 2019-02-28T19:58:14.120 回答