Spaces:
Sleeping
Sleeping
app modif buffer3
Browse files
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 |
-
|
| 145 |
-
|
| 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 |
-
|
| 184 |
-
|
| 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.
|
| 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 |
-
|
| 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.
|