Spaces:
Sleeping
Sleeping
app modif buffer2
Browse files
app.py
CHANGED
|
@@ -19,6 +19,8 @@ Nous allons explorer :
|
|
| 19 |
df = pd.read_csv("data/get_around_delay_analysis.csv")
|
| 20 |
df_pricing = pd.read_csv("data/pricing_clean.csv")
|
| 21 |
|
|
|
|
|
|
|
| 22 |
# === SECTION 1 : EDA SUR LES RETARDS ===
|
| 23 |
st.header("📊 Analyse des retards et annulations")
|
| 24 |
|
|
@@ -76,7 +78,7 @@ st.metric("Moyenne retard précédent (conflits seulement) :", conflict_strict["
|
|
| 76 |
|
| 77 |
st.markdown("""
|
| 78 |
👉 Parmi les **229 annulations liées à une location précédente**,
|
| 79 |
-
**37** sont dues à un
|
| 80 |
Ces retards sont très longs (~4h15 en moyenne).
|
| 81 |
""")
|
| 82 |
|
|
@@ -106,13 +108,101 @@ results = [
|
|
| 106 |
{"Buffer": "-180 min", "Conflits": len(conflict_minus180), "Moyenne retard (min)": conflict_minus180["delay_at_checkout_in_minutes"].mean()},
|
| 107 |
]
|
| 108 |
df_conflicts = pd.DataFrame(results)
|
| 109 |
-
|
| 110 |
st.dataframe(df_conflicts)
|
| 111 |
|
| 112 |
st.markdown("""Si on ajoute un buffer de 30 minutes, on détecte 10 annulations supplémentaires : ces cas correspondent à des locations rendues trop proches de la suivante (<30 min de marge).
|
| 113 |
Avec un buffer de 60 minutes, seulement 3 cas en plus → ce sont donc des situations rares mais critiques.
|
| 114 |
En élargissant à 90 minutes, on ajoute encore 7 cas.""")
|
| 115 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 116 |
|
| 117 |
|
| 118 |
|
|
|
|
| 19 |
df = pd.read_csv("data/get_around_delay_analysis.csv")
|
| 20 |
df_pricing = pd.read_csv("data/pricing_clean.csv")
|
| 21 |
|
| 22 |
+
loc_moyenne = df_pricing["rental_price_per_day"].mean()
|
| 23 |
+
|
| 24 |
# === SECTION 1 : EDA SUR LES RETARDS ===
|
| 25 |
st.header("📊 Analyse des retards et annulations")
|
| 26 |
|
|
|
|
| 78 |
|
| 79 |
st.markdown("""
|
| 80 |
👉 Parmi les **229 annulations liées à une location précédente**,
|
| 81 |
+
**37** sont dues à un retard allant au delà de l'heure de début de la prochaine location.
|
| 82 |
Ces retards sont très longs (~4h15 en moyenne).
|
| 83 |
""")
|
| 84 |
|
|
|
|
| 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
|
| 112 |
st.dataframe(df_conflicts)
|
| 113 |
|
| 114 |
st.markdown("""Si on ajoute un buffer de 30 minutes, on détecte 10 annulations supplémentaires : ces cas correspondent à des locations rendues trop proches de la suivante (<30 min de marge).
|
| 115 |
Avec un buffer de 60 minutes, seulement 3 cas en plus → ce sont donc des situations rares mais critiques.
|
| 116 |
En élargissant à 90 minutes, on ajoute encore 7 cas.""")
|
| 117 |
|
| 118 |
+
st.mardown(""" ANALYSE SUR MOBILE """)
|
| 119 |
+
|
| 120 |
+
# Dans le cas de l'application mobile
|
| 121 |
+
mask = merged["checkin_type_canceled"] == "mobile"
|
| 122 |
+
merged_mob = merged[mask]
|
| 123 |
+
conflict_strict1= merged_mob[
|
| 124 |
+
merged_mob["delay_at_checkout_in_minutes"] > merged_mob["time_delta_with_previous_rental_in_minutes"]
|
| 125 |
+
]
|
| 126 |
+
print("Conflits stricts :", len(conflict_strict1))
|
| 127 |
+
print("Moyenne retard précédent (conflits seulement) :", conflict_strict1["delay_at_checkout_in_minutes"].mean().round(2))
|
| 128 |
+
|
| 129 |
+
# Cas "conflit -30min"
|
| 130 |
+
conflict_1minus30 = merged_mob[
|
| 131 |
+
merged_mob["delay_at_checkout_in_minutes"] > merged_mob["time_delta_with_previous_rental_in_minutes"] - 30
|
| 132 |
+
]
|
| 133 |
+
|
| 134 |
+
# Cas "conflit -60min"
|
| 135 |
+
conflict_1minus60 = merged_mob[
|
| 136 |
+
merged_mob["delay_at_checkout_in_minutes"] > merged_mob["time_delta_with_previous_rental_in_minutes"] - 60
|
| 137 |
+
]
|
| 138 |
+
|
| 139 |
+
conflict_1minus90 = merged_mob[
|
| 140 |
+
merged_mob["delay_at_checkout_in_minutes"] > merged_mob["time_delta_with_previous_rental_in_minutes"] - 90
|
| 141 |
+
]
|
| 142 |
+
|
| 143 |
+
conflict_1minus180 = merged_mob[
|
| 144 |
+
merged_mob["delay_at_checkout_in_minutes"] > merged_mob["time_delta_with_previous_rental_in_minutes"] - 180
|
| 145 |
+
]
|
| 146 |
+
|
| 147 |
+
# Création d'une liste de résultats
|
| 148 |
+
results = [
|
| 149 |
+
{"Buffer": "-30 min", "Conflits": len(conflict_1minus30), "Moyenne retard (min)": conflict_1minus30["delay_at_checkout_in_minutes"].mean()},
|
| 150 |
+
{"Buffer": "-60 min", "Conflits": len(conflict_1minus60), "Moyenne retard (min)": conflict_1minus60["delay_at_checkout_in_minutes"].mean()},
|
| 151 |
+
{"Buffer": "-90 min", "Conflits": len(conflict_1minus90), "Moyenne retard (min)": conflict_1minus90["delay_at_checkout_in_minutes"].mean()},
|
| 152 |
+
{"Buffer": "-180 min", "Conflits": len(conflict_1minus180), "Moyenne retard (min)": conflict_1minus180["delay_at_checkout_in_minutes"].mean()},
|
| 153 |
+
]
|
| 154 |
+
df_conflicts_mob = pd.DataFrame(results)
|
| 155 |
+
df_conflicts_mob['lost_value'] = df_conflicts_mob["Conflits"]*loc_moyenne
|
| 156 |
+
st.dataframe(df_conflicts_mob)
|
| 157 |
+
|
| 158 |
+
st.mardown(""" ANALYSE SUR CONNECT """)
|
| 159 |
+
# Dans le cas de l'utilisation de connect
|
| 160 |
+
mask = merged["checkin_type_canceled"] == "connect"
|
| 161 |
+
merged_connect = merged[mask]
|
| 162 |
+
conflict_strict2 = merged_connect[
|
| 163 |
+
merged_connect["delay_at_checkout_in_minutes"] > merged_connect["time_delta_with_previous_rental_in_minutes"]
|
| 164 |
+
]
|
| 165 |
+
print("Conflits stricts :", len(conflict_strict2))
|
| 166 |
+
print("Moyenne retard précédent (conflits seulement) :", conflict_strict2["delay_at_checkout_in_minutes"].mean().round(2))
|
| 167 |
+
|
| 168 |
+
# Cas "conflit -30min"
|
| 169 |
+
conflict_2minus30 = merged_connect[
|
| 170 |
+
merged_connect["delay_at_checkout_in_minutes"] > merged_connect["time_delta_with_previous_rental_in_minutes"] - 30
|
| 171 |
+
]
|
| 172 |
+
|
| 173 |
+
# Cas "conflit -60min"
|
| 174 |
+
conflict_2minus60 = merged_connect[
|
| 175 |
+
merged_connect["delay_at_checkout_in_minutes"] > merged_connect["time_delta_with_previous_rental_in_minutes"] - 60
|
| 176 |
+
]
|
| 177 |
+
|
| 178 |
+
conflict_2minus90 = merged_connect[
|
| 179 |
+
merged_connect["delay_at_checkout_in_minutes"] > merged_connect["time_delta_with_previous_rental_in_minutes"] - 90
|
| 180 |
+
]
|
| 181 |
+
|
| 182 |
+
conflict_2minus180 = merged_connect[
|
| 183 |
+
merged_connect["delay_at_checkout_in_minutes"] > merged_connect["time_delta_with_previous_rental_in_minutes"] - 180
|
| 184 |
+
]
|
| 185 |
+
|
| 186 |
+
# Création d'une liste de résultats
|
| 187 |
+
results = [
|
| 188 |
+
{"Buffer": "-30 min", "Conflits": len(conflict_2minus30), "Moyenne retard (min)": conflict_2minus30["delay_at_checkout_in_minutes"].mean()},
|
| 189 |
+
{"Buffer": "-60 min", "Conflits": len(conflict_2minus60), "Moyenne retard (min)": conflict_2minus60["delay_at_checkout_in_minutes"].mean()},
|
| 190 |
+
{"Buffer": "-90 min", "Conflits": len(conflict_2minus90), "Moyenne retard (min)": conflict_2minus90["delay_at_checkout_in_minutes"].mean()},
|
| 191 |
+
{"Buffer": "-180 min", "Conflits": len(conflict_2minus180), "Moyenne retard (min)": conflict_2minus180["delay_at_checkout_in_minutes"].mean()},
|
| 192 |
+
]
|
| 193 |
+
df_conflicts_con = pd.DataFrame(results)
|
| 194 |
+
|
| 195 |
+
df_conflicts_con['lost_value'] = df_conflicts_con["Conflits"]*loc_moyenne
|
| 196 |
+
|
| 197 |
+
st.dataframe(df_conflicts_con)
|
| 198 |
+
|
| 199 |
+
st.mardown("""Les deux systèmes subissent des annulations liées aux délais courts.
|
| 200 |
+
|
| 201 |
+
Connect est plus fréquent en volume absolu, mais ses retards sont légèrement moins sévères.
|
| 202 |
+
|
| 203 |
+
Mobile présente moins de cas mais avec des retards plus longs → donc plus difficiles à absorber sans impact client.
|
| 204 |
+
|
| 205 |
+
Les deux méthodes sont exposées aux retards, mais Connect encaisse plus de cas tandis que Mobile concentre les retards les plus importants.""" )
|
| 206 |
|
| 207 |
|
| 208 |
|