大熊猫滚动总和与不均匀间隔指数

时间:2015-10-28 11:46:40

标签: python pandas

我有一个数据框,其中包含不同产品的每周销售额(a,b,c)。如果某一周(例如第4周)的销售额为零,则该周没有记录:

var userObjectId = ""
var object: PFObject = PFObject(className: "User")
object["objectId"] = userObjectID
PFUser.currentUser()?.removeObjectsInArray([object], forKey: "accepted")
PFUser.currentUser()?.saveInBackground()

我想创建一个新列,其中包含前n周的累计销售额,按产品分组。例如。对于n = 2,它应该像last_2_weeks:

In[1]
df = pd.DataFrame({'product': list('aaaabbbbcccc'),
               'week': [1, 2, 3, 5, 1, 2, 3, 5, 1, 2, 3, 4],
               'sales': np.power(2, range(12))})
Out[1]
   product  sales  week
0        a      1     1
1        a      2     2
2        a      4     3
3        a      8     5
4        b     16     1
5        b     32     2
6        b     64     3
7        b    128     5
8        c    256     1
9        c    512     2
10       c   1024     3
11       c   2048     4

如果每周都有记录,我可以按照question中的说明使用 product sales week last_2_weeks 0 a 1 1 0 1 a 2 2 1 2 a 4 3 3 3 a 8 5 4 4 b 16 1 0 5 b 32 2 16 6 b 64 3 48 7 b 128 5 64 8 c 256 1 0 9 c 512 2 256 10 c 1024 3 768 11 c 2048 4 1536

有没有办法设置“周”。作为索引,只计算该指数的总和?或者我可以重新采样一周'并为所有缺失的行设置销售额为零?

2 个答案:

答案 0 :(得分:1)

重新取样仅对DatetimeIndexTimedeltaIndexPeriodIndex有效 但reindex可能是整数。

首先将列week设置为索引。然后,df按列product分组,并按每组索引的最大值应用reindex。缺少的值由0填充。

import pandas as pd
import numpy as np

df = pd.DataFrame({'product': list('aaaabbbbcccc'),
               'week': [1, 2, 3, 5, 1, 2, 3, 5, 1, 2, 3, 4],
               'sales': np.power(2, range(12))})

df = df.set_index('week')   

def reindex_by_max_index_of_group(df):
    index = range(1, max(df.index) + 1)
    return df.reindex(index, fill_value=0)

df = df.groupby('product').apply(reindex_by_max_index_of_group)

df.drop(['product'], inplace=True, axis=1)
print df.reset_index()

#   product  week  sales
#0        a     1      1
#1        a     2      2
#2        a     3      4
#3        a     4      0
#4        a     5      8
#5        b     1     16
#6        b     2     32
#7        b     3     64
#8        b     4      0
#9        b     5    128
#10       c     1    256
#11       c     2    512
#12       c     3   1024
#13       c     4   2048

答案 1 :(得分:0)

您可以使用pivot创建一个自动填充缺失值的表格。这项工作规定,原始数据中每周至少有一个条目,reindex可用于确保每周在表格中有一行。

然后可以sqllocaldb i 应用它:

rolling_sum

这给出了以下结果,它看起来与所需的匹配(因为它提供了前两周的总和):

import pandas, numpy
df = pandas.DataFrame({'product': list('aaaabbbbcccc'),
              'week': [1, 2, 3, 5, 1, 2, 3, 5, 1, 2, 3, 4],
               'sales': numpy.power(2, range(12))})
sales = df.pivot(index='week', columns='product')
# Cope with weeks when there were no sales at all
sales = sales.reindex(range(min(sales.index), 1+max(sales.index))).fillna(0)
# Calculate the sum for the preceding two weeks
pandas.rolling_sum(sales, 3, min_periods=1)-sales