Abdullah6395 commited on
Commit
26e1e45
·
verified ·
1 Parent(s): e77a32b

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +206 -0
app.py ADDED
@@ -0,0 +1,206 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import onnxruntime as ort
2
+ import pickle
3
+ import joblib
4
+ import numpy as np
5
+ import json
6
+ import os
7
+ import requests
8
+ import pandas as pd
9
+ from flask import Flask,render_template,jsonify,request
10
+ import plotly.graph_objects as go
11
+ from dotenv import load_dotenv
12
+ from ta.momentum import RSIIndicator
13
+ from ta.trend import MACD, EMAIndicator
14
+ from ta.volatility import AverageTrueRange
15
+ import plotly.io as pio
16
+ import ChatBot as cb
17
+
18
+ load_dotenv()
19
+ api=os.environ['COIN_GECKO']
20
+ head={
21
+ "x-cg-demo-api-key":api
22
+ }
23
+ params={
24
+ "vs_currency":"usd",
25
+ "days":1
26
+ }
27
+ lines=requests.get("https://api.coingecko.com/api/v3/coins/bitcoin/ohlc",params=params,headers=head).json()
28
+
29
+ def preprocess(lines):
30
+ cols=["open_time","open","high","low","close"]
31
+ data=pd.DataFrame(lines,columns=cols)
32
+ data['open_time']=pd.to_datetime(data['open_time'],unit='ms')
33
+ data['rsi']=RSIIndicator(close=data["close"],window=14,fillna=0).rsi()
34
+ macd=MACD(close=data["close"])
35
+ data["macd"]=macd.macd()
36
+ data['macd_signal']=macd.macd_signal()
37
+ data['ema_20']=EMAIndicator(close=data['close'],window=14,fillna=0).ema_indicator()
38
+ data['atr']=AverageTrueRange(high=data['high'],low=data['low'],close=data['close'],window=14).average_true_range()
39
+ data['weekday']=data['open_time'].dt.day_of_week
40
+ data['day_of_year']=data['open_time'].dt.day_of_year
41
+ data['hour']=data['open_time'].dt.hour
42
+ data['month_end']=data['open_time'].dt.is_month_end.astype(np.float32)
43
+ data['month_start']=data['open_time'].dt.is_month_start.astype(np.float32)
44
+ data['quarter_start']=data['open_time'].dt.is_quarter_start.astype(np.float32)
45
+ data["quarter_end"]=data['open_time'].dt.is_quarter_end.astype(np.float32)
46
+ data["year"]=data['open_time'].dt.year
47
+ data['month']=data['open_time'].dt.month
48
+ data['is_recent']=data['open_time'].dt.year>2023
49
+ data['is_recent']=data['is_recent'].astype(np.float64)
50
+ data=data[data["open_time"].dt.minute==0].reset_index(drop=True)
51
+ return data
52
+ data=preprocess(lines)
53
+
54
+ session=ort.InferenceSession("models/lstm_model.onnx")
55
+
56
+ with open("models/hourly_stat.pkl","rb") as f:
57
+ hourly_model=pickle.load(f)
58
+
59
+ with open("models/daily_stat.pkl","rb") as f:
60
+ daily_model=pickle.load(f)
61
+
62
+ input_scaler=joblib.load("models/input_scaler.pkl")
63
+
64
+ output_scaler=joblib.load("models/ouput_scaler.pkl")
65
+
66
+ with open("Data/portfolio.json","r") as f:
67
+ portfolio=json.load(f)
68
+
69
+ with open("Data/news.json","r") as f:
70
+ news=json.load(f)
71
+
72
+ def predict_onnx(data):
73
+ ourdata=data.drop(columns=['open_time'])
74
+ impfactor=np.linspace(0,1,15).reshape(15,1)
75
+ scaled=input_scaler.transform(ourdata)
76
+ X=np.append(scaled,impfactor,axis=1).reshape(1,15,20)
77
+ input_name = session.get_inputs()[0].name
78
+ output = session.run(None, {input_name: X.astype(np.float32)})
79
+ return pd.DataFrame({
80
+ "ds":data[-15:]['open_time']+pd.Timedelta(hours=1),
81
+ "x":output_scaler.inverse_transform(output[0][0].reshape(1,15)).reshape(15)
82
+ })
83
+ def precict_ml(data):
84
+ prediction=hourly_model.predict(data.rename(columns={"open_time":"ds","close":"previous_close"}).fillna(0))
85
+ return pd.DataFrame({
86
+ "ds":data['open_time']+pd.Timedelta(hours=1),
87
+ "y":prediction['yhat']
88
+ })
89
+ def plot_chart():
90
+ temp=pd.DataFrame()
91
+ batchsize=15
92
+ for i in range(0,len(data),batchsize):
93
+ input_data=data[len(data)-i-batchsize:len(data)-i].fillna(0)
94
+ if len(input_data)<batchsize:
95
+ prediction=predict_onnx(data[:15].fillna(0))[:-(batchsize-(len(data)-i))]
96
+ temp=pd.concat([prediction,temp])
97
+ break
98
+ prediction=predict_onnx(input_data)
99
+ temp=pd.concat([prediction,temp])
100
+ predicted=temp
101
+ mlprediction=precict_ml(data)
102
+ fig=go.Figure()
103
+ fig.add_trace(go.Candlestick(
104
+ x=data["open_time"],
105
+ open=data["open"],
106
+ high=data['high'],
107
+ low=data['low'],
108
+ close=data['close'],
109
+ name="liveprice"
110
+ ))
111
+ fig.add_trace(go.Scatter(
112
+ x=predicted['ds'],
113
+ y=predicted['x'],
114
+ name="lstm_prediction"
115
+ ))
116
+ fig.add_trace(go.Scatter(
117
+ x=mlprediction['ds'],
118
+ y=mlprediction['y'],
119
+ name="MlPrediction"
120
+ )
121
+ )
122
+ fig.update_layout(
123
+ xaxis=dict(
124
+ range=[data['open_time'].iloc[-15],data['open_time'].iloc[-1]],
125
+ rangeslider=dict(visible=False),
126
+ fixedrange=False
127
+ ),
128
+ paper_bgcolor='rgba(113, 78, 161, 0.5)',
129
+ plot_bgcolor='rgba(113, 78, 161, 0.5)',
130
+ font_color="white",
131
+ dragmode="pan"
132
+ )
133
+ return fig
134
+
135
+ def Predict20Days():
136
+ today=pd.to_datetime("today").normalize()
137
+ timerange=pd.date_range(start=today,end=today+pd.Timedelta(days=20),freq="d")
138
+ input_data=pd.DataFrame(timerange,columns=['ds'])
139
+ pred=daily_model.predict(input_data)
140
+ return {
141
+ "ds":timerange,
142
+ "y":pred['yhat']
143
+ }
144
+
145
+ def make_20_days_chart():
146
+ df=Predict20Days()
147
+ fig=go.Figure()
148
+ fig.add_trace(go.Scatter(
149
+ x=df['ds'],
150
+ y=df['y']
151
+ ))
152
+ fig.update_layout(
153
+ paper_bgcolor='rgba(113, 78, 161, 0.5)',
154
+ plot_bgcolor='rgba(113, 78, 161, 0.5)',
155
+ font_color="white",
156
+ dragmode="pan"
157
+ )
158
+ return fig
159
+
160
+ app=Flask(__name__)
161
+ app.config['TEMPLATES_AUTO_RELOAD'] = True
162
+ @app.route("/")
163
+ def front():
164
+ figure=plot_chart()
165
+ next20days=make_20_days_chart()
166
+ config={
167
+ "displayModeBar":False
168
+ }
169
+ plot=pio.to_html(figure,full_html=False,config=config)
170
+ plot2=pio.to_html(next20days,full_html=False,config=config)
171
+ return render_template("index.html",chart=plot,newsset=news,pred20=plot2)
172
+
173
+ @app.route("/update_chart")
174
+ def give_update():
175
+ global lines
176
+ global data
177
+ newlines=requests.get("https://api.coingecko.com/api/v3/coins/bitcoin/ohlc",params=params,headers=head).json()
178
+ lines.append(newlines)
179
+ data=preprocess(lines)
180
+ data=data.drop_duplicates()
181
+ predonnx=predict_onnx(data.iloc[-15:].fillna(0))
182
+ predml=precict_ml(data.iloc[[-1]])
183
+ return jsonify({
184
+ "x":[str(data['open_time'].iloc[-1]),str(predonnx['ds']),str(predml['ds'])],
185
+ "open":float(data['open'].iloc[-1]),
186
+ "high":float(data["high"].iloc[-1]),
187
+ "low":float(data['low'].iloc[-1]),
188
+ "close":float(data['close'].iloc[-1]),
189
+ "y":[float(predonnx['x']),float(predml['y'])]
190
+ })
191
+
192
+ @app.route("/get_response",methods=['POST'])
193
+ def chat():
194
+ res=request.get_json()
195
+ query=res['text']
196
+ inputinvoke={
197
+ "userinput":query,
198
+ "movewhere":"",
199
+ "aimessages":[],
200
+ "query":"",
201
+ "finalanswer":""
202
+ }
203
+ response=cb.graph.invoke(inputinvoke)
204
+ return jsonify(response=response['finalanswer'])
205
+ if __name__=="__main__":
206
+ app.run()