Blockzeit
Lauffähige Beispiele zur Schätzung der Gate-to-Gate-Blockzeit mit dem ML-Modell von SkyLink. Details zum Modell, Genauigkeitskennzahlen und unterstützte Flugzeugtypen finden Sie unter ML-Flugzeitschätzung.
| # | Frage | Verwendete Daten |
|---|---|---|
| 1 | Blockzeit für KJFK → KLAX mit einer B738 schätzen | GET /ml/flight-time |
| 2 | Flugzeiten auf 4 Routen ab EGLL vergleichen | GET /ml/flight-time |
Voraussetzungen
x-api-key bei jeder Anfrage (Direktabonnement). Mehr erfahren →Installation
Die folgenden Skripte verwenden requests für API-Aufrufe und rich für die Terminalausgabe. Einmalig installieren:
pip install requests rich1. Blockzeitschätzung: KJFK → KLAX mit B738
Frage: Wie hoch ist die geschätzte Gate-to-Gate-Blockzeit einer 737-800 auf der Route KJFK–KLAX?
Das Modell liefert eine geschätzte Zeit sowie einen aus historischen Daten abgeleiteten Min/Max-Bereich (GradientBoosting, R²≈0,98). Wind wird nicht modelliert — die tatsächlichen Zeiten variieren je nach Streckenführung und Bedingungen.
import os
import requests
from rich.console import Console
from rich.panel import Panel
console = Console()
HEADERS = {
"X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY", "YOUR_RAPIDAPI_KEY"),
"X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"
def fetch_flight_time(
origin: str, destination: str, aircraft: str | None = None
) -> dict | None:
params: dict[str, str] = {"from": origin, "to": destination}
if aircraft:
params["aircraft"] = aircraft
r = requests.get(
f"{BASE}/ml/flight-time",
headers=HEADERS,
params=params,
timeout=(10, 15),
)
if r.status_code == 404:
return None
r.raise_for_status()
return r.json()
def fmt_mins(minutes: int | None) -> str:
if minutes is None:
return "—"
return f"{minutes // 60}h {minutes % 60:02d}m"
def main() -> None:
data = fetch_flight_time("KJFK", "KLAX", aircraft="B738")
if not data:
console.print("[red]No estimate returned.[/red]")
return
origin = data.get("origin", "KJFK")
dest = data.get("destination", "KLAX")
aircraft = data.get("aircraft_type", "B738")
est_display = data.get("estimated_hours_display") or fmt_mins(
data.get("estimated_minutes")
)
min_m = data.get("min_minutes")
max_m = data.get("max_minutes")
distance = data.get("distance_nm")
range_str = f"{fmt_mins(min_m)} – {fmt_mins(max_m)}"
body = (
f"Route: [bold]{origin} → {dest}[/bold]\n"
f"Aircraft: {aircraft}\n"
f"Estimated: [bold green]{est_display}[/bold green]\n"
f"Range: {range_str}\n"
f"Distance: {distance:,.1f} nm" if distance else ""
)
console.print(Panel(body, title="Block Time Estimate", style="blue"))
console.print(
"[dim]Estimate is statistical average for this route/type — "
"actual time varies with winds and routing.[/dim]"
)
if __name__ == "__main__":
main()Ausgabe: Ein Panel mit Route, Flugzeugtyp, geschätzter Blockzeit (Anzeigeformat), Min–Max-Bereich und Großkreisentfernung in nautischen Meilen.
2. Routenvergleich ab EGLL
Frage: Wie unterscheiden sich die Flugzeiten ab London Heathrow zu vier Langstreckenzielen?
Rufen Sie alle vier Routen parallel ab und sortieren Sie sie aufsteigend nach geschätzter Zeit. Nützlich für Flugplaner, die knappe Umsteigezeitfenster erkennen möchten.
import os
import concurrent.futures
import requests
from rich.console import Console
from rich.table import Table
console = Console()
HEADERS = {
"X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY", "YOUR_RAPIDAPI_KEY"),
"X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"
ROUTES = [
("EGLL", "KJFK"),
("EGLL", "OMDB"),
("EGLL", "YSSY"),
("EGLL", "RJTT"),
]
def fetch_flight_time(origin: str, destination: str) -> tuple[str, str, dict | None]:
try:
r = requests.get(
f"{BASE}/ml/flight-time",
headers=HEADERS,
params={"from": origin, "to": destination},
timeout=(10, 15),
)
if r.status_code == 404:
return origin, destination, None
r.raise_for_status()
return origin, destination, r.json()
except Exception as exc: # noqa: BLE001
console.print(f"[red]{origin}→{destination}: {exc}[/red]")
return origin, destination, None
def fmt_mins(minutes: int | None) -> str:
if minutes is None:
return "—"
return f"{minutes // 60}h {minutes % 60:02d}m"
def main() -> None:
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as pool:
results = list(pool.map(lambda r: fetch_flight_time(*r), ROUTES))
valid = [
(orig, dest, d)
for orig, dest, d in results
if d and d.get("estimated_minutes") is not None
]
valid.sort(key=lambda x: x[2].get("estimated_minutes", 0))
table = Table(
title="EGLL Long-haul Route Comparison (model default aircraft)",
show_lines=True,
)
table.add_column("Route", style="cyan", no_wrap=True)
table.add_column("Distance (nm)", justify="right")
table.add_column("Est. Time", justify="center", style="bold")
table.add_column("Min", justify="center")
table.add_column("Max", justify="center")
for orig, dest, d in valid:
distance = d.get("distance_nm")
dist_str = f"{distance:,.0f}" if distance else "—"
table.add_row(
f"{orig} → {dest}",
dist_str,
fmt_mins(d.get("estimated_minutes")),
fmt_mins(d.get("min_minutes")),
fmt_mins(d.get("max_minutes")),
)
console.print(table)
console.print(
"[dim]Statistical estimates — wind not modelled. "
"Routes sorted by estimated time ascending.[/dim]"
)
if __name__ == "__main__":
main()Ausgabe: Eine von der kürzesten zur längsten sortierte Tabelle mit Route, Entfernung in nautischen Meilen, geschätzter Zeit und dem historischen Min/Max-Bereich für jedes Städtepaar.