Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -23,14 +23,16 @@ class PriceScaler:
|
|
| 23 |
self.scaler = MinMaxScaler()
|
| 24 |
|
| 25 |
def fit_transform(self, data):
|
| 26 |
-
#
|
| 27 |
-
|
| 28 |
-
return
|
|
|
|
| 29 |
|
| 30 |
def inverse_transform(self, data):
|
| 31 |
-
#
|
| 32 |
-
|
| 33 |
-
return
|
|
|
|
| 34 |
|
| 35 |
class CryptoPredictor(nn.Module):
|
| 36 |
def __init__(self, input_dim: int, hidden_dim: int = 128, num_layers: int = 2, dropout: float = 0.2):
|
|
@@ -130,10 +132,11 @@ class CryptoAnalyzer:
|
|
| 130 |
return df.iloc[-days:]
|
| 131 |
|
| 132 |
def prepare_data(self, df: pd.DataFrame, lookback: int) -> Tuple[torch.Tensor, torch.Tensor]:
|
|
|
|
| 133 |
features = df[self.feature_columns].values
|
| 134 |
scaled_features = self.scaler.fit_transform(features)
|
| 135 |
|
| 136 |
-
#
|
| 137 |
close_prices = df['Close'].values
|
| 138 |
scaled_close = self.price_scaler.fit_transform(close_prices)
|
| 139 |
|
|
@@ -143,7 +146,7 @@ class CryptoAnalyzer:
|
|
| 143 |
y.append(scaled_close[i + lookback])
|
| 144 |
|
| 145 |
X = torch.FloatTensor(np.array(X)).to(self.device)
|
| 146 |
-
y = torch.FloatTensor(np.array(y)).to(self.device)
|
| 147 |
|
| 148 |
return X, y
|
| 149 |
|
|
@@ -199,7 +202,7 @@ class CryptoAnalyzer:
|
|
| 199 |
try:
|
| 200 |
df = self.get_data(symbol, days)
|
| 201 |
X, y = self.prepare_data(df, lookback)
|
| 202 |
-
|
| 203 |
model_path = self.get_model_path(symbol)
|
| 204 |
if os.path.exists(model_path):
|
| 205 |
model = CryptoPredictor(X.shape[2]).to(self.device)
|
|
@@ -207,19 +210,18 @@ class CryptoAnalyzer:
|
|
| 207 |
else:
|
| 208 |
model = self.train_model(X, y, symbol)
|
| 209 |
joblib.dump(self.scaler, self.get_scaler_path(symbol))
|
| 210 |
-
|
| 211 |
model.eval()
|
| 212 |
with torch.no_grad():
|
| 213 |
predictions, confidence = model(X)
|
| 214 |
-
predictions = predictions.cpu().numpy()
|
| 215 |
-
confidence = confidence.cpu().numpy()
|
| 216 |
|
| 217 |
-
#
|
| 218 |
-
predictions = predictions.reshape(-1)
|
| 219 |
predictions = self.price_scaler.inverse_transform(predictions)
|
| 220 |
|
| 221 |
-
#
|
| 222 |
-
y_np = y.cpu().numpy().
|
| 223 |
actual_prices = self.price_scaler.inverse_transform(y_np)
|
| 224 |
|
| 225 |
rmse = float(np.sqrt(np.mean((actual_prices - predictions) ** 2)))
|
|
|
|
| 23 |
self.scaler = MinMaxScaler()
|
| 24 |
|
| 25 |
def fit_transform(self, data):
|
| 26 |
+
# Ensure data is 2D for fitting
|
| 27 |
+
data_2d = np.array(data).reshape(-1, 1)
|
| 28 |
+
# Transform and return 1D array
|
| 29 |
+
return self.scaler.fit_transform(data_2d).flatten()
|
| 30 |
|
| 31 |
def inverse_transform(self, data):
|
| 32 |
+
# Ensure data is 2D for inverse transform
|
| 33 |
+
data_2d = np.array(data).reshape(-1, 1)
|
| 34 |
+
# Transform and return 1D array
|
| 35 |
+
return self.scaler.inverse_transform(data_2d).flatten()
|
| 36 |
|
| 37 |
class CryptoPredictor(nn.Module):
|
| 38 |
def __init__(self, input_dim: int, hidden_dim: int = 128, num_layers: int = 2, dropout: float = 0.2):
|
|
|
|
| 132 |
return df.iloc[-days:]
|
| 133 |
|
| 134 |
def prepare_data(self, df: pd.DataFrame, lookback: int) -> Tuple[torch.Tensor, torch.Tensor]:
|
| 135 |
+
# Scale features
|
| 136 |
features = df[self.feature_columns].values
|
| 137 |
scaled_features = self.scaler.fit_transform(features)
|
| 138 |
|
| 139 |
+
# Scale close prices - ensure 1D output
|
| 140 |
close_prices = df['Close'].values
|
| 141 |
scaled_close = self.price_scaler.fit_transform(close_prices)
|
| 142 |
|
|
|
|
| 146 |
y.append(scaled_close[i + lookback])
|
| 147 |
|
| 148 |
X = torch.FloatTensor(np.array(X)).to(self.device)
|
| 149 |
+
y = torch.FloatTensor(np.array(y)).reshape(-1).to(self.device)
|
| 150 |
|
| 151 |
return X, y
|
| 152 |
|
|
|
|
| 202 |
try:
|
| 203 |
df = self.get_data(symbol, days)
|
| 204 |
X, y = self.prepare_data(df, lookback)
|
| 205 |
+
|
| 206 |
model_path = self.get_model_path(symbol)
|
| 207 |
if os.path.exists(model_path):
|
| 208 |
model = CryptoPredictor(X.shape[2]).to(self.device)
|
|
|
|
| 210 |
else:
|
| 211 |
model = self.train_model(X, y, symbol)
|
| 212 |
joblib.dump(self.scaler, self.get_scaler_path(symbol))
|
| 213 |
+
|
| 214 |
model.eval()
|
| 215 |
with torch.no_grad():
|
| 216 |
predictions, confidence = model(X)
|
| 217 |
+
predictions = predictions.cpu().numpy().flatten() # Ensure 1D
|
| 218 |
+
confidence = confidence.cpu().numpy().flatten() # Ensure 1D
|
| 219 |
|
| 220 |
+
# Inverse transform predictions
|
|
|
|
| 221 |
predictions = self.price_scaler.inverse_transform(predictions)
|
| 222 |
|
| 223 |
+
# Inverse transform actual values
|
| 224 |
+
y_np = y.cpu().numpy().flatten() # Ensure 1D
|
| 225 |
actual_prices = self.price_scaler.inverse_transform(y_np)
|
| 226 |
|
| 227 |
rmse = float(np.sqrt(np.mean((actual_prices - predictions) ** 2)))
|