【问题标题】:How to calculate previous n days mean using pandas?如何使用熊猫计算前 n 天的平均值?
【发布时间】:2017-02-07 07:08:25
【问题描述】:

我想计算前 10 天的每一天的平均值。

例如,在结果表的 A 列中,“2000 年 1 月 11 日”显示 44,这是从“2000 年 1 月 1 日”到“2000 年 1 月 10 日”的 A 值的平均值。

原始数据:

              A      B       C
1/1/2000     60      62      88 
1/2/2000     46      99      28 
1/3/2000     20      23      94 
1/4/2000     28      19      79 
1/5/2000     58      45      12 
1/6/2000     50      46      62 
1/7/2000     68      4       55 
1/8/2000     54      64      79 
1/9/2000     26      41      63 
1/10/2000    33      10      18 
1/11/2000    37      82      73 
1/12/2000    67      33      29 
1/13/2000    2       82      17 
1/14/2000    82      74      51 
1/15/2000    9       46      81 
1/16/2000    72      84      70 
1/17/2000    74      77      100 
1/18/2000    19      88      37 

结果:

               A      B      C
1/1/2000            
1/2/2000            
1/3/2000            
1/4/2000            
1/5/2000            
1/6/2000            
1/7/2000            
1/8/2000            
1/9/2000            
1/10/2000           
1/11/2000    44      41      58 
1/12/2000    42      43      56 
1/13/2000    44      37      56 
1/14/2000    42      43      49 
1/15/2000    48      48      46 
1/16/2000    43      48      53 
1/17/2000    45      52      54 
1/18/2000    46      59      58 

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以将rolling.mean()shift 一起使用:

    df.rolling(window = 10).mean().applymap(round).shift()
    

    【讨论】:

      【解决方案2】:

      警告/警告

      numpy 通常(并非总是)提供更高性能的解决方案。但是,它们也不太直观且不太灵活。我提供这个解决方案是为了向社区提供有用的信息。我不会向刚刚熟悉pandasnumpy 的人推荐这个。我建议你也阅读下面@Jeff 的 cmets。

      numpy 使用 as_strided

      import pandas as pd
      import numpy as np
      from numpy.lib.stride_tricks import as_strided as stride
      
      v = df.values
      n, m = v.shape
      s1, s2 = v.strides
      
      # note that `np.nanmean` is used to address potential nan values
      pd.DataFrame(
          np.nanmean(stride(v, (n - 9, 10, m), (s1, s1, s2)), 1).round(),
          df.index[9:], df.columns
      )
      
                    A     B     C
      1/10/2000  44.0  41.0  58.0
      1/11/2000  42.0  43.0  56.0
      1/12/2000  44.0  37.0  56.0
      1/13/2000  42.0  43.0  49.0
      1/14/2000  48.0  48.0  46.0
      1/15/2000  43.0  48.0  53.0
      1/16/2000  45.0  52.0  54.0
      1/17/2000  46.0  59.0  58.0
      1/18/2000  42.0  62.0  54.0
      

      时间测试

      【讨论】:

      • 缺少值会失败:numpy 对这样的事情不友好
      • @Jeff 使用 np.nanmean 并适应 nan 值是一个简单的修复。请重新考虑您的反对票或提供进一步的评论。谢谢。
      • 推荐人们为此使用跨步是很疯狂的。当然有些高级用户偶尔会做一些花哨的事情,但 99% 的人不应该像这样接触 numpy 的解决方案。而且非常不灵活。尝试在一段时间内跳过 2 个 nan。
      • @Jeff,我尊重你的意见。因此,我尝试从您和其他人那里汲取任何智慧。你认为最好不要提供这样的答案。或者在适当的警告中留下这样的答案。截至目前,我认为这是有用的信息。我可以更负责任地发出更大声的警告吗,如果你建议我这样做,我会这样做。但是根据您的cmets,我认为您根本不想看到这种答案。你会建议我做什么最适合社区。​​span>
      • 是的,这是一个有用的答案,但始终需要注意的是,大多数用户不会(也不应该这样做);他偶尔会有些 numpy 例程的性能更高,但它们几乎总是不太灵活且在语法上具有挑战性。所以有了这些警告就可以了。
      猜你喜欢
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 2016-06-07
      • 2021-02-27
      相关资源
      最近更新 更多