我有一个数据框,其中包含不同产品的每周销售额(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
。
有没有办法设置“周”。作为索引,只计算该指数的总和?或者我可以重新采样一周'并为所有缺失的行设置销售额为零?
答案 0 :(得分:1)
重新取样仅对DatetimeIndex
,TimedeltaIndex
或PeriodIndex
有效
但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