Python Pandas:为给定值搜索数据帧中最近的前一行

Python Pandas:为给定值搜索数据帧中最近的前一行,python,pandas,Python,Pandas,我试图创建一个函数,当找到一个条件时(特别是当一个列的值=='Trade'),它会搜索前两列的行,并找到与Tradeprice匹配的值,计算在每个列中找到价格的次数 我有一个报价/订单记录的数据框架: import io import pandas as pd data_raw = """ date_time, type, price, bid_price, ask_price, 2020-11-16 01:39:06.221102501, Quote, 70

我试图创建一个函数,当找到一个条件时(特别是当一个列的值=='Trade'),它会搜索前两列的行,并找到与Trade
price
匹配的值,计算在每个列中找到价格的次数

我有一个报价/订单记录的数据框架:

import io
import pandas as pd


data_raw = """
date_time, type, price, bid_price, ask_price,
2020-11-16 01:39:06.221102501, Quote,  7045.5, 7045.0, 7047.0 
2020-11-16 01:39:06.221102501, Trade,  7045.5, 7045.0, 7047.0 
2020-11-16 01:39:06.221102501, Trade,  7045.5, 7045.0, 7047.0 
2020-11-16 01:39:09.044653308, Quote,  7045.0, 7045.0, 7046.0
2020-11-16 01:39:09.044653308, Quote,  7045.0, 7045.0, 7046.5
2020-11-16 01:39:09.044653308, Quote,  7045.0, 7045.0, 7046.0
2020-11-16 01:39:09.044653308, Quote,  7045.0, 7045.0, 7046.0
2020-11-16 01:39:09.824195125, Quote,  7045.0, 7045.0, 7046.0
2020-11-16 01:39:09.824195125, Quote,  7045.0, 7045.0, 7046.5
2020-11-16 01:39:09.824195125, Quote,  7045.0, 7045.0, 7046.0
2020-11-16 01:39:09.984520580, Quote,  7045.0, 7045.0, 7046.0
2020-11-16 01:39:10.408151534, Quote,  7045.0, 7045.0, 7046.0
2020-11-16 01:39:10.564184018, Quote,  7045.0, 7045.0, 7046.0
2020-11-16 01:39:11.008204633, Quote,  7045.0, 7045.0, 7046.0
2020-11-16 01:39:11.032939855, Quote,  7045.0, 7045.0, 7046.0
2020-11-16 01:39:11.230065390, Quote, 7045.0, 7044.0,  7046.0
2020-11-16 01:39:11.230065390, Trade,  7045.0, 7044.0, 7046.0
2020-11-16 01:39:11.232176362, Quote,  7045.0, 7044.0, 7045.5
2020-11-16 01:39:12.924164557, Quote,  7045.0, 7044.0, 7046.0
"""

df = pd.read_csv(io.StringIO(data_raw), sep=",")
df
我想创建两个单独的列,它们是一笔交易与
bid\u price
列或
ask\u price
列上最近的前面的报价匹配的累计次数之和。我想我需要创建一个函数来实现这一点

例如,当记录
type
为'Trade',且价格为7040.0时,我希望该函数可以搜索前n条记录并找到匹配的报价。如果价格与“出价”匹配,则我可以+=1出价计数,反之亦然,如果价格与“要价”匹配

我曾尝试将“日期和时间”列设置为索引并按时间顺序排序,但是,交易并不总是紧跟在报价之后

我最初的想法是使用类似于
pd.index.get_loc(df['price'],method='ffill',tolerance=10)
的东西,但是,我不知道如何搜索单独的
bid_price
ask_price

预期产出:

date_time                     type  price  bid_price ask_price cum_bid cum_ask
2020-11-16 01:39:06.221102501 Quote 7045.5 7045.0    7047.0    0       0
2020-11-16 01:39:06.221102501 Trade 7045.5 7045.0    7047.0    1       0
2020-11-16 01:39:06.221102501 Trade 7045.5 7045.0    7047.0    2       0
2020-11-16 01:39:09.044653308 Quote 7045.0 7045.0    7046.0    2       0
2020-11-16 01:39:09.044653308 Quote 7045.0 7045.0    7046.5    2       0
2020-11-16 01:39:09.044653308 Quote 7045.0 7045.0    7046.0    2       0
2020-11-16 01:39:09.044653308 Quote 7045.0 7045.0    7046.0    2       0
2020-11-16 01:39:09.824195125 Quote 7045.0 7045.0    7046.0    2       0
2020-11-16 01:39:09.824195125 Quote 7045.0 7045.0    7046.5    2       0
2020-11-16 01:39:09.824195125 Quote 7045.0 7045.0    7046.0    2       0
2020-11-16 01:39:09.984520580 Quote 7045.0 7045.0    7046.0    2       0
2020-11-16 01:39:10.408151534 Quote 7045.0 7045.0    7046.0    2       0     
2020-11-16 01:39:10.564184018 Quote 7045.0 7045.0    7046.0    2       0
2020-11-16 01:39:11.008204633 Quote 7045.0 7045.0    7046.0    2       0
2020-11-16 01:39:11.032939855 Quote 7045.0 7045.0    7046.0    2       0
2020-11-16 01:39:11.230065390 Quote 7045.0 7044.0    7046.0    2       0
2020-11-16 01:39:11.230065390 Trade 7045.0 7044.0    7046.0    3       0
2020-11-16 01:39:11.232176362 Quote 7045.0 7044.0    7045.5    3       0
2020-11-16 01:39:12.924164557 Quote 7045.0 7044.0    7046.0    3       0

感谢您的帮助。

请填写价格栏

df['price']=df['price'].bfill()

检查其是否等于“出价/出价”列,计算总和并使用“交易”列进行过滤

df['cum_ask'] = df['price'].eq(df['ask_price']).cumsum().where(df['type'].eq(' Trade'), None).ffill()

df['cum_bid'] = df['price'].eq(df['bid_price']).cumsum().where(df['type'].eq(' Trade'), None).ffill()
最后一次清理创造了南区

df[[cum_-bid'、[cum_-ask']]=df[[cum_-bid'、[cum_-ask']].fillna(0).astype(int)


回填价格列

df['price']=df['price'].bfill()

检查其是否等于“出价/出价”列,计算总和并使用“交易”列进行过滤

df['cum_ask'] = df['price'].eq(df['ask_price']).cumsum().where(df['type'].eq(' Trade'), None).ffill()

df['cum_bid'] = df['price'].eq(df['bid_price']).cumsum().where(df['type'].eq(' Trade'), None).ffill()
最后一次清理创造了南区

df[[cum_-bid'、[cum_-ask']]=df[[cum_-bid'、[cum_-ask']].fillna(0).astype(int)



你能发布一个预期的输出吗dataframe@Kenan现在添加了预期输出。预期输出df与价格列中的输入df不同,是否正确?@Kenan是-输出数据帧是人为设计的。这是为了演示我希望这两个输出列的性能。我以为我们只是创建了
cum\u bid/cum\u ask
列,价格列是如何重新计算的?在输入df中有2项交易,在预期输出中有3项交易。你能发布预期输出吗dataframe@Kenan现在添加了预期输出。预期输出df与价格列中的输入df不同,是否正确?@Kenan是-输出数据帧是人为设计的。这是为了演示我希望这两个输出列的性能。我以为我们只是创建了
cum\u bid/cum\u ask
列,价格列是如何重新计算的?输入df中有2个交易,预期输出中有3个交易谢谢-逻辑似乎非常合理,但是cumsum()表现出奇怪的行为。当我将此应用于整个数据帧时,两列的cum计数,
cum\u ask
cum\u bid
计数与交易数量不符?另外,我不确定您是从哪里得到df[['bcum','acum']]的,因为我们没有用这些名称创建任何列?更新,请用给出问题的示例df更新问题,我将更新逻辑。现在更新df,谢谢,我的意思是用有问题的例子替换当前的例子,并发布预期的输出预期的输出是相同的-没有变化。不过,我已经更新了当前的示例。谢谢您——逻辑似乎非常合理,但是cumsum()表现出奇怪的行为。当我将此应用于整个数据帧时,两列的cum计数,
cum\u ask
cum\u bid
计数与交易数量不符?另外,我不确定您是从哪里得到df[['bcum','acum']]的,因为我们没有用这些名称创建任何列?更新,请用给出问题的示例df更新问题,我将更新逻辑。现在更新df,谢谢,我的意思是用有问题的例子替换当前的例子,并发布预期的输出预期的输出是相同的-没有变化。但是,我已经更新了当前的示例。