import pandas as pd import numpy as np import matplotlib.pyplot as plt import yfinance as yf from keras.models import Sequential from sklearn.preprocessing import MinMaxScaler from keras.layers.core import Dense,Dropout,Activation from tensorflow.keras.layers import LSTM #from keras.layers.recurrent import LSTM from datetime import date import gradio as gr def create_dataset(dataset,time_step=15): x_ind,y_dep =[],[] for i in range(len(dataset)-time_step-1): a=dataset[i:(i+time_step),0] x_ind.append(a) y_dep.append(dataset[i+time_step,0]) return np.array(x_ind),np.array(y_dep) def stockprice(stockname,number_of_samples): df_yahoo = yf.download(stockname,start='2020-09-15',end=date.today(),interval = "1h",progress=False,auto_adjust=True) df=df_yahoo df.index.rename('Date', inplace=True) df=df.sort_values(by=['Date'],ignore_index=True) min_max_scaler=MinMaxScaler(feature_range=(0,1)) dataset=min_max_scaler.fit_transform(df['Close'].values.reshape(-1,1)) train_size=int(len(df)*0.8) test_size=len(df)-train_size Train=dataset[0:train_size,:] Test=dataset[train_size:len(dataset),:] x_train,y_train=create_dataset(Train,time_step=15) x_test,y_test=create_dataset(Test,time_step=15) x_train=np.reshape(x_train,(x_train.shape[0],1,x_train.shape[1])) x_test=np.reshape(x_test,(x_test.shape[0],1,x_test.shape[1])) time_step=15 model=Sequential() model.add(LSTM(20,input_shape=(1,time_step))) model.add(Dense(1)) model.compile(loss="mean_squared_error",optimizer='adam') model.fit(x_train,y_train,epochs=100,verbose=0) y_pred=model.predict(x_test) y_pred_RNN=min_max_scaler.inverse_transform(y_pred) y_test=np.expand_dims(y_test,axis=1) y_test=min_max_scaler.inverse_transform(y_test) df1=df.drop(["Volume","Open","High","Low"],axis=1) a= int(number_of_samples)*15 new_data = df1[-(a+1):-1] last60prices=np.array(new_data) last60prices=last60prices.reshape(-1, 1) X=min_max_scaler.transform(last60prices) TimeSteps=int(15) NumFeatures=int(1) number_of_samples=int(number_of_samples) X=X.reshape(number_of_samples, NumFeatures, TimeSteps) predicted_Price = model.predict(X) predicted_Price = min_max_scaler.inverse_transform(predicted_Price) pred_df=pd.DataFrame(list(map(lambda x: x[0], predicted_Price)),columns=["PREDICTIONS"]) pred_df.reset_index(inplace=True) pred_df = pred_df.rename(columns = {'index':'HOURS'}) pred_df['HOURS'] = np.arange(1, len(pred_df) + 1) plt.figure(figsize=(15, 6)) range_history = len(new_data) range_future = list(range(range_history, range_history +len(predicted_Price))) plt.plot(np.arange(range_history), np.array(new_data),label='History') plt.plot(range_future, np.array(predicted_Price),label='Forecasted for RNN') plt.legend(loc='upper right') plt.xlabel('Time step (hour)') plt.ylabel('Stock Price') return pred_df,plt.gcf() interface = gr.Interface(fn = stockprice, inputs = [gr.inputs.Textbox(lines=1, placeholder="Enter STOCK-TICKER", default="FB", label="STOCKNAME"), gr.inputs.Slider(minimum=0, maximum=150, step=1, default=5, label="Number of Sample to Predict")], outputs = ["dataframe","plot"], description="LSTM STOCK PREDICTION") interface.launch()