【问题标题】:Monthly alignment of multiple daily time series多个每日时间序列的月度对齐
【发布时间】:2014-01-21 13:59:30
【问题描述】:

所以我有这个数据集,其中包含 N 商品在 d1d2 之间的销售数据。对于每次购买,我都有时间戳、客户 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

有没有更高效/优雅的方式来做到这一点?

【问题讨论】:

  • 如果您包含一些示例数据,您会得到更好的答案。显然你不想分享你拥有的财务数据,但你可以用与你的实际数据相似的随机数来模拟一些。

标签: pandas time-series date-range


【解决方案1】:

以下代码比我最初的尝试快 2.5 倍,优雅 4 倍:

olddf[ 'ones' ] = 1
newdf2 = olddf.set_index( 'dt' ).groupby( 'itemID' )[ 'ones' ].resample( 'M', how='sum' ).unstack( 0 )
print newdf2[ range(5) ]

输出

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 2017-11-22
  • 2020-05-10
相关资源
最近更新 更多