У меня есть фреймворк с таймсериями продаж разных товаров с аналитикой клиентов. Для каждого элемента и конкретного дня я хочу вычислить:
- доля моих лучших клиентов в общем объеме продаж за последние 2 дня
- доля моих лучших клиентов (из списка) в общем объеме продаж за последние 2 дня
Я пробовал решения, представленные здесь:
- для скользящей суммы: Сумма Pandas за диапазон дат для каждой категории отдельно
- для условной группы по: Pandas groupby с идентификацией элемента с максимальным значением в другом столбце
Пример фрейма данных может быть сгенерирован:
import pandas as pd
from datetime import timedelta
df_1 = pd.DataFrame()
df_2 = pd.DataFrame()
df_3 = pd.DataFrame()
# Create datetimes and data
df_1['item'] = [1, 1, 1, 2, 2, 2, 2]
df_1['date'] = pd.date_range('1/1/2018', periods=7, freq='D')
df_1['customer'] = ['a', 'b', 'c', 'a', 'b', 'b', 'c']
df_1['sales'] = [2, 4, 1, 5, 7, 2, 3]
df_2['item'] = [1, 1, 1, 2, 2, 2, 2]
df_2['date'] = pd.date_range('1/1/2018', periods=7, freq='D')
df_2['customer'] = ['b', 'b', 'c', 'a', 'a', 'c', 'a']
df_2['sales'] = [2, 3, 4, 2, 3, 5, 6]
df_3['item'] = [1, 1, 1, 2, 2, 2, 2]
df_3['date'] = pd.date_range('1/1/2018', periods=7, freq='D')
df_3['customer'] = ['b', 'c', 'a', 'c', 'b', 'a', 'b']
df_3['sales'] = [6, 5, 2, 3, 4, 5, 6]
df = pd.concat([df_1, df_2, df_3])
df = df.sort_values(['item', 'date'])
df.reset_index(drop=True)
и выглядит так:
item | date | customer | sales |
---|---|---|---|
1 | 2018-01-01 | a | 2 |
1 | 2018-01-01 | b | 2 |
1 | 2018-01-01 | b | 6 |
1 | 2018-01-02 | b | 4 |
1 | 2018-01-02 | b | 3 |
1 | 2018-01-02 | c | 5 |
1 | 2018-01-03 | c | 1 |
1 | 2018-01-03 | c | 4 |
1 | 2018-01-03 | a | 2 |
2 | 2018-01-04 | a | 5 |
2 | 2018-01-04 | a | 2 |
2 | 2018-01-04 | c | 3 |
2 | 2018-01-05 | b | 7 |
2 | 2018-01-05 | a | 3 |
2 | 2018-01-05 | b | 4 |
2 | 2018-01-06 | b | 2 |
2 | 2018-01-06 | c | 5 |
2 | 2018-01-06 | a | 5 |
2 | 2018-01-07 | c | 3 |
2 | 2018-01-07 | a | 6 |
2 | 2018-01-07 | b | 6 |
Ожидаю следующих результатов:
item | date | sales_at_day | sales_lasta_share days |
a_share | top_share |
---|---|---|---|---|---|
1 | 2018-01-01 | 10 | NaN | NaN | NaN |
1 | 2018-01-02 | 12 | 10 | 0.20 | 0.20 |
1 | 2018-01-03 | 7 | 22 | 0.09 | 0.09 |
2 | 2018-01-04 | 10 | NaN | NaN | NaN |
2 | 2018-01-05 | 14 | 10 | 0.70 | 1.00 |
2 | 2018-01-06 | 12 | 24 | 0.29 | 0.42 |
2 | 2018-01-07 | 15 | 26 | 0.31 | 0.50 |
куда,
a_share
- это доля продаж покупателя «а» в общем объеме продаж за последние 2 дня (не включая сегодняшний день) top_share
- это доля продаж покупателей в
top_cust = ['a', 'c']
список общих продаж за последние 2 дня (не включая текущий день)
Любые идеи? Спасибо заранее :)
Энди