diff --git a/inspiration/Links b/inspiration/Links new file mode 100644 index 0000000..324de6f --- /dev/null +++ b/inspiration/Links @@ -0,0 +1,7 @@ +https://www.flytap.com/en-dk/miles-and-go/statuses#gold +https://www.flytap.com/en-dk/miles-and-go/club + + +Nå! - skal vi prøve og lægge et rejse budget til portugal. +Lad os antage jeg rejser i alle ulige uger, Onsdag morgen (fra Porto) til Fredag aften (Til Porto). +Lad os også antage at jeg flyver med begge programmer. Lad os prøve og lave et årligt budget som jeg kan bruge i excel \ No newline at end of file diff --git a/inspiration/TingSomSkalTilføjes/CalenderMaker.py b/inspiration/TingSomSkalTilføjes/CalenderMaker.py new file mode 100644 index 0000000..85bbfdc --- /dev/null +++ b/inspiration/TingSomSkalTilføjes/CalenderMaker.py @@ -0,0 +1,30 @@ +import calendar +from datetime import date, timedelta + +def skriv_datoer_med_formattering(år): + start_dato = date(år, 1, 1) + slut_dato = date(år, 12, 29) + dags_differens = timedelta(days=1) + + print(f"Datoer for året {år}:\n") + + nuværende_dato = start_dato + while nuværende_dato <= slut_dato: + ugenummer = nuværende_dato.isocalendar()[1] + ugedag = nuværende_dato.strftime("%A") + + if ugenummer % 2 != 0 and ugedag in ["Friday", "Wednesday"]: + # Tabuler outputtet længere ind + if ugedag == "Friday": + print(f"{nuværende_dato.strftime('%Y-%m-%d')} Til Porto fra København") + if ugedag == "Wednesday": + print(f"{nuværende_dato.strftime('%Y-%m-%d')} Til København fra Porto") + + + # else: + # print(f"{nuværende_dato.strftime('%Y-%m-%d')} ({ugedag})") + + nuværende_dato += dags_differens + +# Kald funktionen med det ønskede år +skriv_datoer_med_formattering(2025) diff --git a/inspiration/TingSomSkalTilføjes/Filtered_Flights.xlsx b/inspiration/TingSomSkalTilføjes/Filtered_Flights.xlsx new file mode 100644 index 0000000..69409c1 Binary files /dev/null and b/inspiration/TingSomSkalTilføjes/Filtered_Flights.xlsx differ diff --git a/inspiration/TingSomSkalTilføjes/Filtered_Flights_OPO_CPH.xlsx b/inspiration/TingSomSkalTilføjes/Filtered_Flights_OPO_CPH.xlsx new file mode 100644 index 0000000..4551f51 Binary files /dev/null and b/inspiration/TingSomSkalTilføjes/Filtered_Flights_OPO_CPH.xlsx differ diff --git a/inspiration/TingSomSkalTilføjes/flight_filter.py b/inspiration/TingSomSkalTilføjes/flight_filter.py new file mode 100644 index 0000000..ae6335d --- /dev/null +++ b/inspiration/TingSomSkalTilføjes/flight_filter.py @@ -0,0 +1,177 @@ +from pprint import pprint +from amadeus import Client, ResponseError +import pandas as pd +from datetime import datetime, timedelta +import json + + +class FlightFilter: + def __init__(self, api_key, api_secret): + self.amadeus = Client(client_id=api_key, client_secret=api_secret) + + def get_flight_offers(self, request_body): + """ + Fetch flight offers using the Amadeus SDK with a JSON request body. + """ + try: + print("Fetching flight offers with the provided request body...") + response = self.amadeus.shopping.flight_offers_search.post(request_body) + return response.data + except (ResponseError, Exception) as error: + print(f"Error fetching flight offers: {error}") + return [] + + def filter_and_average_price(flights, morning_departure, evening_departure, morning_hours = 2, evening_hours = 2): + """ + Filters flights: + - Morning departures from OPO. + - Evening departures from CPH. + - Calculates the average price of the matched trips. + """ + morning_time = datetime.strptime( morning_departure, "%H:%M" ) + evening_time = datetime.strptime( evening_departure, "%H:%M" ) + + morning_start = morning_time - timedelta( hours = morning_hours ) + morning_end = morning_time + timedelta( hours = morning_hours ) + evening_start = evening_time - timedelta( hours = evening_hours ) + evening_end = evening_time + timedelta( hours = evening_hours ) + + morning_flights = [] + evening_flights = [] + + for offer in flights: + for itinerary in offer.get( "itineraries", [] ): + for segment in itinerary.get( "segments", [] ): + departure_time = datetime.strptime( segment["departure"]["at"], "%Y-%m-%dT%H:%M:%S" ) + origin = segment["departure"]["iataCode"] + destination = segment["arrival"]["iataCode"] + + # Morning flights from OPO + if ( + origin == "OPO" and destination == "CPH" + and morning_start.time() <= departure_time.time() <= morning_end.time() + ): + morning_flights.append( { + "Flight ID": offer["id"], + "Price (EUR)": float( offer["price"]["total"] ), + "Departure Time": segment["departure"]["at"], + "Arrival Time": segment["arrival"]["at"], + } ) + + # Evening flights from CPH + elif ( + origin == "CPH" and destination == "OPO" + and evening_start.time() <= departure_time.time() <= evening_end.time() + ): + evening_flights.append( { + "Flight ID": offer["id"], + "Price (EUR)": float( offer["price"]["total"] ), + "Departure Time": segment["departure"]["at"], + "Arrival Time": segment["arrival"]["at"], + } ) + + # Calculate average prices + morning_prices = [flight["Price (EUR)"] for flight in morning_flights] + evening_prices = [flight["Price (EUR)"] for flight in evening_flights] + + average_morning_price = sum( morning_prices ) / len( morning_prices ) if morning_prices else 0 + average_evening_price = sum( evening_prices ) / len( evening_prices ) if evening_prices else 0 + + return { + "Morning Flights": morning_flights, + "Evening Flights": evening_flights, + "Average Morning Price (EUR)": average_morning_price, + "Average Evening Price (EUR)": average_evening_price, + } + + return filtered_flights + + def save_to_excel(self, lis_flights, cph_flights, filename): + """Save flights from LIS and CPH into separate blocks in an Excel sheet.""" + with pd.ExcelWriter( filename, engine = "openpyxl" ) as writer: + # Check for OPO → CPH flights + if lis_flights: + lis_df = pd.DataFrame( lis_flights ) + lis_df.sort_values( by = "Departure Time", inplace = True ) + lis_df.to_excel( writer, sheet_name = "Flights", startrow = 1, index = False ) + writer.sheets["Flights"].cell( row = 1, column = 1 ).value = "Departures from OPO around 07:00" + else: + print( "No flights found from OPO to CPH." ) + + # Check for CPH → OPO flights + if cph_flights: + cph_df = pd.DataFrame( cph_flights ) + cph_df.sort_values( by = "Departure Time", inplace = True ) + cph_df.to_excel( writer, sheet_name = "Flights", startrow = len( lis_flights ) + 4, index = False ) + writer.sheets["Flights"].cell( row = len( lis_flights ) + 4, + column = 1 ).value = "Departures from CPH around 18:30" + else: + print( "No flights found from CPH to OPO." ) + + # If no data exists, add a placeholder sheet + if not lis_flights and not cph_flights: + print( "No flight data available. Adding placeholder sheet." ) + pd.DataFrame( { "Message": ["No flights found"] } ).to_excel( writer, sheet_name = "Flights", + index = False ) + + print( f"Filtered flights saved to: {filename}" ) + + +# Usage example +if __name__ == "__main__": + api_key = "uxDqIh36xPAUvpXnXynwAnH86pGBdIch" + api_secret = "xTSLooNZpJWantb5" + + flight_filter = FlightFilter(api_key, api_secret) + + # JSON request body + request_body = { + "currencyCode": "EUR", + "originDestinations": [ + { + "id": "1", + "originLocationCode": "OPO", + "destinationLocationCode": "CPH", + "departureDateTimeRange": { + "date": "2025-03-03", + "time": "06:00:00" + } + }, + { + "id": "2", + "originLocationCode": "CPH", + "destinationLocationCode": "OPO", + "departureDateTimeRange": { + "date": "2025-03-06", + "time": "20:30:00" + } + } + ], + "travelers": [ + {"id": "1", "travelerType": "ADULT"} + ], + "sources": ["GDS"], + "searchCriteria": { + "excludeAllotments": True, + "addOneWayOffers": False, + "maxFlightOffers": 10, + "allowAlternativeFareOptions": True, + } + } + + # Fetch flights + flights = flight_filter.get_flight_offers(request_body) + print(f"Raw flights data: {flights}") + + # Filter flights from OPO to CPH around 07:00 ± 1 hour + opo_to_cph_flights = flight_filter.filter_flights_by_time( + flights, origin_filter="OPO", destination_filter="CPH", filter_time_str="06:00", hours=2 + ) + + # Filter flights from CPH to OPO around 18:30 ± 1 hour + cph_to_opo_flights = flight_filter.filter_flights_by_time( + flights, origin_filter="CPH", destination_filter="OPO", filter_time_str="20:30", hours=2 + ) + + # Save to Excel + flight_filter.save_to_excel(opo_to_cph_flights, cph_to_opo_flights, "Filtered_Flights_OPO_CPH.xlsx") diff --git a/inspiration/TingSomSkalTilføjes/new_flight.py b/inspiration/TingSomSkalTilføjes/new_flight.py new file mode 100644 index 0000000..6a27ab0 --- /dev/null +++ b/inspiration/TingSomSkalTilføjes/new_flight.py @@ -0,0 +1,111 @@ +from amadeus import Client, ResponseError +import pandas as pd + + +class FlightFilter: + def __init__(self, api_key, api_secret): + self.amadeus = Client(client_id=api_key, client_secret=api_secret) + + def get_flight_offers(self, request_body): + try: + print("Fetching flight offers with the provided request body...") + response = self.amadeus.shopping.flight_offers_search.post(request_body) + return response.data + except ResponseError as error: + print(f"Error fetching flight offers: {error}") + print("Response Details:", error.response.body) # Add this line for detailed error logging + return [] + + def filter_flights(self, flights, origin, destination): + """ + Filters flights by origin and destination. + """ + filtered_flights = [] + for offer in flights: + for itinerary in offer.get("itineraries", []): + for segment in itinerary.get("segments", []): + segment_origin = segment["departure"]["iataCode"] + segment_destination = segment["arrival"]["iataCode"] + + # Check if the flight matches the filters + if segment_origin == origin and segment_destination == destination: + filtered_flights.append({ + "Flight ID": offer["id"], + "Price (EUR)": float(offer["price"]["total"]), + "Departure Time": segment["departure"]["at"], + "Arrival Time": segment["arrival"]["at"], + }) + + return filtered_flights + + def calculate_average_price(self, flights): + """ + Calculate the average price of a list of flights. + """ + prices = [flight["Price (EUR)"] for flight in flights] + return sum(prices) / len(prices) if prices else 0 + + def save_to_excel(self, filtered_flights, filename): + """ + Save filtered flights to an Excel file. + """ + with pd.ExcelWriter(filename, engine="openpyxl") as writer: + if filtered_flights: + flights_df = pd.DataFrame(filtered_flights) + flights_df.to_excel(writer, sheet_name="Flights", index=False) + print(f"Filtered flights saved to {filename}") + else: + print("No flights found.") + + +# Usage Example +if __name__ == "__main__": + # Replace these with your Amadeus API credentials + api_key = "uxDqIh36xPAUvpXnXynwAnH86pGBdIch" + api_secret = "xTSLooNZpJWantb5" + + # Initialize the FlightFilter + flight_filter = FlightFilter(api_key, api_secret) + + # Request body for the API call + request_body = { + "currencyCode": "EUR", + "originDestinations": [ + { + "id": "1", + "originLocationCode": "OPO", + "destinationLocationCode": "CPH", + "departureDateTimeRange": {"date": "2025-03-03", "time": "06:00:00"}, + }, + { + "id": "2", + "originLocationCode": "CPH", + "destinationLocationCode": "OPO", + "departureDateTimeRange": {"date": "2025-03-06", "time": "20:30:00"}, + }, + ], + "travelers": [{"id": "1", "travelerType": "ADULT"}], + "sources": ["GDS"], + } + + # Fetch flight offers + flights = flight_filter.get_flight_offers(request_body) + print(flights) + + # Filter flights by origin and destination + opo_to_cph_flights = flight_filter.filter_flights(flights, "OPO", "CPH") + cph_to_opo_flights = flight_filter.filter_flights(flights, "CPH", "OPO") + + # Calculate average prices + avg_opo_to_cph_price = flight_filter.calculate_average_price(opo_to_cph_flights) + avg_cph_to_opo_price = flight_filter.calculate_average_price(cph_to_opo_flights) + + # Output results + print("Flights (OPO → CPH):", opo_to_cph_flights) + print("Flights (CPH → OPO):", cph_to_opo_flights) + print(f"Average OPO → CPH Price: {avg_opo_to_cph_price} EUR") + print(f"Average CPH → OPO Price: {avg_cph_to_opo_price} EUR") + + # Save to Excel + all_flights = opo_to_cph_flights + cph_to_opo_flights + flight_filter.save_to_excel(all_flights, "Filtered_Flights.xlsx")