GoshawkVortexAI commited on
Commit
2c277cc
·
verified ·
1 Parent(s): 8bfd54f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +61 -22
app.py CHANGED
@@ -9,20 +9,18 @@ from sklearn.neighbors import KNeighborsClassifier
9
  from sklearn.preprocessing import StandardScaler
10
  from groq import Groq
11
 
 
 
 
12
  api_key = os.environ.get("GROQ_API_KEY")
13
  client = Groq(api_key=api_key) if api_key else None
14
 
15
- def load_dataframe(file_obj, url):
 
 
 
 
16
  try:
17
- if url and url.strip():
18
- r = requests.get(url.strip(), headers={"User-Agent": "Mozilla/5.0"}, timeout=30)
19
- r.raise_for_status()
20
- text = r.text
21
- elif file_obj is not None:
22
- text = open(file_obj.name, "r", encoding="utf-8", errors="ignore").read()
23
- else:
24
- return None, "Lütfen dosya yükleyin veya link girin."
25
-
26
  df = pd.read_csv(io.StringIO(text), sep="\t", header=None)
27
  if df.shape[1] < 6:
28
  df = pd.read_csv(io.StringIO(text), sep=",", header=None)
@@ -31,9 +29,11 @@ def load_dataframe(file_obj, url):
31
 
32
  df = df.iloc[:, :6]
33
  df.columns = ["date", "open", "high", "low", "close", "volume"]
 
34
  for c in ["open", "high", "low", "close", "volume"]:
35
  df[c] = pd.to_numeric(df[c], errors="coerce")
36
  df = df.dropna(subset=["close"]).reset_index(drop=True)
 
37
  if len(df) < 60:
38
  return None, f"En az 60 satır gerekli, {len(df)} var."
39
  return df, None
@@ -41,6 +41,22 @@ def load_dataframe(file_obj, url):
41
  return None, f"Veri okunamadı: {e}"
42
 
43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  def compute_rsi(series, period=14):
45
  delta = series.diff()
46
  gain = delta.clip(lower=0).rolling(period).mean()
@@ -56,9 +72,10 @@ def train_models(df):
56
  df["rsi"] = compute_rsi(df["close"], 14)
57
  df["macd"] = df["close"].ewm(span=12).mean() - df["close"].ewm(span=26).mean()
58
  df["target"] = (df["close"].shift(-1) > df["close"]).astype(int)
 
59
  df_model = df.dropna().reset_index(drop=True)
60
  if len(df_model) < 20:
61
- return None, None, None, None, "Yetersiz veri."
62
 
63
  features = ["ma_5", "ma_20", "rsi", "macd", "volume"]
64
  X = df_model[features].values
@@ -87,9 +104,11 @@ def train_models(df):
87
  }
88
  return xgb_model, knn_model, scaler, metrics, None
89
 
90
-
91
- def predict_and_analyze(file_obj, url):
92
- df, err = load_dataframe(file_obj, url)
 
 
93
  if err:
94
  return err, {}
95
 
@@ -97,7 +116,9 @@ def predict_and_analyze(file_obj, url):
97
  if err:
98
  return err, {}
99
 
100
- feat = np.array([[metrics["ma5"], metrics["ma20"], metrics["rsi"], metrics["macd"], metrics["volume"]]])
 
 
101
  xgb_up = float(xgb_model.predict_proba(feat)[0][1])
102
  knn_up = float(knn_model.predict_proba(scaler.transform(feat))[0][1])
103
  ens_up = (xgb_up + knn_up) / 2
@@ -138,30 +159,48 @@ def predict_and_analyze(file_obj, url):
138
  header = (
139
  f"**Son: ${metrics['last_close']:,.2f}** | RSI: {metrics['rsi']:.1f} | "
140
  f"MA5: ${metrics['ma5']:,.0f} | MA20: ${metrics['ma20']:,.0f}\n\n"
141
- f"**XGB:** %{xgb_up*100:.1f} | **KNN:** %{knn_up*100:.1f} | **Ens:** %{ens_up*100:.1f}\n\n---\n\n"
 
142
  )
