fruitpicker01 commited on
Commit
128e9a1
·
verified ·
1 Parent(s): 9be16b8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +12 -13
app.py CHANGED
@@ -51,7 +51,7 @@ def make_average_forecast(total_by_date, end_date_str="2025-03-15"):
51
  """
52
  Делает «прогноз по среднему» до указанной даты (end_date_str).
53
  Берём средний дневной прирост count и
54
- добавляем его день за днём, не учитывая выходные.
55
  Возвращает DataFrame: [ds, yhat]
56
  ds - дата (Timestamp)
57
  yhat - прогноз накопленной суммы
@@ -88,7 +88,7 @@ def process_data():
88
 
89
  # 1) Считываем CSV
90
  dasha_count, dasha_daily = read_and_process_data(URL_DASHA, "Даша")
91
- lera_count, lera_daily = read_and_process_data(URL_LERA, "Лера")
92
  sveta_count, sveta_daily = read_and_process_data(URL_SVETA, "Света")
93
 
94
  total_count = dasha_count + lera_count + sveta_count
@@ -135,10 +135,16 @@ def process_data():
135
  daily_all_final = pd.concat([daily_all, total_by_date], ignore_index=True)
136
  daily_all_final["date_dt"] = pd.to_datetime(daily_all_final["date"])
137
 
 
 
 
 
138
  fig1, ax1 = plt.subplots(figsize=(8,5))
139
  sns.lineplot(
140
  data=daily_all_final,
141
- x="date_dt", y="cumulative", hue="user",
 
 
142
  ax=ax1, marker="o"
143
  )
144
  ax1.set_title("Накопительное количество SMS")
@@ -152,7 +158,6 @@ def process_data():
152
  image1_pil = Image.open(buf1)
153
 
154
  # 5) Делаем «Всего» для Prophet + средний прогноз
155
- # Готовим DataFrame для Prophet
156
  df_prophet = total_by_date[["date", "cumulative"]].copy()
157
  df_prophet.columns = ["ds", "y"]
158
  df_prophet["ds"] = pd.to_datetime(df_prophet["ds"])
@@ -201,11 +206,10 @@ def process_data():
201
  df_combined["ds"] = pd.to_datetime(df_combined["ds"])
202
 
203
  # 6) Второй график: «История», «Прогноз (Prophet)», «Прогноз (среднее)» — пунктир
204
- # Сделаем стили dashes вручную: сплошная для «История», пунктир для двух «Прогнозов»
205
  line_styles = {
206
  "История": "",
207
- "Прогноз (Prophet)": (2,2), # пунктир
208
- "Прогноз (среднее)": (2,2) # пунктир
209
  }
210
  line_colors = {
211
  "История": "blue",
@@ -235,7 +239,6 @@ def process_data():
235
  image2_pil = Image.open(buf2)
236
 
237
  # 7) Возвращаем результат
238
- # (прогресс-бары, первый график, второй график)
239
  return bars_html, image1_pil, image2_pil
240
 
241
 
@@ -248,11 +251,7 @@ with gr.Blocks() as demo:
248
  image_output1 = gr.Image(type="pil", label="Накопительный график")
249
  image_output2 = gr.Image(type="pil", label="Прогноз: Prophet & По среднему")
250
 
251
- # process_data возвращает (bars_html, image1_pil, image2_pil)
252
- btn.click(
253
- fn=process_data,
254
- outputs=[html_output, image_output1, image_output2]
255
- )
256
 
257
  if __name__ == "__main__":
258
  demo.launch()
 
51
  """
52
  Делает «прогноз по среднему» до указанной даты (end_date_str).
53
  Берём средний дневной прирост count и
54
+ добавляем его день за днём (не учитывая выходные).
55
  Возвращает DataFrame: [ds, yhat]
56
  ds - дата (Timestamp)
57
  yhat - прогноз накопленной суммы
 
88
 
89
  # 1) Считываем CSV
90
  dasha_count, dasha_daily = read_and_process_data(URL_DASHA, "Даша")
91
+ lera_count, lera_daily = read_and_process_data(URL_LERA, "Лера")
92
  sveta_count, sveta_daily = read_and_process_data(URL_SVETA, "Света")
93
 
94
  total_count = dasha_count + lera_count + sveta_count
 
135
  daily_all_final = pd.concat([daily_all, total_by_date], ignore_index=True)
136
  daily_all_final["date_dt"] = pd.to_datetime(daily_all_final["date"])
137
 
138
+ # === ВАЖНО: сортируем легенду (user) по убыванию финального cumulative ===
139
+ last_values = daily_all_final.groupby("user")["cumulative"].last().sort_values(ascending=False)
140
+ sorted_users = last_values.index.tolist()
141
+
142
  fig1, ax1 = plt.subplots(figsize=(8,5))
143
  sns.lineplot(
144
  data=daily_all_final,
145
+ x="date_dt", y="cumulative",
146
+ hue="user",
147
+ hue_order=sorted_users, # <-- передаём порядок
148
  ax=ax1, marker="o"
149
  )
150
  ax1.set_title("Накопительное количество SMS")
 
158
  image1_pil = Image.open(buf1)
159
 
160
  # 5) Делаем «Всего» для Prophet + средний прогноз
 
161
  df_prophet = total_by_date[["date", "cumulative"]].copy()
162
  df_prophet.columns = ["ds", "y"]
163
  df_prophet["ds"] = pd.to_datetime(df_prophet["ds"])
 
206
  df_combined["ds"] = pd.to_datetime(df_combined["ds"])
207
 
208
  # 6) Второй график: «История», «Прогноз (Prophet)», «Прогноз (среднее)» — пунктир
 
209
  line_styles = {
210
  "История": "",
211
+ "Прогноз (Prophet)": (2,2),
212
+ "Прогноз (среднее)": (2,2)
213
  }
214
  line_colors = {
215
  "История": "blue",
 
239
  image2_pil = Image.open(buf2)
240
 
241
  # 7) Возвращаем результат
 
242
  return bars_html, image1_pil, image2_pil
243
 
244
 
 
251
  image_output1 = gr.Image(type="pil", label="Накопительный график")
252
  image_output2 = gr.Image(type="pil", label="Прогноз: Prophet & По среднему")
253
 
254
+ btn.click(fn=process_data, outputs=[html_output, image_output1, image_output2])
 
 
 
 
255
 
256
  if __name__ == "__main__":
257
  demo.launch()