pandas time series average monthly volume
我有每天一次的csv时间序列数据和累计销售额。Silimar对此
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 01-01-2010 12:10:10 50.00 01-02-2010 12:10:10 80.00 01-03-2010 12:10:10 110.00 . . for each dat of 2010 . 01-01-2011 12:10:10 2311.00 01-02-2011 12:10:10 2345.00 01-03-2011 12:10:10 2445.00 . . for each dat of 2011 . and so on. |
我希望得到每年每个月的月销售额(最大值-最小值)。因此,在过去的5年里,我将有5个1月的值(最大-最小),5个2月的值(最大-最小)。等等。
一旦我有了这些,我接下来会得到1月的(5年平均值),2月的(5年平均值)。等等。
现在,我通过对原始df[年/月]进行切片,然后对一年中的特定月份进行平均。
我希望使用时间序列resample()方法,但目前我一直在告诉pd在[从今天起的过去10年]内每月(max-min)抽样一次。然后在a.mean()中链接
对于如何通过resample()有效地实现这一点的任何建议都将不胜感激。
你可以用
- 首先重新取样到一个月(
M )并得到diff(max()-min() ) - 然后重新取样到5年(
5AS )和groupby 月,取mean() 。
例如。:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | In []: date_range = pd.date_range(start='2008-01-01',end='2017-12-31') df = pd.DataFrame({'sale': np.random.randint(100, 200, size=date_range.size)}, index=date_range) In []: df1 = df.resample('M').apply(lambda g: g.max()-g.min()) df1.resample('5AS').apply(lambda g: g.groupby(g.index.month).mean()).unstack() Out[]: sale 1 2 3 4 5 6 7 8 9 10 11 12 2008-01-01 95.4 90.2 95.2 95.4 93.2 93.8 91.8 95.6 93.4 93.4 94.2 93.8 2013-01-01 93.2 96.4 92.8 96.4 92.6 93.0 93.2 92.6 91.2 93.2 91.8 92.2 |
它可能看起来像这样(注意:没有累计销售价值)。这里的关键是执行df.groupby()传递dt.year和dt.month。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import pandas as pd import numpy as np df = pd.DataFrame({ 'date': pd.date_range(start='2016-01-01',end='2017-12-31'), 'sale': np.random.randint(100,200, size = 365*2+1) }) # Get month max, min and size (and as they are sorted - last and first) dfg = df.groupby([df.date.dt.year,df.date.dt.month])['sale'].agg(['last','first','size']) # Assign new cols (diff and avg) and drop max min size dfg = dfg.assign(diff = dfg['last'] - dfg['first']) dfg = dfg.assign(avg = dfg['diff'] / dfg['size']).drop(['last','first','size'], axis=1) # Rename index cols dfg.index = dfg.index.rename(['Year','Month']) print(dfg.head(6)) |
返回:
1 2 3 4 5 6 7 8 | diff avg Year Month 2016 1 -56 -1.806452 2 -17 -0.586207 3 30 0.967742 4 34 1.133333 5 46 1.483871 6 2 0.066667 |
号