Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中查找每次以前销售的平均值_Python_Pandas - Fatal编程技术网

如何在python中查找每次以前销售的平均值

如何在python中查找每次以前销售的平均值,python,pandas,Python,Pandas,我有一个csv文件,有四列:日期、批发商、产品和销售。我在寻找每个产品和批发商组合在每个日期之前的平均销售额。这意味着批发商“B”在时间“C”之前产品“A”的平均销售额是多少 例如,我们知道批发商“B”在1月、4月、5月和8月的产品“A”的销售额分别为100、200、300和400。假设我们在1月之前没有任何记录,那么批发商“B”在4月之前的产品“A”平均销售额等于100/1,在5月等于(200+100)/2,在8月为(300+200+100)/3 下表显示了我的数据: date whol

我有一个csv文件,有四列:日期、批发商、产品和销售。我在寻找每个产品和批发商组合在每个日期之前的平均销售额。这意味着批发商“B”在时间“C”之前产品“A”的平均销售额是多少

例如,我们知道批发商“B”在1月、4月、5月和8月的产品“A”的销售额分别为100、200、300和400。假设我们在1月之前没有任何记录,那么批发商“B”在4月之前的产品“A”平均销售额等于100/1,在5月等于(200+100)/2,在8月为(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')
df2 = df.groupby(['wholesaler','product'])['sales'].mean()
这给出了每个批发商产品的平均销售额,而我在寻找每个日期以前的平均销售额

wholesaler product   avg sales
    11209  UME24      4.00
    13131  UPE55    713.00
    22423  UME24      1.00
    24302  U4E16    121.00 
谢谢你的帮助

解决方案
这对我来说很棘手,但无论如何都能奏效。期待他人提供更优雅的解决方案

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)

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

cnct.to_csv('TotalAvg.csv')
结果,

wholesaler  product  date      
11209       UME24    2013-12-31     NaN
13131       UPE55    2012-12-31     NaN
                     2013-02-23     1.0
                     2013-04-24     578.5
52237       UPE54    2013-12-18     NaN
                     2013-12-31     9.0
53929       UME24    2013-12-19     NaN
            UPE54    2012-12-31     NaN
82204       UPE55    2012-12-31     NaN
83389       UPE54    2013-12-01     NaN
                     2013-12-17     9.0

似乎是一个很好的方法,但是
ValueError:我无法从重复的轴重新编制索引。有什么想法吗?(pandas 1.18.0说
FutureWarning:pd.Expansing\u mean不推荐用于Series,并将在将来的版本中删除,替换为Series.Expansing(min\u periods=1).mean()
。所以我尝试了
df.groupby(['批发商','product'])['sales'])。也应用(pd.Series.Expansing.mean)
,但没有进一步的进展…。谢谢!这么好的暗示。但是当我运行它时,这个错误会显示:raise ValueError(“无法从重复轴重新索引”)ValueError:无法从重复轴重新索引新语法(对于0.18.0)将是
apply(lambda x:x.expansing().mean())
这个错误是由于将索引设置为最新,这不是唯一的(这就是错误消息所抱怨的)。要么根本不设置索引,要么只使用groupby.Awesome的
as_index=False
选项!我真的很感谢你的帮助。这是一个优雅的解决方案!再问一个问题!我需要找到过去52周的平均销售额。随着时间的推移,销售记录的迭代不断增加。我需要知道过去52周的平均销售额是多少。这意味着在某一特定日期,例如2015年6月11日,某一批发商过去52周的产品平均销售额是多少。万分感谢@Ashkan那么你最好使用
.rolling
平均值,而不是扩展平均值。请检查熊猫计算工具()的滚动窗口。@su79eu7k感谢您的回复和非常好的提示。我尝试在代码中添加“.rolling”来解决52周的问题。
wholesaler  product  date      
11209       UME24    2013-12-31     NaN
13131       UPE55    2012-12-31     NaN
                     2013-02-23     1.0
                     2013-04-24     578.5
52237       UPE54    2013-12-18     NaN
                     2013-12-31     9.0
53929       UME24    2013-12-19     NaN
            UPE54    2012-12-31     NaN
82204       UPE55    2012-12-31     NaN
83389       UPE54    2013-12-01     NaN
                     2013-12-17     9.0