rag-prototype / app.py
QAway-to
Base app.py interface v2.5
87ce0fc
# app.py
import gradio as gr
import requests
import pandas as pd
from datetime import datetime
import os
# --------------------------------------------------------------
# ⚙️ Получение данных
# --------------------------------------------------------------
def fetch_bank_data():
try:
url = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"
r = requests.get(url, timeout=10)
r.raise_for_status()
from xml.etree import ElementTree as ET
root = ET.fromstring(r.text)
data = [
{"Валюта": c.attrib["currency"], "Курс к EUR": float(c.attrib["rate"])}
for c in root.findall(".//{*}Cube[@currency]")
]
df = pd.DataFrame(data).sort_values("Курс к EUR")
return "✅ Данные успешно загружены (ECB)", df
except Exception as e:
return f"❌ Ошибка: {e}", pd.DataFrame()
# --------------------------------------------------------------
# Анализ данных
# --------------------------------------------------------------
def analyze_data(df: pd.DataFrame):
if df.empty:
return "⚠️ Нет данных для анализа."
strongest, weakest = df.iloc[-1], df.iloc[0]
return (
f"📊 Сводка валют:\n\n"
f"• Самая сильная валюта — **{strongest['Валюта']} ({strongest['Курс к EUR']:.2f})**\n"
f"• Самая слабая валюта — **{weakest['Валюта']} ({weakest['Курс к EUR']:.2f})**\n"
f"• Средний курс: **{df['Курс к EUR'].mean():.2f}**"
)
# --------------------------------------------------------------
# Генерация SWOT-анализа (эмуляция RAG)
# --------------------------------------------------------------
def generate_swot(df: pd.DataFrame):
if df.empty:
return "⚠️ Нет данных для SWOT-анализа."
strongest, weakest = df.iloc[-1], df.iloc[0]
avg = df["Курс к EUR"].mean()
return (
f"💡 **SWOT-анализ валютного рынка (по данным ЕЦБ)**\n\n"
f"**Strengths (Сильные стороны):**\n"
f"- Стабильность курса евро как базовой валюты.\n"
f"- {strongest['Валюта']} демонстрирует наибольшую устойчивость.\n\n"
f"**Weaknesses (Слабости):**\n"
f"- {weakest['Валюта']} имеет низкую покупательную способность.\n"
f"- Зависимость многих валют от макроэкономических факторов.\n\n"
f"**Opportunities (Возможности):**\n"
f"- Потенциал для инвестиций в растущие валюты.\n"
f"- Использование колебаний курса для арбитража.\n\n"
f"**Threats (Угрозы):**\n"
f"- Глобальные кризисы и политическая нестабильность.\n"
f"- Волатильность курсов ниже среднего ({avg:.2f})."
)
# --------------------------------------------------------------
# Экспорт в Excel (Power BI)
# --------------------------------------------------------------
def export_to_excel(df: pd.DataFrame):
if df.empty:
return None, "⚠️ Нет данных для экспорта."
filename = f"bank_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.xlsx"
filepath = os.path.join(os.getcwd(), filename)
try:
with pd.ExcelWriter(filepath, engine="openpyxl") as writer:
# Лист 1 — данные
df.to_excel(writer, index=False, sheet_name="Rates")
# Лист 2 — аналитика
summary_text = analyze_data(df)
summary_df = pd.DataFrame({"RAG Summary": [summary_text]})
summary_df.to_excel(writer, index=False, sheet_name="AI_Analysis")
# Лист 3 — SWOT
swot_text = generate_swot(df)
swot_df = pd.DataFrame({"SWOT Analysis": [swot_text]})
swot_df.to_excel(writer, index=False, sheet_name="SWOT_AI")
return filepath, f"✅ Отчёт '{filename}' готов. Можно загрузить в Power BI."
except Exception as e:
return None, f"❌ Ошибка при создании файла: {e}"
# --------------------------------------------------------------
# Интерфейс Gradio
# --------------------------------------------------------------
with gr.Blocks(theme=gr.themes.Soft(), title="🏦 Banking Data RAG Prototype") as demo:
gr.Markdown(
"## 🏦 Banking Data RAG Prototype\n"
"Загружай открытые банковские данные, выполняй RAG-анализ и выгружай отчёт для Power BI."
)
with gr.Row():
with gr.Column(scale=1):
btn_load = gr.Button(" Загрузить данные", variant="primary")
btn_analyze = gr.Button(" Сводный анализ")
btn_swot = gr.Button(" SWOT-анализ")
btn_export = gr.Button(" Экспорт в Power BI")
with gr.Column(scale=3):
status = gr.Textbox(label="Статус", value="Ожидание...")
summary = gr.Textbox(label="Сводка анализа", lines=6)
swot = gr.Textbox(label="SWOT-анализ", lines=10)
table = gr.DataFrame(label=" Курсы валют", interactive=False)
file_out = gr.File(label="Скачать отчёт")
# Кнопки
btn_load.click(fetch_bank_data, None, [status, table])
btn_analyze.click(analyze_data, [table], [summary])
btn_swot.click(generate_swot, [table], [swot])
btn_export.click(export_to_excel, [table], [file_out, status])
demo.queue(max_size=32).launch(server_name="0.0.0.0", server_port=7860)