| import streamlit as st |
| import pandas as pd |
| import matplotlib.pyplot as plt |
|
|
|
|
| st.set_page_config( |
| page_title="Formula 1 Data Visualization", |
| page_icon="🏎️", |
| layout="wide" |
| ) |
|
|
| st.title("🏎️ Formula 1 Data Visualization") |
|
|
| st.write( |
| "Bu uygulama, 1950-2024 yılları arasındaki Formula 1 verilerini kullanarak " |
| "pilotlar, takımlar, yarışlar ve pistler üzerine görselleştirmeler sunar." |
| ) |
|
|
|
|
| @st.cache_data |
| def load_data(): |
| drivers = pd.read_csv("src/drivers.csv") |
| constructors = pd.read_csv("src/constructors.csv") |
| races = pd.read_csv("src/races.csv") |
| results = pd.read_csv("src/results.csv") |
| circuits = pd.read_csv("src/circuits.csv") |
| return drivers, constructors, races, results, circuits |
|
|
|
|
| drivers, constructors, races, results, circuits = load_data() |
|
|
|
|
| st.sidebar.title("Grafik Seçimi") |
|
|
| grafik = st.sidebar.selectbox( |
| "Bir grafik seçin:", |
| [ |
| "Yıllara Göre Yarış Sayısı", |
| "En Çok Yarış Kazanan Pilotlar", |
| "En Başarılı Takımlar", |
| "Pilot Milliyetleri", |
| "Yarış Düzenleyen Ülkeler", |
| "Start Pozisyonu ve Yarış Sonucu", |
| "En Çok Yarış Düzenlenen Pistler" |
| ] |
| ) |
|
|
|
|
| if grafik == "Yıllara Göre Yarış Sayısı": |
| st.subheader("Yıllara Göre Formula 1 Yarış Sayısı") |
|
|
| race_count = races.groupby("year")["raceId"].count() |
|
|
| fig, ax = plt.subplots(figsize=(12, 5)) |
| ax.plot(race_count.index, race_count.values) |
| ax.set_xlabel("Yıl") |
| ax.set_ylabel("Yarış Sayısı") |
| ax.set_title("Yıllara Göre Formula 1 Yarış Sayısı") |
|
|
| st.pyplot(fig) |
|
|
|
|
| elif grafik == "En Çok Yarış Kazanan Pilotlar": |
| st.subheader("En Çok Yarış Kazanan Pilotlar") |
|
|
| wins = results[results["positionOrder"] == 1] |
|
|
| driver_wins = wins.groupby("driverId").size().reset_index(name="wins") |
|
|
| driver_wins = driver_wins.merge( |
| drivers, |
| on="driverId" |
| ) |
|
|
| driver_wins["pilot"] = ( |
| driver_wins["forename"] + " " + driver_wins["surname"] |
| ) |
|
|
| top_drivers = driver_wins.sort_values( |
| "wins", |
| ascending=False |
| ).head(15) |
|
|
| fig, ax = plt.subplots(figsize=(10, 6)) |
| ax.barh(top_drivers["pilot"], top_drivers["wins"]) |
| ax.set_xlabel("Galibiyet Sayısı") |
| ax.set_title("En Çok Yarış Kazanan 15 Pilot") |
| ax.invert_yaxis() |
|
|
| st.pyplot(fig) |
|
|
|
|
| elif grafik == "En Başarılı Takımlar": |
| st.subheader("En Başarılı Takımlar") |
|
|
| wins = results[results["positionOrder"] == 1] |
|
|
| team_wins = wins.groupby("constructorId").size().reset_index(name="wins") |
|
|
| team_wins = team_wins.merge( |
| constructors, |
| on="constructorId" |
| ) |
|
|
| top_teams = team_wins.sort_values( |
| "wins", |
| ascending=False |
| ).head(10) |
|
|
| fig, ax = plt.subplots(figsize=(10, 6)) |
| ax.barh(top_teams["name"], top_teams["wins"]) |
| ax.set_xlabel("Galibiyet Sayısı") |
| ax.set_title("En Başarılı 10 Formula 1 Takımı") |
| ax.invert_yaxis() |
|
|
| st.pyplot(fig) |
|
|
|
|
| elif grafik == "Pilot Milliyetleri": |
| st.subheader("Pilot Milliyetleri Dağılımı") |
|
|
| top_nations = drivers["nationality"].value_counts().head(10) |
|
|
| fig, ax = plt.subplots(figsize=(8, 8)) |
| ax.pie( |
| top_nations, |
| labels=top_nations.index, |
| autopct="%1.1f%%" |
| ) |
| ax.set_title("Pilot Milliyetleri Dağılımı") |
|
|
| st.pyplot(fig) |
|
|
|
|
| elif grafik == "Yarış Düzenleyen Ülkeler": |
| st.subheader("En Çok Yarış Düzenleyen Ülkeler") |
|
|
| country_count = circuits["country"].value_counts().head(15) |
|
|
| fig, ax = plt.subplots(figsize=(10, 6)) |
| ax.barh(country_count.index, country_count.values) |
| ax.set_xlabel("Pist Sayısı") |
| ax.set_title("En Çok Formula 1 Pisti Bulunan Ülkeler") |
| ax.invert_yaxis() |
|
|
| st.pyplot(fig) |
|
|
|
|
| elif grafik == "Start Pozisyonu ve Yarış Sonucu": |
| st.subheader("Start Pozisyonu ve Yarış Sonucu") |
|
|
| sample_results = results[ |
| results["grid"] > 0 |
| ][["grid", "positionOrder"]].sample( |
| 5000, |
| random_state=42 |
| ) |
|
|
| fig, ax = plt.subplots(figsize=(8, 6)) |
| ax.scatter( |
| sample_results["grid"], |
| sample_results["positionOrder"], |
| alpha=0.4 |
| ) |
| ax.set_xlabel("Grid Pozisyonu") |
| ax.set_ylabel("Yarış Sonucu") |
| ax.set_title("Start Pozisyonu ve Yarış Sonucu") |
|
|
| st.pyplot(fig) |
|
|
| st.write( |
| "Grafik, ön sıralardan başlayan pilotların yarışları üst sıralarda " |
| "bitirme eğiliminin daha yüksek olduğunu göstermektedir." |
| ) |
|
|
|
|
| elif grafik == "En Çok Yarış Düzenlenen Pistler": |
| st.subheader("En Çok Yarış Düzenlenen Pistler") |
|
|
| circuit_count = races.groupby("circuitId").size().reset_index(name="race_count") |
|
|
| circuit_count = circuit_count.merge( |
| circuits, |
| on="circuitId" |
| ) |
|
|
| top_circuits = circuit_count.sort_values( |
| "race_count", |
| ascending=False |
| ).head(15) |
|
|
| fig, ax = plt.subplots(figsize=(10, 6)) |
| ax.barh(top_circuits["name"], top_circuits["race_count"]) |
| ax.set_xlabel("Yarış Sayısı") |
| ax.set_title("En Çok Yarış Düzenlenen Pistler") |
| ax.invert_yaxis() |
|
|
| st.pyplot(fig) |