【问题标题】:Avoid duplication of date column for child entity避免子实体的日期列重复
【发布时间】:2019-03-01 03:58:14
【问题描述】:

我有一个简单的实体集 parent1 <- child -> parent2 并且需要使用截止数据框。我的目标是parent1,它可以在预测的任何时候访问。我想仅为parent2 指定一个date 列,以便可以将这个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_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

【问题讨论】:

  • 您能否提供一个具体的例子来说明 parent1、child 和 parent2 是什么,以帮助我们更好地理解这个问题?

标签: featuretools


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2019-06-22
    • 1970-01-01
    相关资源
    最近更新 更多