Update app.py
Browse files
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,
|
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",
|
|
|
|
|
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 |
-
|
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()
|