fruitpicker01 commited on
Commit
9192fe9
·
verified ·
1 Parent(s): aa7a4a8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +46 -80
app.py CHANGED
@@ -4,24 +4,14 @@ import pandas as pd
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,63 +19,55 @@ business_stages = 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:
@@ -107,7 +89,7 @@ with gr.Blocks(theme="default") as demo:
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,35 +105,19 @@ with gr.Blocks(theme="default") as demo:
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():
 
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
 
13
+ # Загрузка данных
14
+ products, data_products = load_dropdown_data(file_path, "Продукты", "Наименование продукта"), pd.read_excel(file_path, sheet_name="Продукты")
 
 
 
 
 
 
15
  genders = load_dropdown_data(file_path, "Пол", "Пол")
16
  generations = load_dropdown_data(file_path, "Поколение", "Поколение")
17
  psychotypes = load_dropdown_data(file_path, "Психотип", "Психотип")
 
19
  industries = load_dropdown_data(file_path, "Отрасль", "Отрасль")
20
  opfs = load_dropdown_data(file_path, "ОПФ", "ОПФ")
21
 
22
+ # Загрузка данных для "Подход"
23
+ approaches_data = pd.read_excel(file_path, sheet_name="Подход")
 
 
 
 
24
 
25
  # Функция для заполнения полей на основе выбранного продукта
26
  def fill_product_details(selected_product, data):
27
+ if selected_product:
28
+ product_row = data[data["Наименование продукта"] == selected_product].iloc[0]
29
+ return (
30
+ product_row.get("Описание предложения", ""),
31
+ product_row.get("Наименование продукта", ""),
32
+ product_row.get("Преимущества", ""),
33
+ product_row.get("Ключевое сообщение", "")
34
+ )
 
 
35
  return "", "", "", ""
36
 
37
+ # Функция для получения списка подходов
38
+ def get_approaches(gender, generation, psychotype, approaches_df):
39
  if approaches_df is None or approaches_df.empty:
40
+ return "Таблица 'Подход' не найдена."
41
+
42
  filters = []
43
  for param_name, param_value in [('Пол', gender), ('Поколение', generation), ('Психотип', psychotype)]:
44
  if param_value:
45
  filters.append(approaches_df[param_name].fillna('') == param_value)
46
  else:
47
+ filters.append(approaches_df[param_name].isnull() | (approaches_df[param_name].fillna('') == ''))
 
48
 
49
+ combined_filter = filters[0]
50
+ for f in filters[1:]:
51
+ combined_filter &= f
 
 
 
 
 
52
 
53
+ matching_rows = approaches_df[combined_filter]
54
  if matching_rows.empty:
55
  return "Подход не найден для выбранных параметров."
56
 
57
  approach_list = []
58
  for approaches in matching_rows['Подход']:
59
+ approach_names = [a.strip() for a in str(approaches).split(',')]
 
 
60
  approach_list.extend(approach_names)
61
 
62
+ # Убираем дубликаты
63
+ approach_list = list(set(approach_list))
64
 
65
+ selected_approaches_text_content = ', '.join(approach_list)
66
+ return selected_approaches_text_content
67
+
68
+ # Функция-обёртка для обновления подхода
69
+ def update_approach(gender, generation, psychotype):
70
+ return get_approaches(gender, generation, psychotype, approaches_data)
71
 
72
  # Создание интерфейса
73
  with gr.Blocks(theme="default") as demo:
 
89
  product_dropdown = gr.Dropdown(
90
  label="Продукт",
91
  choices=products,
92
+ value=None
93
  )
94
  description = gr.Textbox(label="Описание предложения", lines=5, value="")
95
  product_name = gr.Textbox(label="Наименование продукта", lines=1, value="")
 
105
 
106
  with gr.Column(scale=1):
107
  gr.Markdown("**Клиент**")
108
+ gender_dropdown = gr.Dropdown(label="Пол", choices=genders, value=None)
109
+ generation_dropdown = gr.Dropdown(label="Поколение", choices=generations, value=None)
110
+ psychotype_dropdown = gr.Dropdown(label="Психотип", choices=psychotypes, value=None)
111
+ business_stage_dropdown = gr.Dropdown(label="Стадия бизнеса", choices=business_stages, value=None)
112
+ industry_dropdown = gr.Dropdown(label="Отрасль", choices=industries, value=None)
113
+ opf_dropdown = gr.Dropdown(label="ОПФ", choices=opfs, value=None)
114
+ chosen_approach = gr.Textbox(label="Выбранный подход", lines=1, value="")
115
  presence_in_db = gr.Textbox(label="Наличие в базе", lines=1, value="", interactive=False)
116
+
117
+ # При изменении Пол, Поколение, Психотип вызываем update_approach
118
+ gender_dropdown.change(fn=update_approach, inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown], outputs=[chosen_approach])
119
+ generation_dropdown.change(fn=update_approach, inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown], outputs=[chosen_approach])
120
+ psychotype_dropdown.change(fn=update_approach, inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown], outputs=[chosen_approach])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
 
122
  # Кнопки: Вернуть параметры, Создать персонализированное SMS
123
  with gr.Row():