У меня есть этот dataframe, last_bid_vol_price, который постоянно обновляется.
import ccxt
import pandas as pd
import numpy as np
binanceus = ccxt.binanceus({
'enableRateLimit': True,
})
last_bid_vol_price = pd.DataFrame()
while True:
#organize the LOB data the way I want it
orderbook = binanceus.fetch_order_book('BTC/USD')
orderbook_df = pd.DataFrame(orderbook)
orderbook_df.drop(["timestamp", "datetime", 'nonce'],axis=1,inplace=True)
#split bids list
asks = orderbook_df.asks.apply(pd.Series)
#split asks list and merge the two lists
order = orderbook_df.bids.apply(pd.Series).merge(asks, left_index = True, right_index = True)
#back to df
orderbook_df = pd.DataFrame(order)
#rename headers
orderbook_df.columns = ['bids', 'bids_volume', 'asks', 'asks_volume']
#extract the bids where volume is over 1 BTC
bid_vol_price = orderbook_df['bids'].where(orderbook_df['bids_volume'] > 1)
bid_vol = orderbook_df['bids_volume'].where(orderbook_df['bids_volume'] > 1)
bid_vol_price.dropna(inplace=True)
bid_vol.dropna(inplace=True)
bid_vol_price = pd.concat([bid_vol_price, bid_vol], axis=1)
bid_vol_price = bid_vol_price.assign(count=0)
#check if first run
if last_bid_vol_price.empty == True:
last_bid_vol_price = bid_vol_price
#count how many times the bid has remained on the orderbook
mask = ((last_bid_vol_price['bids'] == bid_vol_price['bids'])
and (last_bid_vol_price['bids_volume'] == bid_vol_price['bids_volume']))
bid_vol_price['count'] = bid_vol_price['count'].mask(mask, bid_vol_price['count'] + 1)
#update last_bid_volume_price for the next go by keeping the new volume rows and droping the
#rows that don't exist and dropping the rows with the previous counts
last_bid_vol_price = pd.merge(last_bid_vol_price, bid_vol_price, on=['bids', 'bids_volume'], how='right')
print(last_bid_vol_price)
Я ищу такой выход. Не точные данные, а стиль.
bids bids_volume count
0 6738.23 1.634321 1
1 6733.82 1.607452 1
2 6694.20 9.981800 1
Я хотел бы взять bid_vol_price
, сохранить его в переменной last_bid_vol_price
и сравнить его с новым bid_vol_price
, который приходит, и в конечном итоге считать строки с повторяющиеся значения, но также удаляются строки в last_bid_vol_price
, с которыми не существует в новом bid_vol_price
.
Проблема, с которой я должен начать, это сравнение двух фреймов данных, потому что строка Индекс и размер информационного кадра могут измениться в любой момент. Была бы признательна за помощь в сравнении изменений в этих двух данных.
Мне нужно убедиться, что строки столбцов last_bid_vol_price
bids
и bids_volume
соответствуют bid_vol_price
, даже если индекс строки может измениться и может быть больше или меньше строк.
С
mask = ((last_bid_vol_price['bids'] == bid_vol_price['bids'])
and (last_bid_vol_price['bids_volume'] ==
bid_vol_price['bids_volume']))
Я получаю эту ошибку:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
С
mask = (last_bid_vol_price['bids'] == bid_vol_price['bids'])
Я получаю l oop до bid_vol_price
изменений и тогда я получаю эту ошибку:
ValueError: Can only compare identically-labeled Series objects
Я не могу использовать это mask
без соответствия bids_volume
. Кто-то может отменить ставку, и новая книга поступает в книгу заказов с другим объемом. Если это произошло, счет будет неверным.