# 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)