#pandas #dataframe #group-by
#pandas #фрейм данных #группировка по
Вопрос:
Я хотел бы рассчитать среднее значение с интервалом в 3 года. Мои данные такие :
import pandas as pd
import numpy as np
N=120
data = {'p1': np.random.randint(50,100,N),
'p2': np.random.randint(0,100,N),
'p3': np.random.randint(10,70,N)
}
df = (pd.DataFrame(data, index=pd.bdate_range(start='20100101', periods=N, freq='BM'))
.stack()
.reset_index()
.rename(columns={'level_0': 'date', 'level_1': 'type', 0: 'price'})
.sort_values('date')
)
Я пытался :
(df.sort_values('date')
.groupby(['type',
''.join([(df.date.dt.year-3), '-', (df.date.dt.year)]) #3 years time span
]
)
['price']
.apply(lambda x: x.mean())
)
но появляется сообщение об ошибке :
TypeError: sequence item 0: expected str instance, Series found
Я хотел бы рассчитать среднее значение (и другие показатели) по цене с помощью группы по типу / периоду времени 2010-2013, 2011-2014, 2012-2015…
Метка важна, потому что я могу использовать :
(df.sort_values('date')
.groupby(['type', df.date.dt.year//3]) #3 years time span
['price']
.apply(lambda x: x.mean())
)
есть идеи?
Комментарии:
1. Каков ваш ожидаемый результат?
Ответ №1:
Я думаю, что нашел ответ на свой собственный вопрос с помощью (кому-то еще может быть интересно) :
(df.sort_values('date')
.groupby(['type', (df.date.dt.year-3).astype(str).str.cat((df.date.dt.year).astype(str), sep='-')
]
)
['price']
.apply(lambda x: x.mean())
)