python - Pandas-根据列值在一行中查找第一次出现
问题描述
我有以下数据框:
Row Bid_price Bid_volume Ask_price Ask_volume
2 2999.0 786.7 -500.0 1403.2
3 3000.0 786.7 -499.9 1407.2
4 2950.0 787.3 -250.1 1407.2
---------------------
56 125.1 2691 36.9 3113.1
57 125 2691.1 37 3133.1
---------------------
117 41.4 3029.7 2999 3835.7
118 40.05 3029.7 3000 3835.7
---------------------
123 39.4 3129.7 NaN NaN
124 36.1 3129.7 NaN NaN
125 36 3134.7 NaN NaN
我需要拿第一对Bid_price and Bid_volume (2999.0 and 786.7)
并与所有对Ask_price and Ask_volume
. 只要Bid_volume < Ask_volume AND Bid_price > Ask_price
我跳到下一对Bid_price and Bid_volume
并再次与所有对Ask_price and Ask_volume
. Bid_Price
正在减少,Bid_Volume
正在增加,Ask_Price
正在增加,Ask_Volume
正在增加。Bid_Price, Bid_Volume
具有相同的长度,但Ask_Price
更Ask_Volume
短。
输出应该是第一个实例 where Bid_volume is > Ask_volume AND Bid_price < Ask_price
,因此满足条件。这是第124 行Bid_Price and Bid_Volume
中的情况,它与第 56 行中的对匹配Ask_Price and Ask_Volume
。
所需的输出应该是:
Row Bid_price Bid_volume
124 36.1 3129.7
Row Ask_price Ask_volume
56 36.9 3113.1
我的问题是我只能评估每一行的条件。这不返回任何内容:
BidAsk = BidAsk[(BidAsk["Bid_volume"] > BidAsk["Ask_volume"]) & (BidAsk["Bid_price"] < BidAsk["Ask_price"])]
BidAsk[["Bid_price","Bid_volume"]]
这在这里给出了一个回溯错误:
BidAsk = BidAsk.where((BidAsk["Bid_volume"] > BidAsk["Ask_volume"]) & (BidAsk["Bid_Price"] < BidAsk["Ask_Price"]))
BidAsk[["Bid_price", "Bid_volume"]]
非常感谢任何帮助。谢谢!
解决方案
我希望我理解正确,这个脚本会找到Bid_price
并且Bid_volume
满足条件Bid_volume is > Ask_volume AND Bid_price < Ask_price
。
如果我有这个数据框:
Bid_price Bid_volume Ask_price Ask_volume
0 2999.0 786.7 -500.0 1403.2
1 3000.0 786.7 -499.9 1407.2
2 2950.0 787.3 -250.1 1407.2
3 2500.0 792.8 -250.0 1593.2
4 2000.0 798.9 -200.1 1593.2
5 1400.0 2000.0 1200.0 1600.0
6 36.1 3129.7 NaN NaN
然后:
import pandas as pd
from io import StringIO
txt = '''Bid_price Bid_volume Ask_price Ask_volume
2999.0 786.7 -500.0 1403.2
3000.0 786.7 -499.9 1407.2
2950.0 787.3 -250.1 1407.2
2500.0 792.8 -250.0 1593.2
2000.0 798.9 -200.1 1593.2
1400.0 2000.0 1200.0 1600.0
36.1 3129.7 '''
df = pd.read_fwf(StringIO(txt))
max_price = df.Ask_price.max()
max_volume = df.Ask_volume.max()
mask = pd.concat([df.Bid_price < max_price, df.Bid_volume > max_volume], axis=1).all(axis=1)
print( df.loc[mask, ['Bid_price', 'Bid_volume']].head(1) )
印刷:
Bid_price Bid_volume
6 36.1 3129.7
编辑(根据更新的问题):
import pandas as pd
from io import StringIO
txt = ''' Row Bid_price Bid_volume Ask_price Ask_volume
2 2999.0 786.7 -500.0 1403.2
3 3000.0 786.7 -499.9 1407.2
4 2950.0 787.3 -250.1 1407.2
56 125.1 2691 36.9 3113.1
57 125 2691.1 37 3133.1
117 41.4 3029.7 2999 3835.7
118 40.05 3029.7 3000 3835.7
123 39.4 3129.7 NaN NaN
124 36.1 3129.7 NaN NaN
125 36 3134.7 NaN NaN'''
df = pd.read_fwf(StringIO(txt))
def get_indexes(df):
for idx1, bid_price, bid_volume in zip(df.index, df.Bid_price, df.Bid_volume):
for idx2, ask_price, ask_volume in zip(df.index, df.Ask_price, df.Ask_volume):
if bid_volume > ask_volume and bid_price < ask_price:
return idx1, idx2, bid_price, bid_volume, ask_price, ask_volume
print(df)
print()
result = get_indexes(df)
if result:
print('Bid Price =', result[2])
print('Bid Volume =', result[3])
print('Ask Price =', result[4])
print('Ask Volume =', result[5])
print('Index bid =', result[0])
print('Index ask =', result[1])
印刷:
Row Bid_price Bid_volume Ask_price Ask_volume
0 2 2999.00 786.7 -500.0 1403.2
1 3 3000.00 786.7 -499.9 1407.2
2 4 2950.00 787.3 -250.1 1407.2
3 56 125.10 2691.0 36.9 3113.1
4 57 125.00 2691.1 37.0 3133.1
5 117 41.40 3029.7 2999.0 3835.7
6 118 40.05 3029.7 3000.0 3835.7
7 123 39.40 3129.7 NaN NaN
8 124 36.10 3129.7 NaN NaN
9 125 36.00 3134.7 NaN NaN
Bid Price = 36.1
Bid Volume = 3129.7
Ask Price = 36.9
Ask Volume = 3113.1
Index bid = 8
Index ask = 3
推荐阅读
- php - 运行 SQL 查询以将所有已发布的 WooCommerce 产品更改为草稿状态
- c++ - boost:: 或 std::normal_distribution 是否使用逆累积分布函数?
- openvpn - OpenVPN 在 Windows 上工作,在 Linux VPS 上失败
- ionic-framework - 在 Ionic Framework Ionic 上为 Release Android 8 编译时,我收到“Application Error net::ERR_CONNECTION_REFUSED (http://localhost/)
- python-3.x - Prime numbers using python
- c# - WCF, error 405 on Windows 2016 but not on 2008
- mysql - AWSCLI:创建 mysql 只读副本时无法指定 db 参数组
- java - 这些在 JavaFX 中使用事件的方法是否相同?
- selenium - 测试立即失败,出现未知错误:通过 systemd 运行 Selenium 网格时,DevToolsActivePort 文件不存在
- java - 使用 Spring AMQP 监听许多短暂的、动态创建的队列