【问题标题】:How to find the average of previous sales at each time in python如何在python中找到每次之前的平均销售额
【发布时间】:2016-04-30 03:52:46
【问题描述】:

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

例如,我们知道批发商“B”的产品“A”在 1 月、4 月、5 月、8 月的销售额分别为 100、200、300、400。假设我们在 1 月之前没有任何记录。因此,批发商 'B' 之前在 4 月销售产品 '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')
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 

感谢您的帮助!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

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

    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
    

    【讨论】:

    • 太棒了!我真的很感谢你的帮助。这是一个优雅的解决方案!
    • 再问一个问题!我需要找到过去 52 周的平均销售额。随着时间的推移,销售记录的迭代次数越来越多。我需要找出过去 52 周的平均销售额是多少。这意味着在某个日期,例如 2015 年 11 月 6 日,过去 52 周某个批发商的产品平均销售额是多少。谢谢一百万!
    • @Ashkan 那么您最好使用.rolling 均值而不是扩展均值。请查看 Pandas 计算工具的滚动窗口(pandas.pydata.org/pandas-docs/stable/…)。
    • @su79eu7k 感谢您的回复和非常好的提示。我也尝试在代码中添加“.rolling”来解决 52 周的问题。
    【解决方案2】:

    解决方案

    df = pd.read_csv('Sample.csv',index_col='date')
    df2 = df.groupby(['wholesaler','product'])['sales'].apply(pd.expanding_mean)
    

    【讨论】:

    • 似乎非常好的方法,但对我来说是ValueError: cannot reindex from a duplicate axis。任何想法? (熊猫 1.18.0 说FutureWarning: pd.expanding_mean is deprecated for Series and will be removed in a future version, replace with Series.expanding(min_periods=1).mean()。所以我也尝试了df.groupby(['wholesaler','product'])['sales'].apply(pd.series.expanding.mean),但没有进一步的进展......)
    • 谢谢!这么好的提示。但是当我运行它时,会出现此错误: raise ValueError("cannot reindex from a duplicate axis") ValueError: cannot reindex from a duplicate axis
    • 新语法(适用于 0.18.0)将是 apply( lambda x: x.expanding().mean() )
    • 该错误来自将索引设置为日期,这不是唯一的(这就是错误消息所抱怨的)。要么根本不设置索引,要么只使用 groupby 的 as_index=False 选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    相关资源
    最近更新 更多