[main] Flight Things
All checks were successful
Build, Push, and Deploy to Nomad / docker-nomad (push) Successful in 1m54s

This commit is contained in:
2025-01-21 21:04:40 +01:00
parent ae999e1fac
commit e4fd13a782
12 changed files with 9508 additions and 95 deletions

BIN
PortugalBudget.ods Normal file

Binary file not shown.

View File

@@ -1,32 +0,0 @@
import calendar
from datetime import date, timedelta
def skriv_datoer_med_formattering(år):
start_dato = date(år, 1, 1+10)
slut_dato = date(år, 12, 29)
dags_differens = timedelta(days=1)
print(f"Datoer for året {år}:\n")
resultat = []
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")
resultat.append({'date': nuværende_dato.strftime('%Y-%m-%d'), 'orgin': 'CPH', 'dest': 'LIS','uge':ugenummer, 'month':nuværende_dato.month})
if ugedag == "Wednesday":
print(f"{nuværende_dato.strftime('%Y-%m-%d')} Til København fra Porto")
resultat.append( { 'date': nuværende_dato.strftime( '%Y-%m-%d' ), 'orgin': 'LIS', 'dest': 'CPH','uge':ugenummer,'month':nuværende_dato.month} )
nuværende_dato += dags_differens
print(resultat)
# Kald funktionen med det ønskede år
skriv_datoer_med_formattering(2025)

View File

