【发布时间】:2021-03-19 05:08:00
【问题描述】:
我试图找到一种方法,在给定特定列值的情况下,在 Pandas Dataframe 的两个单独列的最近 preceding 行中找到匹配值,然后在以下情况下指示“1”在 else '0' 列中找到。
Dataframe 索引未排序。
数据:
df = pd.DataFrame({
'datetime': [
'2020-11-16 01:39:06.22021017', '2020-11-16 01:39:06.22021020', '2020-11-16 01:39:06.22021022',
'2020-11-16 01:39:06.22021031', '2020-11-16 01:39:06.22021033', '2020-11-16 01:39:06.22021036'],
'type': ['Quote', 'Trade', 'Trade', 'Quote', 'Quote', 'Trade'],
'price': ['NaN', 7026.5, 7026.5, np.NaN, np.NaN, 7024.0],
'ask_price': [7026.5, 7026.5, 7026.0, 7026.5, 7026.0, 7026.5],
'bid_price': [7024.0, 7024.5, 7024.5, 7024.0, 7024.5, 7024.5]})
我需要什么:
当type == 'Trade' 时,我需要回顾bid_price 和ask_price,并找到与price 列匹配的第一个值。在与交易行相同的行中,我想要两个单独的列来指示价格是否在最近的 bid_price 或 ask_price 列中找到。
预期输出:
df = pd.DataFrame({
'datetime': [
'2020-11-16 01:39:06.22021017', '2020-11-16 01:39:06.22021020', '2020-11-16 01:39:06.22021022',
'2020-11-16 01:39:06.22021033', '2020-11-16 01:39:06.22021034', '2020-11-16 01:39:06.22021033'],
'type': ['Quote', 'Trade', 'Trade', 'Quote', 'Quote', 'Trade'],
'price': ['NaN', 7026.5, 7026.5, np.NaN, np.NaN, 7024.0],
'ask_price': [7026.5, 7026.5, 7026.0, 7026.5, 7026.0, 7026.5],
'bid_price': [7024.0, 7024.5, 7024.5, 7024.0, 7024.5, 7024.5],
'is_bid_trade': [0, 0, 0, 0, 0, 1],
'is_ask_trade': [1, 1, 0, 0, 0, 0]})
您可以看到第一笔交易与ask_price 列中前一行的报价相匹配。 bid_price 列中的最终交易匹配,但这比交易落后两行。
我已经尝试过(并且得到了 SO 的帮助),但还没有在这里找到解决方案。
遗憾的是,datetime 列并非 100% 准确,因此不能依赖于按时间顺序排序。我还尝试使用 df.index.get_loc() 找到最小索引,但不确定如何将其应用于两列进行搜索。
非常感谢所有帮助。
【问题讨论】:
-
您的
is_ask_trade列是否正确?你用 1 标记第一个报价而不是第二个交易? -
另外,这将很难做到。
pd.merge_asof将是一个不错的选择,但它不允许与浮动 dtype 完全匹配,因此您可能需要发挥创意。 -
@ALollz - 我不知道吗! :) 是的 -
is_ask_trade在这里是正确的,因为在索引 == 0 引用的ask_price上执行了两笔交易。 -
哦,价格将始终以 0.5 为间隔,因此希望能稍微减轻这种情况。
标签: python pandas dataframe search