143
  return header + analysis, prob_dict
144
 
145
-
 
 
146
  with gr.Blocks(theme=gr.themes.Soft(primary_hue="orange", secondary_hue="slate")) as demo:
147
  gr.Markdown(
148
  """
149
  # ₿ BTC/USD XGBoost + KNN & Groq AI Tahmin Radarı
150
- **Başlıksız** TSV/CSV yükleyin (Date, Open, High, Low, Close, Volume) **veya** link girin.
 
 
151
  """
152
  )
 
153
  with gr.Row():
154
  with gr.Column():
155
- file_input = gr.File(label="Dosya Yükle (.csv / .tsv / .txt)", file_types=[".csv", ".tsv", ".txt"])
156
- url_input = gr.Textbox(label="veya Link (URL)", placeholder="https://.../BTCUSD30.csv")
 
 
 
 
 
 
 
 
 
 
 
157
  submit_btn = gr.Button("Analiz Et", variant="primary")
 
158
  with gr.Column():
159
  prob_output = gr.Label(label="Model Tahminleri")
160
- analysis_output = gr.Markdown(value="Veri yükleyip butona basın.")
161
 
162
  submit_btn.click(
163
  fn=predict_and_analyze,
164
- inputs=[file_input, url_input],
165
  outputs=[analysis_output, prob_output]
166
  )
167
 
 
9
  from sklearn.preprocessing import StandardScaler
10
  from groq import Groq
11
 
12
+ # ==========================================
13
+ # 🔌 1. GROQ CLIENT
14
+ # ==========================================
15
  api_key = os.environ.get("GROQ_API_KEY")
16
  client = Groq(api_key=api_key) if api_key else None
17
 
18
+ # ==========================================
19
+ # 📊 2. VERİ OKUMA (Tab/CSV, başlıksız)
20
+ # ==========================================
21
+ def parse_data(text):
22
+ """Tab veya virgülle ayrılmış, başlıksız veriyi okur."""
23
  try:
 
 
 
 
 
 
 
 
 
24
  df = pd.read_csv(io.StringIO(text), sep="\t", header=None)
25
  if df.shape[1] < 6:
26
  df = pd.read_csv(io.StringIO(text), sep=",", header=None)
 
29
 
30
  df = df.iloc[:, :6]
31
  df.columns = ["date", "open", "high", "low", "close", "volume"]
32
+
33
  for c in ["open", "high", "low", "close", "volume"]:
34
  df[c] = pd.to_numeric(df[c], errors="coerce")
35
  df = df.dropna(subset=["close"]).reset_index(drop=True)
36
+
37
  if len(df) < 60:
38
  return None, f"En az 60 satır gerekli, {len(df)} var."
39
  return df, None
 
41
  return None, f"Veri okunamadı: {e}"
42
 
43
 
44
+ def get_dataframe(raw_text, url):
45
+ """Önce yapıştırılan metni, yoksa URL'yi dener."""
46
+ if raw_text and raw_text.strip():
47
+ return parse_data(raw_text)
48
+ if url and url.strip():
49
+ try:
50
+ r = requests.get(url.strip(), headers={"User-Agent": "Mozilla/5.0"}, timeout=30)
51
+ r.raise_for_status()
52
+ return parse_data(r.text)
53
+ except Exception as e:
54
+ return None, f"URL okunamadı: {e}"
55
+ return None, "Lütfen CSV içeriğini yapıştırın veya bir URL girin."
56
+
57
+ # ==========================================
58
+ # 🧮 3. TEKNİK GÖSTERGELER + MODEL
59
+ # ==========================================
60
  def compute_rsi(series, period=14):
61
  delta = series.diff()
