Python Pandas:为给定值搜索数据帧中最近的前一行
我试图创建一个函数,当找到一个条件时(特别是当一个列的值=='Trade'),它会搜索前两列的行,并找到与TradePython 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
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,谢谢,我的意思是用有问题的例子替换当前的例子,并发布预期的输出预期的输出是相同的-没有变化。但是,我已经更新了当前的示例。