{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2023-12-11T17:07:26.744932200Z", "start_time": "2023-12-11T17:07:26.740214500Z" } }, "outputs": [], "source": [ "import pandas as pd\n", "import sklearn as sk\n", "import matplotlib.pyplot as plt\n", "import json\n", "import math" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2023-12-11T17:07:55.590798700Z", "start_time": "2023-12-11T17:07:26.744932200Z" } }, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>FlightDate</th>\n", " <th>Airline</th>\n", " <th>Origin</th>\n", " <th>Dest</th>\n", " <th>Cancelled</th>\n", " <th>Diverted</th>\n", " <th>CRSDepTime</th>\n", " <th>DepTime</th>\n", " <th>DepDelayMinutes</th>\n", " <th>DepDelay</th>\n", " <th>...</th>\n", " <th>WheelsOff</th>\n", " <th>WheelsOn</th>\n", " <th>TaxiIn</th>\n", " <th>CRSArrTime</th>\n", " <th>ArrDelay</th>\n", " <th>ArrDel15</th>\n", " <th>ArrivalDelayGroups</th>\n", " <th>ArrTimeBlk</th>\n", " <th>DistanceGroup</th>\n", " <th>DivAirportLandings</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>2018-01-23</td>\n", " <td>Endeavor Air Inc.</td>\n", " <td>ABY</td>\n", " <td>ATL</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>1202</td>\n", " <td>1157.0</td>\n", " <td>0.0</td>\n", " <td>-5.0</td>\n", " <td>...</td>\n", " <td>1211.0</td>\n", " <td>1249.0</td>\n", " <td>7.0</td>\n", " <td>1304</td>\n", " <td>-8.0</td>\n", " <td>0.0</td>\n", " <td>-1.0</td>\n", " <td>1300-1359</td>\n", " <td>1</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>2018-01-24</td>\n", " <td>Endeavor Air Inc.</td>\n", " <td>ABY</td>\n", " <td>ATL</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>1202</td>\n", " <td>1157.0</td>\n", " <td>0.0</td>\n", " <td>-5.0</td>\n", " <td>...</td>\n", " <td>1210.0</td>\n", " <td>1246.0</td>\n", " <td>12.0</td>\n", " <td>1304</td>\n", " <td>-6.0</td>\n", " <td>0.0</td>\n", " <td>-1.0</td>\n", " <td>1300-1359</td>\n", " <td>1</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>2018-01-25</td>\n", " <td>Endeavor Air Inc.</td>\n", " <td>ABY</td>\n", " <td>ATL</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>1202</td>\n", " <td>1153.0</td>\n", " <td>0.0</td>\n", " <td>-9.0</td>\n", " <td>...</td>\n", " <td>1211.0</td>\n", " <td>1251.0</td>\n", " <td>11.0</td>\n", " <td>1304</td>\n", " <td>-2.0</td>\n", " <td>0.0</td>\n", " <td>-1.0</td>\n", " <td>1300-1359</td>\n", " <td>1</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>2018-01-26</td>\n", " <td>Endeavor Air Inc.</td>\n", " <td>ABY</td>\n", " <td>ATL</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>1202</td>\n", " <td>1150.0</td>\n", " <td>0.0</td>\n", " <td>-12.0</td>\n", " <td>...</td>\n", " <td>1207.0</td>\n", " <td>1242.0</td>\n", " <td>11.0</td>\n", " <td>1304</td>\n", " <td>-11.0</td>\n", " <td>0.0</td>\n", " <td>-1.0</td>\n", " <td>1300-1359</td>\n", " <td>1</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>2018-01-27</td>\n", " <td>Endeavor Air Inc.</td>\n", " <td>ABY</td>\n", " <td>ATL</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>1400</td>\n", " <td>1355.0</td>\n", " <td>0.0</td>\n", " <td>-5.0</td>\n", " <td>...</td>\n", " <td>1412.0</td>\n", " <td>1448.0</td>\n", " <td>11.0</td>\n", " <td>1500</td>\n", " <td>-1.0</td>\n", " <td>0.0</td>\n", " <td>-1.0</td>\n", " <td>1500-1559</td>\n", " <td>1</td>\n", " <td>0.0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>5 rows × 61 columns</p>\n", "</div>" ], "text/plain": [ " FlightDate Airline Origin Dest Cancelled Diverted CRSDepTime \\\n", "0 2018-01-23 Endeavor Air Inc. ABY ATL False False 1202 \n", "1 2018-01-24 Endeavor Air Inc. ABY ATL False False 1202 \n", "2 2018-01-25 Endeavor Air Inc. ABY ATL False False 1202 \n", "3 2018-01-26 Endeavor Air Inc. ABY ATL False False 1202 \n", "4 2018-01-27 Endeavor Air Inc. ABY ATL False False 1400 \n", "\n", " DepTime DepDelayMinutes DepDelay ... WheelsOff WheelsOn TaxiIn \\\n", "0 1157.0 0.0 -5.0 ... 1211.0 1249.0 7.0 \n", "1 1157.0 0.0 -5.0 ... 1210.0 1246.0 12.0 \n", "2 1153.0 0.0 -9.0 ... 1211.0 1251.0 11.0 \n", "3 1150.0 0.0 -12.0 ... 1207.0 1242.0 11.0 \n", "4 1355.0 0.0 -5.0 ... 1412.0 1448.0 11.0 \n", "\n", " CRSArrTime ArrDelay ArrDel15 ArrivalDelayGroups ArrTimeBlk \\\n", "0 1304 -8.0 0.0 -1.0 1300-1359 \n", "1 1304 -6.0 0.0 -1.0 1300-1359 \n", "2 1304 -2.0 0.0 -1.0 1300-1359 \n", "3 1304 -11.0 0.0 -1.0 1300-1359 \n", "4 1500 -1.0 0.0 -1.0 1500-1559 \n", "\n", " DistanceGroup DivAirportLandings \n", "0 1 0.0 \n", "1 1 0.0 \n", "2 1 0.0 \n", "3 1 0.0 \n", "4 1 0.0 \n", "\n", "[5 rows x 61 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cf_2018 = pd.read_csv('flight_data/Combined_Flights_2018.csv')\n", "cf_2018.head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2023-12-11T17:07:56.493778700Z", "start_time": "2023-12-11T17:07:55.953264900Z" } }, "outputs": [], "source": [ "# Filter the dataframe to include only the delays from JFK\n", "import RegressionModel\n", "\n", "filtered_df = cf_2018[(cf_2018['Origin'] == 'JFK')]\n", "\n", "RegressionModel.destinations = list(cf_2018['DestCityName'].unique())" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2023-12-11T17:07:56.527530200Z", "start_time": "2023-12-11T17:07:56.498869700Z" } }, "outputs": [], "source": [ "relevant_columns = ['FlightDate', 'Airline', 'Dest', 'DepDelayMinutes', 'ArrDelayMinutes']\n", "jfk_flights_2018 = filtered_df[relevant_columns].copy()\n", "jfk_flights_2018.dropna(inplace=True)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2023-12-11T17:07:56.542402200Z", "start_time": "2023-12-11T17:07:56.526530600Z" } }, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>FlightDate</th>\n", " <th>Airline</th>\n", " <th>Dest</th>\n", " <th>DepDelayMinutes</th>\n", " <th>ArrDelayMinutes</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>5544</th>\n", " <td>2018-01-22</td>\n", " <td>JetBlue Airways</td>\n", " <td>SJC</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>5547</th>\n", " <td>2018-01-22</td>\n", " <td>JetBlue Airways</td>\n", " <td>MSY</td>\n", " <td>86.0</td>\n", " <td>77.0</td>\n", " </tr>\n", " <tr>\n", " <th>5548</th>\n", " <td>2018-01-22</td>\n", " <td>JetBlue Airways</td>\n", " <td>JAX</td>\n", " <td>29.0</td>\n", " <td>11.0</td>\n", " </tr>\n", " <tr>\n", " <th>5554</th>\n", " <td>2018-01-22</td>\n", " <td>JetBlue Airways</td>\n", " <td>ROC</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>5565</th>\n", " <td>2018-01-22</td>\n", " <td>JetBlue Airways</td>\n", " <td>BUF</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>...</th>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " </tr>\n", " <tr>\n", " <th>5666920</th>\n", " <td>2018-09-10</td>\n", " <td>Delta Air Lines Inc.</td>\n", " <td>SFO</td>\n", " <td>0.0</td>\n", " <td>3.0</td>\n", " </tr>\n", " <tr>\n", " <th>5666921</th>\n", " <td>2018-09-10</td>\n", " <td>Delta Air Lines Inc.</td>\n", " <td>MSP</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>5667057</th>\n", " <td>2018-09-10</td>\n", " <td>Delta Air Lines Inc.</td>\n", " <td>LAX</td>\n", " <td>13.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>5667231</th>\n", " <td>2018-09-10</td>\n", " <td>Delta Air Lines Inc.</td>\n", " <td>SEA</td>\n", " <td>48.0</td>\n", " <td>44.0</td>\n", " </tr>\n", " <tr>\n", " <th>5672362</th>\n", " <td>2018-09-04</td>\n", " <td>Endeavor Air Inc.</td>\n", " <td>BNA</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>83754 rows × 5 columns</p>\n", "</div>" ], "text/plain": [ " FlightDate Airline Dest DepDelayMinutes \\\n", "5544 2018-01-22 JetBlue Airways SJC 0.0 \n", "5547 2018-01-22 JetBlue Airways MSY 86.0 \n", "5548 2018-01-22 JetBlue Airways JAX 29.0 \n", "5554 2018-01-22 JetBlue Airways ROC 0.0 \n", "5565 2018-01-22 JetBlue Airways BUF 0.0 \n", "... ... ... ... ... \n", "5666920 2018-09-10 Delta Air Lines Inc. SFO 0.0 \n", "5666921 2018-09-10 Delta Air Lines Inc. MSP 0.0 \n", "5667057 2018-09-10 Delta Air Lines Inc. LAX 13.0 \n", "5667231 2018-09-10 Delta Air Lines Inc. SEA 48.0 \n", "5672362 2018-09-04 Endeavor Air Inc. BNA 0.0 \n", "\n", " ArrDelayMinutes \n", "5544 0.0 \n", "5547 77.0 \n", "5548 11.0 \n", "5554 0.0 \n", "5565 0.0 \n", "... ... \n", "5666920 3.0 \n", "5666921 0.0 \n", "5667057 0.0 \n", "5667231 44.0 \n", "5672362 0.0 \n", "\n", "[83754 rows x 5 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "jfk_flights_2018" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2023-12-11T17:07:56.666500700Z", "start_time": "2023-12-11T17:07:56.546471Z" } }, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>FlightDate</th>\n", " <th>Airline</th>\n", " <th>DepDelayMinutes</th>\n", " <th>ArrDelayMinutes</th>\n", " <th>Year</th>\n", " <th>Month</th>\n", " <th>Day</th>\n", " <th>Dest_ABQ</th>\n", " <th>Dest_ACK</th>\n", " <th>Dest_ATL</th>\n", " <th>...</th>\n", " <th>Dest_SFO</th>\n", " <th>Dest_SJC</th>\n", " <th>Dest_SJU</th>\n", " <th>Dest_SLC</th>\n", " <th>Dest_SMF</th>\n", " <th>Dest_SNA</th>\n", " <th>Dest_SRQ</th>\n", " <th>Dest_STT</th>\n", " <th>Dest_SYR</th>\n", " <th>Dest_TPA</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>5544</th>\n", " <td>2018-01-22</td>\n", " <td>JetBlue Airways</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>2018</td>\n", " <td>1</td>\n", " <td>22</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " </tr>\n", " <tr>\n", " <th>5547</th>\n", " <td>2018-01-22</td>\n", " <td>JetBlue Airways</td>\n", " <td>86.0</td>\n", " <td>77.0</td>\n", " <td>2018</td>\n", " <td>1</td>\n", " <td>22</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>...</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " </tr>\n", " <tr>\n", " <th>5548</th>\n", " <td>2018-01-22</td>\n", " <td>JetBlue Airways</td>\n", " <td>29.0</td>\n", " <td>11.0</td>\n", " <td>2018</td>\n", " <td>1</td>\n", " <td>22</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>...</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " </tr>\n", " <tr>\n", " <th>5554</th>\n", " <td>2018-01-22</td>\n", " <td>JetBlue Airways</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>2018</td>\n", " <td>1</td>\n", " <td>22</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>...</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " </tr>\n", " <tr>\n", " <th>5565</th>\n", " <td>2018-01-22</td>\n", " <td>JetBlue Airways</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>2018</td>\n", " <td>1</td>\n", " <td>22</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>...</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " <td>False</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>5 rows × 78 columns</p>\n", "</div>" ], "text/plain": [ " FlightDate Airline DepDelayMinutes ArrDelayMinutes Year \\\n", "5544 2018-01-22 JetBlue Airways 0.0 0.0 2018 \n", "5547 2018-01-22 JetBlue Airways 86.0 77.0 2018 \n", "5548 2018-01-22 JetBlue Airways 29.0 11.0 2018 \n", "5554 2018-01-22 JetBlue Airways 0.0 0.0 2018 \n", "5565 2018-01-22 JetBlue Airways 0.0 0.0 2018 \n", "\n", " Month Day Dest_ABQ Dest_ACK Dest_ATL ... Dest_SFO Dest_SJC \\\n", "5544 1 22 False False False ... False True \n", "5547 1 22 False False False ... False False \n", "5548 1 22 False False False ... False False \n", "5554 1 22 False False False ... False False \n", "5565 1 22 False False False ... False False \n", "\n", " Dest_SJU Dest_SLC Dest_SMF Dest_SNA Dest_SRQ Dest_STT Dest_SYR \\\n", "5544 False False False False False False False \n", "5547 False False False False False False False \n", "5548 False False False False False False False \n", "5554 False False False False False False False \n", "5565 False False False False False False False \n", "\n", " Dest_TPA \n", "5544 False \n", "5547 False \n", "5548 False \n", "5554 False \n", "5565 False \n", "\n", "[5 rows x 78 columns]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Convert 'FlightDate' into numerical components\n", "jfk_flights_2018['FlightDate'] = pd.to_datetime(jfk_flights_2018['FlightDate'])\n", "jfk_flights_2018['Year'] = jfk_flights_2018['FlightDate'].dt.year\n", "jfk_flights_2018['Month'] = jfk_flights_2018['FlightDate'].dt.month\n", "jfk_flights_2018['Day'] = jfk_flights_2018['FlightDate'].dt.day\n", "\n", "# One-hot encoding for categorical variables\n", "df_jfk_encoded = pd.get_dummies(jfk_flights_2018, columns=['Dest'])\n", "df_jfk_encoded.head()\n" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "ExecuteTime": { "end_time": "2023-12-11T17:07:56.737639800Z", "start_time": "2023-12-11T17:07:56.666500700Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlkAAAGzCAYAAAAczwI+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABHQUlEQVR4nO3de1hVZf7//xcHN+JhgydAEtRS83xOpHNJYpKTZo2aKZnVR0NTKVN/lVmfJs2m0vJU06R+ZqbxcI1ZSeIQnjqQBzyiSVYqlmywFLaaArLv3x99WbmFSpElos/Hda1rWut+73vd62Zwv657r73wMcYYAQAAoEL5VvYAAAAALkeELAAAABsQsgAAAGxAyAIAALABIQsAAMAGhCwAAAAbELIAAABsQMgCAACwASELAADABoQsAAAAG/hX5smbNGmiAwcOlDr+2GOPafbs2Tp16pSeeOIJLVq0SAUFBYqNjdWcOXMUGhpq1WZlZWnkyJFas2aNatWqpfj4eE2dOlX+/r9e2tq1a5WYmKhdu3YpIiJCzzzzjB588EGvc86ePVuvvPKKXC6XOnTooDfffFPdunU752vxeDw6dOiQateuLR8fn/OfDAAAcNEZY3Ts2DGFh4fL17eC155MJcrNzTXZ2dnWlpKSYiSZNWvWGGOMGTFihImIiDCpqalm8+bNpnv37ub666+3Xn/69GnTtm1bExMTY7Zu3Wo+/vhjU79+fTNp0iSr5rvvvjM1atQwiYmJZvfu3ebNN980fn5+Jjk52apZtGiRcTgc5t133zW7du0yjzzyiAkODjY5OTnnfC0HDx40ktjY2NjY2Niq4Hbw4MELDzZn8THm0vkD0WPHjtWKFSu0d+9eud1uNWjQQO+9957uvfdeSdKePXvUqlUrpaWlqXv37lq5cqXuuusuHTp0yFrdmjdvniZMmKDDhw/L4XBowoQJSkpKUkZGhnWegQMHKi8vT8nJyZKkqKgoXXfddZo1a5akX1alIiIiNHr0aE2cOPGcxp6fn6/g4GAdPHhQTqezIqcFAADYxO12KyIiQnl5eQoKCqrQviv148IzFRYW6p///KcSExPl4+Oj9PR0FRUVKSYmxqpp2bKlIiMjrZCVlpamdu3aeX18GBsbq5EjR2rXrl3q1KmT0tLSvPooqRk7dqx13vT0dE2aNMlq9/X1VUxMjNLS0n5zvAUFBSooKLD2jx07JklyOp2ELAAAqhg7bvW5ZG58X758ufLy8qx7pVwulxwOh4KDg73qQkND5XK5rJozA1ZJe0nb79W43W6dPHlSP/74o4qLi8usKemjLFOnTlVQUJC1RUREnPc1AwCAy9clE7L+/ve/684771R4eHhlD+WcTJo0Sfn5+dZ28ODByh4SAAC4hFwSHxceOHBAn3zyiZYtW2YdCwsLU2FhofLy8rxWs3JychQWFmbVbNy40auvnJwcq63kf0uOnVnjdDoVGBgoPz8/+fn5lVlT0kdZAgICFBAQcP4XCwAArgiXxErW/PnzFRISori4OOtYly5dVK1aNaWmplrHMjMzlZWVpejoaElSdHS0du7cqdzcXKsmJSVFTqdTrVu3tmrO7KOkpqQPh8OhLl26eNV4PB6lpqZaNQAAAOer0leyPB6P5s+fr/j4eK9nWwUFBWn48OFKTExU3bp15XQ6NXr0aEVHR6t79+6SpJ49e6p169YaMmSIpk+fLpfLpWeeeUYJCQnWKtOIESM0a9YsPfXUU3rooYe0evVqLVmyRElJSda5EhMTFR8fr65du6pbt26aMWOGTpw4oWHDhl3cyQAAAJePCn8oxHlatWqVkWQyMzNLtZ08edI89thjpk6dOqZGjRqmX79+Jjs726tm//795s477zSBgYGmfv365oknnjBFRUVeNWvWrDEdO3Y0DofDXH311Wb+/PmlzvXmm2+ayMhI43A4TLdu3cyXX355XteRn59vJJn8/Pzzeh0AAKg8dr5/X1LPyarK3G63goKClJ+fzyMcAACoIux8/74k7skCAAC43BCyAAAAbEDIAgAAsAEhCwAAwAaELAAAABsQsgAAAGxAyAIAALABIQsAAMAGlf5ndXBumkxM8trfPy3uNyoBAMClgJUsAAAAGxCyAAAAbEDIAgAAsAEhCwAAwAaELAAAABsQsgAAAGxAyAIAALABIQsAAMAGhCwAAAAbELIAAABsQMgCAACwASELAADABoQsAAAAGxCyAAAAbEDIAgAAsAEhCwAAwAaELAAAABsQsgAAAGxAyAIAALABIQsAAMAGhCwAAAAbELIAAABsQMgCAACwASELAADABoQsAAAAGxCyAAAAbEDIAgAAsAEhCwAAwAaELAAAABsQsgAAAGxAyAIAALABIQsAAMAGlR6yfvjhBz3wwAOqV6+eAgMD1a5dO23evNlqN8Zo8uTJatiwoQIDAxUTE6O9e/d69XHkyBENHjxYTqdTwcHBGj58uI4fP+5Vs2PHDt10002qXr26IiIiNH369FJjWbp0qVq2bKnq1aurXbt2+vjjj+25aAAAcNmr1JB19OhR3XDDDapWrZpWrlyp3bt369VXX1WdOnWsmunTp+uNN97QvHnztGHDBtWsWVOxsbE6deqUVTN48GDt2rVLKSkpWrFihdavX69HH33Uane73erZs6caN26s9PR0vfLKK5oyZYrefvttq+aLL77QoEGDNHz4cG3dulV9+/ZV3759lZGRcXEmAwAAXFZ8jDGmsk4+ceJEff755/r000/LbDfGKDw8XE888YSefPJJSVJ+fr5CQ0O1YMECDRw4UF999ZVat26tTZs2qWvXrpKk5ORk9e7dW99//73Cw8M1d+5cPf3003K5XHI4HNa5ly9frj179kiSBgwYoBMnTmjFihXW+bt3766OHTtq3rx5f3gtbrdbQUFBys/Pl9PpvKB5KUuTiUle+/unxVX4OQAAuNLY+f5dqStZH374obp27ar77rtPISEh6tSpk/72t79Z7fv27ZPL5VJMTIx1LCgoSFFRUUpLS5MkpaWlKTg42ApYkhQTEyNfX19t2LDBqrn55putgCVJsbGxyszM1NGjR62aM89TUlNynrMVFBTI7XZ7bQAAACUqNWR99913mjt3rpo3b65Vq1Zp5MiRevzxx7Vw4UJJksvlkiSFhoZ6vS40NNRqc7lcCgkJ8Wr39/dX3bp1vWrK6uPMc/xWTUn72aZOnaqgoCBri4iIOO/rBwAAl69KDVkej0edO3fWSy+9pE6dOunRRx/VI488ck4fz1W2SZMmKT8/39oOHjxY2UMCAACXkEoNWQ0bNlTr1q29jrVq1UpZWVmSpLCwMElSTk6OV01OTo7VFhYWptzcXK/206dP68iRI141ZfVx5jl+q6ak/WwBAQFyOp1eGwAAQIlKDVk33HCDMjMzvY59/fXXaty4sSSpadOmCgsLU2pqqtXudru1YcMGRUdHS5Kio6OVl5en9PR0q2b16tXyeDyKioqyatavX6+ioiKrJiUlRddee631Tcbo6Giv85TUlJwHAADgfFRqyBo3bpy+/PJLvfTSS/rmm2/03nvv6e2331ZCQoIkycfHR2PHjtWLL76oDz/8UDt3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CwAAwAaELAAAABsQsgAAAGxAyAIAALABIQsAAMAGhCwAAAAbELIAAABsQMgCAACwASELAADABoQsAAAAGxCyAAAAbEDIAgAAsAEhCwAAwAaELAAAABsQsgAAAGxQrpD13XffVfQ4AAAALivlClnNmjXTbbfdpn/+8586depURY8JAACgyitXyNqyZYvat2+vxMREhYWF6X/+53+0cePGih4bAABAlVWukNWxY0fNnDlThw4d0rvvvqvs7GzdeOONatu2rV577TUdPny4oscJAABQpVzQje/+/v665557tHTpUr388sv65ptv9OSTTyoiIkJDhw5Vdnb2Ofc1bdo0+fj4aOzYsdaxU6dOKSEhQfXq1VOtWrXUv39/5eTkeL0uKytLcXFxqlGjhkJCQjR+/HidPn3aq2bt2rXq3LmzAgIC1KxZMy1YsKDU+WfPnq0mTZqoevXqioqKYmUOAABckAsKWZs3b9Zjjz2mhg0b6rXXXtOTTz6pb7/9VikpKTp06JDuvvvuc+pn06ZNeuutt9S+fXuv4+PGjdNHH32kpUuXat26dTp06JDuueceq724uFhxcXEqLCzUF198oYULF2rBggWaPHmyVbNv3z7FxcXptttu07Zt2zR27Fg9/PDDWrVqlVWzePFiJSYm6rnnntOWLVvUoUMHxcbGKjc390KmBwAAXMlMObz66qumbdu2plq1aubuu+82H330kSkuLvaqOXjwoPHz8/vDvo4dO2aaN29uUlJSzC233GLGjBljjDEmLy/PVKtWzSxdutSq/eqrr4wkk5aWZowx5uOPPza+vr7G5XJZNXPnzjVOp9MUFBQYY4x56qmnTJs2bbzOOWDAABMbG2vtd+vWzSQkJFj7xcXFJjw83EydOvUcZ8SY/Px8I8nk5+ef82vOR+MJK7w2AABw4ex8/y7XStbcuXN1//3368CBA1q+fLnuuusu+fp6dxUSEqK///3vf9hXQkKC4uLiFBMT43U8PT1dRUVFXsdbtmypyMhIpaWlSZLS0tLUrl07hYaGWjWxsbFyu93atWuXVXN237GxsVYfhYWFSk9P96rx9fVVTEyMVVOWgoICud1urw0AAKCEf3letHfv3j+scTgcio+P/92aRYsWacuWLdq0aVOpNpfLJYfDoeDgYK/joaGhcrlcVs2ZAaukvaTt92rcbrdOnjypo0ePqri4uMyaPXv2/ObYp06dqueff/53rw8AAFy5yrWSNX/+fC1durTU8aVLl2rhwoXn1MfBgwc1ZswY/etf/1L16tXLM4xKNWnSJOXn51vbwYMHK3tIAADgElKukDV16lTVr1+/1PGQkBC99NJL59RHenq6cnNz1blzZ/n7+8vf31/r1q3TG2+8IX9/f4WGhqqwsFB5eXler8vJyVFYWJgkKSwsrNS3DUv2/6jG6XQqMDBQ9evXl5+fX5k1JX2UJSAgQE6n02sDAAAoUa6QlZWVpaZNm5Y63rhxY2VlZZ1THz169NDOnTu1bds2a+vatasGDx5s/Xe1atWUmppqvSYzM1NZWVmKjo6WJEVHR2vnzp1e3wJMSUmR0+lU69atrZoz+yipKenD4XCoS5cuXjUej0epqalWDQAAwPkq1z1ZISEh2rFjh5o0aeJ1fPv27apXr9459VG7dm21bdvW61jNmjVVr1496/jw4cOVmJiounXryul0avTo0YqOjlb37t0lST179lTr1q01ZMgQTZ8+XS6XS88884wSEhIUEBAgSRoxYoRmzZqlp556Sg899JBWr16tJUuWKCkpyTpvYmKi4uPj1bVrV3Xr1k0zZszQiRMnNGzYsPJMDwAAQPlC1qBBg/T444+rdu3auvnmmyVJ69at05gxYzRw4MAKG9zrr78uX19f9e/fXwUFBYqNjdWcOXOsdj8/P61YsUIjR45UdHS0atasqfj4eL3wwgtWTdOmTZWUlKRx48Zp5syZatSokd555x3FxsZaNQMGDNDhw4c1efJkuVwudezYUcnJyaVuhgcAADhXPsYYc74vKiws1JAhQ7R06VL5+/+S0zwej4YOHap58+bJ4XBU+EAvdW63W0FBQcrPz7fl/qwmE5O89vdPi6vwcwAAcKWx8/27XCtZDodDixcv1v/+7/9q+/btCgwMVLt27dS4ceMKHRwAAEBVVa6QVaJFixZq0aJFRY0FAADgslGukFVcXKwFCxYoNTVVubm58ng8Xu2rV6+ukMEBAABUVeUKWWPGjNGCBQsUFxentm3bysfHp6LHBQAAUKWVK2QtWrRIS5YsUe/evSt6PAAAAJeFcj2M1OFwqFmzZhU9FgAAgMtGuULWE088oZkzZ6ocT38AAAC4IpTr48LPPvtMa9as0cqVK9WmTRtVq1bNq33ZsmUVMjgAAICqqlwhKzg4WP369avosQAAAFw2yhWy5s+fX9HjAAAAuKyU654sSTp9+rQ++eQTvfXWWzp27Jgk6dChQzp+/HiFDQ4AAKCqKtdK1oEDB9SrVy9lZWWpoKBAd9xxh2rXrq2XX35ZBQUFmjdvXkWPEwAAoEop10rWmDFj1LVrVx09elSBgYHW8X79+ik1NbXCBgcAAFBVlWsl69NPP9UXX3whh8PhdbxJkyb64YcfKmRgAAAAVVm5VrI8Ho+Ki4tLHf/+++9Vu3btCx4UAABAVVeukNWzZ0/NmDHD2vfx8dHx48f13HPP8ad2AAAAVM6PC1999VXFxsaqdevWOnXqlO6//37t3btX9evX17///e+KHiMAAECVU66Q1ahRI23fvl2LFi3Sjh07dPz4cQ0fPlyDBw/2uhEeAADgSlWukCVJ/v7+euCBBypyLAAAAJeNcoWs//u///vd9qFDh5ZrMAAAAJeLcoWsMWPGeO0XFRXp559/lsPhUI0aNQhZAADgileubxcePXrUazt+/LgyMzN14403cuM7AACALuBvF56tefPmmjZtWqlVLgAAgCtRhYUs6Zeb4Q8dOlSRXQIAAFRJ5bon68MPP/TaN8YoOztbs2bN0g033FAhAwMAAKjKyhWy+vbt67Xv4+OjBg0a6Pbbb9err75aEeMCAACo0soVsjweT0WPAwAA4LJSofdkAQAA4BflWslKTEw859rXXnutPKcAAACo0soVsrZu3aqtW7eqqKhI1157rSTp66+/lp+fnzp37mzV+fj4VMwoAQAAqphyhaw+ffqodu3aWrhwoerUqSPplweUDhs2TDfddJOeeOKJCh0kAABAVVOue7JeffVVTZ061QpYklSnTh29+OKLfLsQAABA5QxZbrdbhw8fLnX88OHDOnbs2AUPCgAAoKorV8jq16+fhg0bpmXLlun777/X999/r//85z8aPny47rnnnooeIwAAQJVTrnuy5s2bpyeffFL333+/ioqKfunI31/Dhw/XK6+8UqEDBAAAqIrKFbJq1KihOXPm6JVXXtG3334rSbrmmmtUs2bNCh0cAABAVXVBDyPNzs5Wdna2mjdvrpo1a8oYU1HjAgAAqNLKFbJ++ukn9ejRQy1atFDv3r2VnZ0tSRo+fDiPbwAAAFA5Q9a4ceNUrVo1ZWVlqUaNGtbxAQMGKDk5ucIGBwAAUFWV656s//73v1q1apUaNWrkdbx58+Y6cOBAhQwMAACgKivXStaJEye8VrBKHDlyRAEBARc8KAAAgKquXCHrpptu0v/93/9Z+z4+PvJ4PJo+fbpuu+22c+5n7ty5at++vZxOp5xOp6Kjo7Vy5Uqr/dSpU0pISFC9evVUq1Yt9e/fXzk5OV59ZGVlKS4uTjVq1FBISIjGjx+v06dPe9WsXbtWnTt3VkBAgJo1a6YFCxaUGsvs2bPVpEkTVa9eXVFRUdq4ceM5XwcAAMDZyhWypk+frrffflt33nmnCgsL9dRTT6lt27Zav369Xn755XPup1GjRpo2bZrS09O1efNm3X777br77ru1a9cuSb/c+/XRRx9p6dKlWrdunQ4dOuT1sNPi4mLFxcWpsLBQX3zxhRYuXKgFCxZo8uTJVs2+ffsUFxen2267Tdu2bdPYsWP18MMPa9WqVVbN4sWLlZiYqOeee05btmxRhw4dFBsbq9zc3PJMDwAAgHxMOZ+7kJ+fr1mzZmn79u06fvy4OnfurISEBDVs2PCCBlS3bl298soruvfee9WgQQO99957uvfeeyVJe/bsUatWrZSWlqbu3btr5cqVuuuuu3To0CGFhoZK+uVBqRMmTNDhw4flcDg0YcIEJSUlKSMjwzrHwIEDlZeXZ92kHxUVpeuuu06zZs2SJHk8HkVERGj06NGaOHHiOY3b7XYrKChI+fn5cjqdFzQHZWkyMclrf/+0uAo/BwAAVxo737/PeyWrqKhIPXr0UG5urp5++mktWbJEH3/8sV588cULCljFxcVatGiRTpw4oejoaKWnp6uoqEgxMTFWTcuWLRUZGam0tDRJUlpamtq1a2cFLEmKjY2V2+22VsPS0tK8+iipKemjsLBQ6enpXjW+vr6KiYmxagAAAM7XeX+7sFq1atqxY0eFDWDnzp2Kjo7WqVOnVKtWLb3//vtq3bq1tm3bJofDoeDgYK/60NBQuVwuSZLL5fIKWCXtJW2/V+N2u3Xy5EkdPXpUxcXFZdbs2bPnN8ddUFCggoICa9/tdp/fhQMAgMtaue7JeuCBB/T3v/+9QgZw7bXXatu2bdqwYYNGjhyp+Ph47d69u0L6ttPUqVMVFBRkbREREZU9JAAAcAkp13OyTp8+rXfffVeffPKJunTpUupvFr722mvn3JfD4VCzZs0kSV26dNGmTZs0c+ZMDRgwQIWFhcrLy/NazcrJyVFYWJgkKSwsrNS3AEu+fXhmzdnfSMzJyZHT6VRgYKD8/Pzk5+dXZk1JH2WZNGmSEhMTrX23203QAgAAlvNayfruu+/k8XiUkZGhzp07q3bt2vr666+1detWa9u2bdsFDcjj8aigoEBdunRRtWrVlJqaarVlZmYqKytL0dHRkqTo6Gjt3LnT61uAKSkpcjqdat26tVVzZh8lNSV9OBwOdenSxavG4/EoNTXVqilLQECA9eiJkg0AAKDEea1kNW/eXNnZ2VqzZo2kX/6MzhtvvFHqfqZzNWnSJN15552KjIzUsWPH9N5772nt2rVatWqVgoKCNHz4cCUmJqpu3bpyOp0aPXq0oqOj1b17d0lSz5491bp1aw0ZMkTTp0+Xy+XSM888o4SEBOuhqCNGjNCsWbP01FNP6aGHHtLq1au1ZMkSJSX9+m29xMRExcfHq2vXrurWrZtmzJihEydOaNiwYeW6LgAAgPMKWWc/7WHlypU6ceJEuU+em5uroUOHKjs7W0FBQWrfvr1WrVqlO+64Q5L0+uuvy9fXV/3791dBQYFiY2M1Z84c6/V+fn5asWKFRo4cqejoaNWsWVPx8fF64YUXrJqmTZsqKSlJ48aN08yZM9WoUSO98847io2NtWoGDBigw4cPa/LkyXK5XOrYsaOSk5PLHR4BAADO6zlZvr6+crlcCgkJkSTVrl1b27dv19VXX23bAKsKnpMFAEDVc8k8J8vHx0c+Pj6ljgEAAMDbeX9c+OCDD1r3O506dUojRowo9e3CZcuWVdwIAQAAqqDzClnx8fFe+w888ECFDgYAAOBycV4ha/78+XaNAwAA4LJSrie+AwAA4PcRsgAAAGxAyAIAALABIQsAAMAGhCwAAAAbELIAAABsQMgCAACwASELAADABoQsAAAAGxCyAAAAbEDIAgAAsAEhCwAAwAaELAAAABsQsgAAAGxAyAIAALABIQsAAMAGhCwAAAAbELIAAABsQMgCAACwASELAADABoQsAAAAGxCyAAAAbEDIAgAAsAEhCwAAwAaELAAAABsQsgAAAGxAyAIAALABIQsAAMAGhCwAAAAbELIAAABsQMgCAACwASELAADABoQsAAAAGxCyAAAAbEDIAgAAsAEhCwAAwAaELAAAABsQsgAAAGxQqSFr6tSpuu6661S7dm2FhISob9++yszM9Ko5deqUEhISVK9ePdWqVUv9+/dXTk6OV01WVpbi4uJUo0YNhYSEaPz48Tp9+rRXzdq1a9W5c2cFBASoWbNmWrBgQanxzJ49W02aNFH16tUVFRWljRs3Vvg1AwCAK0Olhqx169YpISFBX375pVJSUlRUVKSePXvqxIkTVs24ceP00UcfaenSpVq3bp0OHTqke+65x2ovLi5WXFycCgsL9cUXX2jhwoVasGCBJk+ebNXs27dPcXFxuu2227Rt2zaNHTtWDz/8sFatWmXVLF68WImJiXruuee0ZcsWdejQQbGxscrNzb04kwEAAC4rPsYYU9mDKHH48GGFhIRo3bp1uvnmm5Wfn68GDRrovffe07333itJ2rNnj1q1aqW0tDR1795dK1eu1F133aVDhw4pNDRUkjRv3jxNmDBBhw8flsPh0IQJE5SUlKSMjAzrXAMHDlReXp6Sk5MlSVFRUbruuus0a9YsSZLH41FERIRGjx6tiRMn/uHY3W63goKClJ+fL6fTWdFToyYTk7z290+Lq/BzAABwpbHz/fuSuicrPz9fklS3bl1JUnp6uoqKihQTE2PVtGzZUpGRkUpLS5MkpaWlqV27dlbAkqTY2Fi53W7t2rXLqjmzj5Kakj4KCwuVnp7uVePr66uYmBir5mwFBQVyu91eGwAAQIlLJmR5PB6NHTtWN9xwg9q2bStJcrlccjgcCg4O9qoNDQ2Vy+Wyas4MWCXtJW2/V+N2u3Xy5En9+OOPKi4uLrOmpI+zTZ06VUFBQdYWERFRvgsHAACXpUsmZCUkJCgjI0OLFi2q7KGck0mTJik/P9/aDh48WNlDAgAAlxD/yh6AJI0aNUorVqzQ+vXr1ahRI+t4WFiYCgsLlZeX57WalZOTo7CwMKvm7G8Blnz78Myas7+RmJOTI6fTqcDAQPn5+cnPz6/MmpI+zhYQEKCAgIDyXTAAALjsVepKljFGo0aN0vvvv6/Vq1eradOmXu1dunRRtWrVlJqaah3LzMxUVlaWoqOjJUnR0dHauXOn17cAU1JS5HQ61bp1a6vmzD5Kakr6cDgc6tKli1eNx+NRamqqVQMAAHA+KnUlKyEhQe+9954++OAD1a5d27r/KSgoSIGBgQoKCtLw4cOVmJiounXryul0avTo0YqOjlb37t0lST179lTr1q01ZMgQTZ8+XS6XS88884wSEhKslaYRI0Zo1qxZeuqpp/TQQw9p9erVWrJkiZKSfv3GXmJiouLj49W1a1d169ZNM2bM0IkTJzRs2LCLPzEAAKDKq9SQNXfuXEnSrbfe6nV8/vz5evDBByVJr7/+unx9fdW/f38VFBQoNjZWc+bMsWr9/Py0YsUKjRw5UtHR0apZs6bi4+P1wgsvWDVNmzZVUlKSxo0bp5kzZ6pRo0Z65513FBsba9UMGDBAhw8f1uTJk+VyudSxY0clJyeXuhkeAADgXFxSz8mqynhOFgAAVc8V85wsAACAywUhCwAAwAaELAAAABsQsgAAAGxAyAIAALABIQsAAMAGhCwAAAAbELIAAABsQMgCAACwASELAADABoQsAAAAGxCyAAAAbEDIAgAAsAEhCwAAwAaELAAAABsQsgAAAGxAyAIAALABIQsAAMAGhCwAAAAbELIAAABsQMgCAACwASELAADABoQsAAAAGxCyAAAAbEDIAgAAsAEhCwAAwAaELAAAABsQsgAAAGxAyAIAALABIQsAAMAGhCwAAAAbELIAAABsQMgCAACwASELAADABoQsAAAAGxCyAAAAbEDIAgAAsAEhCwAAwAaELAAAABsQsgAAAGxAyAIAALBBpYas9evXq0+fPgoPD5ePj4+WL1/u1W6M0eTJk9WwYUMFBgYqJiZGe/fu9ao5cuSIBg8eLKfTqeDgYA0fPlzHjx/3qtmxY4duuukmVa9eXREREZo+fXqpsSxdulQtW7ZU9erV1a5dO3388ccVfr0AAODKUakh68SJE+rQoYNmz55dZvv06dP1xhtvaN68edqwYYNq1qyp2NhYnTp1yqoZPHiwdu3apZSUFK1YsULr16/Xo48+arW73W717NlTjRs3Vnp6ul555RVNmTJFb7/9tlXzxRdfaNCgQRo+fLi2bt2qvn37qm/fvsrIyLDv4gEAwGXNxxhjKnsQkuTj46P3339fffv2lfTLKlZ4eLieeOIJPfnkk5Kk/Px8hYaGasGCBRo4cKC++uortW7dWps2bVLXrl0lScnJyerdu7e+//57hYeHa+7cuXr66aflcrnkcDgkSRMnTtTy5cu1Z88eSdKAAQN04sQJrVixwhpP9+7d1bFjR82bN++cxu92uxUUFKT8/Hw5nc6KmhZLk4lJXvv7p8VV+DkAALjS2Pn+fcnek7Vv3z65XC7FxMRYx4KCghQVFaW0tDRJUlpamoKDg62AJUkxMTHy9fXVhg0brJqbb77ZCliSFBsbq8zMTB09etSqOfM8JTUl5ylLQUGB3G631wYAAFDikg1ZLpdLkhQaGup1PDQ01GpzuVwKCQnxavf391fdunW9asrq48xz/FZNSXtZpk6dqqCgIGuLiIg430sEAACXsUs2ZF3qJk2apPz8fGs7ePBgZQ8JAABcQi7ZkBUWFiZJysnJ8Tqek5NjtYWFhSk3N9er/fTp0zpy5IhXTVl9nHmO36opaS9LQECAnE6n1wYAAFDikg1ZTZs2VVhYmFJTU61jbrdbGzZsUHR0tCQpOjpaeXl5Sk9Pt2pWr14tj8ejqKgoq2b9+vUqKiqyalJSUnTttdeqTp06Vs2Z5ympKTkPAADA+arUkHX8+HFt27ZN27Ztk/TLze7btm1TVlaWfHx8NHbsWL344ov68MMPtXPnTg0dOlTh4eHWNxBbtWqlXr166ZFHHtHGjRv1+eefa9SoURo4cKDCw8MlSffff78cDoeGDx+uXbt2afHixZo5c6YSExOtcYwZM0bJycl69dVXtWfPHk2ZMkWbN2/WqFGjLvaUAACAy4WpRGvWrDGSSm3x8fHGGGM8Ho959tlnTWhoqAkICDA9evQwmZmZXn389NNPZtCgQaZWrVrG6XSaYcOGmWPHjnnVbN++3dx4440mICDAXHXVVWbatGmlxrJkyRLTokUL43A4TJs2bUxSUtJ5XUt+fr6RZPLz889vEs5R4wkrvDYAAHDh7Hz/vmSek1XV8ZwsAACqnivyOVkAAABVGSELAADABoQsAAAAGxCyAAAAbEDIAgAAsAEhCwAAwAaELAAAABsQsgAAAGxAyAIAALABIQsAAMAGhCwAAAAbELIAAABsQMgCAACwASELAADABoQsAAAAGxCyAAAAbEDIAgAAsAEhCwAAwAaELAAAABsQsgAAAGzgX9kDQPk0mZhU6tj+aXGVMBIAAFAWVrIAAABsQMgCAACwASELAADABoQsAAAAGxCyAAAAbEDIAgAAsAEhCwAAwAaELAAAABvwMNLLyNkPKOXhpAAAVB5WsgAAAGxAyAIAALABIQsAAMAGhCwAAAAbELIAAABsQMgCAACwAY9wuIyd/UgHicc6AABwsbCSBQAAYANCFgAAgA34uPAKw1PhAQC4OFjJAgAAsAErWVc4bo4HAMAerGSdZfbs2WrSpImqV6+uqKgobdy4sbKHdNE1mZjktQEAgPPHStYZFi9erMTERM2bN09RUVGaMWOGYmNjlZmZqZCQkMoeXqU5l6DF6hcAAN58jDGmsgdxqYiKitJ1112nWbNmSZI8Ho8iIiI0evRoTZw48Xdf63a7FRQUpPz8fDmdzgof2+W6okQ4AwBUJjvfv1nJ+n8KCwuVnp6uSZMmWcd8fX0VExOjtLS0UvUFBQUqKCiw9vPz8yX98sOyg6fgZ1v6rWyR45ZW9hAuWMbzsZU9BABAOZW8b9ux5kTI+n9+/PFHFRcXKzQ01Ot4aGio9uzZU6p+6tSpev7550sdj4iIsG2MuDQFzajsEQAALtSxY8cUFBRUoX0Ssspp0qRJSkxMtPY9Ho+OHDmievXqycfHp0LP5Xa7FRERoYMHD9ryUWRVwlz8gnn4FXPxK+biV8zFr5iLX5U1F8YYHTt2TOHh4RV+PkLW/1O/fn35+fkpJyfH63hOTo7CwsJK1QcEBCggIMDrWHBwsJ1DlNPpvOJ/QUowF79gHn7FXPyKufgVc/Er5uJXZ89FRa9gleARDv+Pw+FQly5dlJqaah3zeDxKTU1VdHR0JY4MAABURaxknSExMVHx8fHq2rWrunXrphkzZujEiRMaNmxYZQ8NAABUMYSsMwwYMECHDx/W5MmT5XK51LFjRyUnJ5e6Gf5iCwgI0HPPPVfq48krEXPxC+bhV8zFr5iLXzEXv2IufnWx54LnZAEAANiAe7IAAABsQMgCAACwASELAADABoQsAAAAGxCyLnGzZ89WkyZNVL16dUVFRWnjxo2VPaQKNXXqVF133XWqXbu2QkJC1LdvX2VmZnrVnDp1SgkJCapXr55q1aql/v37l3pobFZWluLi4lSjRg2FhIRo/PjxOn369MW8lAo3bdo0+fj4aOzYsdaxK2kufvjhBz3wwAOqV6+eAgMD1a5dO23evNlqN8Zo8uTJatiwoQIDAxUTE6O9e/d69XHkyBENHjxYTqdTwcHBGj58uI4fP36xL+WCFBcX69lnn1XTpk0VGBioa665Rv/7v//r9XfWLte5WL9+vfr06aPw8HD5+Pho+fLlXu0Vdd07duzQTTfdpOrVqysiIkLTp0+3+9LO2+/NRVFRkSZMmKB27dqpZs2aCg8P19ChQ3Xo0CGvPq6EuTjbiBEj5OPjoxkzZngdv2hzYXDJWrRokXE4HObdd981u3btMo888ogJDg42OTk5lT20ChMbG2vmz59vMjIyzLZt20zv3r1NZGSkOX78uFUzYsQIExERYVJTU83mzZtN9+7dzfXXX2+1nz592rRt29bExMSYrVu3mo8//tjUr1/fTJo0qTIuqUJs3LjRNGnSxLRv396MGTPGOn6lzMWRI0dM48aNzYMPPmg2bNhgvvvuO7Nq1SrzzTffWDXTpk0zQUFBZvny5Wb79u3mT3/6k2natKk5efKkVdOrVy/ToUMH8+WXX5pPP/3UNGvWzAwaNKgyLqnc/vKXv5h69eqZFStWmH379pmlS5eaWrVqmZkzZ1o1l+tcfPzxx+bpp582y5YtM5LM+++/79VeEdedn59vQkNDzeDBg01GRob597//bQIDA81bb711sS7znPzeXOTl5ZmYmBizePFis2fPHpOWlma6detmunTp4tXHlTAXZ1q2bJnp0KGDCQ8PN6+//rpX28WaC0LWJaxbt24mISHB2i8uLjbh4eFm6tSplTgqe+Xm5hpJZt26dcaYX/7xqFatmlm6dKlV89VXXxlJJi0tzRjzyy+cr6+vcblcVs3cuXON0+k0BQUFF/cCKsCxY8dM8+bNTUpKirnllluskHUlzcWECRPMjTfe+JvtHo/HhIWFmVdeecU6lpeXZwICAsy///1vY4wxu3fvNpLMpk2brJqVK1caHx8f88MPP9g3+AoWFxdnHnroIa9j99xzjxk8eLAx5sqZi7PfTCvquufMmWPq1Knj9fsxYcIEc+2119p8ReX3e8GixMaNG40kc+DAAWPMlTcX33//vbnqqqtMRkaGady4sVfIuphzwceFl6jCwkKlp6crJibGOubr66uYmBilpaVV4sjslZ+fL0mqW7euJCk9PV1FRUVe89CyZUtFRkZa85CWlqZ27dp5PTQ2NjZWbrdbu3btuoijrxgJCQmKi4vzumbpypqLDz/8UF27dtV9992nkJAQderUSX/729+s9n379snlcnnNRVBQkKKiorzmIjg4WF27drVqYmJi5Ovrqw0bNly8i7lA119/vVJTU/X1119LkrZv367PPvtMd955p6Qray7OVFHXnZaWpptvvlkOh8OqiY2NVWZmpo4ePXqRrqbi5efny8fHx/qbulfSXHg8Hg0ZMkTjx49XmzZtSrVfzLkgZF2i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lClT1LFjR7311luKiIhQjRo19Oc//9lrRWHTpk264447VL9+fQUFBemWW27Rli1bvMbj4+OjuXPn6k9/+pNq1qypRx55RLfddpskqU6dOvLx8dGDDz4oqeyVkI4dO2rKlCm/2d9f/vIXSdIHH3ygzp07q3r16rr66qv1/PPP/2Go9Pf3V1hYmMLDw9WuXTuNHj1a69atU0ZGhl5++WWrrqCgQE8++aSuuuoq1axZU1FRUVq7du1v9vvtt9/q7rvvVmhoqGrVqqXrrrtOn3zyidX+wgsvqG3btqVe17FjRz377LO/2e+iRYvUp08fr2O33nqrRo8erbFjx6pOnToKDQ3V3/72N504cULDhg1T7dq11axZM61cudJ6zdkriSUfd65atUqtWrVSrVq1rLB+5nnGjh3rde6+fftaP7tbb71VBw4c0Lhx46wVwhKfffaZbrrpJgUGBioiIkKPP/64Tpw4YbXPmTNHzZs3V/Xq1RUaGqp7773X6zx9+vTRokWLfnNegKqEkAVcZm6//XZ16NBBy5Yts47dd999ys3N1cqVK5Wenq7OnTurR48eOnLkiFXzzTffaMmSJfroo4+UnJysrVu36rHHHrPajx07pvj4eH322Wf68ssv1bx5c/Xu3bvUKtCUKVPUr18/7dy5U88//7z+85//SJIyMzOVnZ2tmTNnntf1nNnfQw89pE8//VRDhw7VmDFjtHv3br311ltasGCBFcDOR8uWLXXnnXd6zdWoUaOUlpamRYsWaceOHbrvvvvUq1cv7d27t8w+jh8/rt69eys1NVVbt25Vr1691KdPH2VlZUmSHnroIX311VfatGmT9ZqtW7dqx44dGjZsWJl9HjlyRLt371bXrl1LtS1cuFD169fXxo0bNXr0aI0cOVL33Xefrr/+em3ZskU9e/bUkCFD9PPPP//mdf/888/661//qn/84x9av369srKy9OSTT57TnEnSsmXL1KhRI73wwgvKzs62Atq3336rXr16qX///tqxY4cWL16szz77TKNGjZIkbd68WY8//rheeOEFZWZmKjk5WTfffLNX3926ddPGjRsv2Y9xgfNy3n9SGsAlIT4+3tx9991ltg0YMMC0atXKGGPMp59+apxOpzl16pRXzTXXXGPeeustY4wxzz33nPHz8zPff/+91b5y5Urj6+trsrOzyzxHcXGxqV27tvnoo4+sY5LM2LFjverWrFljJJmjR496HW/cuLF5/fXXvY516NDBPPfcc7/bX48ePcxLL73kdewf//iHadiwYZnjLLm+Dh06lNk2YcIEExgYaIwx5sCBA8bPz8/88MMPpc45adIkY4wx8+fPN0FBQb95LmOMadOmjXnzzTet/TvvvNOMHDnS2h89erS59dZbf/P1W7duNZJMVlaW1/FbbrnF3Hjjjdb+6dOnTc2aNc2QIUOsY9nZ2UaSSUtLM8aUnv/58+cbSeabb76xXjN79mwTGhrqdZ4xY8Z4nfvuu+828fHx1n5ZP7/hw4ebRx991OvYp59+anx9fc3JkyfNf/7zH+N0Oo3b7f7Na9++fbuRZPbv3/+bNUBV4V958Q6AXYwx1kc427dv1/Hjx1WvXj2vmpMnT+rbb7+19iMjI3XVVVdZ+9HR0fJ4PMrMzFRYWJhycnL0zDPPaO3atcrNzVVxcbF+/vlna8WmRFmrLxfi7P62b9+uzz//3Gvlqri4WKdOndLPP/+sGjVqnFf/Z87Vzp07VVxcrBYtWnjVFBQUlJq/EsePH9eUKVOUlJSk7OxsnT59WidPnvSal0ceeUQPPfSQXnvtNfn6+uq9997T66+//ptjOnnypCSpevXqpdrat29v/befn5/q1aundu3aWcdCQ0MlSbm5ub/Zf40aNXTNNddY+w0bNvzd+nO1fft27dixQ//617+sY8YYeTwe7du3T3fccYcaN26sq6++Wr169VKvXr3Ur18/r59ZYGCgJP3uShxQVRCygMvQV199paZNm0r6JQQ0bNiwzPuKzudRBPHx8frpp580c+ZMNW7cWAEBAYqOjlZhYaFXXc2aNc+pP19fXxljvI6VdWP72f0dP35czz//vO65555StWWFkj9y9lz5+fkpPT1dfn5+XnW1atUq8/VPPvmkUlJS9Ne//lXNmjVTYGCg7r33Xq956dOnjwICAvT+++/L4XCoqKio1L1IZ6pfv74k6ejRo2rQoIFXW7Vq1bz2S75deua+pN/9hmlZfZz5szjXn83Zjh8/rv/5n//R448/XqotMjJSDodDW7Zs0dq1a/Xf//5XkydP1pQpU7Rp0ybr/4slH2Gffd1AVUTIAi4zq1ev1s6dOzVu3DhJUufOneVyueTv768mTZr85uuysrJ06NAhhYeHS5K+/PJL+fr66tprr5Ukff7555ozZ4569+4tSTp48KB+/PHHPxyPw+GQ9Mtq05kaNGjgdbO12+3Wvn37/rC/zp07KzMzU82aNfvD2j+yZ88eJScna9KkSZKkTp06qbi4WLm5ubrpppvOqY/PP/9cDz74oPr16yfpl6Cxf/9+rxp/f3/Fx8dr/vz5cjgcGjhwoLViU5ZrrrlGTqdTu3fvLrWqdjGc/bMpLi5WRkaG9SUG6Zef69k/086dO2v37t2/+7Px9/dXTEyMYmJi9Nxzzyk4OFirV6+2QnNGRoYaNWpkBU2gKiNkAVVYQUGBXC6XiouLlZOTo+TkZE2dOlV33XWXhg4dKkmKiYlRdHS0+vbtq+nTp6tFixY6dOiQkpKS1K9fP+vjuOrVqys+Pl5//etf5Xa79fjjj+vPf/6zwsLCJEnNmzfXP/7xD3Xt2lVut1vjx4//3aBQonHjxvLx8dGKFSvUu3dvBQYGqlatWrr99tu1YMEC9enTR8HBwZo8eXKp1aOyTJ48WXfddZciIyN17733ytfXV9u3b1dGRoZefPHF33zd6dOn5XK55PF49NNPP2nt2rV68cUX1bFjR40fP16S1KJFCw0ePFhDhw7Vq6++qk6dOunw4cNKTU1V+/btFRcXV6rf5s2ba9myZerTp498fHz07LPPlrmK9PDDD6tVq1aSfglmv8fX11cxMTH67LPP1Ldv3z+ck4p2++23KzExUUlJSbrmmmv02muvlXrOWZMmTbR+/XoNHDhQAQEBql+/viZMmKDu3btr1KhRevjhh1WzZk3t3r1bKSkpmjVrllasWKHvvvtON998s+rUqaOPP/5YHo/HCvKS9Omnn6pnz54X+YoBe/DtQqAKS05OVsOGDdWkSRP16tVLa9as0RtvvKEPPvjACiw+Pj76+OOPdfPNN2vYsGFq0aKFBg4cqAMHDlj370hSs2bNdM8996h3797q2bOn2rdvrzlz5ljtf//733X06FF17txZQ4YM0eOPP66QkJA/HONVV12l559/XhMnTlRoaKj1TbNJkybplltu0V133aW4uDj17dvX6z6h3xIbG6sVK1bov//9r6677jp1795dr7/++h8+T2rXrl1q2LChIiMjdeutt2rJkiWaNGmSPv30U6+PAufPn6+hQ4fqiSee0LXXXqu+fftq06ZNioyMLLPf1157TXXq1NH111+vPn36KDY2Vp07dy5V17x5c11//fVq2bKloqKi/vA6H374YS1atKhSHiz70EMPKT4+XkOHDtUtt9yiq6++2msVS/rl0RT79+/XNddcY3201759e61bt05ff/21brrpJnXq1EmTJ0+2VkeDg4O1bNky3X777WrVqpXmzZunf//732rTpo0k6dSpU1q+fLkeeeSRi3vBgE18zNkfvAO44kyZMkXLly/Xtm3bKnsoly1jjJo3b67HHntMiYmJ51QfFRWlcePGadCgQRdhhJVv7ty5ev/99/Xf//63socCVAhWsgDAZocPH9asWbPkcrl+89lYZ/Px8dHbb799STy5/2KpVq2a3nzzzcoeBlBhuCcLAGwWEhKi+vXr6+2331adOnXO+XUdO3ZUx44d7RvYJebhhx+u7CEAFYqPCwEAAGzAx4UAAAA2IGQBAADYgJAFAABgA0IWAACADQhZAAAANiBkAQAA2ICQBQAAYANCFgAAgA0IWQAAADb4/wESmFCokH7ykQAAAABJRU5ErkJggg==", "text/plain": [ "<Figure size 640x480 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "# Choose your target variable, e.g., 'DepDelayMinutes'\n", "X = df_jfk_encoded.drop('DepDelayMinutes', axis=1)\n", "y = df_jfk_encoded['DepDelayMinutes']\n", "\n", "# plot the distribution of the target variable\n", "plt.hist(y, bins=100)\n", "plt.xlabel('Departure Delay (minutes)')\n", "plt.ylabel('Frequency')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "\n", "# Splitting the dataset into training and testing sets\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", "\n", "X_train = X_train.apply(pd.to_numeric, errors='coerce')\n", "y_train = pd.to_numeric(y_train, errors='coerce')\n", "X_test = X_test.apply(pd.to_numeric, errors='coerce')\n", "y_test = pd.to_numeric(y_test, errors='coerce')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "\n", "# Splitting the dataset into training and testing sets\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", "\n", "X_train = X_train.apply(pd.to_numeric, errors='coerce')\n", "y_train = pd.to_numeric(y_train, errors='coerce')\n", "X_test = X_test.apply(pd.to_numeric, errors='coerce')\n", "y_test = pd.to_numeric(y_test, errors='coerce')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2023-12-11T17:07:57.060977300Z", "start_time": "2023-12-11T17:07:56.738640200Z" } }, "outputs": [], "source": [ "from sklearn.linear_model import LinearRegression\n", "\n", "# Initialize the model\n", "model = LinearRegression()\n", "\n", "# Train the model\n", "model.fit(X_train, y_train)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2023-12-11T17:08:11.323526900Z", "start_time": "2023-12-11T17:08:10.881732300Z" } }, "outputs": [], "source": [ "from sklearn.metrics import mean_squared_error, r2_score\n", "\n", "# Predict on the test set\n", "y_pred = model.predict(X_test)\n", "\n", "# Evaluate the model\n", "mse = mean_squared_error(y_test, y_pred)\n", "r2 = r2_score(y_test, y_pred)\n", "print(\"Mean Squared Error:\", mse)\n", "print(\"R^2 Score:\", r2)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2023-12-11T17:15:24.634324900Z", "start_time": "2023-12-11T17:15:24.628684100Z" } }, "outputs": [], "source": [ "print(list(X_test))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2023-12-11T17:28:49.141033600Z", "start_time": "2023-12-11T17:28:49.133184200Z" }, "collapsed": false }, "outputs": [], "source": [ "\n", "i = X_test.iloc[[3]].copy()\n", "i['FlightDate'] = 1640995200000000000\n", "i['Year'] = 2022\n", "i['Month'] = 1\n", "i['Day'] = 1\n", "print(i)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2023-12-11T17:17:36.066986Z", "start_time": "2023-12-11T17:17:36.055529500Z" }, "collapsed": false }, "outputs": [], "source": [ "X_mike = X_test.iloc[[3]]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2023-12-11T17:29:00.458780500Z", "start_time": "2023-12-11T17:29:00.448275500Z" }, "collapsed": false }, "outputs": [], "source": [ "model.predict(i)" ] } ], "metadata": { "kernelspec": { "display_name": "sas2", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" } }, "nbformat": 4, "nbformat_minor": 2 }