QAway-to commited on
Commit
be92cc8
·
1 Parent(s): ae4da3f

Base app.py interface v1.3

Browse files
Files changed (1) hide show
  1. app.py +60 -70
app.py CHANGED
@@ -1,16 +1,14 @@
1
- # app.py — Financial RAG → Power BI
2
  import gradio as gr
3
- import asyncio
4
- from itertools import cycle
5
- from datetime import datetime
6
  import requests
7
  import pandas as pd
8
  from transformers import pipeline
 
9
 
10
- # ============================================================
11
  # ⚙️ Конфигурация
12
- # ============================================================
13
- FRED_API_KEY = "YOUR_FRED_API_KEY" # зарегистрируй на https://fred.stlouisfed.org
14
  FRED_URL = "https://api.stlouisfed.org/fred/series/observations"
15
 
16
  INDICATORS = {
@@ -22,99 +20,91 @@ INDICATORS = {
22
 
23
  generator = pipeline("text2text-generation", model="google/flan-t5-base")
24
 
25
- # ============================================================
26
- # 🌀 Асинхронная анимация "Loading..."
27
- # ============================================================
28
- async def async_loader(update_fn, delay=0.12):
29
- frames = cycle(["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"])
30
- for frame in frames:
31
- update_fn(f"💭 Fetching financial data... {frame}")
32
- await asyncio.sleep(delay)
33
-
34
- # ============================================================
35
- # 📈 Основная логика: загрузка, анализ, экспорт
36
- # ============================================================
37
- def get_fred_data(series_id, start="2024-01-01"):
38
  params = {
39
  "series_id": series_id,
40
  "api_key": FRED_API_KEY,
41
  "file_type": "json",
42
- "observation_start": start,
43
  }
44
- r = requests.get(FRED_URL, params=params)
45
- data = r.json().get("observations", [])
46
  df = pd.DataFrame(data)
47
  if df.empty:
48
  return pd.DataFrame()
49
  df["value"] = pd.to_numeric(df["value"], errors="coerce")
50
- return df.tail(10)
51
-
52
- def analyze_and_export(indicator_name, progress_text):
53
- """Потоковая функция, полностью в стиле MBTI-интерфейса."""
54
- if not indicator_name:
55
- yield "⚠️ Select indicator first.", "", progress_text
56
- return
57
 
58
- # шаг 1 — загрузка данных
59
- yield "📡 Requesting latest data from FRED...", "⏳ Fetching...", "1/3"
60
  series_id = INDICATORS[indicator_name]
61
- df = get_fred_data(series_id)
62
  if df.empty:
63
- yield "⚠️ No data received.", "", "1/3"
64
- return
65
 
66
- # шаг 2 подготовка контекста
67
- recent = df.tail(5)
68
- trend = recent["value"].pct_change().mean() * 100
69
- context = f"Recent {indicator_name} values:\n{recent[['date','value']].to_string(index=False)}"
70
- yield "📊 Data fetched successfully.", "💭 Generating analytical summary...", "2/3"
71
-
72
- # шаг 3 — генерация аналитики
73
  prompt = (
74
  f"Analyze the following economic indicator data and describe the recent trend:\n"
75
  f"{context}\nAverage change: {trend:.2f}%"
76
  )
77
  try:
78
- response = generator(prompt, max_new_tokens=150)[0]["generated_text"]
79
  except Exception as e:
80
- response = f"⚠️ LLM generation error: {e}"
81
 
82
- # шаг 4 — экспорт в CSV
83
- filename = f"powerbi_{indicator_name.lower().replace(' ','_')}.csv"
84
- df.to_csv(filename, index=False)
85
- yield response, f"✅ Exported to {filename}", "3/3"
86
 
87
- # ============================================================
88
- # 🧱 Gradio UI (в том же формате, что MBTI)
89
- # ============================================================
90
- with gr.Blocks(theme=gr.themes.Soft(), title="🏦 Financial RAG → Power BI") as demo:
91
  gr.Markdown(
92
- "## 🏦 Financial RAG → Power BI\n"
93
- "Получай аналитические сводки по банковским показателям (FRED API) "
94
- экспортируй их прямо в Power BI CSV.\n\n"
95
- "_Интерфейс в том же формате, что MBTI Interviewer._"
 
96
  )
97
 
98
  with gr.Row():
99
  with gr.Column(scale=1):
100
- indicator_in = gr.Dropdown(
101
- choices=list(INDICATORS.keys()),
102
  label="Выберите показатель",
103
- value="Inflation (CPI)"
 
104
  )
105
- run_btn = gr.Button("📈 Сформировать отчёт", variant="primary")
106
 
107
- with gr.Column(scale=1):
108
- summary_out = gr.Textbox(label="📊 Аналитическая сводка", lines=7)
109
- status_out = gr.Textbox(label="💬 Статус", lines=2)
110
- progress_out = gr.Textbox(label="📊 Прогресс", value="0/3")
 
 
 
 
 
 
 
111
 
112
- # Кнопка → потоковая функция
113
- run_btn.click(
114
- analyze_and_export,
115
- inputs=[indicator_in, progress_out],
116
- outputs=[summary_out, status_out, progress_out],
117
  show_progress=True,
118
  )
119
 
120
- demo.queue(max_size=32).launch(server_name="0.0.0.0", server_port=7860)
 
 
 
 
 
 
1
+ # app.py — Financial RAG Dashboard
2
  import gradio as gr
 
 
 
3
  import requests
4
  import pandas as pd
5
  from transformers import pipeline
6
+ from datetime import datetime
7
 
8
+ # ======================================================
9
  # ⚙️ Конфигурация
10
+ # ======================================================
11
+ FRED_API_KEY = "YOUR_FRED_API_KEY"
12
  FRED_URL = "https://api.stlouisfed.org/fred/series/observations"
13
 
14
  INDICATORS = {
 
20
 
21
  generator = pipeline("text2text-generation", model="google/flan-t5-base")
22
 
23
+ # ======================================================
24
+ # 🧠 Логика
25
+ # ======================================================
26
+ def fetch_fred_data(series_id: str, start_date="2024-01-01"):
 
 
 
 
 
 
 
 
 
27
  params = {
28
  "series_id": series_id,
29
  "api_key": FRED_API_KEY,
30
  "file_type": "json",
31
+ "observation_start": start_date,
32
  }
33
+ response = requests.get(FRED_URL, params=params)
34
+ data = response.json().get("observations", [])
35
  df = pd.DataFrame(data)
36
  if df.empty:
37
  return pd.DataFrame()
38
  df["value"] = pd.to_numeric(df["value"], errors="coerce")
39
+ return df[["date", "value"]].tail(12)
 
 
 
 
 
 
40
 
41
+ def generate_financial_summary(indicator_name: str):
42
+ """Основная функция загружает данные, генерирует сводку, экспортирует CSV."""
43
  series_id = INDICATORS[indicator_name]
44
+ df = fetch_fred_data(series_id)
45
  if df.empty:
46
+ return "⚠️ No data found.", None
 
47
 
48
+ # --- контекст для LLM ---
49
+ trend = df["value"].pct_change().mean() * 100
50
+ context = f"Recent {indicator_name} data:\n{df.to_string(index=False)}"
 
 
 
 
51
  prompt = (
52
  f"Analyze the following economic indicator data and describe the recent trend:\n"
53
  f"{context}\nAverage change: {trend:.2f}%"
54
  )
55
  try:
56
+ summary = generator(prompt, max_new_tokens=150)[0]["generated_text"]
57
  except Exception as e:
58
+ summary = f"⚠️ LLM generation error: {e}"
59
 
60
+ # --- экспорт ---
61
+ file_name = f"powerbi_{indicator_name.lower().replace(' ', '_')}.csv"
62
+ df.to_csv(file_name, index=False)
63
+ return summary, file_name
64
 
65
+ # ======================================================
66
+ # 💻 Интерфейс
67
+ # ======================================================
68
+ with gr.Blocks(title="🏦 Financial RAG → Power BI", theme=gr.themes.Soft()) as demo:
69
  gr.Markdown(
70
+ """
71
+ ## 🏦 Financial RAG Dashboard
72
+ Автоматическая аналитика по ключевым банковским показателям (FRED API)
73
+ Экспортируй данные для Power BI и DAX визуализаций.
74
+ """
75
  )
76
 
77
  with gr.Row():
78
  with gr.Column(scale=1):
79
+ indicator_dropdown = gr.Dropdown(
 
80
  label="Выберите показатель",
81
+ choices=list(INDICATORS.keys()),
82
+ value="Inflation (CPI)",
83
  )
84
+ generate_btn = gr.Button("📊 Сформировать отчёт", variant="primary")
85
 
86
+ with gr.Column(scale=2):
87
+ summary_box = gr.Textbox(
88
+ label="📈 Аналитическая сводка",
89
+ placeholder="Здесь появится результат анализа...",
90
+ lines=10,
91
+ )
92
+ export_box = gr.File(label="📂 Файл для Power BI")
93
+
94
+ def run_pipeline(indicator):
95
+ summary, file_path = generate_financial_summary(indicator)
96
+ return summary, file_path
97
 
98
+ generate_btn.click(
99
+ fn=run_pipeline,
100
+ inputs=indicator_dropdown,
101
+ outputs=[summary_box, export_box],
 
102
  show_progress=True,
103
  )
104
 
105
+ gr.Markdown(
106
+ "<center><small>Developed with ❤️ for Financial RAG prototyping • Powered by Hugging Face</small></center>"
107
+ )
108
+
109
+ if __name__ == "__main__":
110
+ demo.launch(server_name="0.0.0.0", server_port=7860)