我有一个包含四列的csv文件:日期,批发商,产品和销售。我希望在每个日期找到每个产品和批发商组合的最近52周销售额的平均值。这意味着在过去52周内,在'C'时间批发商'B'的产品'A'的平均售前价格是多少。
例如,我们知道1月,4月,5月,8月批发商'B'的产品'A'的销售额分别为100,200,300,400。假设我们在1月之前没有任何记录。因此4月批发商'B'中产品'A'的平均售价等于100/1,而5月等于(200 + 100)/ 2八月是(300 + 200 + 100)/ 3。
下表显示了我的数据:
date wholesaler product sales
12/31/2012 53929 UPE54 4
12/31/2012 13131 UPE55 1
2/23/2013 13131 UPE55 1156
4/24/2013 13131 UPE55 1
12/1/2013 83389 UPE54 9
12/17/2013 83389 UPE54 1
12/18/2013 52237 UPE54 9
12/19/2013 53929 UME24 1
12/31/2013 82204 UPE55 9
12/31/2013 11209 UME24 4
12/31/2013 52237 UPE54 1
现在我正在使用:
df = pd.read_csv('Sample.csv',index_col='date')
expd_gb = df.reset_index().groupby(['wholesaler', 'product'])['sales'].apply(pd.Series.expanding)
idx = df.reset_index().groupby(['wholesaler', 'product', 'date'])['sales'].count().index
cnct = pd.concat([expd_gb.iloc[n].mean().shift(1) for n in range(len(expd_gb))])
cnct.index = idx
这给出了每个产品 - 批发商组合的先前销售的总平均值(不是过去52周)。结果是:
wholesaler product date
11209 UME24 12/31/2013 NaN
13131 UPE55 12/31/2012 NaN
2/23/2013 1.0
4/24/2013 578.5
52237 UPE54 12/18/2013 NaN
12/31/2013 9.0
53929 UME24 12/19/2013 NaN
UPE54 12/31/2012 NaN
82204 UPE55 12/31/2013 NaN
83389 UPE54 12/1/2013 NaN
12/17/2013 9.0
随着时间的推移,销售记录的迭代正在增加。我需要查看过去52周内的平均销售额。这意味着在特定日期,例如2015年6月11日某个批发商在过去52周内的平均销售额是多少。万分感谢您的帮助!
答案 0 :(得分:2)
考虑一个apply
函数,有条件地平均每个记录的批发商和产品的最近52周的销售额。如果没有解决方法,groupby()
会为组返回相同的值,而您需要一种运行组平均值,因此请尝试按系列进行处理。并确保将日期转换为日期时间格式,因为您可以使用timedelta()
计算52周。
import pandas as pd
import datetime
dateparse = lambda x: pd.datetime.strptime(x, '%m/%d/%Y')
df = pd.read_csv('Sample.csv', index_col='date',
parse_dates=[0], date_parser=dateparse)
def last52weeks(x):
ser = df['sales'][(df.index >= x.name - datetime.timedelta(weeks=52)) &
(df.index <= x.name) &
(df['wholesaler'] == x[0]) &
(df['product'] == x[1])]
return ser.mean()
df['avg_sales_last52weeks'] = df.apply(last52weeks, axis=1)
df = df.sort_values(['wholesaler', 'product'])
# wholesaler product sales avg_sales_last52weeks
# date
# 2013-12-31 11209 UME24 4 4.0
# 2012-12-31 13131 UPE55 1 1.0
# 2013-02-23 13131 UPE55 1156 578.5
# 2013-04-24 13131 UPE55 1 386.0
# 2013-12-18 52237 UPE54 9 9.0
# 2013-12-31 52237 UPE54 1 5.0
# 2013-12-19 53929 UME24 1 1.0
# 2012-12-31 53929 UPE54 4 4.0
# 2013-12-31 82204 UPE55 9 9.0
# 2013-12-01 83389 UPE54 9 9.0
# 2013-12-17 83389 UPE54 1 5.0
答案 1 :(得分:1)
如果平均值是每周平均值,那么您不应该将总和(每个批发商的产品)除以周数,即52,而不是在cnct = pd.concat([expd_gb.iloc]中得到平均值[n] .mean()。shift(1)for n in range(len(expd_gb))])?
如果您的周数少于52周,那么您希望将该产品的总销售额除以您拥有的周数。例如,如果在(2016年)1月你卖出100个小部件,2月份200个,3月份400个,那么截至4月1日的总销售额将为700个。1月份为31天,2月份为29天,3月份为31个,所以总天数是91,恰好是13周(91/7)。因此,该三个月期间的平均每周销售额将为700/13或约。每周53.85小部件。如果您有91条每日记录,13条每周记录或3条月记录,则无关紧要,每周平均值仍然相同。
要获得天数(以及周数),您可以查看timedelta对象。一旦你超过52周,你也可以使用timedelta来计算52周(或364天)之前的日期,当你阅读文件时,在该日期之前丢弃任何文件。