Pandas 多个每日时间序列的月度校准
因此,我有一个数据集,其中包含日期Pandas 多个每日时间序列的月度校准,pandas,time-series,date-range,Pandas,Time Series,Date Range,因此,我有一个数据集,其中包含日期d1和日期d2之间N项目的销售数据。对于每次购买,我都有时间戳、客户ID和物品ID。我的目标是生成一个大小为(M x N)的数据框,其中df[I,j]是I月份内物品j的购买总数 生成模型数据 import pandas as pd import random d1 = '2014-1-1' d2 = '2014-3-31' daily = pd.date_range( d1, d2, freq='D' ) npurchase = 1000 nitem = 20
d1
和日期d2
之间N
项目的销售数据。对于每次购买,我都有时间戳、客户ID和物品ID。我的目标是生成一个大小为(M x N)
的数据框,其中df[I,j]
是I
月份内物品j
的购买总数
生成模型数据
import pandas as pd
import random
d1 = '2014-1-1'
d2 = '2014-3-31'
daily = pd.date_range( d1, d2, freq='D' )
npurchase = 1000
nitem = 20
olddf = pd.DataFrame( { 'dt': [ random.choice( daily ) for _ in xrange( npurchase) ], 'itemID': [ randint(nitem) for _ in xrange( npurchase ) ] } )
olddf.head()
输出:
dt itemID
0 2014-02-24 00:00:00 19
1 2014-01-29 00:00:00 0
2 2014-01-27 00:00:00 7
3 2014-02-03 00:00:00 12
4 2014-01-24 00:00:00 3
重新采样并对齐
rng = pd.date_range( d1, d2, freq='M')
newdf = pd.DataFrame( index=rng )
for name, group in olddf.groupby( 'itemID' ) :
tmp = group.groupby( 'dt' ).size().resample( 'M', how='sum' )
newdf[ name ] = tmp
newdf.fillna( 0, inplace=True )
newdf.ix[ :, :5 ]
输出
0 1 2 3 4 5
2014-01-31 15 21 25 17 10 14
2014-02-28 10 13 16 20 15 8
2014-03-31 12 25 14 14 26 12
itemID 0 1 2 3 4
dt
2014-01-31 10 21 19 23 15
2014-02-28 8 11 12 20 11
2014-03-31 21 18 13 12 18
有没有更高效/优雅的方法呢?以下代码比我最初的尝试快2.5倍,优雅4倍:
olddf[ 'ones' ] = 1
newdf2 = olddf.set_index( 'dt' ).groupby( 'itemID' )[ 'ones' ].resample( 'M', how='sum' ).unstack( 0 )
print newdf2[ range(5) ]
输出
0 1 2 3 4 5
2014-01-31 15 21 25 17 10 14
2014-02-28 10 13 16 20 15 8
2014-03-31 12 25 14 14 26 12
itemID 0 1 2 3 4
dt
2014-01-31 10 21 19 23 15
2014-02-28 8 11 12 20 11
2014-03-31 21 18 13 12 18
如果包含一些示例数据,您将得到更好的答案。显然,您不想共享您拥有的财务数据,但您可以使用与实际数据类似的随机数字模拟一些数据。或者,可以使用pandas.pivot_table()和unstack()组合,例如,我使用它将每日时间序列转换为列中的表年,每个月是一行,值是相应月份的每日值的平均值