我有OHLC数据和缺失的时间框架。假设我有以下熊猫数据,由变量df表示:
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
现在,我重新整理了熊猫的数据,以填补缺失的空白,我得到了以下信息:
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开始)。所需的输出应该如下所示:
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
我该如何解决熊猫的这个问题?
发布于 2022-01-27 04:45:12
不幸的是,您不能直接指定每个列的填充方法。
解决办法不是在重采样期间填充值,而是在重采样过程之后进行:
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()
产出:
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不正确,但作为概括感兴趣)
(df.resample('T')
.fillna(None)
.assign(Close=lambda d: d['Close'].bfill()) # bfill for Close
.ffill() # ffill for others
)
产出:
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
交叉填写值:
(df.resample('T')
.fillna(None)
.assign(Open=lambda d: d['Open'].fillna(d['Close'].ffill())) # Open = last Close
.ffill() # ffill the others
)
产出:
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:
(df.resample('T')
.fillna(None)
.assign(Open=lambda d: d['Open'].ffill(),
Close=lambda d: d['Close'].bfill(),
High=lambda d: d['High'].interpolate()
)
)
产出:
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
发布于 2022-06-03 15:29:00
The answer by @mozway是正确的方向,但它有两个问题:
如果有多个连续的缺失值行,则
以下是我(重采样后)要做的事情:
df.copy()结果‘’open‘=df’‘open’.‘open(df’‘close’..ffill(),limit=1)结果‘’close‘=df’‘close’.‘open(df’‘open’..bfill(),limit=1)
结果‘’open‘=结果’‘open’.‘open(结果’‘close’..ffill())结果‘关闭’= result'close'.fillna(result'close'.ffill())
最后,
结果‘’high‘=结果’‘high’.滤网( 'close'].min(axis=1))) [‘open’,‘.max’].max(axis=1))结果‘’low‘=结果’‘low’
此方法将在多个连续缺失行的情况下工作,并在逻辑上处理“高”和“低”的缺失值。
https://stackoverflow.com/questions/70878536
复制相似问题