Marcel0123 commited on
Commit
cbd3079
·
verified ·
1 Parent(s): 13c8514

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +17 -62
app.py CHANGED
@@ -17,26 +17,23 @@ from sklearn.decomposition import PCA
17
  # ======================================================
18
  # DATA LADEN
19
  # ======================================================
20
- VEREISTE_KOLOMMEN = {"survived","pclass","sex","age","sibsp","parch","fare","embarked"}
21
 
22
  def load_data(path="Titanic-Dataset.csv"):
23
  if not os.path.exists(path):
24
  raise FileNotFoundError("❌ Titanic-Dataset.csv niet gevonden in de rootmap.")
25
  df = pd.read_csv(path)
26
  df.columns = [c.lower().strip() for c in df.columns]
27
- ontbrekend = VEREISTE_KOLOMMEN - set(df.columns)
28
- if ontbrekend:
29
- raise ValueError(f"Ontbrekende kolommen: {', '.join(sorted(ontbrekend))}")
30
- # Missende waarden invullen (modus voor categorisch, mediaan voor numeriek)
31
  for c in df.columns:
32
  if df[c].isna().any():
33
  df[c] = df[c].fillna(df[c].mode()[0] if df[c].dtype=='O' else df[c].median())
34
- # Afgeleide kolommen
35
  df["family_size"] = df["sibsp"] + df["parch"] + 1
36
  df["status"] = df["survived"].map({0:"Niet overleefd", 1:"Overleefd"})
37
- # Consistente casing (laat intern Engels voor model/plots; vertaling doen we alleen in de preview-tabel)
38
- df["sex"] = df["sex"].astype(str).str.title() # 'Male'/'Female'
39
- df["embarked"] = df["embarked"].astype(str).str.upper() # 'S'/'C'/'Q'
40
  return df
41
 
42
  df = load_data()
@@ -64,46 +61,6 @@ def make_plot(fig, title):
64
  )
65
  return fig
66
 
67
- def maak_passagiers_preview(df_src: pd.DataFrame) -> pd.DataFrame:
68
- """
69
- Maakt een weergavetabel met Nederlandse kolomnamen/waarden (alleen voor tonen in de UI).
70
- We wijzigen het originele df niet (het model gebruikt nog steeds de Engelse kolommen/waarden).
71
- """
72
- kolommen = ["pclass","sex","age","sibsp","parch","fare","embarked","family_size","status"]
73
- optioneel = ["name","ticket","cabin"]
74
- aanwezig_opt = [c for c in optioneel if c in df_src.columns]
75
- selectie = kolommen + aanwezig_opt
76
-
77
- d = df_src[selectie].copy()
78
-
79
- # Waarde-vertalingen voor weergave
80
- d["sex"] = d["sex"].map({"Male":"Man", "Female":"Vrouw"}).fillna(d["sex"])
81
- d["embarked"] = d["embarked"].map({"S":"Southampton","C":"Cherbourg","Q":"Queenstown"}).fillna(d["embarked"])
82
-
83
- # Kolomnamen naar NL
84
- mapping = {
85
- "pclass":"Klasse",
86
- "sex":"Geslacht",
87
- "age":"Leeftijd",
88
- "sibsp":"Broers/Zussen",
89
- "parch":"Ouders/Kinderen",
90
- "fare":"Ticketprijs (£)",
91
- "embarked":"Vertrekhaven",
92
- "family_size":"Familieomvang",
93
- "status":"Uitkomst",
94
- "name":"Naam",
95
- "ticket":"Ticket",
96
- "cabin":"Hut",
97
- }
98
- d = d.rename(columns=mapping)
99
-
100
- # Sorteer kolommen op een prettige volgorde
101
- volgorde = [k for k in ["Naam","Klasse","Geslacht","Leeftijd","Familieomvang",
102
- "Broers/Zussen","Ouders/Kinderen","Ticketprijs (£)",
103
- "Vertrekhaven","Uitkomst","Ticket","Hut"] if k in d.columns]
104
- d = d[volgorde]
105
- return d.head(10)
106
-
107
  # ======================================================
108
  # MODELTRAINING + 2D VISUALISATIE
109
  # ======================================================