@@ -1,18 +1,31 @@
import json import json
import time import time
from datetime import datetime from datetime import datetime
import pandas as pd
from amadeus import Client, ResponseError from amadeus import Client, ResponseError
import calender_maker
from inspiration.TingSomSkalTilføjes.calender_maker import CalenderMaker
# OopCompanion:suppressRename # OopCompanion:suppressRename
class AmadeusClient: class AmadeusClient:
def __init__(self, client_id: str, client_secret: str): def __init__(self, prod=bool):
""" """
Initialize the Amadeus API client. Initialize the Amadeus API client.
""" """
self.client = Client(client_id=client_id, client_secret=client_secret,hostname="production") if prod:
client_id = "ABRGQv6U7IWAYxwwmjqAOPUDGvuFMSjw"
client_secret = "BcwpSKf3FICJIxaw"
self.client = Client(client_id=client_id, client_secret=client_secret,host="api.amadeus.com")
print("Getting production Amadeus API client")
else:
client_id = "uxDqIh36xPAUvpXnXynwAnH86pGBdIch"
client_secret = "xTSLooNZpJWantb5"
self.client = Client( client_id = client_id, client_secret = client_secret,host="test.api.amadeus.com" )
print( "Getting development Amadeus API client" )
def find_cheapest_flights(self, origin: str, destination: str, departure_date: str, adults: int = 1): def find_cheapest_flights(self, origin: str, destination: str, departure_date: str, adults: int = 1):
""" """
@@ -34,11 +47,13 @@ class AmadeusClient:
nonStop="true", nonStop="true",
) )
return response.data return response.data
except ResponseError as error: except ResponseError as error:
if error.response.status_code == 429: if error.response.status_code == 429:
retry_after = error.response.headers.get( 'Retry-After', '60' ) # standard fallback til 60 sekunder retry_after = error.response.headers.get( 'Retry-After', '60' ) # standard fallback til 60 sekunder
print( f"Rate limit reached. Retry after {retry_after} seconds." ) print( f"Rate limit reached. Retry after {retry_after} seconds." )
time.sleep( int( retry_after ) ) time.sleep( int( retry_after ) )
print(error)
def parse_flight_data(self, flights): def parse_flight_data(self, flights):
@@ -101,26 +116,61 @@ class AmadeusClient:
first_departure = parsed_flights[0]["departure"]["iataCode"] first_departure = parsed_flights[0]["departure"]["iataCode"]
last_arrival = parsed_flights[-1]["arrival"]["iataCode"] last_arrival = parsed_flights[-1]["arrival"]["iataCode"]
return f"{departure_date}: {first_departure} -> {last_arrival} - {average_price:.2f}" #return f"{departure_date}: {first_departure} -> {last_arrival} - {average_price:.2f}"
return {"departure_date":departure_date, "departure": first_departure, "arrival": last_arrival,"price": average_price}
# Example usage # Example usage
if __name__ == "__main__": if __name__ == "__main__":
client_id = "ABRGQv6U7IWAYxwwmjqAOPUDGvuFMSjw" cd = CalenderMaker()
client_secret = "BcwpSKf3FICJIxaw" travel_days = cd.get_dates(year = 2025, dest_day="Thursday", orgin_day="Tuesday")
travel_days = [{'date': '2025-01-15', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 3, 'month': 1}, {'date': '2025-01-17', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 3, 'month': 1}, {'date': '2025-01-29', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 5, 'month': 1}, {'date': '2025-01-31', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 5, 'month': 1}, {'date': '2025-02-12', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 7, 'month': 2}, {'date': '2025-02-14', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 7, 'month': 2}, {'date': '2025-02-26', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 9, 'month': 2}, {'date': '2025-02-28', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 9, 'month': 2}, {'date': '2025-03-12', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 11, 'month': 3}, {'date': '2025-03-14', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 11, 'month': 3}, {'date': '2025-03-26', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 13, 'month': 3}, {'date': '2025-03-28', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 13, 'month': 3}, {'date': '2025-04-09', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 15, 'month': 4}, {'date': '2025-04-11', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 15, 'month': 4}, {'date': '2025-04-23', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 17, 'month': 4}, {'date': '2025-04-25', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 17, 'month': 4}, {'date': '2025-05-07', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 19, 'month': 5}, {'date': '2025-05-09', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 19, 'month': 5}, {'date': '2025-05-21', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 21, 'month': 5}, {'date': '2025-05-23', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 21, 'month': 5}, {'date': '2025-06-04', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 23, 'month': 6}, {'date': '2025-06-06', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 23, 'month': 6}, {'date': '2025-06-18', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 25, 'month': 6}, {'date': '2025-06-20', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 25, 'month': 6}, {'date': '2025-07-02', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 27, 'month': 7}, {'date': '2025-07-04', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 27, 'month': 7}, {'date': '2025-07-16', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 29, 'month': 7}, {'date': '2025-07-18', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 29, 'month': 7}, {'date': '2025-07-30', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 31, 'month': 7}, {'date': '2025-08-01', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 31, 'month': 8}, {'date': '2025-08-13', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 33, 'month': 8}, {'date': '2025-08-15', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 33, 'month': 8}, {'date': '2025-08-27', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 35, 'month': 8}, {'date': '2025-08-29', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 35, 'month': 8}, {'date': '2025-09-10', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 37, 'month': 9}, {'date': '2025-09-12', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 37, 'month': 9}, {'date': '2025-09-24', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 39, 'month': 9}, {'date': '2025-09-26', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 39, 'month': 9}, {'date': '2025-10-08', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 41, 'month': 10}, {'date': '2025-10-10', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 41, 'month': 10}, {'date': '2025-10-22', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 43, 'month': 10}, {'date': '2025-10-24', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 43, 'month': 10}, {'date': '2025-11-05', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 45, 'month': 11}, {'date': '2025-11-07', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 45, 'month': 11}, {'date': '2025-11-19', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 47, 'month': 11}, {'date': '2025-11-21', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 47, 'month': 11}, {'date': '2025-12-03', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 49, 'month': 12}, {'date': '2025-12-05', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 49, 'month': 12}, {'date': '2025-12-17', 'orgin': 'LIS', 'dest': 'CPH', 'uge': 51, 'month': 12}, {'date': '2025-12-19', 'orgin': 'CPH', 'dest': 'LIS', 'uge': 51, 'month': 12}] amadeus_client = AmadeusClient( prod = True)
import csv
amadeus_client = AmadeusClient( client_id, client_secret ) with open( "summery.txt", 'w' ) as fp, open( 'data_csv.csv', "w" ) as fp2:
with open( "summery.txt", 'w' ) as fp: writer = csv.DictWriter( fp2, fieldnames = ['orgin', 'dest', 'date', 'price','note'] )
writer.writeheader()
for days in travel_days: for days in travel_days:
origin = days['orgin'] origin = days['orgin']
destination = days['dest'] destination = days['dest']
departure_date = days['date'] departure_date = days['date']
try:
try: try:
summary = amadeus_client.get_flight_summary( departure_date, origin, destination ) summary = amadeus_client.get_flight_summary( departure_date, origin, destination )
print(summary) print(summary)
fp.writelines( summary + '\n' ) writer.writerow( {
"orgin": summary["departure_date"],
"dest": summary["departure"],
"date": summary["arrival"],
"price": summary['price'],
"note": ""
} )
fp.writelines( str(summary) + '\n' )
except Exception as e:
print( f"Error fetching flight summary for {origin} -> {destination} on {departure_date}" )
writer.writerow( {
"orgin": origin,
"dest": destination,
"date": departure_date,
"price": 214.0,
"note": "False - Flight not found"
} )
pass
except ResponseError as error: except ResponseError as error:
print( f"An error occurred: {error}" ) print( f"An error occurred: {error}" )
df = pd.read_csv( 'data_csv.csv' )
# Write the raw data to the first sheet
with pd.ExcelWriter( 'output.xlsx' ) as writer:
df.to_excel( writer, sheet_name = 'Sheet1', index = False )
# Calculate the average monthly data
df['date'] = pd.to_datetime( df['date'] )
df['month'] = df['date'].dt.to_period( 'M' )
avg_monthly_data = df.groupby( 'month' )['price'].mean().reset_index()
avg_monthly_data.columns = ['Month', 'Average Price']
# Write the average monthly data to the second sheet
avg_monthly_data.to_excel( writer, sheet_name = 'Sheet2', index = False )

