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