【发布时间】:2022-07-20 23:48:23
【问题描述】:
我有一个基于在线游戏 EVE 的市场数据的大型数据框。 我正在尝试根据商品的买入或卖出订单的价格来确定最有利可图的交易。 我发现循环所有可能性需要相当长的时间,并希望获得一些关于如何使我的代码更高效的建议。
数据 = https://market.fuzzwork.co.uk/orderbooks/latest.csv.gz
设置:
import pandas as pd
df = pd.read_csv('latest.csv', sep='\t', names=["orderID","typeID","issued","buy","volume","volumeEntered","minVolume","price","stationID","range","duration","region","orderSet"])
遍历所有可能性
buy_order = df[(df.typeID == 34) & (df.buy == True)].copy()
sell_order = df[(df.typeID == 34) & (df.buy == False)].copy()
profitable_trade = []
for i in buy_order.index:
for j in sell_order.index:
if buy_order.loc[i,'price'] > sell_order.loc[j, 'price']:
profitable_trade.append(buy_order.loc[i, ['typeID', 'orderID', 'price', 'volume', 'stationID', 'range']].tolist() + sell_order.loc[j, ['orderID', 'price', 'volume', 'stationID', 'range']].tolist())
这需要相当长的时间(锐龙 2600x 上 33 秒,M1 Pro 上 12 秒)
缩短迭代时间
buy_order = df[(df.typeID == 34) & (df.buy == True)].copy()
sell_order = df[(df.typeID == 34) & (df.buy == False)].copy()
buy_order.sort_values(by='price', ascending=False, inplace=True, ignore_index=True)
sell_order.sort_values(by='price', ascending=True, inplace=True, ignore_index=True)
for i in buy_order.index:
if buy_order.loc[i, 'price'] > sell_order.price.min():
for j in sell_order.index:
if buy_order.loc[i,'price'] > sell_order.loc[j, 'price']:
profitable_trade2.append(buy_order.loc[i, ['typeID', 'orderID', 'price', 'volume', 'stationID', 'range']].tolist() + sell_order.loc[j, ['orderID', 'price', 'volume', 'stationID', 'range']].tolist())
else:
break
else:
break
这节省了大约 25%-30% 的时间(2600x 为 23 秒,M1 Pro 为 9 秒)
时间已记录在 Jupyter Notebook 中
欢迎任何提示!
【问题讨论】:
-
如果你想快速使用 numpyfriendo
-
如果您记录的数据较少,代码会更快。现在,如果您有 10 个买单和 10 个卖单,并且所有买单的价格都高于所有卖单的价格,那么对于买单和卖单的每个组合,它都会在最终数据框中记录 100 个订单。这会很慢。
-
@INGl0R1AM0R1 在这种情况下我将如何使用 Numpy? (我没有太多经验,有没有想到的功能?)
-
@NickODell 不幸的是,我必须记录所有可能性。我想使用结果并确定最近的交易地点等。当利润少一点但游戏内更接近时,只进行最有利可图的交易是没有多大意义的。