Как рассчитать среднее значение с обратными временными окнами в пандах - PullRequest
0 голосов
/ 07 июня 2018

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

У меня есть следующий фрейм данных:

df_dict={'startDate': 
['2015-01-01','2015-01-05','2015-01-18','2015-01-25',
'2015-02-02','2015-02-03','2015-02-04','2015-02-17',
'2015-03-03','2015-03-04','2015-03-07','2015-03-11',
'2015-04-04','2015-04-05','2015-04-17','2015-04-19'],
'price':[200,250,270,240,100,120,130,140,300,310,330,370,400,410,420,440],

'250_index': [1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2]}
df=pd.DataFrame(df_dict)

мне нужно найти первую доступную дату в моем наборе данныхкоторый в данном случае равен 2015-01-01, затем создайте 30day интервалы, например: 2015-01-01, 2015-01-31, 2015-03-02, 2015-04-01, затем для каждого интервала и 250_index комбинация вычисляет прошлое 30day 60_dayи 90day средняя цена.

результирующий фрейм данных должен выглядеть примерно так: средние значения за первый интервал равны 0, поскольку у нас нет информации о том, что произошло, но для второго интервала 2015-01-31 нам необходимо рассчитатьpast_30_avg на основе цен, которые мы имеем между 2015-01-01 и 2015-01-31, то же самое для других интервалов:

time_interval    index    past_30_avg  past_60_avg  past_90_avg
 '2015-01-01'     1         0             0            0
                  2         0             0            0
 '2015-01-31'     1         235           0            0
                  2         245           0            0
 '2015-03-02'     1         115          175           0
                  2         130          187           0
 '2015-04-01'     1         315          240          221    
                  2         340          235          238

Я искал обобщенный подход, так как это всего лишь часть моего набора данных

1 Ответ

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

Рассмотрим pd.Grouper для 30-дневного среднего (ежемесячная агрегация), а затем transform() с rolling() для 60 и 90 дней:

tdf = df.groupby([pd.Grouper(key='startDate', freq='30D', label='right'), '250_index']).mean()\
              .reset_index().rename(columns={'price': 'past_30_avg'})
print(tdf)

tdf['past_60_avg'] = tdf.groupby('250_index')['past_30_avg'].transform(lambda x: x.rolling(2).mean())
tdf['past_90_avg'] = tdf.groupby('250_index')['past_30_avg'].transform(lambda x: x.rolling(3).mean())

#    startDate  250_index  past_30_avg  past_60_avg  past_90_avg
# 0 2015-01-31          1          235          NaN          NaN
# 1 2015-01-31          2          245          NaN          NaN
# 2 2015-03-02          1          115        175.0          NaN
# 3 2015-03-02          2          130        187.5          NaN
# 4 2015-04-01          1          315        215.0   221.666667
# 5 2015-04-01          2          340        235.0   238.333333
# 6 2015-05-01          1          410        362.5   280.000000
# 7 2015-05-01          2          425        382.5   298.333333
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...