mrshibly commited on
Commit
17ea6b8
·
verified ·
1 Parent(s): 6816ccb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +10 -16
app.py CHANGED
@@ -1,10 +1,11 @@
1
  import gradio as gr
2
  import torch
 
3
  import numpy as np
4
  from sklearn.preprocessing import MinMaxScaler
5
  import pandas as pd
6
 
7
- # Load and preprocess data
8
  df = pd.read_csv('HistoricalQuotes.csv')
9
  df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y')
10
  df.set_index('Date', inplace=True)
@@ -13,46 +14,39 @@ df = df.sort_index()
13
  df['Close'] = df['Close'].replace({r'\$': ''}, regex=True).astype(float)
14
 
15
  scaler = MinMaxScaler(feature_range=(0, 1))
16
- scaled_data = scaler.fit_transform(df['Close'].values.reshape(-1, 1))
17
 
18
  # Define LSTM model
19
  class LSTMModel(nn.Module):
20
- def __init__(self, input_size=1, hidden_size=50, num_layers=2, output_size=1, dropout=0.2):
21
  super().__init__()
22
  self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True, dropout=dropout)
23
  self.fc = nn.Linear(hidden_size, output_size)
24
 
25
  def forward(self, x):
26
- h0 = torch.zeros(num_layers, x.size(0), 50)
27
- c0 = torch.zeros(num_layers, x.size(0), 50)
28
  out, _ = self.lstm(x, (h0, c0))
29
  return self.fc(out[:, -1, :])
30
 
31
- # Load trained model
32
  model = LSTMModel()
33
- model.load_state_dict(torch.load('lstm_model.pth'))
34
  model.eval()
35
 
36
  def forecast(past_prices, steps=30):
37
  try:
38
- # Parse input (comma-separated prices)
39
  prices = [float(x.strip().replace('$', '')) for x in past_prices.split(',')]
40
  if len(prices) < 60:
41
- return "Error: Please provide at least 60 prices."
42
-
43
- # Scale and prepare sequence
44
  prices_scaled = scaler.transform(np.array(prices).reshape(-1, 1))
45
  current_seq = torch.from_numpy(prices_scaled[-60:].reshape(1, 60, 1)).float()
46
-
47
- # Forecast
48
  predictions = []
49
  for _ in range(steps):
50
  with torch.no_grad():
51
  pred_scaled = model(current_seq).item()
52
  predictions.append(pred_scaled)
53
  current_seq = torch.cat((current_seq[:, 1:, :], torch.tensor([[[pred_scaled]]]).float()), dim=1)
54
-
55
- # Inverse transform
56
  predictions = scaler.inverse_transform(np.array(predictions).reshape(-1, 1)).flatten()
57
  return pd.DataFrame({'Forecast': predictions}).to_string()
58
  except Exception as e:
@@ -61,7 +55,7 @@ def forecast(past_prices, steps=30):
61
  # Create Gradio interface
62
  iface = gr.Interface(
63
  fn=forecast,
64
- inputs=gr.Textbox(label="Past Prices (comma-separated, at least 60, e.g., 273.36,273.52,...)"),
65
  outputs=gr.Textbox(label="Forecasted Prices")
66
  )
67
  iface.launch(share=True)
 
1
  import gradio as gr
2
  import torch
3
+ import torch.nn as nn # Added missing import
4
  import numpy as np
5
  from sklearn.preprocessing import MinMaxScaler
6
  import pandas as pd
7
 
8
+ # Load data and scaler
9
  df = pd.read_csv('HistoricalQuotes.csv')
10
  df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y')
11
  df.set_index('Date', inplace=True)
 
14
  df['Close'] = df['Close'].replace({r'\$': ''}, regex=True).astype(float)
15
 
16
  scaler = MinMaxScaler(feature_range=(0, 1))
17
+ scaler.fit(df['Close'].values.reshape(-1, 1))
18
 
19
  # Define LSTM model
20
  class LSTMModel(nn.Module):
21
+ def __init__(self, input_size=1, hidden_size=100, num_layers=2, output_size=1, dropout=0.2):
22
  super().__init__()
23
  self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True, dropout=dropout)
24
  self.fc = nn.Linear(hidden_size, output_size)
25
 
26
  def forward(self, x):
27
+ h0 = torch.zeros(num_layers, x.size(0), 100)
28
+ c0 = torch.zeros(num_layers, x.size(0), 100)
29
  out, _ = self.lstm(x, (h0, c0))
30
  return self.fc(out[:, -1, :])
31
 
32
+ # Load model
33
  model = LSTMModel()
34
+ model.load_state_dict(torch.load('lstm_model.pth', map_location=torch.device('cpu'))) # Added map_location for compatibility
35
  model.eval()
36
 
37
  def forecast(past_prices, steps=30):
38
  try:
 
39
  prices = [float(x.strip().replace('$', '')) for x in past_prices.split(',')]
40
  if len(prices) < 60:
41
+ return "Error: At least 60 prices required."
 
 
42
  prices_scaled = scaler.transform(np.array(prices).reshape(-1, 1))
43
  current_seq = torch.from_numpy(prices_scaled[-60:].reshape(1, 60, 1)).float()
 
 
44
  predictions = []
45
  for _ in range(steps):
46
  with torch.no_grad():
47
  pred_scaled = model(current_seq).item()
48
  predictions.append(pred_scaled)
49
  current_seq = torch.cat((current_seq[:, 1:, :], torch.tensor([[[pred_scaled]]]).float()), dim=1)
 
 
50
  predictions = scaler.inverse_transform(np.array(predictions).reshape(-1, 1)).flatten()
51
  return pd.DataFrame({'Forecast': predictions}).to_string()
52
  except Exception as e:
 
55
  # Create Gradio interface
56
  iface = gr.Interface(
57
  fn=forecast,
58
+ inputs=gr.Textbox(label="Past Prices (comma-separated, e.g., 273.36,273.52,...)"),
59
  outputs=gr.Textbox(label="Forecasted Prices")
60
  )
61
  iface.launch(share=True)