diff --git a/Readme.md b/Readme.md
index 0de800d..4d25279 100644
--- a/Readme.md
+++ b/Readme.md
@@ -23,7 +23,7 @@ pip install -r requirements.txt
## Start streamlit app
```python
-streamlit run app.py --theme.base dark
+streamlit run app(2.1).py --theme.base dark
```
diff --git a/app.py b/app(1.0).py
similarity index 100%
rename from app.py
rename to app(1.0).py
diff --git a/app(2.1).py b/app(2.1).py
new file mode 100644
index 0000000..ce3db8d
--- /dev/null
+++ b/app(2.1).py
@@ -0,0 +1,477 @@
+from src.helpers import *
+import pandas as pd
+import streamlit as st
+from streamlit_option_menu import option_menu
+from streamlit_folium import st_folium
+import matplotlib.pyplot as plt
+import folium
+st.set_option('deprecation.showPyplotGlobalUse', False)
+#df = pd.read_csv("data/own.csv")
+df=pd.read_csv("data/personal_flight_data.csv")
+airport_df = pd.read_csv("data/airports.csv")
+leaf_keywords_df = pd.read_csv("data/green_aircraft.csv")
+leaf_keywords = [str(k).strip().lower() for k in leaf_keywords_df["keyword"].dropna()]
+airline_colors_df = pd.read_csv("data/airline_colors.csv")
+airline_color_dict = dict(zip(airline_colors_df['Airline'], airline_colors_df['Color']))
+updates_made = False
+if df["distance"].isnull().any():
+ for index, row in df.iterrows():
+ # Only process if both origin and destination are present
+ if pd.notnull(row.get('origin', None)) and pd.notnull(row.get('destination', None)) and row['origin'] and row['destination']:
+ # Try to find airport by ICAO or IATA code
+ def find_airport(code):
+ if pd.isnull(code):
+ return None
+ code = str(code).strip().upper()
+ # Try ICAO first
+ match = airport_df[airport_df['ident'].str.upper() == code]
+ if not match.empty:
+ return match.iloc[0]
+ # Try IATA if available
+ if 'iata_code' in airport_df.columns:
+ match = airport_df[airport_df['iata_code'].str.upper() == code]
+ if not match.empty:
+ return match.iloc[0]
+ return None
+
+ # Fill coordinates if missing
+ if pd.isnull(row['origin_lat']) or pd.isnull(row['origin_lng']) or pd.isnull(row['destination_lat']) or pd.isnull(row['destination_lng']):
+ # Use helper to get coordinates, but allow both ICAO and IATA
+ origin_airport = find_airport(row['origin'])
+ dest_airport = find_airport(row['destination'])
+ if origin_airport is not None and dest_airport is not None:
+ df.at[index, 'origin_lat'] = origin_airport['latitude_deg']
+ df.at[index, 'origin_lng'] = origin_airport['longitude_deg']
+ df.at[index, 'destination_lat'] = dest_airport['latitude_deg']
+ df.at[index, 'destination_lng'] = dest_airport['longitude_deg']
+ updates_made = True
+ # Fill distance if missing and coordinates are present
+ lat1, lon1, lat2, lon2 = df.at[index, 'origin_lat'], df.at[index, 'origin_lng'], df.at[index, 'destination_lat'], df.at[index, 'destination_lng']
+ if pd.isnull(row['distance']) and pd.notnull(lat1) and pd.notnull(lon1) and pd.notnull(lat2) and pd.notnull(lon2):
+ df.at[index, 'distance'] = calculate_distance(lat1, lon1, lat2, lon2)
+ updates_made = True
+ else:
+ # If origin or destination is missing, leave coordinates and distance as NaN
+ continue
+## update origin link if necessary
+if df["origin_link"].isnull().any():
+ update_links(df, airport_df, origin_col="origin", link_col="origin_link", second_origin_col="ident", second_link_col="home_link")
+ updates_made = True
+if df["destination_link"].isnull().any():
+ update_links(df, airport_df, origin_col="destination", link_col="destination_link", second_origin_col="ident", second_link_col="home_link")
+ updates_made = True
+if df["origin_wikipedia_link"].isnull().any():
+ update_links(df, airport_df, origin_col="origin", link_col="origin_wikipedia_link", second_origin_col="ident", second_link_col="wikipedia_link")
+ updates_made = True
+if df["destination_wikipedia_link"].isnull().any():
+ update_links(df, airport_df, origin_col="destination", link_col="destination_wikipedia_link", second_origin_col="ident", second_link_col="wikipedia_link")
+ updates_made = True
+
+if updates_made:
+ df.to_csv("data/personal_flight_data.csv", index=False)
+print(df)
+
+
+#st.title("Your Streamlit App")
+
+with st.sidebar:
+ selection = option_menu(
+ "Tabs",
+ [
+ "Overview",
+ "Map",
+ "More Statistics",
+ "Add Data",
+ "Edit Data",
+ "Information" # <-- Add this line
+ ],
+ icons=[
+ "airplane",
+ "map",
+ "bar-chart",
+ "cloud-upload",
+ "pencil-square",
+ "info-circle" # <-- Add an icon for Information
+ ],
+ menu_icon="archive",
+ default_index=0,
+ styles={
+ "container": {"padding": "0!important", "width": "100%", "background-color": "#02001e"},
+ "icon": {"font-size": "14px", "margin-right": "5px", "color": "white"},
+ "nav-link": {"font-size": "14px", "text-align": "left", "margin":"2px"},
+ }
+ )
+
+
+if selection == "Overview":
+ st.title("All your flights add up:")
+
+ # 📅 Sort by date (most recent first)
+ df_sorted = df.copy()
+ df_sorted['Date'] = pd.to_datetime(df_sorted['Date'], dayfirst=True, errors='coerce')
+ df_sorted = df_sorted.sort_values(by='Date', ascending=False)
+
+ # 📅 Extract valid dates
+ valid_dates = df_sorted['Date'].dropna()
+
+ # Calculate streak
+ if st.session_state.get("monthly_streak", False):
+ # Monthly streak
+ months = valid_dates.dt.to_period("M").sort_values(ascending=False).unique()
+ streak = 1
+ for i in range(1, len(months)):
+ if months[i] == months[i - 1] - 1:
+ streak += 1
+ else:
+ break
+ if streak == 1:
+ streak_text = f"{months[0].strftime('%b %Y')}"
+ else:
+ streak_text = f"{months[streak - 1].strftime('%b %Y')} → {months[0].strftime('%b %Y')}"
+ streak_label = "month"
+ else:
+ # Yearly streak (default)
+ years = valid_dates.dt.year.sort_values(ascending=False).unique()
+ streak = 1
+ for i in range(1, len(years)):
+ if years[i] == years[i - 1] - 1:
+ streak += 1
+ else:
+ break
+ if streak == 1:
+ streak_text = f"{years[0]}"
+ else:
+ streak_text = f"{years[streak - 1]} → {years[0]}"
+ streak_label = "year"
+
+ # 🎯 Display streak at the top, centered, and larger
+ st.markdown(
+ f"""
+
+ 🔥 {streak} {streak_label}{'s' if streak > 1 else ''} in a row
+ ({streak_text})
+
+ """,
+ unsafe_allow_html=True
+ )
+
+ # ✈️ Statistics
+ distance = round(get_column_sum(df, "distance"))
+ surrounded = round(surrounded_world(distance), ndigits=2)
+ col1, col2 = st.columns(2)
+
+ with col1:
+ st.markdown(f"✈️ Impressive you already covered {distance} km", unsafe_allow_html=True)
+ st.markdown(f"🌎 Surrounded world {surrounded} times", unsafe_allow_html=True)
+
+ with col2:
+ # Most flown airline
+ if not df['Airline'].dropna().empty:
+ most_airline = df['Airline'].mode()[0]
+ airline_count = df['Airline'].value_counts()[most_airline]
+ st.markdown(f"You really seem to love {most_airline} ❤️ ({airline_count} flights)", unsafe_allow_html=True)
+ else:
+ st.markdown("Most flown airline: N/A", unsafe_allow_html=True)
+
+ # Most flown aircraft
+ if not df['Aircraft'].dropna().empty:
+ most_aircraft = df['Aircraft'].mode()[0]
+ aircraft_count = df['Aircraft'].value_counts()[most_aircraft]
+ st.markdown(f"One aircraft stands out, the {most_aircraft} ({aircraft_count} flights)", unsafe_allow_html=True)
+ else:
+ st.markdown("Most flown aircraft: N/A", unsafe_allow_html=True)
+
+ st.write("---")
+ # 🔝 Show the 5 most recent flights
+
+
+ st.subheader("🆕 Most Recent Flights")
+
+ for idx, row in df_sorted.head(5).iterrows():
+ aircraft = row.get('Aircraft', '')
+ leaf = ""
+ if isinstance(aircraft, str) and any(kw in aircraft.lower() for kw in leaf_keywords):
+ leaf = " 🍃"
+ date_str = row['Date'].strftime('%d.%m.%Y') if pd.notnull(row['Date']) else "Unknown date"
+ # Determine color based on airline, fallback to gray if not found or missing
+ airline = row.get('Airline', None)
+ if pd.notnull(airline):
+ airline_key = airline.strip()
+ bg_color = airline_color_dict.get(airline_key, "#AAAAAA")
+ else:
+ bg_color = "#AAAAAA" # gray for unknown or missing airline
+
+ st.markdown(
+ f"""
+
+ {date_str} — {row['Airline']} {row['Flight Number']}
+ from {row['origin']} to {row['destination']} on a {row['Aircraft']}
+ ({row['Seat']}, {row['Regestration']}){leaf}
+
+ """,
+ unsafe_allow_html=True
+ )
+
+ # 👇 Show/hide older flights with a button
+ if "show_older" not in st.session_state:
+ st.session_state.show_older = False
+
+ if st.session_state.show_older:
+ if st.button("Hide Older Flights", key="hide_older"):
+ st.session_state.show_older = False
+ st.experimental_rerun()
+ st.subheader("📋 Older Flights")
+ for idx, row in df_sorted.iloc[5:].iterrows():
+ aircraft = row.get('Aircraft', '')
+ leaf = ""
+ if isinstance(aircraft, str) and any(kw in aircraft.lower() for kw in leaf_keywords):
+ leaf = " 🍃"
+ date_str = row['Date'].strftime('%d.%m.%Y') if pd.notnull(row['Date']) else "Unknown date"
+ airline = row.get('Airline', None)
+ if pd.notnull(airline):
+ airline_key = airline.strip()
+ bg_color = airline_color_dict.get(airline_key, "#AAAAAA")
+ else:
+ bg_color = "#AAAAAA"
+
+ st.markdown(
+ f"""
+
+ {date_str} — {row['Airline']} {row['Flight Number']}
+ from {row['origin']} to {row['destination']} on a {row['Aircraft']}
+ ({row['Seat']}, {row['Regestration']}){leaf}
+
+ """,
+ unsafe_allow_html=True
+ )
+ else:
+ if st.button("Show Older Flights", key="show_older"):
+ st.session_state.show_older = True
+ st.experimental_rerun()
+
+
+
+
+
+
+if selection == "Map":
+ st.title('Map')
+ m = folium.Map(location=[df['origin_lat'].mean(), df['origin_lng'].mean()], zoom_start=2)
+
+ for _, row in df.iterrows():
+ # Skip if origin or destination is missing or NaN
+ if (
+ pd.isnull(row.get('origin_lat')) or pd.isnull(row.get('origin_lng')) or
+ pd.isnull(row.get('destination_lat')) or pd.isnull(row.get('destination_lng'))
+ ):
+ continue
+
+ folium.Marker(
+ location=[row['origin_lat'], row['origin_lng']],
+ icon=folium.Icon(color='blue', icon='plane-departure'),
+ popup='Origin'
+ ).add_to(m)
+
+ folium.Marker(
+ location=[row['destination_lat'], row['destination_lng']],
+ icon=folium.Icon(color='blue', icon='plane-arrival'),
+ popup='Destination'
+ ).add_to(m)
+
+ folium.PolyLine(
+ locations=[
+ [row['origin_lat'], row['origin_lng']],
+ [row['destination_lat'], row['destination_lng']]
+ ],
+ color='red'
+ ).add_to(m)
+
+ st_folium(m, width=725, height=500)
+
+
+if selection == "More Statistics":
+ st.title("Even more statistics")
+
+ # Prepare statistics
+ origin_counts = df['origin'].value_counts()
+ destination_counts = df['destination'].value_counts()
+ aircraft_counts = df['Aircraft'].value_counts()
+ airline_counts = df['Airline'].value_counts()
+
+ def render_stat_blocks(title, counts, color="#4F8BF9", label="Flights"):
+ st.subheader(title)
+ max_count = counts.max() if not counts.empty else 1
+ for item, count in counts.items():
+ block_count = min(count, 40)
+ bar = f""
+ st.markdown(
+ f"""
+
+ {item}
+ {bar}
+
+
+ Traveler, frequent traveler, or flying maniac?
+ Per default, the streak will be yearly. For all you frequent flyers, you can switch to a monthly streak calculation to up the thrill.
+
+ """,
+ unsafe_allow_html=True
+ )
+ btn_label = "Monthly Streak" if not st.session_state["monthly_streak"] else "Yearly Streak"
+ btn_clicked = st.button(btn_label, key="toggle_streak_info", help="Toggle streak calculation mode")
+ st.markdown("
", unsafe_allow_html=True)
+ if btn_clicked:
+ st.session_state["monthly_streak"] = not st.session_state["monthly_streak"]
+ st.experimental_rerun()
+
+ info_boxes = [
+ "The color added to each flight is supposed to represent that airlines color. However, some airlines are automatically generated and therefore might not align with what youd expect. Make changes youself through the airline_colors.csv located in the data folder or, if your not tach-savvy, let me know.",
+ "Tip: Use the 'Add Data' tab to enter new flights. You can edit or delete any flight in the 'Edit Data' tab later.",
+ "The leaf symbol (🍃) next to an aircraft indicates that it is considered a 'green' aircraft, meaning it has lower emissions or is more environmentally friendly compared to other frequently used aircraft.",
+ "Your data is saved locally as a CSV file. We dont make backups so if you care about your logbook please do that yourself!",
+ ]
+
+ for info in info_boxes:
+ st.markdown(
+ f"""
+
+ {info}
+
+ """,
+ unsafe_allow_html=True
+ )
+
+ st.markdown(
+ f"""
+
+ Made with love in Hamburg EDDH/HAM 🖤
+ by Cole
+
+ """,
+ unsafe_allow_html=True
+ )
+
+
+
+
diff --git a/data/airline_colors.csv b/data/airline_colors.csv
new file mode 100644
index 0000000..fb31342
--- /dev/null
+++ b/data/airline_colors.csv
@@ -0,0 +1,98 @@
+Airline,Color
+Delta Air Lines,#C8102E
+Delta,#C8102E
+United Airlines,#005DAA
+United,#005DAA
+American Airlines,#B61F23
+Lufthansa,#0A1D3D
+Air France,#002157
+KLM Royal Dutch Airlines,#00A1E4
+British Airways,#075AAA
+Iberia,#DA162A
+Emirates,#D71921
+Qatar Airways,#5C0632
+Turkish Airlines,#C70A0C
+Swiss International Air Lines,#D52B1E
+Austrian Airlines,#ED2939
+Scandinavian Airlines (SAS),#00205B
+Finnair,#00205B
+Aer Lingus,#007D8A
+TAP Air Portugal,#D71921
+Alitalia,#006633
+Virgin Atlantic,#CC0000
+Virgin Australia,#CC0000
+Virgin America,#CC0000
+Ryanair,#F4CA35
+EasyJet,#FF6600
+Wizz Air,#C6007E
+JetBlue Airways,#003876
+Southwest Airlines,#E31837
+Alaska Airlines,#003B49
+WestJet,#046A38
+Air Canada,#FF0000
+Hawaiian Airlines,#633194
+Aeroméxico,#002F6C
+Avianca,#DA291C
+LATAM Airlines,#002776
+Azul Brazilian Airlines,#0033A0
+Copa Airlines,#003366
+Gol Linhas Aéreas,#FF6600
+Aerolineas Argentinas,#00AEEF
+Air New Zealand,#000000
+Qantas,#E4002B
+Singapore Airlines,#FFB612
+Cathay Pacific,#00685E
+Japan Airlines,#E60012
+All Nippon Airways (ANA),#0F2D73
+Korean Air,#003DA5
+China Southern Airlines,#008ACD
+China Eastern Airlines,#D71921
+Air China,#E60012
+Hainan Airlines,#E60012
+Ethiopian Airlines,#078930
+South African Airways,#002B7F
+Kenya Airways,#E60012
+Easy Jet,#FF671E
+Frontier,#248168
+Eurowings,#8F174F
+TAP Air Portugal,#008751
+Vueling,#FFCC00
+ITA Airways,#0072CE
+WestJet,#00777C
+Transavia,#67BD47
+Norwegian Air Shuttle,#EB1C2D
+Luxair,#00A9CE
+Austrian Airlines,#ED1C24
+Swiss International Air Lines,#D40511
+Porter Airlines,#1A2E6C
+SATA Air Açores,#0064A3
+JetSMART,#E60012
+LEVEL,#005FAA
+CityJet,#8E0C3A
+Ryanair,#F4CA35
+Volotea,#A60F2D
+Flyr,#163541
+La Compagnie,#354C9C
+Wamos Air,#8C4799
+Aegean Airlines,#1A2E6C
+AirBaltic,#B2D235
+Air Dolomiti,#008C95
+Air Europa,#0066B3
+Air Serbia,#1A1A1A
+Air Transat,#00AEEF
+Allegiant Air,#FF6600
+Atlantic Airways,#003366
+Azores Airlines,#007A78
+Binter Canarias,#8DC63F
+Blue Air,#004A99
+Brussels Airlines,#ED2939
+Condor,#F6BE00
+Corsair,#00205B
+Frontier Airlines,#007A33
+Icelandair,#002B7F
+Jet2,#D71921
+Play Airlines,#EF1621
+Sun Country Airlines,#002F6C
+TUI Airways,#00B4E6
+Fly Safair,#e01f9d
+
diff --git a/data/green_aircraft.csv b/data/green_aircraft.csv
new file mode 100644
index 0000000..86815f1
--- /dev/null
+++ b/data/green_aircraft.csv
@@ -0,0 +1,11 @@
+keyword
+neo
+NEO
+max
+Max
+MAX
+350
+787
+220
+XLR
+
diff --git a/data/personal_flight_data.csv b/data/personal_flight_data.csv
index 5a37336..b271cb1 100644
--- a/data/personal_flight_data.csv
+++ b/data/personal_flight_data.csv
@@ -1,25 +1,27 @@
Airline,Aircraft,Regestration,Seat,Flight Number,origin,destination,Date,Origin Address,Destination address,origin_lat,origin_lng,destination_lat,destination_lng,distance,origin_link,origin_wikipedia_link,destination_link,destination_wikipedia_link,Destination Address
-Lufthansa ,A321-200,,9E,LH 005,EDDH,EDDF,28.8.2019,"Hamburg Arpt (HAM), Flughafenstr. 1-3, 22335 Hamburg, Germany","Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany",53.630402,9.98823,50.036521,8.561268,411.4515269941574,https://www.hamburg-airport.de/en/,https://en.wikipedia.org/wiki/Hamburg_Airport,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,
-Lufthansa ,B747-8i ,D-ABYF,28K,LH 430,EDDF,KORD,28.8.2019,"Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany","O'Hare International Airport (ORD), 10000 W Balmoral Ave, Chicago, IL 60666, USA",50.036521,8.561268,41.9786,-87.9048,6970.315836600558,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,https://www.flychicago.com/ohare/home/pages/default.aspx,https://en.wikipedia.org/wiki/O'Hare_International_Airport,
+Lufthansa,A321-200,,9E,LH 005,EDDH,EDDF,28.8.2019,"Hamburg Arpt (HAM), Flughafenstr. 1-3, 22335 Hamburg, Germany","Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany",53.630402,9.98823,50.036521,8.561268,411.4515269941574,https://www.hamburg-airport.de/en/,https://en.wikipedia.org/wiki/Hamburg_Airport,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,
+Lufthansa,B747-8i,D-ABYF,28K,LH 430,EDDF,KORD,28.8.2019,"Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany","O'Hare International Airport (ORD), 10000 W Balmoral Ave, Chicago, IL 60666, USA",50.036521,8.561268,41.9786,-87.9048,6970.315836600558,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,https://www.flychicago.com/ohare/home/pages/default.aspx,https://en.wikipedia.org/wiki/O'Hare_International_Airport,
United,B767,,38L,UA 1989,KORD,KIAH,28.8.2019,"O'Hare International Airport (ORD), 10000 W Balmoral Ave, Chicago, IL 60666, USA","George Bush Intercontinental Airport (IAH), 2800 N Terminal Rd, Houston, TX 77032, USA",41.9786,-87.9048,29.984399795532227,-95.34140014648438,1490.6518827216926,https://www.flychicago.com/ohare/home/pages/default.aspx,https://en.wikipedia.org/wiki/O'Hare_International_Airport,http://www.fly2houston.com/iah,https://en.wikipedia.org/wiki/George_Bush_Intercontinental_Airport,
United,E175LR,N85355,21B,UA 6248,KIAH,KCMH,26.3.2020,"George Bush Intercontinental Airport (IAH), 2800 N Terminal Rd, Houston, TX 77032, USA","John Glenn Columbus International Airport (CMH), 4600 International Gateway, Columbus, OH 43219, USA",29.984399795532227,-95.34140014648438,39.998001,-82.891899,1586.2497746368967,http://www.fly2houston.com/iah,https://en.wikipedia.org/wiki/George_Bush_Intercontinental_Airport,https://flycolumbus.com/,https://en.wikipedia.org/wiki/Port_Columbus_International_Airport,
United,ERJ-145XR,N12163,10A,UA 5019,KCMH,KEWR,26.3.2020,"John Glenn Columbus International Airport (CMH), 4600 International Gateway, Columbus, OH 43219, USA","Newark Liberty International Airport (EWR), 3 Brewster Rd, Newark, NJ 07114, USA",39.998001,-82.891899,40.692501,-74.168701,742.9840577363749,https://flycolumbus.com/,https://en.wikipedia.org/wiki/Port_Columbus_International_Airport,http://www.panynj.gov/CommutingTravel/airports/html/newarkliberty.html,https://en.wikipedia.org/wiki/Newark_Liberty_International_Airport,
-United,B767 ,,40A,UA 30,KEWR,EDDM,26.3.2020,"Newark Liberty International Airport (EWR), 3 Brewster Rd, Newark, NJ 07114, USA","Nordallee 25, 85356 München-Flughafen",40.692501,-74.168701,48.353802,11.7861,6502.961020392131,http://www.panynj.gov/CommutingTravel/airports/html/newarkliberty.html,https://en.wikipedia.org/wiki/Newark_Liberty_International_Airport,http://www.munich-airport.com/,https://en.wikipedia.org/wiki/Munich_Airport,
-Lufthansa ,A319-100,,6F,"LH 015
-",EDDH,EDDF,18.12.2021,"Hamburg Arpt (HAM), Flughafenstr. 1-3, 22335 Hamburg, Germany","Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany",53.630402,9.98823,50.036521,8.561268,411.4515269941574,https://www.hamburg-airport.de/en/,https://en.wikipedia.org/wiki/Hamburg_Airport,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,
+United,B767,,40A,UA 30,KEWR,EDDM,26.3.2020,"Newark Liberty International Airport (EWR), 3 Brewster Rd, Newark, NJ 07114, USA","Nordallee 25, 85356 München-Flughafen",40.692501,-74.168701,48.353802,11.7861,6502.961020392131,http://www.panynj.gov/CommutingTravel/airports/html/newarkliberty.html,https://en.wikipedia.org/wiki/Newark_Liberty_International_Airport,http://www.munich-airport.com/,https://en.wikipedia.org/wiki/Munich_Airport,
+Lufthansa,A319-100,,6F,"LH 015",EDDH,EDDF,18.12.2021,"Hamburg Arpt (HAM), Flughafenstr. 1-3, 22335 Hamburg, Germany","Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany",53.630402,9.98823,50.036521,8.561268,411.4515269941574,https://www.hamburg-airport.de/en/,https://en.wikipedia.org/wiki/Hamburg_Airport,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,
United,B777-200,,43L,UA 047,EDDF,KIAH,18.12.2021,"Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany","George Bush Intercontinental Airport (IAH), 2800 N Terminal Rd, Houston, TX 77032, USA",50.036521,8.561268,29.984399795532227,-95.34140014648438,8401.836952913003,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,http://www.fly2houston.com/iah,https://en.wikipedia.org/wiki/George_Bush_Intercontinental_Airport,
-United,B777-200,,35L ,UA 46,KIAH,EDDF,7.1.2022,"George Bush Intercontinental Airport (IAH), 2800 N Terminal Rd, Houston, TX 77032, USA","Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany",29.984399795532227,-95.34140014648438,50.036521,8.561268,8401.836952913003,http://www.fly2houston.com/iah,https://en.wikipedia.org/wiki/George_Bush_Intercontinental_Airport,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,
-Lufthansa ,A320-200,,18A ,LH 028,EDDF,EDDH,8.1.2022,"Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany","Hamburg Arpt (HAM), Flughafenstr. 1-3, 22335 Hamburg, Germany",50.036521,8.561268,53.630402,9.98823,411.4515269941574,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,https://www.hamburg-airport.de/en/,https://en.wikipedia.org/wiki/Hamburg_Airport,
+United,B777-200,,35L,UA 46,KIAH,EDDF,7.1.2022,"George Bush Intercontinental Airport (IAH), 2800 N Terminal Rd, Houston, TX 77032, USA","Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany",29.984399795532227,-95.34140014648438,50.036521,8.561268,8401.836952913003,http://www.fly2houston.com/iah,https://en.wikipedia.org/wiki/George_Bush_Intercontinental_Airport,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,
+Lufthansa,A320-200,,18A ,LH 028,EDDF,EDDH,8.1.2022,"Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany","Hamburg Arpt (HAM), Flughafenstr. 1-3, 22335 Hamburg, Germany",50.036521,8.561268,53.630402,9.98823,411.4515269941574,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,https://www.hamburg-airport.de/en/,https://en.wikipedia.org/wiki/Hamburg_Airport,
Eurowings,A319-100,D-AGWX,6F,EW 7180,EDDH,EHAM,17.7.2023,"Hamburg Arpt (HAM), Flughafenstr. 1-3, 22335 Hamburg, Germany","Aankomstpassage 1, 1118 AX Schiphol, Netherlands",53.630402,9.98823,52.308601,4.76389,379.35693324190026,https://www.hamburg-airport.de/en/,https://en.wikipedia.org/wiki/Hamburg_Airport,http://www.schiphol.nl/,https://en.wikipedia.org/wiki/Amsterdam_Airport_Schiphol,
United,B777-200,,37A,UA 21,EHAM,KIAH,17.7.2023,"Aankomstpassage 1, 1118 AX Schiphol, Netherlands","George Bush Intercontinental Airport (IAH), 2800 N Terminal Rd, Houston, TX 77032, USA",52.308601,4.76389,29.984399795532227,-95.34140014648438,8049.292070451202,http://www.schiphol.nl/,https://en.wikipedia.org/wiki/Amsterdam_Airport_Schiphol,http://www.fly2houston.com/iah,https://en.wikipedia.org/wiki/George_Bush_Intercontinental_Airport,
Frontier,A320neo,N358FR,29F,F 2479,KIAH,KPHX,18.7.2023,"George Bush Intercontinental Airport (IAH), 2800 N Terminal Rd, Houston, TX 77032, USA","Phoenix Sky Harbor International Airport (PHX), 3400 Sky Hbr Blvd, Phoenix, AZ 85034, USA",29.984399795532227,-95.34140014648438,33.435302,-112.005905,1620.425103231022,http://www.fly2houston.com/iah,https://en.wikipedia.org/wiki/George_Bush_Intercontinental_Airport,http://phoenix.gov/skyharborairport/,https://en.wikipedia.org/wiki/Phoenix_Sky_Harbor_International_Airport,
United,B737Max8,,29F,UA 1217,KPHX,KIAH,28.7.2023,"Phoenix Sky Harbor International Airport (PHX), 3400 Sky Hbr Blvd, Phoenix, AZ 85034, USA","George Bush Intercontinental Airport (IAH), 2800 N Terminal Rd, Houston, TX 77032, USA",33.435302,-112.005905,29.984399795532227,-95.34140014648438,1620.425103231022,http://phoenix.gov/skyharborairport/,https://en.wikipedia.org/wiki/Phoenix_Sky_Harbor_International_Airport,http://www.fly2houston.com/iah,https://en.wikipedia.org/wiki/George_Bush_Intercontinental_Airport,
-United,B737,,23F ,UA 1849,KIAH,KAUS,3.9.2023,"George Bush Intercontinental Airport (IAH), 2800 N Terminal Rd, Houston, TX 77032, USA","3600 Presidential Blvd, Austin, TX 78719, USA",29.984399795532227,-95.34140014648438,30.197535,-97.662015,224.5148479278488,http://www.fly2houston.com/iah,https://en.wikipedia.org/wiki/George_Bush_Intercontinental_Airport,http://www.ci.austin.tx.us/austinairport/,https://en.wikipedia.org/wiki/Austin-Bergstrom_International_Airport,
+United,B737,,23F,UA 1849,KIAH,KAUS,3.9.2023,"George Bush Intercontinental Airport (IAH), 2800 N Terminal Rd, Houston, TX 77032, USA","3600 Presidential Blvd, Austin, TX 78719, USA",29.984399795532227,-95.34140014648438,30.197535,-97.662015,224.5148479278488,http://www.fly2houston.com/iah,https://en.wikipedia.org/wiki/George_Bush_Intercontinental_Airport,http://www.ci.austin.tx.us/austinairport/,https://en.wikipedia.org/wiki/Austin-Bergstrom_International_Airport,
Lufthansa,B787-9,D-ABPB,11H,LH 469,KAUS,EDDF,3.9.2023,"3600 Presidential Blvd, Austin, TX 78719, USA","Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany",30.197535,-97.662015,50.036521,8.561268,8526.238090777648,http://www.ci.austin.tx.us/austinairport/,https://en.wikipedia.org/wiki/Austin-Bergstrom_International_Airport,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,
-Lufthansa,A320-200,,18D,LH 010,EDDF,EDDH,"4.9.2023
-","Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany","Hamburg Arpt (HAM), Flughafenstr. 1-3, 22335 Hamburg, Germany",50.036521,8.561268,53.630402,9.98823,411.4515269941574,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,https://www.hamburg-airport.de/en/,https://en.wikipedia.org/wiki/Hamburg_Airport,
+Lufthansa,A320-200,,18D,LH 010,EDDF,EDDH,04.09.2023,"Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany","Hamburg Arpt (HAM), Flughafenstr. 1-3, 22335 Hamburg, Germany",50.036521,8.561268,53.630402,9.98823,411.4515269941574,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,https://www.hamburg-airport.de/en/,https://en.wikipedia.org/wiki/Hamburg_Airport,
Lufthansa,A320-200,D-AIUI,5F,LH 029,EDDH,EDDF,1.10.2023,"Hamburg Arpt (HAM), Flughafenstr. 1-3, 22335 Hamburg, Germany","Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany",53.630402,9.98823,50.036521,8.561268,411.4515269941574,https://www.hamburg-airport.de/en/,https://en.wikipedia.org/wiki/Hamburg_Airport,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,
Lufthansa,A340-300,D-AIGY,20K,LH 576,EDDF,FACT,1.10.2023,"Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany","Matroosfontein, Cape Town, 7490, South Africa",50.036521,8.561268,-33.9648017883,18.6016998291,9392.7628645969,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,http://www.airports.co.za/home.asp?pid=229,https://en.wikipedia.org/wiki/Cape_Town_International_Airport,
Fly Safair,B737-8,ZS-FGD,5F,FA 134,FACT,FAPE,29.11.2023,"Matroosfontein, Cape Town, 7490, South Africa","Allister Miller Dr, Walmer, Gqeberha, 6070, South Africa",-33.9648017883,18.6016998291,-33.984901,25.6173,646.8004348019678,http://www.airports.co.za/home.asp?pid=229,https://en.wikipedia.org/wiki/Cape_Town_International_Airport,http://www.acsa.co.za/home.asp?pid=236,https://en.wikipedia.org/wiki/Chief_Dawid_Stuurman_International_Airport,
Lufthansa,A340-300,D-AIFF,21C,LH 577,FACT,EDDF,20.12.2023,"Matroosfontein, Cape Town, 7490, South Africa","Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany",-33.9648017883,18.6016998291,50.036521,8.561268,9392.7628645969,http://www.airports.co.za/home.asp?pid=229,https://en.wikipedia.org/wiki/Cape_Town_International_Airport,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,
Lufthansa,A321-200,D-AISB,24F,LH 030,EDDF,EDDH,20.12.2023,"Frankfurt Arpt (FRA), 60547 Frankfurt am Main, Germany","Hamburg Arpt (HAM), Flughafenstr. 1-3, 22335 Hamburg, Germany",50.036521,8.561268,53.630402,9.98823,411.4515269941574,http://www.frankfurt-airport.de/,https://en.wikipedia.org/wiki/Frankfurt_Airport,https://www.hamburg-airport.de/en/,https://en.wikipedia.org/wiki/Hamburg_Airport,
+Easy Jet,A320neo,G-UZHV,5F,EZY76RJ,LFBD,EGKK,14.08.2024,,,44.8283,-0.715556,51.148771,-0.192089,703.8780270077718,https://www.bordeaux.aeroport.fr/,https://en.wikipedia.org/wiki/Bordeaux%E2%80%93M%C3%A9rignac_Airport,http://www.gatwickairport.com/,https://en.wikipedia.org/wiki/Gatwick_Airport,
+Easy Jet,A319,G-EZDY,5D,EZY8633,EGKK,EDDH,19.08.2024,,,51.148771,-0.192089,53.630402,9.98823,743.0851678148329,http://www.gatwickairport.com/,https://en.wikipedia.org/wiki/Gatwick_Airport,https://www.hamburg-airport.de/en/,https://en.wikipedia.org/wiki/Hamburg_Airport,
+Easy Jet,A319,G-EZDV,24F,EZY8634,EDDH,EGKK,26.05.2025,,,53.630402,9.98823,51.148771,-0.192089,743.0851678148329,https://www.hamburg-airport.de/en/,https://en.wikipedia.org/wiki/Hamburg_Airport,http://www.gatwickairport.com/,https://en.wikipedia.org/wiki/Gatwick_Airport,
+British Airways,A320neo,G-TTNG,7A,BA972,EGLL,EDDH,29.05.2025,,,51.4706,-0.461941,53.630402,9.98823,745.4434199500324,http://www.heathrowairport.com/,https://en.wikipedia.org/wiki/Heathrow_Airport,https://www.hamburg-airport.de/en/,https://en.wikipedia.org/wiki/Hamburg_Airport,
diff --git a/requirements.txt b/requirements.txt
index aa04133..c577902 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,4 +2,5 @@ pandas
streamlit==1.31.0
streamlit-option-menu==0.3.12
folium
-streamlit-folium
\ No newline at end of file
+streamlit-folium
+matplotlib