fruitpicker01's picture
Update app.py
cc4b607 verified
raw
history blame
9.64 kB
import gradio as gr
import pandas as pd
# Функция для загрузки данных из вкладок Excel
def load_dropdown_data(file_path, sheet_name, column_name):
"""Загружает уникальные значения из столбца на заданной вкладке и добавляет 'Не выбрано'."""
data = pd.read_excel(file_path, sheet_name=sheet_name)
unique_values = data[column_name].dropna().unique().tolist()
unique_values = ["Не выбрано"] + unique_values # Добавляем 'Не выбрано' в начало списка
return unique_values
# Путь к файлу
file_path = "Исходные данные.xlsx"
# Загрузка данных
products, data_products = load_dropdown_data(file_path, "Продукты", "Наименование продукта"), pd.read_excel(file_path, sheet_name="Продукты")
genders = load_dropdown_data(file_path, "Пол", "Пол")
generations = load_dropdown_data(file_path, "Поколение", "Поколение")
psychotypes = load_dropdown_data(file_path, "Психотип", "Психотип")
business_stages = load_dropdown_data(file_path, "Стадия бизнеса", "Стадия бизнеса")
industries = load_dropdown_data(file_path, "Отрасль", "Отрасль")
opfs = load_dropdown_data(file_path, "ОПФ", "ОПФ")
# Загрузка данных для "Подход"
approaches_data = pd.read_excel(file_path, sheet_name="Подход")
# Функция для заполнения полей на основе выбранного продукта
def fill_product_details(selected_product, data):
if selected_product and selected_product != "Не выбрано":
product_row = data[data["Наименование продукта"] == selected_product].iloc[0]
return (
product_row.get("Описание предложения", ""),
product_row.get("Наименование продукта", ""),
product_row.get("Преимущества", ""),
product_row.get("Ключевое сообщение", "")
)
return "", "", "", ""
# Функция для получения списка подходов
def get_approaches(gender, generation, psychotype, approaches_df):
if approaches_df is None or approaches_df.empty:
return "Таблица 'Подход' не найдена."
filters = []
for param_name, param_value in [('Пол', gender), ('Поколение', generation), ('Психотип', psychotype)]:
if param_value:
filters.append(approaches_df[param_name].fillna('') == param_value)
else:
filters.append(approaches_df[param_name].isnull() | (approaches_df[param_name].fillna('') == ''))
combined_filter = filters[0]
for f in filters[1:]:
combined_filter &= f
matching_rows = approaches_df[combined_filter]
if matching_rows.empty:
return "Подход не найден для выбранных параметров."
approach_list = []
for approaches in matching_rows['Подход']:
approach_names = [a.strip() for a in str(approaches).split(',')]
approach_list.extend(approach_names)
# Убираем дубликаты
approach_list = list(set(approach_list))
selected_approaches_text_content = ', '.join(approach_list)
return selected_approaches_text_content
# Функция-обёртка для обновления подхода
def update_approach(gender, generation, psychotype):
# Заменяем 'Не выбрано' на None
gender = None if gender == "Не выбрано" else gender
generation = None if generation == "Не выбрано" else generation
psychotype = None if psychotype == "Не выбрано" else psychotype
return get_approaches(gender, generation, psychotype, approaches_data)
# Создание интерфейса
with gr.Blocks(theme="default") as demo:
gr.Markdown("**Процент созданных SMS по выбранному продукту**")
# Прогресс-бар
progress_bar_html = """
<div style="width: 100%; background-color: #e0e0e0; border-radius: 10px; overflow: hidden;">
<div style="width: 0%; background-color: #4caf50; height: 20px; text-align: center; color: white;">
0%
</div>
</div>
"""
gr.HTML(progress_bar_html)
with gr.Row():
with gr.Column(scale=1):
gr.Markdown("**Продукт**")
product_dropdown = gr.Dropdown(
label="Продукт",
choices=products,
value="Не выбрано" # Устанавливаем 'Не выбрано' как значение по умолчанию
)
description = gr.Textbox(label="Описание предложения", lines=5, value="")
product_name = gr.Textbox(label="Наименование продукта", lines=1, value="")
benefits = gr.Textbox(label="Преимущества", lines=9, value="")
key_message = gr.Textbox(label="Ключевое сообщение", lines=2, value="")
# Обработчик выбора продукта
product_dropdown.change(
fn=lambda selected: fill_product_details(selected, data_products),
inputs=[product_dropdown],
outputs=[description, product_name, benefits, key_message]
)
with gr.Column(scale=1):
gr.Markdown("**Клиент**")
gender_dropdown = gr.Dropdown(label="Пол", choices=genders, value="Не выбрано")
generation_dropdown = gr.Dropdown(label="Поколение", choices=generations, value="Не выбрано")
psychotype_dropdown = gr.Dropdown(label="Психотип", choices=psychotypes, value="Не выбрано")
business_stage_dropdown = gr.Dropdown(label="Стадия бизнеса", choices=business_stages, value="Не выбрано")
industry_dropdown = gr.Dropdown(label="Отрасль", choices=industries, value="Не выбрано")
opf_dropdown = gr.Dropdown(label="ОПФ", choices=opfs, value="Не выбрано")
chosen_approach = gr.Textbox(label="Выбранный подход", lines=1, value="")
presence_in_db = gr.Textbox(label="Наличие в базе", lines=1, value="", interactive=False)
# При изменении Пол, Поколение, Психотип вызываем update_approach
gender_dropdown.change(fn=update_approach, inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown], outputs=[chosen_approach])
generation_dropdown.change(fn=update_approach, inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown], outputs=[chosen_approach])
psychotype_dropdown.change(fn=update_approach, inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown], outputs=[chosen_approach])
# Кнопки: Вернуть параметры, Создать персонализированное SMS
with gr.Row():
return_params_btn = gr.Button("Вернуть параметры предыдущего запроса")
create_personal_sms_btn = gr.Button("Создать персонализированное SMS")
# Блок для Модель 1, Промпт 1, SMS 1
with gr.Row():
with gr.Column():
model_1_name = gr.Textbox(label="Модель 1", value="Скрыто для слепого тестирования", interactive=False)
prompt_1 = gr.Textbox(label="Промпт 1", value="Скрыто для слепого тестирования", interactive=False)
sms_1 = gr.Textbox(label="SMS 1", lines=3, value="")
# Блок для Модель 2, Промпт 2, SMS 2
with gr.Column():
model_2_name = gr.Textbox(label="Модель 2", value="Скрыто для слепого тестирования", interactive=False)
prompt_2 = gr.Textbox(label="Промпт 2", value="Скрыто для слепого тестирования", interactive=False)
sms_2 = gr.Textbox(label="SMS 2", lines=3, value="")
# Кнопки выбора SMS
with gr.Row():
prefer_sms_1_btn = gr.Button("Я предпочитаю это SMS")
prefer_sms_2_btn = gr.Button("Я предпочитаю это SMS")
# Кнопка "Перегенерировать SMS"
regen_btn = gr.Button("Перегенерировать SMS (не нравится ни одно из SMS)")
# Комментарии к SMS 1 и 2
with gr.Row():
comment_sms_1 = gr.Textbox(label="Комментарий к SMS 1", lines=2, value="")
comment_sms_2 = gr.Textbox(label="Комментарий к SMS 2", lines=2, value="")
# Откорректированные SMS
with gr.Row():
corrected_sms_1 = gr.Textbox(label="Откорректированное SMS 1", lines=3, value="")
corrected_sms_2 = gr.Textbox(label="Откорректированное SMS 2", lines=3, value="")
# Кнопки сохранения
with gr.Row():
save_sms_1_btn = gr.Button("Сохранить в базу")
save_sms_2_btn = gr.Button("Сохранить в базу")
demo.launch()