【问题标题】:Pandas rolling values熊猫滚动值
【发布时间】:2018-07-30 17:28:26
【问题描述】:

如何获得pandas系列值的某个长度n的滚动值?

例如,如果我有以下情况:

df = pd.DataFrame({'temperature': [0, 1, 2, np.nan, 4, 2, 0.8, 4, 8.8, 7.12]})

我如何获得长度为 n 的移动值,例如,如果 n=3:

[NaN, NaN, 0], [NaN, 0, 1],..., [4, 8.8, 7.12]

编辑: 如果我使用 pandas 滚动,如:

roll = pd.Series.rolling(df, 3).mean()

然后滚动是该系列的移动平均线。 在这里,我不想要每组移动的 3 个值的平均值,而是这些 3 个值的集合。

【问题讨论】:

  • 你能再解释一下吗?不清楚你是如何得到这个输出的。
  • 我没有得到任何输出,我想得到这个输出,这是我提出问题的目的。前两个滚动列表可能应该是“None”而不是“NaN”,我不知道。
  • 我的意思是不清楚如何得到这个输出。为什么前两行有前导 NaN?
  • 您如何从输入到(所需)输出尚不清楚。
  • 请阅读问题,如果看不懂,请避免降级。

标签: python pandas


【解决方案1】:

我认为您需要先添加NaNs,然后添加this solution

N = 3
x = np.concatenate([[np.nan] * (N-1), df['temperature'].values])

def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
print (rolling_window(x, N))
[[  nan   nan  0.  ]
 [  nan  0.    1.  ]
 [ 0.    1.    2.  ]
 [ 1.    2.     nan]
 [ 2.     nan  4.  ]
 [  nan  4.    2.  ]
 [ 4.    2.    0.8 ]
 [ 2.    0.8   4.  ]
 [ 0.8   4.    8.8 ]
 [ 4.    8.8   7.12]]

【讨论】:

    【解决方案2】:

    即使线程很旧,也许它会帮助其他人。我是初学者,但我通过以下过程解决了 user5805065 的问题。也许,有人可以让它更优雅、更高效。

    • 将 Pandas 系列转换为 NumPy:
    rollTemperature = df['temperature'].values
    
    • 然后我用一些初始变量在 for 循环中创建了 numpy 数组:
    period = 2
    stop = len(rollTemperature)
    diffRoll = np.zeros(stop)
    
    for i in range(0,stop):
    
        if i == 0:
            diffRoll[i] = np.nan
    
        elif np.mod(i,period)!=0:
            diffRoll[i] = np.nan
    
        else:
            diffRoll[i] = (rollTemperature[i] + rollTemperature[i-period])/2
    
    • 比将numpy数组添加到existin dataFrame:
    df['diffRoll'] = diffRoll 
    

    比输出是:

       temperature  diffRoll
    0         0.00       NaN
    1         1.00       NaN
    2         2.00       1.0
    3          NaN       NaN
    4         4.00       3.0
    5         2.00       NaN
    6         0.80       2.4
    7         4.00       NaN
    8         8.80       4.8
    9         7.12       NaN
    

    【讨论】:

      猜你喜欢
      • 2019-10-26
      • 2019-07-27
      • 2020-07-05
      • 2018-06-26
      • 2017-03-30
      • 2019-04-11
      • 1970-01-01
      • 2017-08-27
      • 2020-02-18
      相关资源
      最近更新 更多