daafa999 commited on
Commit
3635c9e
·
verified ·
1 Parent(s): b9aabc8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +14 -11
app.py CHANGED
@@ -9,9 +9,12 @@ from sklearn.preprocessing import MinMaxScaler
9
  import joblib
10
  import os
11
  import warnings
 
 
12
  warnings.filterwarnings('ignore')
13
 
14
- app = FastAPI(title="Crypto ML Strategy (Paper 2105.06827v3)")
 
15
 
16
  SYMBOL = "ETH/USDT"
17
  TIMEFRAME = "4h"
@@ -29,16 +32,11 @@ def fetch_data(symbol: str, timeframe: str, limit: int = 2000) -> pd.DataFrame:
29
 
30
  def prepare_dataset(df: pd.DataFrame):
31
  df = df.copy()
32
- # Nonaktifkan warning pandas-ta vs pandas 2.x
33
- import warnings
34
- warnings.filterwarnings("ignore", category=FutureWarning)
35
-
36
  df.ta.rsi(append=True)
37
  df.ta.macd(append=True)
38
  df.ta.bbands(append=True)
39
  df.ta.cci(append=True)
40
  df.dropna(inplace=True)
41
-
42
  df["next_close"] = df["close"].shift(-1)
43
  df["label"] = (df["next_close"] > df["close"] * (1 + FEE)).astype(int)
44
  df.dropna(inplace=True)
@@ -56,7 +54,7 @@ def prepare_dataset(df: pd.DataFrame):
56
  X_scaled = scaler.fit_transform(X)
57
  return X_scaled, y, idx_list, df, scaler
58
 
59
- @app.get("/api/train")
60
  def train_and_backtest():
61
  try:
62
  if os.path.exists(MODEL_PATH):
@@ -105,7 +103,7 @@ def train_and_backtest():
105
  except Exception as e:
106
  raise HTTPException(500, f"Training failed: {str(e)}")
107
 
108
- @app.get("/api/predict")
109
  def predict_next_move():
110
  if not os.path.exists(MODEL_PATH):
111
  raise HTTPException(400, "Model belum dilatih. Panggil /api/train terlebih dahulu.")
@@ -124,7 +122,7 @@ def predict_next_move():
124
  "logic": "Prediksi >0.15% movement dalam 4 jam ke depan"
125
  }
126
 
127
- # 🎨 Gradio UI
128
  def run_train():
129
  return train_and_backtest()
130
 
@@ -140,9 +138,14 @@ with gr.Blocks(title="Crypto ML Predictor") as demo:
140
  with gr.Row():
141
  pred_btn = gr.Button("🔮 Prediksi Pergerakan Berikutnya")
142
  pred_out = gr.JSON(label="Sinyal Prediksi")
 
143
  train_btn.click(run_train, outputs=train_out)
144
  pred_btn.click(run_predict, outputs=pred_out)
145
  gr.Markdown("⚠️ *File model bersifat temporary. Retrain otomatis jika Space restart.*")
146
 
147
- # ⚙️ Mount Gradio ke FastAPI
148
- app = gr.mount_gradio_app(app, demo, path="/")
 
 
 
 
 
9
  import joblib
10
  import os
11
  import warnings
12
+ import uvicorn
13
+
14
  warnings.filterwarnings('ignore')
15
 
16
+ # 🔹 1. FastAPI App
17
+ fastapi_app = FastAPI(title="Crypto ML Strategy (Paper 2105.06827v3)")
18
 
19
  SYMBOL = "ETH/USDT"
20
  TIMEFRAME = "4h"
 
32
 
33
  def prepare_dataset(df: pd.DataFrame):
34
  df = df.copy()
 
 
 
 
35
  df.ta.rsi(append=True)
36
  df.ta.macd(append=True)
37
  df.ta.bbands(append=True)
38
  df.ta.cci(append=True)
39
  df.dropna(inplace=True)
 
40
  df["next_close"] = df["close"].shift(-1)
41
  df["label"] = (df["next_close"] > df["close"] * (1 + FEE)).astype(int)
42
  df.dropna(inplace=True)
 
54
  X_scaled = scaler.fit_transform(X)
55
  return X_scaled, y, idx_list, df, scaler
56
 
57
+ @fastapi_app.get("/api/train")
58
  def train_and_backtest():
59
  try:
60
  if os.path.exists(MODEL_PATH):
 
103
  except Exception as e:
104
  raise HTTPException(500, f"Training failed: {str(e)}")
105
 
106
+ @fastapi_app.get("/api/predict")
107
  def predict_next_move():
108
  if not os.path.exists(MODEL_PATH):
109
  raise HTTPException(400, "Model belum dilatih. Panggil /api/train terlebih dahulu.")
 
122
  "logic": "Prediksi >0.15% movement dalam 4 jam ke depan"
123
  }
124
 
125
+ # 🔹 2. Gradio UI
126
  def run_train():
127
  return train_and_backtest()
128
 
 
138
  with gr.Row():
139
  pred_btn = gr.Button("🔮 Prediksi Pergerakan Berikutnya")
140
  pred_out = gr.JSON(label="Sinyal Prediksi")
141
+
142
  train_btn.click(run_train, outputs=train_out)
143
  pred_btn.click(run_predict, outputs=pred_out)
144
  gr.Markdown("⚠️ *File model bersifat temporary. Retrain otomatis jika Space restart.*")
145
 
146
+ # 🔹 3. Mount & Run Server
147
+ app = gr.mount_gradio_app(fastapi_app, demo, path="/")
148
+
149
+ # ✅ CRITICAL: HF Spaces butuh server yang blocking di port 7860
150
+ if __name__ == "__main__":
151
+ uvicorn.run(app, host="0.0.0.0", port=7860)