{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "source": [ "# **HKIA Historical Flight Information API Tutorial**" ], "metadata": { "id": "NbPkvwosmTaL" } }, { "cell_type": "markdown", "source": [ "# Introduction\n", "\n", "This tutorial guides you through using the API to access historical flight information from Hong Kong International Airport (HKIA)\n", "\n", "* DATA.GOV.HK Website: https://data.gov.hk/en-data/dataset/aahk-team1-flight-info/resource/8f41b55c-a2ef-4963-bb25-96d8b21f3db4\n", "* Data Specification: https://www.hongkongairport.com/iwov-resources/misc/opendata/Flight_Information_DataSpec_en.pdf\n", "\n", "***Only data from TODAY-91 to TODAY+14 is available.***" ], "metadata": { "id": "Wkzto9SymivK" } }, { "cell_type": "code", "execution_count": 200, "metadata": { "id": "yt2SzaeSf1nk" }, "outputs": [], "source": [ "# import necessary libraries:\n", "import requests\n", "import pandas as pd\n", "import json" ] }, { "cell_type": "markdown", "source": [ "# **Fetching Flight Information**\n", "\n", "## **The `get_json_flight_info` Function**\n", "This function fetches HKIA flight information for a specific date and flight type through API:\n", "\n", "### **Input**\n", "* **date**: The target date for the flight information in 'YYYY-MM-DD' format.\n", "* **arrival**: Set to True for arrival flights, False for departures.\n", "* **cargo**: Set to True for cargo flights, False for passenger flights.\n", "* **lang**: Language of the response ('en', 'zh_HK', or 'zh_CN'). Default is 'en'.\n", "\n", "### **Returns**\n", "* A JSON containing detailed flight information for the given parameters and date range." ], "metadata": { "id": "xxPkHLbAol3Y" } }, { "cell_type": "code", "source": [ "def get_json_flight_info(date, arrival, cargo, lang='en'):\n", "\n", " arrival_str = 'true' if arrival else 'false'\n", " cargo_str = 'true' if cargo else 'false'\n", "\n", " url = f\"https://www.hongkongairport.com/flightinfo-rest/rest/flights/past?date={date}&arrival={arrival_str}&cargo={cargo_str}&lang={lang}\"\n", "\n", " response = requests.get(url)\n", "\n", " if response.status_code == 200:\n", " data = response.json()\n", " return data\n", " else:\n", " print(f\"Error: {response.status_code}\")" ], "metadata": { "id": "pq8rksJRU6FH" }, "execution_count": 201, "outputs": [] }, { "cell_type": "markdown", "source": [ "### **Example of Usages**" ], "metadata": { "id": "MItwzT-ttR_a" } }, { "cell_type": "code", "source": [ "# Valid\n", "yesterday = (pd.to_datetime('today')-pd.Timedelta('1 days')).strftime('%Y-%m-%d')\n", "flight_info = get_json_flight_info(date=yesterday, arrival=False, cargo=False, lang='en')\n", "# print(json.dumps(flight_info, indent=2))" ], "metadata": { "id": "J4zx46HJhLGs" }, "execution_count": 202, "outputs": [] }, { "cell_type": "code", "source": [ "# Invalid\n", "one_year_before = (pd.to_datetime('today')-pd.Timedelta('365 days')).strftime('%Y-%m-%d')\n", "flight_info = get_json_flight_info(date=one_year_before, arrival=False, cargo=False, lang='en')\n", "\n", "print(f\"https://www.hongkongairport.com/flightinfo-rest/rest/flights/past?date={one_year_before}&arrival=false&cargo=false&lang=en\")\n", "# \"message\": \"The combination of parameter date [2023-12-01] and span [1] is out of valid range (D-91 to D+14).\"" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Ln02EqeErt2B", "outputId": "5f04c3f4-236e-44e6-8986-75ae93465f35" }, "execution_count": 203, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Error: 400\n", "https://www.hongkongairport.com/flightinfo-rest/rest/flights/past?date=2023-03-24&arrival=false&cargo=false&lang=en\n" ] } ] }, { "cell_type": "markdown", "source": [ "# **Preprocessing**\n", "\n", "## **The `preprocessing` Function**\n", "This function preprocesses JSON flight information.\n", "\n", "### **Input**\n", "* `json_flight_info` returned from `get_json_flight_info` function\n", "* **col**: Optional; a list of column names as strings to specify which columns to include. Defaults to \"None,\" indicating all columns are returned.\n", "\n", "### **Returns**\n", "* A pandas DataFrame containing detailed flight information based on `json_flight_info`" ], "metadata": { "id": "M0mbjjbLt3-x" } }, { "cell_type": "code", "source": [ "def preprocessing(json_flight_info, col=None):\n", " df = pd.json_normalize(json_flight_info, 'list')\n", " df.insert(loc=0, column='info_date', value=json_flight_info[0]['date'])\n", " if col is not None:\n", " df = df[col]\n", " if 'flight' in df.columns:\n", " df['flight'] = df['flight'].apply(lambda x: [f\"{flight['no']} ({flight['airline']})\" for flight in x])\n", " return df" ], "metadata": { "id": "i5ZWTFwiiyjr" }, "execution_count": 204, "outputs": [] }, { "cell_type": "markdown", "source": [ "## **The `get_df_flight_info` Function**\n", "This function uses the above two function to get pandas dataframe format flight info within day ranges\n", "\n", "### **Input**\n", "* **start_date, end_date**: Specifies the query range ('YYYY-MM-DD').\n", "> *(For a single-day query, set both start_date and end_date to the same value.)*\n", "\n", "\n", "\n", "* **arrival, cargo, lang**: Same as those in `get_json_flight_info`\n", "\n", "### **Returns**\n", "* A pandas DataFrame containing detailed flight information for the given parameters and date range." ], "metadata": { "id": "t5PoPBidweWA" } }, { "cell_type": "code", "source": [ "def get_df_flight_info(start_date, end_date, arrival, cargo, lang='en', col=None):\n", "\n", " date_list = pd.date_range(start=start_date, end=end_date).strftime('%Y-%m-%d').tolist()\n", "\n", " df_list = []\n", " for date in date_list:\n", " json_flight_info = get_json_flight_info(date, arrival, cargo, lang)\n", " df = preprocessing(json_flight_info, col)\n", " df_list += [df]\n", "\n", " return pd.concat(df_list).reset_index()" ], "metadata": { "id": "d1Kw8H1_BW21" }, "execution_count": 205, "outputs": [] }, { "cell_type": "markdown", "source": [ "### **Example of Usages**" ], "metadata": { "id": "4Q4p3biGzC1p" } }, { "cell_type": "code", "source": [ "# single-day query\n", "yesterday = (pd.to_datetime('today')-pd.Timedelta('1 days')).strftime('%Y-%m-%d')\n", "flight_info = get_df_flight_info(start_date=yesterday, end_date=yesterday, arrival=False, cargo=False)\n", "flight_info.head()" ], "metadata": { "id": "p_9PqPB_S2BH", "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "outputId": "d58ccf03-ed0a-49c1-cd04-af6bf5f0dae9" }, "execution_count": 206, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " index info_date time \\\n", "0 0 2024-03-21 23:35 \n", "1 1 2024-03-21 23:45 \n", "2 2 2024-03-21 00:05 \n", "3 3 2024-03-21 00:15 \n", "4 4 2024-03-21 00:15 \n", "\n", " flight status \\\n", "0 [CX 255 (CPA)] Dep 00:04 (22/03/2024) \n", "1 [ET 645 (ETH)] Dep 00:07 (22/03/2024) \n", "2 [CX 261 (CPA)] Dep 00:15 \n", "3 [CX 289 (CPA), LH 7015 (DLH)] Dep 00:22 \n", "4 [CX 880 (CPA), MH 9190 (MAS), OM 5880 (MGL), A... Dep 00:24 \n", "\n", " statusCode destination terminal aisle gate \n", "0 None [LHR] T1 BC 2 \n", "1 None [ADD] T1 D 31 \n", "2 None [CDG] T1 A 49 \n", "3 None [FRA] T1 A 66 \n", "4 None [LAX] T1 BC 9 " ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
indexinfo_datetimeflightstatusstatusCodedestinationterminalaislegate
002024-03-2123:35[CX 255 (CPA)]Dep 00:04 (22/03/2024)None[LHR]T1BC2
112024-03-2123:45[ET 645 (ETH)]Dep 00:07 (22/03/2024)None[ADD]T1D31
222024-03-2100:05[CX 261 (CPA)]Dep 00:15None[CDG]T1A49
332024-03-2100:15[CX 289 (CPA), LH 7015 (DLH)]Dep 00:22None[FRA]T1A66
442024-03-2100:15[CX 880 (CPA), MH 9190 (MAS), OM 5880 (MGL), A...Dep 00:24None[LAX]T1BC9
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "flight_info", "repr_error": "Out of range float values are not JSON compliant: nan" } }, "metadata": {}, "execution_count": 206 } ] }, { "cell_type": "markdown", "source": [ "# **Visualizing Flight Data**\n", "With the data processed, we can now visualize it to uncover insights. For example, to visualize the count of flights by origin or destination:\n", "\n", "## Top `N` `locations` by Flight Counts within 30 Days" ], "metadata": { "id": "CHn3xGo5zz0d" } }, { "cell_type": "code", "source": [ "N = 20\n", "today = pd.to_datetime('today').strftime('%Y-%m-%d')\n", "thirty_days_before = (pd.to_datetime('today')-pd.Timedelta('30 days')).strftime('%Y-%m-%d')\n", "df = get_df_flight_info(start_date=thirty_days_before, end_date=today, arrival=False, cargo=False, col=[\"destination\"])\n", "\n", "if 'origin' in df.columns:\n", " location = 'Origin'\n", " info = df['origin']\n", "\n", "if 'destination' in df.columns:\n", " location = 'Destination'\n", " info = df['destination']\n", "\n", "counts = info.explode().value_counts()[:N]\n", "counts.plot.bar(title=f'Top {N} Flight Counts by {location}')" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 487 }, "id": "8r1tDKLBkX32", "outputId": "063fd7ab-a9be-4fec-d0ef-adf42a3a2204" }, "execution_count": 207, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 207 }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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iObNm6NOnToAgPj4eBgZGcHa2lptWzs7O8THx0vbvBleVOtV63IzY8YMWFlZSQ9HR0ctHw0RERGVFjoNMAEBAbh48SI2btyoy2oAABMmTEBKSor0iIuL03mdREREVDJ0Nox6xIgR2LNnD6KiolC5cmVpub29PTIyMpCcnKzWCpOQkAB7e3tpm9OnT6uVpxqlpNomO2NjYxgbG2v5KIiIiKg00nqAEUJg5MiR2L59O44ePYpq1aqprXdzc0OZMmVw+PBh+Pj4AABiY2Nx9+5duLu7AwDc3d0RHByMxMRE2NraAgAOHToES0tLuLq6anuXiYhKHc41Q5Q/rQeYgIAArF+/Hjt37kTZsmWlPitWVlYwNTWFlZUV/P39MXr0aJQrVw6WlpYYOXIk3N3d0bRpUwBAhw4d4Orqir59+2L27NmIj4/HDz/8gICAALayEBERkfYDzPLlywEAbdq0UVseGhqKAQMGAAAWLFgApVIJHx8fpKenw9PTE8uWLZO2NTAwwJ49e/DFF1/A3d0d5ubm6N+/P6ZMmaLt3SUiIiIZ0sktpIKYmJggJCQEISEheW5TtWpV7Nu3T5u7RkRERG8J/hYSEdE7qKh9bAD2s6HShb9GTURERLLDAENERESyw1tIRESkE/q4TcXh5u8utsAQERGR7DDAEBERkezwFhIREVE+eJuqdGILDBEREckOAwwRERHJDgMMERERyQ77wBAREZUwXfezeRtnXmYLDBEREckOW2CIiIhIY/pu5WELDBEREckOAwwRERHJDgMMERERyQ4DDBEREckOAwwRERHJDgMMERERyQ4DDBEREckOAwwRERHJDgMMERERyQ4DDBEREckOAwwRERHJDgMMERERyQ4DDBEREckOAwwRERHJDgMMERERyQ4DDBEREckOAwwRERHJDgMMERERyQ4DDBEREckOAwwRERHJDgMMERERyQ4DDBEREckOAwwRERHJDgMMERERyQ4DDBEREckOAwwRERHJDgMMERERyQ4DDBEREckOAwwRERHJDgMMERERyQ4DDBEREckOAwwRERHJDgMMERERyQ4DDBEREckOAwwRERHJDgMMERERyQ4DDBEREckOAwwRERHJDgMMERERyQ4DDBEREckOAwwRERHJTqkOMCEhIXBycoKJiQmaNGmC06dPl/QuERERUSlQagPMpk2bMHr0aAQF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\n" }, "metadata": {} } ] } ] }