исторические метки - PullRequest
       10

исторические метки

1 голос
/ 21 сентября 2019

Фон

Для проекта CRM у меня есть снимки возможностей.Мне уже удалось создать множество функций с * / 1003 *, но я действительно хочу иметь исторические подсчеты побед и рейтинг.Другими словами, я хотел бы знать:

Для данной возможности, сколько сделок было выиграно, пока возможность не была изменена в последний раз?

Пример данных

import pandas as pd
import featuretools as ft

df = pd.DataFrame(
    {'OpportunityId': [111, 111, 222, 222, 222, 333, 333, 333],
     'UpdateId': [1,3,2,5,7,4,6,8],
     'Label': ['Open', 'Win', 'Open', 'Open', 'Win', 'Open', 'Open', 'Open'],
     'CreatedOn': pd.to_datetime(['9/27/18','9/27/18','9/28/18','9/28/18','9/28/18','10/2/18','10/2/18','10/2/18']),
     'ModifiedOn': pd.to_datetime(['9/27/18','10/1/18','9/28/18','10/3/18','10/7/18','10/2/18','10/6/18','10/10/18']),
     'EstRevenue': [2000, 2000, 80000, 84000, 78000, 100000, 95000, 110000]})
df
| OpportunityId | UpdateId | Label | CreatedOn  | ModifiedOn | EstRevenue |
|---------------|----------|-------|------------|------------|------------|
| 111           | 1        | Open  | 2018-09-27 | 2018-09-27 | 2000       |
| 111           | 3        | Win   | 2018-09-27 | 2018-10-01 | 2000       |
| 222           | 2        | Open  | 2018-09-28 | 2018-09-28 | 80000      |
| 222           | 5        | Open  | 2018-09-28 | 2018-10-03 | 84000      |
| 222           | 7        | Win   | 2018-09-28 | 2018-10-07 | 78000      |
| 333           | 4        | Open  | 2018-10-02 | 2018-10-02 | 100000     |
| 333           | 6        | Open  | 2018-10-02 | 2018-10-06 | 95000      |
| 333           | 8        | Open  | 2018-10-02 | 2018-10-10 | 110000     |

Желаемый результат

| OPPORTUNITIES | Label | CreatedOn | Max( ModifiedOn ) | AVG( EstRevenue ) | Wins |
|---------------|-------|-----------|-------------------|------------------:|------|
| 111           | Win   | 9/27/18   | 10/1/18           |              2000 | 0    |
| 222           | Win   | 9/28/18   | 10/7/18           |             80667 | 1    |
| 333           | Open  | 10/2/18   | 10/10/18          |            101667 | 2    |

Пока предпринимаются попытки

Мне трудно обернуть свой мозг ...

  1. Функции, которые зависят от нескольких возможностей ... мне нужна отдельная сущность?
  2. Как объединить Label, который обеспечивает оба:
    1. Текущее значениеLabel и
    2. Количество, когда столбец Label равен 0

Задача для меня - столбец Label ...В то время как обычно я делал бы столбец CurrentLabel, я почти уверен, что ft справится с этим ...

es = (ft.EntitySet(id='CRM')
      .entity_from_dataframe(
          entity_id='updates',
          dataframe=df,
          index='UpdateId',
          time_index='ModifiedOn')
      .normalize_entity(
          base_entity_id='updates',
          new_entity_id='opportunities',
          index='OpportunityId',
          make_time_index='CreatedOn',
          copy_variables=['Label'],
          additional_variables=['CreatedOn']
      )
)
es['updates']['Label'].interesting_values  = ['Win']
Entityset: CRM
  Entities:
    updates [Rows: 8, Columns: 5]
    opportunities [Rows: 3, Columns: 3]
  Relationships:
    updates.OpportunityId -> opportunities.OpportunityId
feature_matrix, feature_defs = ft.dfs(
    entityset=es,
    target_entity="opportunities",
    agg_primitives=[
        "mean","count","num_unique","time_since_first"],
    trans_primitives=[
        'time_since_previous'],
    where_primitives=[
        "sum","count"],
    max_depth=2,
    verbose=1
)
...