【问题标题】:Calculate simple historical average using pandas使用 pandas 计算简单的历史平均值
【发布时间】:2021-08-01 09:38:30
【问题描述】:

我有一个如下所示的数据框

data = pd.DataFrame({'day':['1','21','41','61','81','101','121','141','161','181','201','221'],'Sale':[1.08,0.9,0.72,0.58,0.48,0.42,0.37,0.33,0.26,0.24,0.22,0.11]})

我想通过计算直到day 221 的所有记录的平均值来填充day 241 的值。同样,我想通过计算直到day 241 的所有记录的平均值来计算day 261 的值等等。

例如:通过取 day 1 to day n-21 的所有值的平均值来计算 day n 的值。

我想这样做直到day 1001

我尝试了以下但不正确

df['day'] = df.iloc[:,1].rolling(window=all).mean()

如何在day 列下每天创建新行?

我希望我的输出如下所示

【问题讨论】:

    标签: python pandas dataframe numpy time-series


    【解决方案1】:

    听起来您正在寻找扩展均值:

    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame({'day': ['1', '21', '41', '61', '81', '101', '121', '141',
                               '161', '181', '201', '221'],
                       'Sale': [1.08, 0.9, 0.72, 0.58, 0.48, 0.42, 0.37, 0.33, 0.26,
                                0.24, 0.22, 0.11]})
    
    # Generate Some new values
    to_add = pd.DataFrame({'day': np.arange(241, 301, 20)})
    
    # Add New Values To End of DataFrame
    new_df = pd.concat((df, to_add)).reset_index(drop=True)
    
    # Replace Values Where Sale is NaN with the expanding mean
    new_df['Sale'] = np.where(new_df['Sale'].isna(),
                              new_df['Sale'].expanding().mean(),
                              new_df['Sale'])
    print(new_df)
    
        day      Sale
    0     1  1.080000
    1    21  0.900000
    2    41  0.720000
    3    61  0.580000
    4    81  0.480000
    5   101  0.420000
    6   121  0.370000
    7   141  0.330000
    8   161  0.260000
    9   181  0.240000
    10  201  0.220000
    11  221  0.110000
    12  241  0.475833
    13  261  0.475833
    14  281  0.475833
    

    将 NaN 替换为 1 然后求平均值:

    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame({'day': ['1', '21', '41', '61', '81', '101', '121', '141',
                               '161', '181', '201', '221'],
                       'Sale': [1.08, 0.9, 0.72, 0.58, 0.48, 0.42, 0.37, 0.33, 0.26,
                                0.24, 0.22, 0.11 ]})
    
    # Generate Some new values
    to_add = pd.DataFrame({'day': np.arange(241, 301, 20)})
    
    # Add New Values To End of DataFrame
    new_df = pd.concat((df, to_add)).reset_index(drop=True)
    # Replace Values Where Sale is NaN with the expanding mean
    new_df['Sale'] = np.where(new_df['Sale'].isna(),
                              new_df['Sale'].fillna(1).shift().expanding().mean(),
                              new_df['Sale'])
    print(new_df)
    
        day      Sale
    0     1  1.080000
    1    21  0.900000
    2    41  0.720000
    3    61  0.580000
    4    81  0.480000
    5   101  0.420000
    6   121  0.370000
    7   141  0.330000
    8   161  0.260000
    9   181  0.240000
    10  201  0.220000
    11  221  0.110000
    12  241  0.475833
    13  261  0.516154
    14  281  0.550714
    

    【讨论】:

    • 为什么计算出来的结果不正确?例如:输出中的第 13 行,不应该是 0.5154 吗?
    • 意思是,当我们计算第 281 天的值时,我希望考虑过去(第 1 天到第 261 天)的所有值的值。同样,当我们执行第 301 天时,我想要从第 1 天到第 281 天的所有值,其中第 281 天是最近计算的值
    • 谢谢,我会试试的。尽管如此,我还是接受了答案。但是有一个问题,我们的第二种方法在现实世界中不是很正常吗?意思是,我们添加了一条新记录(带有值),我们希望看到后续值略有变化......那么,我是否正确理解用 1 替换 NA 是正常方法?我真的不明白我们什么时候不应该用 1 替换 NA
    • 完全披露:我不知道,可能有更好的方法。但是一旦你到达数据的末尾,扩展的平均值将不再改变。您可以自己尝试一下,无论您将累积平均值添加到系列末尾多少次,然后除以新长度,该值都不会改变。在这种情况下,fillna 用于为每一行赋予新的含义,但它是一种人工注入。您可以很容易地用 0 填充来模拟下降趋势。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 2019-03-07
    • 2014-02-04
    相关资源
    最近更新 更多