lda_analyze / app.py
daswer123's picture
Upload 3 files
f147e1e verified
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()