62
  gain = delta.clip(lower=0).rolling(period).mean()
 
72
  df["rsi"] = compute_rsi(df["close"], 14)
73
  df["macd"] = df["close"].ewm(span=12).mean() - df["close"].ewm(span=26).mean()
74
  df["target"] = (df["close"].shift(-1) > df["close"]).astype(int)
75
+
76
  df_model = df.dropna().reset_index(drop=True)
77
  if len(df_model) < 20:
78
+ return None, None, None, None, "Göstergelerden sonra yetersiz veri."
79
 
80
  features = ["ma_5", "ma_20", "rsi", "macd", "volume"]
81
  X = df_model[features].values
 
104
  }
105
  return xgb_model, knn_model, scaler, metrics, None
106
 
107
+ # ==========================================
108
+ # 🧠 4. ANALİZ FONKSİYONU
109
+ # ==========================================
110
+ def predict_and_analyze(raw_text, url):
111
+ df, err = get_dataframe(raw_text, url)
112
  if err:
113
  return err, {}
114
 
 
116
  if err:
117
  return err, {}
118
 
119
+ feat = np.array([[metrics["ma5"], metrics["ma20"], metrics["rsi"],
120
+ metrics["macd"], metrics["volume"]]])
121
+
122
  xgb_up = float(xgb_model.predict_proba(feat)[0][1])
123
  knn_up = float(knn_model.predict_proba(scaler.transform(feat))[0][1])
124
  ens_up = (xgb_up + knn_up) / 2
 
159
  header = (
160
  f"**Son: ${metrics['last_close']:,.2f}** | RSI: {metrics['rsi']:.1f} | "
161
  f"MA5: ${metrics['ma5']:,.0f} | MA20: ${metrics['ma20']:,.0f}\n\n"
162
+ f"**XGB:** %{xgb_up*100:.1f} | **KNN:** %{knn_up*100:.1f} | "
163
+ f"**Ens:** %{ens_up*100:.1f}\n\n---\n\n"
164
  )
165
  return header + analysis, prob_dict
166
 
167
+ # ==========================================
168
+ # 🎨 5. GRADIO ARAYÜZÜ
169
+ # ==========================================
170
  with gr.Blocks(theme=gr.themes.Soft(primary_hue="orange", secondary_hue="slate")) as demo:
171
  gr.Markdown(
172
  """
173
  # ₿ BTC/USD XGBoost + KNN & Groq AI Tahmin Radarı
174
+ **Dosya seçici kaldırıldı.** CSV içeriğini doğrudan aşağıya yapıştırın **veya** bir URL girin.
175
+ Veri **tab veya virgülle ayrılmış, başlıksız** olmalı:
176
+ `Date, Open, High, Low, Close, Volume`
177
  """
178
  )
179
+
180
  with gr.Row():
181
  with gr.Column():
182
+ gr.Markdown("### 📋 CSV İçeriğini Yapıştır")
183
+ raw_input = gr.Textbox(
184
+ label="CSV/TSV İçeriği",
185
+ placeholder="2021-02-04 11:30\t37826.1\t37916.7\t37359.8\t37359.8\t5032\n...",
186
+ lines=10
187
+ )
188
+
189
+ gr.Markdown("### 🔗 veya URL")
190
+ url_input = gr.Textbox(
191
+ label="CSV Linki",
192
+ placeholder="https://raw.githubusercontent.com/.../BTCUSD30.csv"
193
+ )
194
+
195
  submit_btn = gr.Button("Analiz Et", variant="primary")
196
+
197
  with gr.Column():
198
  prob_output = gr.Label(label="Model Tahminleri")
199
+ analysis_output = gr.Markdown(value="Veri girip butona basın.")
200
 
201
  submit_btn.click(
202
  fn=predict_and_analyze,
203
+ inputs=[raw_input, url_input],
204
  outputs=[analysis_output, prob_output]
205
  )
206