Сравнивая новый фрейм данных со старым фреймом данных, когда имеете дело с фреймами данных как временных рядов? - PullRequest
1 голос
/ 22 марта 2020

У меня есть этот 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. Кто-то может отменить ставку, и новая книга поступает в книгу заказов с другим объемом. Если это произошло, счет будет неверным.

1 Ответ

2 голосов
/ 26 марта 2020

Через 4 дня я понял это.

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.0)

    #check if first run
    if last_bid_vol_price.empty == True:
        last_bid_vol_price = bid_vol_price

Следующий код решает мою проблему с дополнительным преимуществом сохранения индекса места размещения ставок.

    #update last_bid_volume_price for the next go by keeping the new volume rows and droping the
    #rows that no longer exist and while updating the counts of rows that continue to exist
    bid_vol_price_m = pd.merge(bid_vol_price, last_bid_vol_price, on=['bids','bids_volume'], how='left', indicator='exist')
    #count_y, count_x column's is produced from the merge above 
    bid_vol_price_m['count'] = np.where(bid_vol_price_m.exist =='both', bid_vol_price_m['count_y'] + 1, 0)
    bid_vol_price_m = bid_vol_price_m.drop(['exist', 'count_x', 'count_y'], axis=1)
    #keep the index values and order from bid_vol_price
    bid_vol_price_m.index = bid_vol_price.index
    last_bid_vol_price = bid_vol_price_m
    print(last_bid_vol_price)

Вот некоторые выходные данные

15  6670.97     2.558446   15.0
29  6658.99     1.020400   15.0
42  6650.00     3.052699   15.0
47  6643.85     9.780500   15.0
94  6608.07     2.968100   15.0
       bids  bids_volume  count
15  6670.97     2.558446   16.0
29  6658.99     1.020400   16.0
42  6650.00     3.052699   16.0
47  6643.85     9.780500   16.0
94  6608.07     2.968100   16.0
       bids  bids_volume  count
8   6678.92     2.225173    0.0
16  6670.97     2.558446   17.0
30  6658.99     1.020400   17.0
43  6650.00     3.052699   17.0
48  6643.85     9.780500   17.0
95  6608.07     2.968100   17.0
       bids  bids_volume  count
8   6678.92     2.225173    1.0
16  6670.97     2.558446   18.0
30  6658.99     1.020400   18.0
43  6650.00     3.052699   18.0
48  6643.85     9.780500   18.0
95  6608.07     2.968100   18.0
       bids  bids_volume  count
15  6670.97     2.558446   19.0
29  6658.99     1.020400   19.0
42  6650.00     3.052699   19.0
47  6643.85     9.780500   19.0
94  6608.07     2.968100   19.0

Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...