假设数据帧如下。我希望在df数据框中添加一列,该列获取当前行的价格,并从当前小时/分钟之前的最后一个索引5分钟的价格中减去它。我试图引用一个minute_df并读取当前的小时/分钟,并从minute_df拉收盘价,但没有得到一个工作的解决方案。df索引为datetime64。
例如,在06:27:12,它应该取这一行的价格,减去06:22最后一个指数的收盘价,因为这是06:27之前的5分钟。对于06:27分钟内的每个指数,它应该引用这个收盘价进行计算,直到它变成06:28,然后应该从06:23的最后一个指数中减去。
df
TimeStamp Price Q hour min
2022-10-05 05:30:11.344618-05:00 8636 1 5 30
2022-10-05 05:30:12.647597-05:00 8637 1 5 30
2022-10-05 05:30:20.080559-05:00 8637 1 5 30
2022-10-05 05:30:21.267389-05:00 8637 2 5 30
2022-10-05 05:30:21.267952-05:00 8636 1 5 30
minute_df
TimeStamp open high low close
2022-10-05 05:30:00-05:00 8636 8645 8635 8645
2022-10-05 05:31:00-05:00 8645 8647 8637 8638
2022-10-05 05:32:00-05:00 8639 8650 8639 8649
2022-10-05 05:33:00-05:00 8648 8652 8648 8649
预期输出是df数据框中的一列,其中包含当前价格-收盘价的值,或当前分钟前5分钟的最后一个索引的价格。NaN值,直到有足够的行来回顾这么多周期。
df("price_change")
不确定我是否理解正确,但这是我的尝试
如果TimeStamp
是列
# Remove the seconds and microseconds
floor_ts = df.TimeStamp.dt.floor("min")
# Get last 5 minute timestamp
last_index_5_ts = floor_ts - pd.Timedelta(5, unit="min")
# Create dict from minute_df TimeStamp to close price
ts_to_close_dict = dict(zip(minute_df.TimeStamp, minute_df.close))
close_price_v = last_index_5_ts.map(ts_to_close_dict)
df["price_change"] = df.Price - close_price_v
df
相同的代码,但如果TimeStamp
是索引
floor_ts = df.index.floor("min")
last_index_5_ts = floor_ts - pd.Timedelta(5, unit="min")
ts_to_close_dict = dict(zip(minute_df.index, minute_df.close))
close_price_v = last_index_5_ts.map(ts_to_close_dict)
df["price_change"] = df.Price - close_price_v
df
一些笔记:
- 我不确定你是什么意思关于处理
NaN
值,但如果你需要向前填充/向后填充他们,你可以使用pd.fillna - 上面的一些
pandas
功能(如floor
)可能在旧的熊猫版本中缺失
编辑:我没有注意到df
已经有hour
和minute
列了。你可以用它来计算floor_ts
(虽然不确定它是否更容易/更快)