Python: как правильно использовать скользящее среднее в цикле с Pandas? - PullRequest
0 голосов
/ 08 июня 2018

У меня есть датафрейм df, содержащий информацию о транзакции между двумя компаниями и времени.Я должен group-by каждые 3 месяца и сравнивать с другими 3 месяцами плюс 1. Например, мне нужно сгруппировать октябрь 2015 года, ноябрь 2015 года, декабрь 2015 года и сравнить их с ноябрем 2015 года, декабрем 2015 года, январем 2016 года. Итак,Я должен сгруппировать месяцы [201510, 201511, 201512] и сравнить их с [201511, 201512, 201601]

. Фрейм данных выглядит следующим образом:

     A          B            YM       tot
0   494     6.83353e+07     201507  136388.22
1   1150    6.78366e+07     201507  68972.76
2   1575    6.96231e+07     201507  43447.37
3   3459    1.70194e+07     201507  298173.15
4   8591    5.40416e+07     201507  51255.22
5   17350   1.79459e+07     201507  24400.00
6   24685   1.7862e+07      201507  67631.19
7   28157   1.79105e+07     201507  20241.00
8   47963   2.73774e+07     201507  30000.00

times = pd.unique(df['YM']) ##  months we consider

times:  
array([201507, 201508, 201509, 201510, 201511, 201512, 201601, 201602,
           201603, 201604, 201605, 201606, 201607, 201608, 201609, 201610,
           201611, 201612, 201701, 201702, 201703, 201704, 201705, 201706,
           201707, 201708, 201709, 201710, 201711, 201712])

вот что я делаю:

k = 0
v = 3
for i in range(0, len(times)-3)
    ## First Time Window
    tmp = df[(df['YM'] >= times[k]) & (df['YM'] <= times[v])] 
    net1 = net1.groupby(['A','B'], as_index = False)['tot'].sum()

    ## Second Time Window
    tmp = df[(df['YM'] >= times[k+1]) & (df['YM'] <= times[v+1])]  
    net2 = net2.groupby(['A','B'], as_index = False)['tot'].sum()

    k += 1 ## Update Time windows
    v += 1

Я хотел бы знать, есть ли более эффективный способ сделать это.

1 Ответ

0 голосов
/ 08 июня 2018

В ваших примерах данных у нас есть только один YM, с которым можно поиграть, так что он не выглядит много, но я думаю, что это может сделать то, что вы ищете:

df['YM'] = pd.to_datetime(df['YM'], format='%Y%m')

df.groupby('YM').sum().rolling(freq='M', window=3).mean()

Он группируется по году и месяцу, получает сумму, а затем получает скользящее среднее значение каждые 3 месяца

Если вы хотите ограничить сравнение столбцом tot:

df.groupby('YEARMONTH')['tot'].sum().rolling(freq='M', window=3).mean()
...