featuretools: накапливать пользователя unique_value с отметкой времени - PullRequest
0 голосов
/ 27 марта 2020

У меня есть такой набор данных,

    user_id event_name  event_timestamp             origin


0   1001790 deals       2020-01-01 12:07:05.089002  
1   1001818 purchase    2019-10-30 09:15:38.810000  ICN
2   1001969 deals       2019-12-16 01:11:06.595004  
3   1001969 deals       2019-12-16 01:11:22.811008  
4   1001969 purchase    2019-12-21 12:20:24.405000  PUS
5   1001969 view_item   2019-12-21 12:22:01.318000  ICN
es = ft.EntitySet(id="dataset")

variable_types = {
    'event_timestamp': ft.variable_types.Datetime,
    'user_id': ft.variable_types.Id,
    'origin': ft.variable_types.Categorical,
    'event_name': ft.variable_types.Categorical,
}

es.entity_from_dataframe(
    entity_id='total',
    dataframe=total,
    index='event_timestamp',
    variable_types=variable_types,
)

es.normalize_entity(
    base_entity_id='total',
    new_entity_id='users',
    index='user_id',
    copy_variables=['event_timestamp'],
    make_time_index=False,
)

es.normalize_entity(
    base_entity_id='total',
    new_entity_id='origin',
    index='origin',
    make_time_index=False,
)

es.normalize_entity(
    base_entity_id='total',
    new_entity_id='event_name',
    index='event_name',
    make_time_index=False,
)

И я хочу получить результат, подобный

                                    NUM_UNIQUE(total.event_name)  NUM_UNIQUE(total.origin)
user_id time                                                                              
1001818 2019-10-30 09:15:38.810000                         1                             1
1001969 2019-12-21 12:11:06.595004                         1                             0
        2019-12-21 12:11:22.811008                         1                             0
        2019-12-21 12:20:24.405000                         1                             1
        2019-12-21 12:22:01.318000                         2                             2
1001790 2020-01-01 12:07:05.089002                         1                             1 

Таким образом, если я установлю окно 5 минут, в user_id 1001969, накопительный счет не должен работать между вторым и третьим.

1 Ответ

0 голосов
/ 06 апреля 2020

Вы можете применить тренировочное окно к каждому времени отсечки для прокатки windows. Вот время отсечения:

 user_id                       time
 1001969 2019-12-21 12:11:06.595004
 1001969 2019-12-21 12:11:22.811008
 1001969 2019-12-21 12:20:24.405000
 1001969 2019-12-21 12:22:01.318000

В DFS я применяю пятиминутное тренировочное окно к каждому времени отсечения.

fm, fd = ft.dfs(
    target_entity='users',
    entityset=es,
    agg_primitives=['num_unique'],
    trans_primitives=[],
    cutoff_time=cutoff_time,
    cutoff_time_in_index=True,
    training_window='5 minutes',
)

Накопительный счет должен работать, как и ожидалось, со следующим выводом .

                                    NUM_UNIQUE(total.origin)  NUM_UNIQUE(total.event_name)
user_id time                                                                              
1001969 2019-12-21 12:11:06.595004                       NaN                           NaN
        2019-12-21 12:11:22.811008                       NaN                           NaN
        2019-12-21 12:20:24.405000                       1.0                           1.0
        2019-12-21 12:22:01.318000                       2.0                           2.0
...