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