首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在熊猫/每栏自定义填充方法中正确地重采样ohlc数据

如何在熊猫/每栏自定义填充方法中正确地重采样ohlc数据
EN

Stack Overflow用户
提问于 2022-01-27 04:25:56
回答 2查看 591关注 0票数 2

我有OHLC数据和缺失的时间框架。假设我有以下熊猫数据,由变量df表示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                     Open     High     Low      Close
2019-04-19 00:00:00  0.67068  0.67123  0.67064  0.67123
2019-04-19 00:02:00  0.67062  0.67425  0.67060  0.67223

现在,我重新整理了熊猫的数据,以填补缺失的空白,我得到了以下信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = df.resample('T').ffill()

                     Open     High     Low      Close
2019-04-19 00:00:00  0.67068  0.67123  0.67064  0.67123
2019-04-19 00:01:00  0.67068  0.67123  0.67064  0.67123
2019-04-19 00:02:00  0.67062  0.67425  0.67060  0.67223

从上面我们可以看到,缺失的空白(00:01:00)是在ffill()的帮助下填补的。但是,该行中的数据(从00:01:00开始的行)没有正确显示,因为开盘价应该与前一行的收盘价相同(行从00:00:00开始)。同样,该行的收盘价(从00:01:00开始)应与下一行的开盘价相同(行从00:02:00开始)。所需的输出应该如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                     Open     High     Low      Close
2019-04-19 00:00:00  0.67068  0.67123  0.67064  0.67123
2019-04-19 00:01:00  0.67123  0.67123  0.67064  0.67062
2019-04-19 00:02:00  0.67062  0.67425  0.67060  0.67223

我该如何解决熊猫的这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-27 04:45:12

不幸的是,您不能直接指定每个列的填充方法。

解决办法不是在重采样期间填充值,而是在重采样过程之后进行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = df.resample('T').fillna(None)

df['Open'], df['Close'] = (df['Open'].fillna(df['Close'].ffill()),
                           df['Close'].fillna(df['Open'].bfill()))

df = df.ffill()

产出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                        Open     High      Low    Close
2019-04-19 00:00:00  0.67068  0.67123  0.67064  0.67123
2019-04-19 00:01:00  0.67123  0.67123  0.67064  0.67062
2019-04-19 00:02:00  0.67062  0.67425  0.67060  0.67223

以前的答案(对OHLC不正确,但作为概括感兴趣)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(df.resample('T')
   .fillna(None)
   .assign(Close=lambda d: d['Close'].bfill())  # bfill for Close
   .ffill()                                     # ffill for others
)

产出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                        Open     High      Low    Close
2019-04-19 00:00:00  0.67068  0.67123  0.67064  0.67123
2019-04-19 00:01:00  0.67068  0.67123  0.67064  0.67223
2019-04-19 00:02:00  0.67062  0.67425  0.67060  0.67223

交叉填写值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(df.resample('T')
   .fillna(None)
   .assign(Open=lambda d: d['Open'].fillna(d['Close'].ffill())) # Open = last Close
   .ffill()  # ffill the others
)

产出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                        Open     High      Low    Close
2019-04-19 00:00:00  0.67068  0.67123  0.67064  0.67123
2019-04-19 00:01:00  0.67123  0.67123  0.67064  0.67123
2019-04-19 00:02:00  0.67062  0.67425  0.67060  0.67223

更多选择

下面是另一个示例,我们将插入High,并将其保留为NaNs:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(df.resample('T')
   .fillna(None)
   .assign(Open=lambda d: d['Open'].ffill(),
           Close=lambda d: d['Close'].bfill(),
           High=lambda d: d['High'].interpolate()
          )
)

产出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                        Open     High      Low    Close
2019-04-19 00:00:00  0.67068  0.67123  0.67064  0.67123
2019-04-19 00:01:00  0.67068  0.67274      NaN  0.67223
2019-04-19 00:02:00  0.67062  0.67425  0.67060  0.67223
票数 2
EN

Stack Overflow用户

发布于 2022-06-03 15:29:00

The answer by @mozway是正确的方向,但它有两个问题:

如果有多个连续的缺失值行,则

  1. 将无法工作,
  2. 填充"High“和"Low”在OHLC上下文中是不符合逻辑的。

以下是我(重采样后)要做的事情:

  1. 交叉填充第一个缺失行

df.copy()结果‘’open‘=df’‘open’.‘open(df’‘close’..ffill(),limit=1)结果‘’close‘=df’‘close’.‘open(df’‘open’..bfill(),limit=1)

  1. Now,将open和close的相同值传播到其余的行:

结果‘’open‘=结果’‘open’.‘open(结果’‘close’..ffill())结果‘关闭’= result'close'.fillna(result'close'.ffill())

最后,

  1. 将高和低逻辑设置为打开值和关闭值的最小和最大值:

结果‘’high‘=结果’‘high’.滤网( 'close'].min(axis=1))) [‘open’,‘.max’].max(axis=1))结果‘’low‘=结果’‘low’

此方法将在多个连续缺失行的情况下工作,并在逻辑上处理“高”和“低”的缺失值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70878536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档