View File

@@ -0,0 +1,23 @@
import calendar
from datetime import date, timedelta
class CalenderMaker(object):
def get_dates(self,year=2025,dest_day="Friday", orgin_day="Wednesday"):
start_date = date.today() + timedelta(days=3)
return_date = start_date + timedelta(days=365)
dags_differens = timedelta(days=1)
resultat = []
current_date = start_date
while current_date <= return_date:
ugenummer = current_date.isocalendar()[1]
ugedag = current_date.strftime("%A")
if ugenummer % 2 != 0 and ugedag in [dest_day, orgin_day]:
if ugedag == dest_day:
resultat.append({'date': current_date.strftime('%Y-%m-%d'), 'orgin': 'CPH', 'dest': 'LIS','uge':ugenummer, 'month':current_date.month})
if ugedag == orgin_day:
resultat.append( { 'date': current_date.strftime( '%Y-%m-%d' ), 'orgin': 'LIS', 'dest': 'CPH','uge':ugenummer,'month':current_date.month} )
current_date += dags_differens
return resultat

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,53 @@
orgin,dest,date,price,note
2025-01-28,LIS,CPH,721.87,
2025-01-30,CPH,LIS,157.58499999999998,
2025-02-11,LIS,CPH,102.37,
2025-02-13,CPH,LIS,157.58499999999998,
2025-02-25,LIS,CPH,158.37,
2025-02-27,CPH,LIS,157.58499999999998,
2025-03-11,LIS,CPH,571.12,
2025-03-13,CPH,LIS,258.9225,
2025-03-25,LIS,CPH,317.7866666666667,
2025-03-27,CPH,LIS,281.85,
2025-04-08,LIS,CPH,212.12,
2025-04-10,CPH,LIS,465.436,
2025-04-22,LIS,CPH,594.12,
2025-04-24,CPH,LIS,197.894,
2025-05-06,LIS,CPH,187.78666666666666,
2025-05-08,CPH,LIS,240.69400000000002,
2025-05-20,LIS,CPH,166.78666666666666,
2025-05-22,CPH,LIS,199.25333333333333,
2025-06-03,LIS,CPH,194.78666666666666,
2025-06-05,CPH,LIS,253.836,
2025-06-17,LIS,CPH,164.78666666666666,
2025-06-19,CPH,LIS,269.9225,
2025-07-01,LIS,CPH,170.37,
2025-07-03,CPH,LIS,256.43600000000004,
2025-07-15,LIS,CPH,219.37,
2025-07-17,CPH,LIS,242.894,
2025-07-29,LIS,CPH,262.37,
2025-07-31,CPH,LIS,172.38400000000001,
2025-08-12,LIS,CPH,170.37,
2025-08-14,CPH,LIS,149.76399999999998,
2025-08-26,LIS,CPH,147.87,
2025-08-28,CPH,LIS,144.024,
2025-09-09,LIS,CPH,145.78666666666666,
2025-09-11,CPH,LIS,266.236,
2025-09-23,LIS,CPH,146.37,
2025-09-25,CPH,LIS,189.864,
2025-10-07,LIS,CPH,187.78666666666666,
2025-10-09,CPH,LIS,226.094,
2025-10-21,LIS,CPH,159.45333333333335,
2025-10-23,CPH,LIS,170.7075,
2025-11-04,LIS,CPH,143.62,
2025-11-06,CPH,LIS,133.78,
2025-11-18,LIS,CPH,143.62,
2025-11-20,CPH,LIS,126.78,
2025-12-02,LIS,CPH,114.62,
2025-12-04,CPH,LIS,126.78,
2025-12-16,LIS,CPH,143.62,
2025-12-18,CPH,LIS,126.78,
2025-12-30,LIS,CPH,114.62,
2026-01-01,CPH,LIS,126.78,
2026-01-13,LIS,CPH,114.62,
2026-01-15,CPH,LIS,126.78,
1 orgin dest date price note
2 2025-01-28 LIS CPH 721.87
3 2025-01-30 CPH LIS 157.58499999999998
4 2025-02-11 LIS CPH 102.37
5 2025-02-13 CPH LIS 157.58499999999998
6 2025-02-25 LIS CPH 158.37
7 2025-02-27 CPH LIS 157.58499999999998
8 2025-03-11 LIS CPH 571.12
9 2025-03-13 CPH LIS 258.9225
10 2025-03-25 LIS CPH 317.7866666666667
11 2025-03-27 CPH LIS 281.85
12 2025-04-08 LIS CPH 212.12
13 2025-04-10 CPH LIS 465.436
14 2025-04-22 LIS CPH 594.12
15 2025-04-24 CPH LIS 197.894
16 2025-05-06 LIS CPH 187.78666666666666
17 2025-05-08 CPH LIS 240.69400000000002
18 2025-05-20 LIS CPH 166.78666666666666
19 2025-05-22 CPH LIS 199.25333333333333
20 2025-06-03 LIS CPH 194.78666666666666
21 2025-06-05 CPH LIS 253.836
22 2025-06-17 LIS CPH 164.78666666666666
23 2025-06-19 CPH LIS 269.9225
24 2025-07-01 LIS CPH 170.37
25 2025-07-03 CPH LIS 256.43600000000004
26 2025-07-15 LIS CPH 219.37
27 2025-07-17 CPH LIS 242.894
28 2025-07-29 LIS CPH 262.37
29 2025-07-31 CPH LIS 172.38400000000001
30 2025-08-12 LIS CPH 170.37
31 2025-08-14 CPH LIS 149.76399999999998
32 2025-08-26 LIS CPH 147.87
33 2025-08-28 CPH LIS 144.024
34 2025-09-09 LIS CPH 145.78666666666666
35 2025-09-11 CPH LIS 266.236
36 2025-09-23 LIS CPH 146.37
37 2025-09-25 CPH LIS 189.864
38 2025-10-07 LIS CPH 187.78666666666666
39 2025-10-09 CPH LIS 226.094
40 2025-10-21 LIS CPH 159.45333333333335
41 2025-10-23 CPH LIS 170.7075
42 2025-11-04 LIS CPH 143.62
43 2025-11-06 CPH LIS 133.78
44 2025-11-18 LIS CPH 143.62
45 2025-11-20 CPH LIS 126.78
46 2025-12-02 LIS CPH 114.62
47 2025-12-04 CPH LIS 126.78
48 2025-12-16 LIS CPH 143.62
49 2025-12-18 CPH LIS 126.78
50 2025-12-30 LIS CPH 114.62
51 2026-01-01 CPH LIS 126.78
52 2026-01-13 LIS CPH 114.62
53 2026-01-15 CPH LIS 126.78

