fruitpicker01 commited on
Commit
3158ca9
·
verified ·
1 Parent(s): 2b67471

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +99 -20
app.py CHANGED
@@ -4,12 +4,24 @@ import pandas as pd
4
  # Функция для загрузки данных из вкладок Excel
5
  def load_dropdown_data(file_path, sheet_name, column_name):
6
  """Загружает уникальные значения из столбца на заданной вкладке."""
7
- data = pd.read_excel(file_path, sheet_name=sheet_name)
8
- return data[column_name].dropna().unique().tolist()
 
 
 
 
9
 
10
- # Загрузка данных из всех вкладок
11
  file_path = "Исходные данные.xlsx"
12
- products, data_products = load_dropdown_data(file_path, "Продукты", "Наименование продукта"), pd.read_excel(file_path, sheet_name="Продукты")
 
 
 
 
 
 
 
 
13
  genders = load_dropdown_data(file_path, "Пол", "Пол")
14
  generations = load_dropdown_data(file_path, "Поколение", "Поколение")
15
  psychotypes = load_dropdown_data(file_path, "Психотип", "Психотип")
@@ -17,18 +29,64 @@ business_stages = load_dropdown_data(file_path, "Стадия бизнеса", "
17
  industries = load_dropdown_data(file_path, "Отрасль", "Отрасль")
18
  opfs = load_dropdown_data(file_path, "ОПФ", "ОПФ")
19
 
 
 
 
 
 
 
 
20
  # Функция для заполнения полей на основе выбранного продукта
21
  def fill_product_details(selected_product, data):
22
- if selected_product:
23
- product_row = data[data["Наименование продукта"] == selected_product].iloc[0]
24
- return (
25
- product_row["Описание предложения"],
26
- product_row["Наименование продукта"],
27
- product_row["Преимущества"],
28
- product_row["Ключевое сообщение"]
29
- )
 
 
30
  return "", "", "", ""
31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  # Создание интерфейса
33
  with gr.Blocks(theme="default") as demo:
34
  gr.Markdown("**Процент созданных SMS по выбранному продукту**")
@@ -49,7 +107,7 @@ with gr.Blocks(theme="default") as demo:
49
  product_dropdown = gr.Dropdown(
50
  label="Продукт",
51
  choices=products,
52
- value=None
53
  )
54
  description = gr.Textbox(label="Описание предложения", lines=5, value="")
55
  product_name = gr.Textbox(label="Наименование продукта", lines=1, value="")
@@ -65,15 +123,36 @@ with gr.Blocks(theme="default") as demo:
65
 
66
  with gr.Column(scale=1):
67
  gr.Markdown("**Клиент**")
68
- gender_dropdown = gr.Dropdown(label="Пол", choices=genders, value=None)
69
- generation_dropdown = gr.Dropdown(label="Поколение", choices=generations, value=None)
70
- psychotype_dropdown = gr.Dropdown(label="Психотип", choices=psychotypes, value=None)
71
- business_stage_dropdown = gr.Dropdown(label="Стадия бизнеса", choices=business_stages, value=None)
72
- industry_dropdown = gr.Dropdown(label="Отрасль", choices=industries, value=None)
73
- opf_dropdown = gr.Dropdown(label="ОПФ", choices=opfs, value=None)
74
- chosen_approach = gr.Textbox(label="Выбранный подход", lines=1, value="")
75
  presence_in_db = gr.Textbox(label="Наличие в базе", lines=1, value="", interactive=False)
76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  # Кнопки: Вернуть параметры, Создать персонализированное SMS
78
  with gr.Row():
79
  return_params_btn = gr.Button("Вернуть параметры предыдущего запроса")
 
4
  # Функция для загрузки данных из вкладок Excel
5
  def load_dropdown_data(file_path, sheet_name, column_name):
6
  """Загружает уникальные значения из столбца на заданной вкладке."""
7
+ try:
8
+ data = pd.read_excel(file_path, sheet_name=sheet_name)
9
+ return data[column_name].dropna().unique().tolist()
10
+ except Exception as e:
11
+ print(f"Ошибка загрузки данных из листа '{sheet_name}': {e}")
12
+ return []
13
 
14
+ # Путь к файлу Excel
15
  file_path = "Исходные данные.xlsx"
16
+
17
+ # Загрузка данных из всех вкладок
18
+ products = load_dropdown_data(file_path, "Продукты", "Наименование продукта")
19
+ try:
20
+ data_products = pd.read_excel(file_path, sheet_name="Продукты")
21
+ except Exception as e:
22
+ print(f"Ошибка загрузки листа 'Продукты': {e}")
23
+ data_products = pd.DataFrame()
24
+
25
  genders = load_dropdown_data(file_path, "Пол", "Пол")
26
  generations = load_dropdown_data(file_path, "Поколение", "Поколение")
27
  psychotypes = load_dropdown_data(file_path, "Психотип", "Психотип")
 
29
  industries = load_dropdown_data(file_path, "Отрасль", "Отрасль")
30
  opfs = load_dropdown_data(file_path, "ОПФ", "ОПФ")
31
 
32
+ # Загрузка подходов
33
+ try:
34
+ approaches_df = pd.read_excel(file_path, sheet_name="Подход")
35
+ except Exception as e:
36
+ print(f"Ошибка загрузки листа 'Подход': {e}")
37
+ approaches_df = None
38
+
39
  # Функция для заполнения полей на основе выбранного продукта
40
  def fill_product_details(selected_product, data):
41
+ if selected_product and not data.empty:
42
+ product_row = data[data["Наименование продукта"] == selected_product]
43
+ if not product_row.empty:
44
+ product_row = product_row.iloc[0]
45
+ return (
46
+ product_row.get("Описание предложения", ""),
47
+ product_row.get("Наименование продукта", ""),
48
+ product_row.get("Преимущества", ""),
49
+ product_row.get("Ключевое сообщение", "")
50
+ )
51
  return "", "", "", ""
52
 
53
+ # Функция для определения подходов
54
+ def determine_approaches(gender, generation, psychotype):
55
+ if approaches_df is None or approaches_df.empty:
56
+ return "Таблица 'Подход' не найдена или пуста."
57
+
58
+ filters = []
59
+ for param_name, param_value in [('Пол', gender), ('Поколение', generation), ('Психотип', psychotype)]:
60
+ if param_value:
61
+ filters.append(approaches_df[param_name].fillna('') == param_value)
62
+ else:
63
+ # Если параметр не выбран, не фильтруем по нему
64
+ continue
65
+
66
+ if filters:
67
+ combined_filter = filters[0]
68
+ for f in filters[1:]:
69
+ combined_filter &= f
70
+ matching_rows = approaches_df[combined_filter]
71
+ else:
72
+ # Если ни один параметр не выбран, все строки соответствуют
73
+ matching_rows = approaches_df.copy()
74
+
75
+ if matching_rows.empty:
76
+ return "Подход не найден для выбранных параметров."
77
+
78
+ approach_list = []
79
+ for approaches in matching_rows['Подход']:
80
+ if pd.isna(approaches):
81
+ continue
82
+ approach_names = [a.strip() for a in approaches.split(',')]
83
+ approach_list.extend(approach_names)
84
+
85
+ approach_list = list(set(approach_list)) # Убираем дубликаты
86
+ selected_approaches_text_content = ', '.join(approach_list)
87
+
88
+ return selected_approaches_text_content if approach_list else "Подход не найден для выбранных параметров."
89
+
90
  # Создание интерфейса
91
  with gr.Blocks(theme="default") as demo:
92
  gr.Markdown("**Процент созданных SMS по выбранному продукту**")
 
107
  product_dropdown = gr.Dropdown(
108
  label="Продукт",
109
  choices=products,
110
+ value=None # Значение по умолчанию не устанавливается
111
  )
112
  description = gr.Textbox(label="Описание предложения", lines=5, value="")
113
  product_name = gr.Textbox(label="Наименование продукта", lines=1, value="")
 
123
 
124
  with gr.Column(scale=1):
125
  gr.Markdown("**Клиент**")
126
+ gender_dropdown = gr.Dropdown(label="Пол", choices=["Не выбрано"] + genders, value="Не выбрано")
127
+ generation_dropdown = gr.Dropdown(label="Поколение", choices=["Не выбрано"] + generations, value="Не выбрано")
128
+ psychotype_dropdown = gr.Dropdown(label="Психотип", choices=["Не выбрано"] + psychotypes, value="Не выбрано")
129
+ business_stage_dropdown = gr.Dropdown(label="Стадия бизнеса", choices=["Не выбрано"] + business_stages, value="Не выбрано")
130
+ industry_dropdown = gr.Dropdown(label="Отрасль", choices=["Не выбрано"] + industries, value="Не выбрано")
131
+ opf_dropdown = gr.Dropdown(label="ОПФ", choices=["Не выбрано"] + opfs, value="Не выбрано")
132
+ chosen_approach = gr.Textbox(label="Выбранный подход", lines=2, value="", interactive=False)
133
  presence_in_db = gr.Textbox(label="Наличие в базе", lines=1, value="", interactive=False)
134
 
135
+ # Обработчики для определения подходов
136
+ # Когда изменяется любое из трех полей, вызывается функция determine_approaches
137
+ inputs_for_approach = [gender_dropdown, generation_dropdown, psychotype_dropdown]
138
+ approach_output = chosen_approach
139
+
140
+ def update_approach(gender, generation, psychotype):
141
+ # Преобразуем "Не выбрано" в None для фильтрации
142
+ gender = None if gender == "Не выбрано" else gender
143
+ generation = None if generation == "Не выбрано" else generation
144
+ psychotype = None if psychotype == "Не выбрано" else psychotype
145
+ result = determine_approaches(gender, generation, psychotype)
146
+ return result
147
+
148
+ # Привязываем обработчик к каждому из дропдаунов
149
+ for input_component in inputs_for_approach:
150
+ input_component.change(
151
+ fn=update_approach,
152
+ inputs=inputs_for_approach,
153
+ outputs=approach_output
154
+ )
155
+
156
  # Кнопки: Вернуть параметры, Создать персонализированное SMS
157
  with gr.Row():
158
  return_params_btn = gr.Button("Вернуть параметры предыдущего запроса")