Spaces:
Sleeping
Sleeping
QAway-to
commited on
Commit
·
01961c2
1
Parent(s):
c0326b0
Base app.py interface v2.0
Browse files
app.py
CHANGED
|
@@ -5,11 +5,7 @@ import pandas as pd
|
|
| 5 |
from io import BytesIO
|
| 6 |
from datetime import datetime
|
| 7 |
|
| 8 |
-
# --------------------------------------------------------------
|
| 9 |
-
# ⚙️ Загрузка открытых банковских данных
|
| 10 |
-
# --------------------------------------------------------------
|
| 11 |
def fetch_bank_data():
|
| 12 |
-
"""Получаем курсы валют от Европейского Центробанка."""
|
| 13 |
try:
|
| 14 |
url = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"
|
| 15 |
r = requests.get(url, timeout=10)
|
|
@@ -28,9 +24,6 @@ def fetch_bank_data():
|
|
| 28 |
except Exception as e:
|
| 29 |
return f"❌ Ошибка: {e}", pd.DataFrame()
|
| 30 |
|
| 31 |
-
# --------------------------------------------------------------
|
| 32 |
-
# 🧠 Простая LLM-сводка (эмуляция RAG анализа)
|
| 33 |
-
# --------------------------------------------------------------
|
| 34 |
def analyze_data(df: pd.DataFrame):
|
| 35 |
if df.empty:
|
| 36 |
return "⚠️ Нет данных для анализа."
|
|
@@ -38,22 +31,22 @@ def analyze_data(df: pd.DataFrame):
|
|
| 38 |
weakest = df.iloc[0]
|
| 39 |
return (
|
| 40 |
f"📊 Сводка валют:\n\n"
|
| 41 |
-
f"• Самая сильная валюта
|
| 42 |
-
f"• Самая слабая валюта
|
| 43 |
-
f"• Средний
|
| 44 |
)
|
| 45 |
|
| 46 |
-
#
|
| 47 |
-
# 📤 Экспорт данных в Excel для Power BI
|
| 48 |
-
# --------------------------------------------------------------
|
| 49 |
def export_to_excel(df: pd.DataFrame):
|
| 50 |
if df.empty:
|
| 51 |
return None, "⚠️ Нет данных для экспорта."
|
|
|
|
| 52 |
output = BytesIO()
|
| 53 |
-
|
|
|
|
| 54 |
output.seek(0)
|
| 55 |
-
|
| 56 |
-
return output, f"✅ Отчёт '{filename}' готов для Power BI."
|
| 57 |
|
| 58 |
# --------------------------------------------------------------
|
| 59 |
# 🧱 Интерфейс Gradio
|
|
@@ -61,24 +54,22 @@ def export_to_excel(df: pd.DataFrame):
|
|
| 61 |
with gr.Blocks(theme=gr.themes.Soft(), title="🏦 Banking Data RAG Prototype") as demo:
|
| 62 |
gr.Markdown(
|
| 63 |
"## 🏦 Banking Data RAG Prototype\n"
|
| 64 |
-
"Загружай открытые банковские данные, анализируй
|
| 65 |
-
"_Первая версия RAG-анализа без внешнего LLM-API._"
|
| 66 |
)
|
| 67 |
|
| 68 |
with gr.Row():
|
| 69 |
with gr.Column(scale=1):
|
| 70 |
btn_load = gr.Button("🔄 Загрузить данные", variant="primary")
|
| 71 |
btn_analyze = gr.Button("🧠 Проанализировать")
|
| 72 |
-
btn_export = gr.Button("📤 Экспорт в Power BI
|
| 73 |
with gr.Column(scale=3):
|
| 74 |
status = gr.Textbox(label="Статус", value="Ожидание...")
|
| 75 |
summary = gr.Textbox(label="Сводка анализа", lines=6)
|
| 76 |
table = gr.DataFrame(label="📋 Курсы валют", interactive=False)
|
| 77 |
-
file_out = gr.File(label="Скачать отчёт",
|
| 78 |
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
btn_analyze.click(lambda df: analyze_data(df), [table], [summary])
|
| 82 |
btn_export.click(export_to_excel, [table], [file_out, status])
|
| 83 |
|
| 84 |
demo.queue(max_size=32).launch(server_name="0.0.0.0", server_port=7860)
|
|
|
|
| 5 |
from io import BytesIO
|
| 6 |
from datetime import datetime
|
| 7 |
|
|
|
|
|
|
|
|
|
|
| 8 |
def fetch_bank_data():
|
|
|
|
| 9 |
try:
|
| 10 |
url = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"
|
| 11 |
r = requests.get(url, timeout=10)
|
|
|
|
| 24 |
except Exception as e:
|
| 25 |
return f"❌ Ошибка: {e}", pd.DataFrame()
|
| 26 |
|
|
|
|
|
|
|
|
|
|
| 27 |
def analyze_data(df: pd.DataFrame):
|
| 28 |
if df.empty:
|
| 29 |
return "⚠️ Нет данных для анализа."
|
|
|
|
| 31 |
weakest = df.iloc[0]
|
| 32 |
return (
|
| 33 |
f"📊 Сводка валют:\n\n"
|
| 34 |
+
f"• Самая сильная валюта — **{strongest['Валюта']} ({strongest['Курс к EUR']:.2f})**\n"
|
| 35 |
+
f"• Самая слабая валюта — **{weakest['Валюта']} ({weakest['Курс к EUR']:.2f})**\n"
|
| 36 |
+
f"• Средний курс: **{df['Курс к EUR'].mean():.2f}**"
|
| 37 |
)
|
| 38 |
|
| 39 |
+
# ✅ исправленный экспорт
|
|
|
|
|
|
|
| 40 |
def export_to_excel(df: pd.DataFrame):
|
| 41 |
if df.empty:
|
| 42 |
return None, "⚠️ Нет данных для экспорта."
|
| 43 |
+
filename = f"bank_report_{datetime.now().strftime('%Y%m%d')}.xlsx"
|
| 44 |
output = BytesIO()
|
| 45 |
+
with pd.ExcelWriter(output, engine="openpyxl") as writer:
|
| 46 |
+
df.to_excel(writer, index=False, sheet_name="Rates")
|
| 47 |
output.seek(0)
|
| 48 |
+
# 🟢 Gradio требует именно (file-like, name)
|
| 49 |
+
return gr.File.update(value=output, visible=True, label=filename), f"✅ Отчёт '{filename}' готов для Power BI."
|
| 50 |
|
| 51 |
# --------------------------------------------------------------
|
| 52 |
# 🧱 Интерфейс Gradio
|
|
|
|
| 54 |
with gr.Blocks(theme=gr.themes.Soft(), title="🏦 Banking Data RAG Prototype") as demo:
|
| 55 |
gr.Markdown(
|
| 56 |
"## 🏦 Banking Data RAG Prototype\n"
|
| 57 |
+
"Загружай открытые банковские данные, анализируй и выгружай отчёт для Power BI.\n"
|
|
|
|
| 58 |
)
|
| 59 |
|
| 60 |
with gr.Row():
|
| 61 |
with gr.Column(scale=1):
|
| 62 |
btn_load = gr.Button("🔄 Загрузить данные", variant="primary")
|
| 63 |
btn_analyze = gr.Button("🧠 Проанализировать")
|
| 64 |
+
btn_export = gr.Button("📤 Экспорт в Power BI")
|
| 65 |
with gr.Column(scale=3):
|
| 66 |
status = gr.Textbox(label="Статус", value="Ожидание...")
|
| 67 |
summary = gr.Textbox(label="Сводка анализа", lines=6)
|
| 68 |
table = gr.DataFrame(label="📋 Курсы валют", interactive=False)
|
| 69 |
+
file_out = gr.File(label="Скачать отчёт", visible=False)
|
| 70 |
|
| 71 |
+
btn_load.click(fetch_bank_data, None, [status, table])
|
| 72 |
+
btn_analyze.click(analyze_data, [table], [summary])
|
|
|
|
| 73 |
btn_export.click(export_to_excel, [table], [file_out, status])
|
| 74 |
|
| 75 |
demo.queue(max_size=32).launch(server_name="0.0.0.0", server_port=7860)
|