File size: 6,099 Bytes
14df075
aa32941
296469d
 
c0326b0
2fa5186
aa32941
2fa5186
 
 
296469d
 
9aa2a23
 
 
14df075
9aa2a23
 
2fa5186
 
 
 
c0326b0
9aa2a23
296469d
9aa2a23
aa32941
2fa5186
2de0ed6
2fa5186
c0326b0
 
 
2fa5186
c0326b0
 
01961c2
 
 
c0326b0
 
408bfed
2de0ed6
408bfed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2fa5186
2de0ed6
2fa5186
c0326b0
 
 
2fa5186
 
 
 
 
 
408bfed
2fa5186
 
408bfed
2fa5186
 
 
 
408bfed
 
 
 
 
2fa5186
 
 
c0326b0
 
2de0ed6
c0326b0
 
 
 
408bfed
c0326b0
 
90ba9ea
 
87ce0fc
 
 
 
296469d
9aa2a23
c0326b0
408bfed
87ce0fc
2fa5186
c0326b0
408bfed
01961c2
 
408bfed
c0326b0
aa32941
296469d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# 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)