Spaces:
Sleeping
Sleeping
| # 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) | |