2015-11-25 3 views
4

Есть два Dataframes. Во-первых, как это:pandas count значения за последние 7 дней с даты

print df1 

     id  date month is_buy 
    0 17 2015-01-16 2015-01  1 
    1 17 2015-01-26 2015-01  1 
    2 17 2015-01-27 2015-01  1 
    3 17 2015-02-11 2015-02  1 
    4 17 2015-03-14 2015-03  1 
    5 18 2015-01-28 2015-01  1 
    6 18 2015-02-12 2015-02  1 
    7 18 2015-02-25 2015-02  1 
    8 18 2015-03-04 2015-03  1 

Во втором кадре данных есть некоторые агрегированные данные по месяцам от первого:

df2 = df1[df1['is_buy'] == 1].groupby(['id', 'month']).agg({'is_buy': np.sum}) 

print df2 

     id month  buys 
    0 17 2015-01   3 
    1 17 2015-02   1 
    2 17 2015-03   1 
    3 18 2015-01   1 
    4 18 2015-02   2 
    5 18 2015-03   1 

Я пытаюсь получить новый столбец df2 под названием «last_week_buys» с агрегированной покупает последние 7 дней с первого дня каждого df1 ['month']. Другими словами, я хочу получить следующее:

 id month  buys last_week_buys 
    0 17 2015-01   3    NaN 
    1 17 2015-02   1     2 
    2 17 2015-03   1     0 
    3 18 2015-01   1    NaN 
    4 18 2015-02   2     1 
    5 18 2015-03   1     1 

Есть ли идеи, чтобы получить этот столбец?

+0

В зависимости от того, как вы определяете последнюю неделю предыдущего месяца (окончательные 7 дней?, Последние 5 торговых дней и т. Д.), Должно быть легко вычислить месяц за месяц количество покупок за последнюю неделю, затем просто сдвиньте эту серию, чтобы выровнять ее с последующим месяцем. –

+0

@KevinS, да, нужно рассчитывать окончательные 7 дней покупки. Я попытался сгруппировать данные в df1 не только по месяцам, но и по неделям года, но заметил, что эта календарная неделя может включать 1 или 2 дня ... Но мне определенно нужно 7 дней. –

ответ

2

Это может быть сделано с немного дата манипуляции магии и групповых площадках:

# datetimeindex makes convenient manipulations 
date = pd.DatetimeIndex(df1['date']) 

# compute df2: totals by month 
df1['month'] = date.to_period('M') 
df2 = df1[df1['is_buy'] == 1].groupby(['id', 'month']).sum() 

# compute df3: totals by last seven days 
from datetime import timedelta 
is_last_seven = date.to_period('M') != (date + timedelta(days=7)).to_period('M') 
df3 = df1[(df1['is_buy'] == 1) & is_last_seven].groupby(['id', df1.month + 1]).sum() 

# join the results 
result = df2.join(df3, rsuffix='_last_seven') 

Вот результат:

>>> print(result) 

      is_buy is_buy_last_seven 
id month        
17 2015-01  3    NaN 
    2015-02  1     2 
    2015-03  1    NaN 
18 2015-01  1    NaN 
    2015-02  2     1 
    2015-03  1     1 

Вы можете заполнить NaN значения, как вы хотите.

+0

это именно то, что я хочу, спасибо большое! –

+0

, и если это не усложнит вас - как я могу получить количество уникальных дат покупки? Я попытался использовать .agg ({'is_buy': np.sum, 'date': lambda x: x.nunique()}) Но этот вариант был неправильным (в колонке «дата» у меня было что-то вроде 1970-01 -01 00: 00: 00.000000002 'или NaT) @jakevdp –

+0

Вы можете попробовать сначала очистить даты, используя что-то вроде '' df1 [' date '] = pd.DatetimeIndex (df1 [' date ']). To_period (' D ') '' – jakevdp

Смежные вопросы