如何在python中找到每次销售的最近52周的平均值

时间:2016-05-01 20:19:47

标签: python pandas

我有一个包含四列的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周内的平均销售额是多少。万分感谢您的帮助!

2 个答案:

答案 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天)之前的日期,当你阅读文件时,在该日期之前丢弃任何文件。