@@ -306,9 +263,6 @@ h1, h2, h3, h4 { color:#1B4B91; }
306
  .kpi .value { font-size:1.6rem; font-weight:800; color:#1B4B91; }
307
  .kpi .label { font-size:.9rem; color:#3F557A; }
308
  .explain-card { background:#EAF0FF; border-radius:12px; padding:18px; border:1px solid #D5E0FA; }
309
-
310
- /* Scrollbaar venster voor de passagierstabel */
311
- #passenger_table { overflow:auto; max-height:250px; }
312
  """
313
 
314
  with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as demo:
@@ -321,17 +275,18 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
321
  if hp: gr.Image(value=hp, interactive=False, show_label=False, elem_classes=["hero-img"])
322
  else: gr.Markdown("⚠️ **Geen afbeelding gevonden.** Plaats `titanic_bg.png` of `titanic_bg.jpg` in de root.")
323
 
324
- # NIEUW PANEEL: Passagierslijst (eerste 10 rijen) — scrollbaar
325
  with gr.Column(elem_classes=["panel"]):
326
- gr.Markdown("## 👥 Passagierslijst — eerste 10 rijen van de dataset")
327
  gr.DataFrame(
328
- value=maak_passagiers_preview(df),
329
  wrap=True,
330
- interactive=False,
331
- label="Titanic-passagiers (voorbeeld)",
332
- elem_id="passenger_table",
333
- max_height=250
334
  )
 
 
335
 
336
  # Panel: status + 2D-plot links en uitleg rechts
337
  with gr.Column(elem_classes=["panel"]):
@@ -343,7 +298,7 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
343
  with gr.Column(scale=1, min_width=320):
344
  gr.Markdown(EXPLAIN_MD_SIDE, elem_classes=["explain-card"])
345
 
346
- # KPI-tegels
347
  with gr.Row():
348
  gr.HTML(f"<div class='kpi'><div class='value'>{len(df):,}</div><div class='label'>Totaal passagiers</div></div>")
349
  gr.HTML(f"<div class='kpi'><div class='value'>{int(df['survived'].sum()):,}</div><div class='label'>Overlevenden</div></div>")
@@ -394,11 +349,11 @@ Hier kun je ontdekken **hoe groot jouw kans op overleving** zou zijn geweest aan
394
  btn = gr.Button("🎲 Bereken én vertel mijn verhaal", variant="primary")
395
  story_out = gr.Markdown()
396
 
397
- # Laden & acties
398
  demo.load(fn=train_and_embed_solid, inputs=[], outputs=[status_md, train_plot])
399
  demo.load(lambda: (plot_age_hist(df), plot_gender(df), plot_fare_box(df)), inputs=[], outputs=[g2, g3, g4])
400
 
401
- # Initiële gauge (na modeltraining): gebruik de default UI-waarden
402
  demo.load(lambda: live_viz(2, "Man", 30, 1, 0, 50, "S"), inputs=[], outputs=[viz_plot])
403
 
404
  # Live updates bij elke wijziging
 
17
  # ======================================================
18
  # DATA LADEN
19
  # ======================================================
20
+ REQUIRED = {"survived","pclass","sex","age","sibsp","parch","fare","embarked"}
21
 
22
  def load_data(path="Titanic-Dataset.csv"):
23
  if not os.path.exists(path):
24
  raise FileNotFoundError("❌ Titanic-Dataset.csv niet gevonden in de rootmap.")
25
  df = pd.read_csv(path)
26
  df.columns = [c.lower().strip() for c in df.columns]
27
+ missing = REQUIRED - set(df.columns)
28
+ if missing:
29
+ raise ValueError(f"Ontbrekende kolommen: {', '.join(sorted(missing))}")
 
30
  for c in df.columns:
31
  if df[c].isna().any():
32
  df[c] = df[c].fillna(df[c].mode()[0] if df[c].dtype=='O' else df[c].median())
 
33
  df["family_size"] = df["sibsp"] + df["parch"] + 1
34
  df["status"] = df["survived"].map({0:"Niet overleefd", 1:"Overleefd"})
35
+ df["sex"] = df["sex"].astype(str).str.title()
36
+ df["embarked"] = df["embarked"].astype(str).str.upper()
 
37
  return df
38
 
39
  df = load_data()
 
61
  )
62
  return fig
63
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  # ======================================================
65
  # MODELTRAINING + 2D VISUALISATIE
66
  # ======================================================
 
263
  .kpi .value { font-size:1.6rem; font-weight:800; color:#1B4B91; }
264
  .kpi .label { font-size:.9rem; color:#3F557A; }
265
  .explain-card { background:#EAF0FF; border-radius:12px; padding:18px; border:1px solid #D5E0FA; }
 
 
 
266
  """
267
 
268
  with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as demo:
 
275
  if hp: gr.Image(value=hp, interactive=False, show_label=False, elem_classes=["hero-img"])
276
  else: gr.Markdown("⚠️ **Geen afbeelding gevonden.** Plaats `titanic_bg.png` of `titanic_bg.jpg` in de root.")
277
 
278
+ # NIEUW PANEEL: Passagierslijst (volledige dataset, scrollbaar)
279
  with gr.Column(elem_classes=["panel"]):
280
+ gr.Markdown("## 👥 Passagierslijst — volledige dataset (scrollbaar)")
281
  gr.DataFrame(
282
+ value=df, # volledige dataset
283
  wrap=True,
284
+ interactive=False, # alleen-lezen
285
+ label="Titanic-passagiers",
286
+ max_height=320 # vaste hoogte -> scroll binnen de tabel
 
287
  )
288
+ # Kleine spacer om overlap te voorkomen
289
+ gr.Markdown("")
290
 
291
  # Panel: status + 2D-plot links en uitleg rechts
292
  with gr.Column(elem_classes=["panel"]):
 
298
  with gr.Column(scale=1, min_width=320):
299
  gr.Markdown(EXPLAIN_MD_SIDE, elem_classes=["explain-card"])
300
 
301
+ # KPIs
302
  with gr.Row():
303
  gr.HTML(f"<div class='kpi'><div class='value'>{len(df):,}</div><div class='label'>Totaal passagiers</div></div>")
304
  gr.HTML(f"<div class='kpi'><div class='value'>{int(df['survived'].sum()):,}</div><div class='label'>Overlevenden</div></div>")
 
349
  btn = gr.Button("🎲 Bereken én vertel mijn verhaal", variant="primary")
350
  story_out = gr.Markdown()
351
 
352
+ # Loads & acties
353
  demo.load(fn=train_and_embed_solid, inputs=[], outputs=[status_md, train_plot])
354
  demo.load(lambda: (plot_age_hist(df), plot_gender(df), plot_fare_box(df)), inputs=[], outputs=[g2, g3, g4])
355
 
356
+ # Initiele gauge (na modeltraining): gebruik de default UI-waarden
357
  demo.load(lambda: live_viz(2, "Man", 30, 1, 0, 50, "S"), inputs=[], outputs=[viz_plot])
358
 
359
  # Live updates bij elke wijziging