import onnxruntime as ort import pickle import joblib import numpy as np import json import os import requests import pandas as pd from flask import Flask,render_template,jsonify,request import plotly.graph_objects as go from dotenv import load_dotenv from ta.momentum import RSIIndicator from ta.trend import MACD, EMAIndicator from ta.volatility import AverageTrueRange import plotly.io as pio import ChatBot as cb load_dotenv() api=os.environ['COIN_GECKO'] head={ "x-cg-demo-api-key":api } params={ "vs_currency":"usd", "days":1 } lines=requests.get("https://api.coingecko.com/api/v3/coins/bitcoin/ohlc",params=params,headers=head).json() def preprocess(lines): cols=["open_time","open","high","low","close"] data=pd.DataFrame(lines,columns=cols) data['open_time']=pd.to_datetime(data['open_time'],unit='ms') data['rsi']=RSIIndicator(close=data["close"],window=14,fillna=0).rsi() macd=MACD(close=data["close"]) data["macd"]=macd.macd() data['macd_signal']=macd.macd_signal() data['ema_20']=EMAIndicator(close=data['close'],window=14,fillna=0).ema_indicator() data['atr']=AverageTrueRange(high=data['high'],low=data['low'],close=data['close'],window=14).average_true_range() data['weekday']=data['open_time'].dt.day_of_week data['day_of_year']=data['open_time'].dt.day_of_year data['hour']=data['open_time'].dt.hour data['month_end']=data['open_time'].dt.is_month_end.astype(np.float32) data['month_start']=data['open_time'].dt.is_month_start.astype(np.float32) data['quarter_start']=data['open_time'].dt.is_quarter_start.astype(np.float32) data["quarter_end"]=data['open_time'].dt.is_quarter_end.astype(np.float32) data["year"]=data['open_time'].dt.year data['month']=data['open_time'].dt.month data['is_recent']=data['open_time'].dt.year>2023 data['is_recent']=data['is_recent'].astype(np.float64) data=data[data["open_time"].dt.minute==0].reset_index(drop=True) return data data=preprocess(lines) session=ort.InferenceSession("models/lstm_model.onnx") with open("models/hourly_stat.pkl","rb") as f: hourly_model=pickle.load(f) with open("models/daily_stat.pkl","rb") as f: daily_model=pickle.load(f) input_scaler=joblib.load("models/input_scaler.pkl") output_scaler=joblib.load("models/ouput_scaler.pkl") with open("Data/portfolio.json","r") as f: portfolio=json.load(f) with open("Data/news.json","r") as f: news=json.load(f) def predict_onnx(data): ourdata=data.drop(columns=['open_time']) impfactor=np.linspace(0,1,15).reshape(15,1) scaled=input_scaler.transform(ourdata) X=np.append(scaled,impfactor,axis=1).reshape(1,15,20) input_name = session.get_inputs()[0].name output = session.run(None, {input_name: X.astype(np.float32)}) return pd.DataFrame({ "ds":data[-15:]['open_time']+pd.Timedelta(hours=1), "x":output_scaler.inverse_transform(output[0][0].reshape(1,15)).reshape(15) }) def precict_ml(data): prediction=hourly_model.predict(data.rename(columns={"open_time":"ds","close":"previous_close"}).fillna(0)) return pd.DataFrame({ "ds":data['open_time']+pd.Timedelta(hours=1), "y":prediction['yhat'] }) def plot_chart(): temp=pd.DataFrame() batchsize=15 for i in range(0,len(data),batchsize): input_data=data[len(data)-i-batchsize:len(data)-i].fillna(0) if len(input_data)