Próbuję użyć Featuretools do obliczania funkcji serii czasu. W szczególności chciałbym odjąć prąd (x) z poprzedniego (x) przez klucz grupowy (user_id), ale mam kłopoty w dodaniu tego rodzaju relacji w EntitySet.

df = pd.DataFrame({
    "user_id": [i % 2 for i in range(0, 6)],
    'x': range(0, 6),
    'time': pd.to_datetime(['2014-1-1 04:00', '2014-1-1 05:00', 
                            '2014-1-1 06:00', '2014-1-1 08:00', '2014-1-1 10:00', '2014-1-1 12:00'])
     })

print(df.to_string())
       user_id  x                time
0        0      0 2014-01-01 04:00:00
1        1      1 2014-01-01 05:00:00
2        0      2 2014-01-01 06:00:00
3        1      3 2014-01-01 08:00:00
4        0      4 2014-01-01 10:00:00
5        1      5 2014-01-01 12:00:00


es = ft.EntitySet(id='test')
es.entity_from_dataframe(entity_id='data', dataframe=df,
                         variable_types={
                             'user_id': ft.variable_types.Categorical,
                             'x': ft.variable_types.Numeric,
                             'time': ft.variable_types.Datetime
                         },
                         make_index=True, index='index',
                         time_index='time'
                         )

Następnie próbuję wywołać DFS, ale nie mogę uzyskać relacji ...

fm, fl = ft.dfs(
    target_entity="data",
    entityset=es,
    trans_primitives=["diff"]
)
print(fm.to_string())
       user_id  x  DIFF(x)
index                     
0            0  0      NaN
1            1  1      1.0
2            0  2      1.0
3            1  3      1.0
4            0  4      1.0
5            1  5      1.0

Ale w rzeczywistości chciałbym uzyskać różnicę przez użytkownika. Oznacza to, że z ostatniej wartości dla każdego użytkownika:

       user_id  x  DIFF(x)
index                     
0            0  0      NaN
1            1  1      NaN
2            0  2      2.0
3            1  3      2.0
4            0  4      2.0
5            1  5      2.0

Jak uzyskać ten rodzaj relacji w Featuretools? Próbowałem kilku samouczka, ale bezskutecznie. Jestem zakłopotany.

Dzięki!

2
Ruslan 25 lipiec 2020, 23:06

1 odpowiedź

Najlepsza odpowiedź

Dzięki za pytanie. Możesz uzyskać oczekiwany wyjście, normalizując podmiot dla użytkowników i stosowanie grupy przez prymitywę transformacji. Przejdę szybki przykład za pomocą tych danych.

user_id  x                time
      0  0 2014-01-01 04:00:00
      1  1 2014-01-01 05:00:00
      0  2 2014-01-01 06:00:00
      1  3 2014-01-01 08:00:00
      0  4 2014-01-01 10:00:00
      1  5 2014-01-01 12:00:00

Najpierw utwórz zestaw podmiotowy i normalizuj podmiot dla użytkowników.

es = ft.EntitySet(id='test')

es.entity_from_dataframe(
    dataframe=df,
    entity_id='data',
    make_index=True,
    index='index',
    time_index='time',
)

es.normalize_entity(
    base_entity_id='data',
    new_entity_id='users',
    index='user_id',
)

Następnie zastosuj grupę przez przekształcenie prymitywnego w DFS.

fm, fl = ft.dfs(
    target_entity="data",
    entityset=es,
    groupby_trans_primitives=["diff"],
)

fm.filter(regex="DIFF", axis=1)

Powinieneś uzyskać różnicę przez użytkownika.

       DIFF(x) by user_id
index
0                     NaN
1                     NaN
2                     2.0
3                     2.0
4                     2.0
5                     2.0
2
Jeff Hernandez 27 lipiec 2020, 13:52