gdleds commited on
Commit
b968dc8
·
1 Parent(s): 2a26115

app modif buffer2

Browse files
Files changed (1) hide show
  1. app.py +92 -2
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 **retard allant au delà de l'heure de début de la prochaine location.
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