Стохастический осциллятор, не работающий на самодельном фрейме данных

#python #pandas #cryptocurrency #ta-lib #pandas-ta

Вопрос:

Я создал новый фрейм данных pandas, добавив последние 15 элементов, за вычетом последнего элемента, из истории binance. И каждую минуту я добавляю новые данные во вновь созданный фрейм данных. Это отлично работает и дает следующий результат через несколько минут:

               open           close  ...            high                 time
0   61095.98000000  61099.44000000  ...  61115.93000000  2021-11-05 15:34:00
1   61099.45000000  61038.01000000  ...  61104.11000000  2021-11-05 15:35:00
2   61038.00000000  61010.96000000  ...  61080.05000000  2021-11-05 15:36:00
3   61010.97000000  60978.94000000  ...  61017.93000000  2021-11-05 15:37:00
4   60977.80000000  60945.65000000  ...  60990.54000000  2021-11-05 15:38:00
5   60945.65000000  60900.00000000  ...  60958.00000000  2021-11-05 15:39:00
6   60900.00000000  60991.44000000  ...  60993.71000000  2021-11-05 15:40:00
7   60991.45000000  60888.04000000  ...  60996.14000000  2021-11-05 15:41:00
8   60888.04000000  60880.94000000  ...  60906.98000000  2021-11-05 15:42:00
9   60880.95000000  60810.99000000  ...  60880.95000000  2021-11-05 15:43:00
10  60810.99000000  60763.94000000  ...  60864.74000000  2021-11-05 15:44:00
11  60763.95000000  60872.14000000  ...  60896.86000000  2021-11-05 15:45:00
12  60873.17000000  60908.84000000  ...  60934.22000000  2021-11-05 15:46:00
13  60908.84000000  60844.19000000  ...  60914.94000000  2021-11-05 15:47:00
14  60844.18000000  60870.40000000  ...  60879.34000000  2021-11-05 15:48:00
15  60870.39000000  60845.01000000  ...  60877.53000000  2021-11-05 15:49:00
16  60845.02000000  60900.62000000  ...  60920.64000000  2021-11-05 15:50:00
17  60900.63000000  60873.40000000  ...  60901.29000000  2021-11-05 15:51:00

[18 rows x 5 columns]
 

Теперь я хочу добавить стохастический осциллятор в этот фрейм данных. Я попытался сделать это, добавив в свой код следующую строку:

 df.ta.stoch(high='high', low='low', k=14, d=3, append=True)
 

Однако после добавления этого кода мой фрейм данных больше не будет отображаться в инструкции print, как и стохастик, когда я пытаюсь его распечатать. Как заставить стохастик работать с моим самодельным фреймом данных? Если у вас есть какие-либо вопросы, задавайте их прямо сейчас! Заранее спасибо!

Мой полный код ниже:

 #import threading
import pandas_ta as ta
import websocket
import json
import pandas as pd
from binance import Client

client = Client('5Z5VtpcArDgm525AC6sUoy8TJer4tlel4Twt1ENf7OIzeLB2qx6oaLICHL9jVKoa', 'e641miivoiguEU3gOKjuYEvVKdFNazehtovZtJKdQXb2NVxwTeo1AQ2TBDArocWU')
historical = client.get_historical_klines('BTCUSDT', Client.KLINE_INTERVAL_1MINUTE, '11/05/2021', limit=1000)
SOCKET = "wss://stream.binance.com:9443/ws/btcusdt@kline_1m"

hist_df = pd.DataFrame(historical)
hist_df.columns = ['Open time','Open', 'High', 'Low', 'Close', 'Volume', 'Close time', 'Quote Asset Volume', 'Number of trades', 'TB Base volume','Tb Quote volume','Ignore']



def on_open(ws):
    print('opened connection')

def on_close(ws):
    print('closed connection')

dic = {'open': [], 'close': [], 'low': [], 'high': [], 'time': []}

history_open_price = hist_df['Open'][-15:-1]
history_close_price = hist_df['Close'][-15:-1]
history_highest_price = hist_df['High'][-15:-1]
history_lowest_price = hist_df['Low'][-15:-1]
history_time = pd.to_datetime(hist_df['Open time']/1000, unit='s')[-15:-1]

for a, b in history_open_price.items():
    dic['open'].append(b)
for a, b in history_close_price.items():
    dic['close'].append(b)
for a, b in history_highest_price.items():
    dic['high'].append(b)
for a, b in history_lowest_price.items():
    dic['low'].append(b)
for a, b in history_time.items():
    dic['time'].append(str(b))

def on_message(ws, message):
    json_message = json.loads(message)
    candle = json_message['k']

    open_price = candle['o']
    close_price = candle['c']
    highest_price = candle['h']
    lowest_price = candle['l']
    status = candle['x']
    open_time = pd.to_datetime(candle['t']/1000, unit='s')
    if status:
        dic['open'].append(open_price)
        dic['close'].append(close_price)
        dic['high'].append(highest_price)
        dic['low'].append(lowest_price)
        dic['time'].append(str(open_time))
        df = pd.DataFrame(dic)
        # df.ta.stoch(high='high', low='low', k=14, d=3, append=True)

        print(df)

ws = websocket.WebSocketApp(SOCKET, on_open=on_open, on_close=on_close, on_message=on_message)
ws.run_forever()