【问题标题】:Ignoring multiple NaNs when calculating standard deviation计算标准差时忽略多个 NaN
【发布时间】:2018-09-14 09:27:57
【问题描述】:

我有以下熊猫数据框,其中包含一些 5 分钟的盘中数据。 DeltaBetweenClose 是NaN,表示开市当天(美国东部标准时间 9:30)的第一条交易柱。

    time     Date       symbol    DeltaBetweenClose 
    9:35    2017-07-17  spy        NaN 
    9:40    2017-07-17  spy       -1.2                     
    ..........................................
    ..........................................    
    16:00   2018-07-17  spy        1.7
    9:35    2017-07-18  spy        NaN
    9:40    2017-07-18  spy        0.3                      
    ..........................................
    ..........................................        
    9:35    2018-07-17  nflx       NaN

我正在尝试创建一个列CloseDelta_sd,它计算由symbols 分组的DeltaBetweenClose 列的滚动标准偏差,它查看前30 个柱并计算标准偏差,同时忽略NaNs。我的以下尝试返回所有NaNs。当DeltaBetweenClose 列的顶部只有一个NaN 时,它可以工作。

df['CloseDelta_sd'] = df.groupby('symbol').DeltaBetweenClose.transform(lambda x: x.rolling(30).std())

【问题讨论】:

  • std 有一个skipna选项,默认为true
  • @user3483203 skipna 默认为真。我应该说清楚吗?
  • 你不应该这样做。您可能需要在rolling 中将min_periods 设置为1
  • @user3483203 哇,它做到了!您对可能发生的事情的最初假设是什么?
  • @user3483203 您介意发布您的解决方案作为答案吗?

标签: python pandas numpy dataframe


【解决方案1】:

问题不在于std,因为它默认跳过NaN,而是rolling。

你需要使用min_periods参数:

具有值所需的窗口中的最小观察次数(否则结果为 NA)。对于由偏移量指定的窗口,这将默认为 1。

由于您提供 int 而不是偏移量,因此您最终会得到很多 NaN 组,修复很简单:

(df.groupby('symbol').DeltaBetweenClose
    .transform(lambda x: x.rolling(30, min_periods=1).std()))

【讨论】:

    猜你喜欢
    • 2020-09-01
    • 2023-03-18
    • 2015-05-15
    • 2016-04-14
    • 2020-01-28
    • 2021-12-27
    • 2015-11-20
    • 2020-08-13
    • 2019-08-15
    相关资源
    最近更新 更多