Spaces:
Build error
Build error
| import gradio as gr | |
| import pandas as pd | |
| import os | |
| from work import LDAAnalyzer | |
| from datetime import datetime | |
| import shutil | |
| BASE_OUTPUT_DIR = "output" | |
| os.makedirs(BASE_OUTPUT_DIR, exist_ok=True) | |
| def create_output_dir(): | |
| """Создание директории для текущего анализа""" | |
| timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") | |
| output_dir = os.path.join(BASE_OUTPUT_DIR, timestamp) | |
| os.makedirs(output_dir, exist_ok=True) | |
| return output_dir | |
| def show_columns(file): | |
| """Получение списка колонок из загруженного файла""" | |
| if file is None: | |
| return gr.Dropdown( | |
| choices=[], | |
| value=None, | |
| interactive=False, | |
| label="Сначала загрузите файл" | |
| ) | |
| try: | |
| df = pd.read_excel(file.name) | |
| columns = [f"{i}: {col}" for i, col in enumerate(df.columns)] | |
| return gr.Dropdown( | |
| choices=columns, | |
| value=None, | |
| interactive=True, | |
| label="Выберите колонку для анализа" | |
| ) | |
| except Exception as e: | |
| return gr.Dropdown( | |
| choices=[], | |
| value=None, | |
| interactive=False, | |
| label=f"Ошибка чтения файла: {str(e)}" | |
| ) | |
| def perform_analysis(file, selected_column, progress=gr.Progress()): | |
| """Выполнение LDA анализа""" | |
| if file is None or selected_column is None: | |
| return ["⚠️ Ошибка: Загрузите файл и выберите колонку", | |
| None, None, None, None, None] | |
| try: | |
| output_dir = create_output_dir() | |
| input_file_path = os.path.join(output_dir, "data.xlsx") | |
| shutil.copy2(file.name, input_file_path) | |
| column_idx = int(selected_column.split(":")[0]) | |
| progress(0, desc="Инициализация...") | |
| analyzer = LDAAnalyzer(input_file_path, column_idx) | |
| # Загрузка данных | |
| progress(0.2, desc="📂 Загрузка данных...") | |
| analyzer.load_data() | |
| # Подготовка данных | |
| progress(0.4, desc="🔄 Подготовка данных...") | |
| analyzer.prepare_data() | |
| # Выполнение анализа | |
| progress(0.6, desc="📊 Выполнение LDA анализа...") | |
| analyzer.perform_lda() | |
| # Получение и подготовка результатов перед сохранением | |
| progress(0.8, desc="📊 Формирование результатов...") | |
| # Получаем матрицы напрямую из анализатора | |
| confusion_matrix, percentages, accuracy = analyzer.create_confusion_matrix() | |
| coefficients = analyzer.get_coefficients() | |
| # Подготовка данных для отображения | |
| # 1. Матрица классификации | |
| df1 = confusion_matrix.copy() | |
| df1.index = [f"{i+1}.00" for i in range(len(df1))] | |
| df1.insert(0, "Исходный", df1.index) | |
| df1.insert(1, "Количество", df1["Всего"]) | |
| # 2. Проценты классификации | |
| df2 = pd.DataFrame(percentages) | |
| df2.index = [f"{i+1}.00" for i in range(len(df2))] | |
| df2.columns = df1.columns[2:] # Используем те же заголовки | |
| df2.insert(0, "Исходный", df2.index) | |
| df2.insert(1, "Количество", confusion_matrix["Всего"]) | |
| # Добавляем строку с примечанием | |
| note_row = pd.DataFrame({ | |
| "Исходный": f"* Примечание: {accuracy:.1f}% наблюдений классифицированы правильно.", | |
| "Количество": "", | |
| }, index=[""]) | |
| df2 = pd.concat([df2, note_row]) | |
| # 3. Коэффициенты | |
| df3 = coefficients.copy() | |
| df3.index.name = "Переменная" | |
| df3 = df3.reset_index() | |
| # Сохранение результатов | |
| progress(0.9, desc="💾 Сохранение результатов...") | |
| analyzer.save_results(output_dir) | |
| # Пути к файлам | |
| results_file = os.path.join(output_dir, 'lda_results.xlsx') | |
| plot_file = os.path.join(output_dir, 'lda_visualization.png') | |
| progress(1.0, desc="✅ Готово!") | |
| return [ | |
| f"✅ Анализ успешно завершен!\nРезультаты сохранены в: {output_dir}", | |
| df1, | |
| df2, | |
| df3, | |
| plot_file, | |
| results_file | |
| ] | |
| except Exception as e: | |
| error_msg = f"❌ Ошибка при выполнении анализа: {str(e)}" | |
| print(error_msg) # для отладки | |
| return [error_msg, None, None, None, None, None] | |
| with gr.Blocks(title="LDA Анализ", theme=gr.themes.Soft()) as demo: | |
| gr.Markdown(""" | |
| # 📊 LDA Анализ | |
| ### Загрузите Excel файл и выберите колонку для анализа | |
| """) | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| file_input = gr.File( | |
| label="📑 Excel файл", | |
| file_types=[".xlsx", ".xls"], | |
| type="filepath" | |
| ) | |
| with gr.Column(scale=1): | |
| column_select = gr.Dropdown( | |
| label="🎯 Выберите колонку", | |
| choices=[], | |
| interactive=False | |
| ) | |
| with gr.Column(scale=1): | |
| start_btn = gr.Button( | |
| "▶️ Начать анализ", | |
| variant="primary" | |
| ) | |
| status = gr.Markdown("💡 Ожидание начала анализа...") | |
| with gr.Tabs() as tabs: | |
| with gr.Tab("📋 Матрица классификации"): | |
| df1 = gr.Dataframe( | |
| label="Матрица классификации", | |
| headers=None, | |
| datatype="number", | |
| wrap=True, | |
| ) | |
| with gr.Tab("📊 Проценты"): | |
| df2 = gr.Dataframe( | |
| label="Проценты классификации", | |
| headers=None, | |
| datatype="number", | |
| wrap=True | |
| ) | |
| with gr.Tab("📈 Коэффициенты"): | |
| df3 = gr.Dataframe( | |
| label="Коэффициенты функций", | |
| headers=None, | |
| datatype="number", | |
| wrap=True | |
| ) | |
| with gr.Tab("📉 Визуализация"): | |
| with gr.Column(): | |
| results_plot = gr.Image( | |
| label="График результатов", | |
| show_label=True | |
| ) | |
| with gr.Tab("📁 Файлы"): | |
| with gr.Column(): | |
| results_file = gr.File( | |
| label="📊 Скачать полный отчет", | |
| show_label=True | |
| ) | |
| # Обработчики событий | |
| file_input.change( | |
| fn=show_columns, | |
| inputs=[file_input], | |
| outputs=[column_select] | |
| ) | |
| start_btn.click( | |
| fn=perform_analysis, | |
| inputs=[file_input, column_select], | |
| outputs=[ | |
| status, | |
| df1, df2, df3, | |
| results_plot, results_file | |
| ], | |
| show_progress=True | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() |