gdleds commited on
Commit
ab91474
·
1 Parent(s): 397caf3

app modif buffer3

Browse files
Files changed (1) hide show
  1. app.py +24 -25
app.py CHANGED
@@ -102,10 +102,10 @@ conflict_minus180 = merged[
102
 
103
  # Création d'une liste de résultats
104
  results = [
105
- {"Buffer": "-30 min", "Conflits": len(conflict_minus30), "Moyenne retard (min)": conflict_minus30["delay_at_checkout_in_minutes"].mean()},
106
- {"Buffer": "-60 min", "Conflits": len(conflict_minus60), "Moyenne retard (min)": conflict_minus60["delay_at_checkout_in_minutes"].mean()},
107
- {"Buffer": "-90 min", "Conflits": len(conflict_minus90), "Moyenne retard (min)": conflict_minus90["delay_at_checkout_in_minutes"].mean()},
108
- {"Buffer": "-180 min", "Conflits": len(conflict_minus180), "Moyenne retard (min)": conflict_minus180["delay_at_checkout_in_minutes"].mean()},
109
  ]
110
  df_conflicts = pd.DataFrame(results)
111
  df_conflicts['lost_value'] = df_conflicts["Conflits"]*loc_moyenne
@@ -141,8 +141,8 @@ merged_mob = merged[mask]
141
  conflict_strict1= merged_mob[
142
  merged_mob["delay_at_checkout_in_minutes"] > merged_mob["time_delta_with_previous_rental_in_minutes"]
143
  ]
144
- print("Conflits stricts :", len(conflict_strict1))
145
- print("Moyenne retard précédent (conflits seulement) :", conflict_strict1["delay_at_checkout_in_minutes"].mean().round(2))
146
 
147
  # Cas "conflit -30min"
148
  conflict_1minus30 = merged_mob[
@@ -164,10 +164,10 @@ conflict_1minus180 = merged_mob[
164
 
165
  # Création d'une liste de résultats
166
  results = [
167
- {"Buffer": "-30 min", "Conflits": len(conflict_1minus30), "Moyenne retard (min)": conflict_1minus30["delay_at_checkout_in_minutes"].mean()},
168
- {"Buffer": "-60 min", "Conflits": len(conflict_1minus60), "Moyenne retard (min)": conflict_1minus60["delay_at_checkout_in_minutes"].mean()},
169
- {"Buffer": "-90 min", "Conflits": len(conflict_1minus90), "Moyenne retard (min)": conflict_1minus90["delay_at_checkout_in_minutes"].mean()},
170
- {"Buffer": "-180 min", "Conflits": len(conflict_1minus180), "Moyenne retard (min)": conflict_1minus180["delay_at_checkout_in_minutes"].mean()},
171
  ]
172
  df_conflicts_mob = pd.DataFrame(results)
173
  df_conflicts_mob['lost_value'] = df_conflicts_mob["Conflits"]*loc_moyenne
@@ -180,8 +180,8 @@ merged_connect = merged[mask]
180
  conflict_strict2 = merged_connect[
181
  merged_connect["delay_at_checkout_in_minutes"] > merged_connect["time_delta_with_previous_rental_in_minutes"]
182
  ]
183
- print("Conflits stricts :", len(conflict_strict2))
184
- print("Moyenne retard précédent (conflits seulement) :", conflict_strict2["delay_at_checkout_in_minutes"].mean().round(2))
185
 
186
  # Cas "conflit -30min"
187
  conflict_2minus30 = merged_connect[
@@ -203,10 +203,10 @@ conflict_2minus180 = merged_connect[
203
 
204
  # Création d'une liste de résultats
205
  results = [
206
- {"Buffer": "-30 min", "Conflits": len(conflict_2minus30), "Moyenne retard (min)": conflict_2minus30["delay_at_checkout_in_minutes"].mean()},
207
- {"Buffer": "-60 min", "Conflits": len(conflict_2minus60), "Moyenne retard (min)": conflict_2minus60["delay_at_checkout_in_minutes"].mean()},
208
- {"Buffer": "-90 min", "Conflits": len(conflict_2minus90), "Moyenne retard (min)": conflict_2minus90["delay_at_checkout_in_minutes"].mean()},
209
- {"Buffer": "-180 min", "Conflits": len(conflict_2minus180), "Moyenne retard (min)": conflict_2minus180["delay_at_checkout_in_minutes"].mean()},
210
  ]
211
  df_conflicts_con = pd.DataFrame(results)
212
 
@@ -214,18 +214,17 @@ df_conflicts_con['lost_value'] = df_conflicts_con["Conflits"]*loc_moyenne
214
 
215
  st.dataframe(df_conflicts_con)
216
 
217
- st.mardown("""Les deux systèmes subissent des annulations liées aux délais courts.
218
-
219
  Connect est plus fréquent en volume absolu, mais ses retards sont légèrement moins sévères.
220
-
221
  Mobile présente moins de cas mais avec des retards plus longs → donc plus difficiles à absorber sans impact client.
222
-
223
- Les deux méthodes sont exposées aux retards, mais Connect encaisse plus de cas tandis que Mobile concentre les retards les plus importants.""" )
224
-
225
-
226
 
227
  # === SECTION 3 : IMPACT DES BUFFERS ===
228
  st.header("⏳ Simulation de buffer entre locations")
 
 
229
 
230
  loc_moyenne = df_pricing["rental_price_per_day"].mean()
231
  CA_total = (df['state'] == 'ended').sum() * loc_moyenne
@@ -281,9 +280,9 @@ Nos analyses montrent :
281
 
282
  ✅ **Recommandations** :
283
  - Pas de buffer global.
284
- - Buffer ciblé (<1h) sur cas à risque.
285
  - Notifications pour inciter à rendre le véhicule en avance.
286
- - Eventuellement pénalités pour retards répétés.
287
 
288
  👉 L’impact économique du buffer est donc limité,
289
  mais des mesures ciblées peuvent réduire la friction sans perte majeure de CA.
 
102
 
103
  # Création d'une liste de résultats
104
  results = [
105
+ {"Buffer": "-30 min", "Conflits": (len(conflict_minus30)-len(conflict_strict)), "Moyenne retard (min)": conflict_minus30["delay_at_checkout_in_minutes"].mean()},
106
+ {"Buffer": "-60 min", "Conflits": (len(conflict_minus60)-len(conflict_strict)), "Moyenne retard (min)": conflict_minus60["delay_at_checkout_in_minutes"].mean()},
107
+ {"Buffer": "-90 min", "Conflits": (len(conflict_minus90)-len(conflict_strict)), "Moyenne retard (min)": conflict_minus90["delay_at_checkout_in_minutes"].mean()},
108
+ {"Buffer": "-180 min", "Conflits": (len(conflict_minus180)-len(conflict_strict)), "Moyenne retard (min)": conflict_minus180["delay_at_checkout_in_minutes"].mean()},
109
  ]
110
  df_conflicts = pd.DataFrame(results)
111
  df_conflicts['lost_value'] = df_conflicts["Conflits"]*loc_moyenne
 
141
  conflict_strict1= merged_mob[
142
  merged_mob["delay_at_checkout_in_minutes"] > merged_mob["time_delta_with_previous_rental_in_minutes"]
143
  ]
144
+ st.metric("Conflits stricts :", len(conflict_strict1))
145
+ st.metric("Moyenne retard précédent (conflits seulement) :", conflict_strict1["delay_at_checkout_in_minutes"].mean().round(2))
146
 
147
  # Cas "conflit -30min"
148
  conflict_1minus30 = merged_mob[
 
164
 
165
  # Création d'une liste de résultats
166
  results = [
167
+ {"Buffer": "-30 min", "Conflits": (len(conflict_1minus30)-len(conflict_strict1)), "Moyenne retard (min)": conflict_1minus30["delay_at_checkout_in_minutes"].mean()},
168
+ {"Buffer": "-60 min", "Conflits": (len(conflict_1minus60)-len(conflict_strict1)), "Moyenne retard (min)": conflict_1minus60["delay_at_checkout_in_minutes"].mean()},
169
+ {"Buffer": "-90 min", "Conflits": (len(conflict_1minus90)-len(conflict_strict1)), "Moyenne retard (min)": conflict_1minus90["delay_at_checkout_in_minutes"].mean()},
170
+ {"Buffer": "-180 min", "Conflits": (len(conflict_1minus180)-len(conflict_strict1)), "Moyenne retard (min)": conflict_1minus180["delay_at_checkout_in_minutes"].mean()},
171
  ]
172
  df_conflicts_mob = pd.DataFrame(results)
173
  df_conflicts_mob['lost_value'] = df_conflicts_mob["Conflits"]*loc_moyenne
 
180
  conflict_strict2 = merged_connect[
181
  merged_connect["delay_at_checkout_in_minutes"] > merged_connect["time_delta_with_previous_rental_in_minutes"]
182
  ]
183
+ st.metric("Conflits stricts :", len(conflict_strict2))
184
+ st.metric("Moyenne retard précédent (conflits seulement) :", conflict_strict2["delay_at_checkout_in_minutes"].mean().round(2))
185
 
186
  # Cas "conflit -30min"
187
  conflict_2minus30 = merged_connect[
 
203
 
204
  # Création d'une liste de résultats
205
  results = [
206
+ {"Buffer": "-30 min", "Conflits": (len(conflict_2minus30)-len(conflict_strict2)), "Moyenne retard (min)": conflict_2minus30["delay_at_checkout_in_minutes"].mean()},
207
+ {"Buffer": "-60 min", "Conflits": (len(conflict_2minus60)-len(conflict_strict2)), "Moyenne retard (min)": conflict_2minus60["delay_at_checkout_in_minutes"].mean()},
208
+ {"Buffer": "-90 min", "Conflits": (len(conflict_2minus90)-len(conflict_strict2)), "Moyenne retard (min)": conflict_2minus90["delay_at_checkout_in_minutes"].mean()},
209
+ {"Buffer": "-180 min", "Conflits": (len(conflict_2minus180)-len(conflict_strict2)), "Moyenne retard (min)": conflict_2minus180["delay_at_checkout_in_minutes"].mean()},
210
  ]
211
  df_conflicts_con = pd.DataFrame(results)
212
 
 
214
 
215
  st.dataframe(df_conflicts_con)
216
 
217
+ st.markdown("""Les deux systèmes subissent des annulations liées aux délais courts.
 
218
  Connect est plus fréquent en volume absolu, mais ses retards sont légèrement moins sévères.
 
219
  Mobile présente moins de cas mais avec des retards plus longs → donc plus difficiles à absorber sans impact client.
220
+ Les deux méthodes sont exposées aux retards, mais Connect encaisse plus de cas tandis que Mobile concentre les retards les plus importants.
221
+ Un buffer opérationnel de 30 minutes permettrai un gain rapide sans trop affecté le CA global.
222
+ """ )
 
223
 
224
  # === SECTION 3 : IMPACT DES BUFFERS ===
225
  st.header("⏳ Simulation de buffer entre locations")
226
+ st.markdown(""" Afin d'analyser l'impact d'un buffer nous prenons cette fois ci que les location qui a eu lieu et filtrons toutes les location ayant débuté dans les 30 minutes qui suit la précéddentes.
227
+ Ces locations sont celle qui risquent d'etre impacté """)
228
 
229
  loc_moyenne = df_pricing["rental_price_per_day"].mean()
230
  CA_total = (df['state'] == 'ended').sum() * loc_moyenne
 
280
 
281
  ✅ **Recommandations** :
282
  - Pas de buffer global.
283
+ - Buffer ciblé (<1h) sur cas à risque, zone chaude.
284
  - Notifications pour inciter à rendre le véhicule en avance.
285
+ - Eventuellement pénalités pour retards répétés.(=> mais c'est anticommercial )
286
 
287
  👉 L’impact économique du buffer est donc limité,
288
  mais des mesures ciblées peuvent réduire la friction sans perte majeure de CA.