Binary file not shown.

View File

@@ -0,0 +1,3 @@
orgin,dest,date,price
LIS,CPH,2025-01-28,1
CPH,LIS,2025-01-30,1

Binary file not shown.

View File

@@ -1,50 +1,52 @@
2025-01-15: LIS -> CPH - 128.87 {'departure_date': '2025-01-28', 'departure': 'LIS', 'arrival': 'CPH', 'price': 721.87}
2025-01-17: CPH -> LIS - 374.72 {'departure_date': '2025-01-30', 'departure': 'CPH', 'arrival': 'LIS', 'price': 157.58499999999998}
2025-01-29: LIS -> CPH - 128.87 {'departure_date': '2025-02-11', 'departure': 'LIS', 'arrival': 'CPH', 'price': 102.37}
2025-01-31: CPH -> LIS - 313.24 {'departure_date': '2025-02-13', 'departure': 'CPH', 'arrival': 'LIS', 'price': 157.58499999999998}
2025-02-12: LIS -> CPH - 152.62 {'departure_date': '2025-02-25', 'departure': 'LIS', 'arrival': 'CPH', 'price': 158.37}
2025-02-14: CPH -> LIS - 518.62 {'departure_date': '2025-02-27', 'departure': 'CPH', 'arrival': 'LIS', 'price': 157.58499999999998}
2025-02-26: LIS -> CPH - 162.87 {'departure_date': '2025-03-11', 'departure': 'LIS', 'arrival': 'CPH', 'price': 571.12}
2025-02-28: CPH -> LIS - 167.78 {'departure_date': '2025-03-13', 'departure': 'CPH', 'arrival': 'LIS', 'price': 258.9225}
2025-03-12: LIS -> CPH - 171.87 {'departure_date': '2025-03-25', 'departure': 'LIS', 'arrival': 'CPH', 'price': 317.7866666666667}
2025-03-14: CPH -> LIS - 254.00 {'departure_date': '2025-03-27', 'departure': 'CPH', 'arrival': 'LIS', 'price': 281.85}
2025-03-26: LIS -> CPH - 211.62 {'departure_date': '2025-04-08', 'departure': 'LIS', 'arrival': 'CPH', 'price': 212.12}
2025-03-28: CPH -> LIS - 193.06 {'departure_date': '2025-04-10', 'departure': 'CPH', 'arrival': 'LIS', 'price': 465.436}
2025-04-09: LIS -> CPH - 158.87 {'departure_date': '2025-04-22', 'departure': 'LIS', 'arrival': 'CPH', 'price': 594.12}
2025-04-11: CPH -> LIS - 998.95 {'departure_date': '2025-04-24', 'departure': 'CPH', 'arrival': 'LIS', 'price': 197.894}
2025-04-23: LIS -> CPH - 226.87 {'departure_date': '2025-05-06', 'departure': 'LIS', 'arrival': 'CPH', 'price': 187.78666666666666}
2025-04-25: CPH -> LIS - 261.38 {'departure_date': '2025-05-08', 'departure': 'CPH', 'arrival': 'LIS', 'price': 240.69400000000002}
2025-05-07: LIS -> CPH - 196.12 {'departure_date': '2025-05-20', 'departure': 'LIS', 'arrival': 'CPH', 'price': 166.78666666666666}
2025-05-09: CPH -> LIS - 304.88 {'departure_date': '2025-05-22', 'departure': 'CPH', 'arrival': 'LIS', 'price': 199.25333333333333}
2025-05-21: LIS -> CPH - 160.29 {'departure_date': '2025-06-03', 'departure': 'LIS', 'arrival': 'CPH', 'price': 194.78666666666666}
2025-05-23: CPH -> LIS - 199.16 {'departure_date': '2025-06-05', 'departure': 'CPH', 'arrival': 'LIS', 'price': 253.836}
2025-06-04: LIS -> CPH - 161.62 {'departure_date': '2025-06-17', 'departure': 'LIS', 'arrival': 'CPH', 'price': 164.78666666666666}
2025-06-06: CPH -> LIS - 300.38 {'departure_date': '2025-06-19', 'departure': 'CPH', 'arrival': 'LIS', 'price': 269.9225}
2025-06-18: LIS -> CPH - 155.12 {'departure_date': '2025-07-01', 'departure': 'LIS', 'arrival': 'CPH', 'price': 170.37}
2025-06-20: CPH -> LIS - 257.88 {'departure_date': '2025-07-03', 'departure': 'CPH', 'arrival': 'LIS', 'price': 256.43600000000004}
2025-07-02: LIS -> CPH - 149.62 {'departure_date': '2025-07-15', 'departure': 'LIS', 'arrival': 'CPH', 'price': 219.37}
2025-07-04: CPH -> LIS - 288.57 {'departure_date': '2025-07-17', 'departure': 'CPH', 'arrival': 'LIS', 'price': 242.894}
2025-07-16: LIS -> CPH - 158.87 {'departure_date': '2025-07-29', 'departure': 'LIS', 'arrival': 'CPH', 'price': 262.37}
2025-07-18: CPH -> LIS - 261.76 {'departure_date': '2025-07-31', 'departure': 'CPH', 'arrival': 'LIS', 'price': 172.38400000000001}
2025-07-30: LIS -> CPH - 277.62 {'departure_date': '2025-08-12', 'departure': 'LIS', 'arrival': 'CPH', 'price': 170.37}
2025-08-01: CPH -> LIS - 169.11 {'departure_date': '2025-08-14', 'departure': 'CPH', 'arrival': 'LIS', 'price': 149.76399999999998}
2025-08-13: LIS -> CPH - 194.62 {'departure_date': '2025-08-26', 'departure': 'LIS', 'arrival': 'CPH', 'price': 147.87}
2025-08-15: CPH -> LIS - 140.19 {'departure_date': '2025-08-28', 'departure': 'CPH', 'arrival': 'LIS', 'price': 144.024}
2025-08-27: LIS -> CPH - 145.95 {'departure_date': '2025-09-09', 'departure': 'LIS', 'arrival': 'CPH', 'price': 145.78666666666666}
2025-08-29: CPH -> LIS - 240.52 {'departure_date': '2025-09-11', 'departure': 'CPH', 'arrival': 'LIS', 'price': 266.236}
2025-09-10: LIS -> CPH - 158.87 {'departure_date': '2025-09-23', 'departure': 'LIS', 'arrival': 'CPH', 'price': 146.37}
2025-09-12: CPH -> LIS - 289.38 {'departure_date': '2025-09-25', 'departure': 'CPH', 'arrival': 'LIS', 'price': 189.864}
2025-09-24: LIS -> CPH - 170.12 {'departure_date': '2025-10-07', 'departure': 'LIS', 'arrival': 'CPH', 'price': 187.78666666666666}
2025-09-26: CPH -> LIS - 261.38 {'departure_date': '2025-10-09', 'departure': 'CPH', 'arrival': 'LIS', 'price': 226.094}
2025-10-08: LIS -> CPH - 162.87 {'departure_date': '2025-10-21', 'departure': 'LIS', 'arrival': 'CPH', 'price': 159.45333333333335}
2025-10-10: CPH -> LIS - 261.38 {'departure_date': '2025-10-23', 'departure': 'CPH', 'arrival': 'LIS', 'price': 170.7075}
2025-10-22: LIS -> CPH - 145.87 {'departure_date': '2025-11-04', 'departure': 'LIS', 'arrival': 'CPH', 'price': 143.62}
2025-10-24: CPH -> LIS - 227.52 {'departure_date': '2025-11-06', 'departure': 'CPH', 'arrival': 'LIS', 'price': 133.78}
2025-11-05: LIS -> CPH - 151.12 {'departure_date': '2025-11-18', 'departure': 'LIS', 'arrival': 'CPH', 'price': 143.62}
2025-11-07: CPH -> LIS - 142.80 {'departure_date': '2025-11-20', 'departure': 'CPH', 'arrival': 'LIS', 'price': 126.78}
2025-11-19: LIS -> CPH - 116.62 {'departure_date': '2025-12-02', 'departure': 'LIS', 'arrival': 'CPH', 'price': 114.62}
2025-11-21: CPH -> LIS - 135.80 {'departure_date': '2025-12-04', 'departure': 'CPH', 'arrival': 'LIS', 'price': 126.78}
2025-12-03: LIS -> CPH - 116.62 {'departure_date': '2025-12-16', 'departure': 'LIS', 'arrival': 'CPH', 'price': 143.62}
No flights found for 2025-12-05: CPH -> LIS {'departure_date': '2025-12-18', 'departure': 'CPH', 'arrival': 'LIS', 'price': 126.78}
2025-12-17: LIS -> CPH - 116.62 {'departure_date': '2025-12-30', 'departure': 'LIS', 'arrival': 'CPH', 'price': 114.62}
2025-12-19: CPH -> LIS - 143.30 {'departure_date': '2026-01-01', 'departure': 'CPH', 'arrival': 'LIS', 'price': 126.78}
{'departure_date': '2026-01-13', 'departure': 'LIS', 'arrival': 'CPH', 'price': 114.62}
{'departure_date': '2026-01-15', 'departure': 'CPH', 'arrival': 'LIS', 'price': 126.78}

View File

@@ -1,8 +1,12 @@
aiofiles==24.1.0
amadeus==11.0.0 amadeus==11.0.0
annotated-types==0.7.0 annotated-types==0.7.0
anyio==4.7.0 anyio==4.7.0
beautifulsoup4==4.12.3 beautifulsoup4==4.12.3
certifi==2024.12.14
charset-normalizer==3.4.1
click==8.1.7 click==8.1.7
et_xmlfile==2.0.0
fastapi==0.115.6 fastapi==0.115.6
h11==0.14.0 h11==0.14.0
httptools==0.6.4 httptools==0.6.4
@@ -14,21 +18,26 @@ MarkupSafe==3.0.2
mdurl==0.1.2 mdurl==0.1.2
mistune==3.0.2 mistune==3.0.2
numpy==2.2.1 numpy==2.2.1
openpyxl==3.1.5
pandas==2.2.3 pandas==2.2.3
pillow==11.0.0 pillow==11.0.0
pydantic==2.10.3 pydantic==2.10.3
pydantic_core==2.27.1 pydantic_core==2.27.1
python-dateutil==2.9.0.post0 python-dateutil==2.9.0.post0
python-dotenv==1.0.1 python-dotenv==1.0.1
python-multipart==0.0.20
pytz==2024.2 pytz==2024.2
PyYAML==6.0.2 PyYAML==6.0.2
requests==2.32.3
six==1.17.0 six==1.17.0
sniffio==1.3.1 sniffio==1.3.1
soupsieve==2.6 soupsieve==2.6
starlette==0.41.3 starlette==0.41.3
typing_extensions==4.12.2 typing_extensions==4.12.2
tzdata==2024.2 tzdata==2024.2
urllib3==2.3.0
uvicorn==0.32.1 uvicorn==0.32.1
uvloop==0.21.0 uvloop==0.21.0
watchfiles==1.0.0 watchfiles==1.0.0
websockets==14.1 websockets==14.1
XlsxWriter==3.2.0