Как авиационный фанат, я обычно ищу, какой именно самолет я получу для своих дальних перелетов. Начните задавать вопросы и получайте ответы: это новенький самолет ?; Подбираю ли я хорошее место ?; Есть ли у него предыдущий запланированный рейс, чтобы прилететь в мой аэропорт ?; Если да, то работает ли он вовремя ?; Если нет, сколько мне нужно ждать прибытия моего самолета ?; и так далее. При таком поиске вы можете найти 4–6-значный номер, который мы называем бортовым номером или регистрационным номером, одним из уникальных идентификаторов самолета. Если вы когда-либо делали снимок самолета, когда вы взволнованы, садясь на борт, пожалуйста, увеличьте его хвостовую часть. Вы найдете этот номер, напечатанный как на левом, так и на правом борту самолета. Нравится.

Этот уникальный номер вдохновил меня на активизацию моего проекта по науке о данных. Я считал, что этот бортовой номер может быть хорошим предиктором задержки рейсов. И я расширил этот вывод до - а что насчет производителей или моделей самолетов, можно ли узнать это по этому номеру - и могут ли это быть переменные, которые я могу использовать для своих моделей прогнозирования? Вот как я начал свой проект, исходя из этого амбициозного предположения: если существует определенная связь между самолетами и задержками, это может быть связано со стратегиями эксплуатации парка воздушных судов - будь то диверсификация или упрощение инвентаризации их парка.

Своевременная производительность с открытым исходным кодом в 29 миллионах точек данных

Набор данных о своевременности выполнения работ можно получить на Статическом веб-сайте Транспортного бюро. В моем случае я погрузился в данные за 5 последних лет с 2013 по 2017 год, и в итоге получилось 29 миллионов точек данных по всем внутренним пассажирским рейсам. Файл CSV содержит от основной информации о каждом рейсе (например, дату, запланированное время, фактическое время и т. Д.) До конкретного подробного журнала, такого как минуты задержек, причины задержек, статус рейса (отменен, задержан или перенаправлен) и т. Д.

# Since BTS webpage allows to get dataset by month, I downloaded first and merged it.
import glob
import pandas as pd
import os, os.path
# Set the file path
path = './assets/rawdata/'
# Make reproducible, whether the combined dataset existed or not
if os.path.isfile('./assets/newdf_2013.csv') == True:
    newdf_2013 = pd.read_csv('./assets/newdf_2013.csv', low_memory=False)
    print("File existed!", newdf_2013.shape)
else:
    # pull 2013 datasets, segmented down by months, and merge
    files = glob.glob(path + str(2013) + "/*.csv")
    df_2013 = pd.concat((pd.read_csv(f, low_memory=False) for f in files))
    print("Shape of 2013 raw datasets: ", df_2013.shape)

После получения набора данных и завершения слияния убедитесь, что вы провели базовый анализ набора данных, на какие столбцы и функции вы хотите в основном обратить внимание. Здесь я выбрал около 30 функций из 110 столбцов. Сброшенные столбцы представляли собой информацию о рейсах или несколько дублированных географических данных аэропорта / рынка.

# Select only relevant columns
if os.path.isfile('./assets/newdf_2013.csv') == True:
    print("File existed and already preprocessed")
else:
    cols = ['Year', 'Month', 'DayofMonth', 'DayOfWeek', 'Carrier', 
            'FlightNum', 'TailNum', 'Origin', 'Dest', 'CRSDepTime',
            'DepTime', 'DepDelay', 'TaxiOut', 'WheelsOff',
            'CRSElapsedTime', 'ActualElapsedTime', 'AirTime', 
            'Distance', 'WheelsOn', 'TaxiIn', 'CRSArrTime', 
            'ArrTime', 'ArrDelay', 'Diverted', 'Cancelled', 
            'CancellationCode', 'NASDelay', 'SecurityDelay', 
            'CarrierDelay', 'LateAircraftDelay', 'WeatherDelay']

    newdf_2013 = df_2013[[col for col in df_2013.columns 
                          if col in cols]]
    print("Shape of 2013 modified datasets: ", newdf_2013.shape)

По вычислительным причинам я делю это на данные местного рынка как для исходящих, так и для входящих рейсов. В результате получилось 2,2 миллиона точек данных.

# only select Washington Metro airport
if os.path.isfile('./assets/washington.csv') == True:
    print("File existed and already preprocessed")
    was_air = pd.read_csv('./assets/washington.csv', low_memory=False)
    print("Washington airports dataset dimension: ", was_air.shape)
else:
    was_airports = ['DCA', 'IAD', 'BWI']

    a = newdf_2013[newdf_2013.Origin.isin(was_airports)]
    b = newdf_2014[newdf_2014.Origin.isin(was_airports)]
    c = newdf_2015[newdf_2015.Origin.isin(was_airports)]
    d = newdf_2016[newdf_2016.Origin.isin(was_airports)]
    e = newdf_2017[newdf_2017.Origin.isin(was_airports)]

    a_= newdf_2013[newdf_2013.Dest.isin(was_airports)]
    b_= newdf_2014[newdf_2014.Dest.isin(was_airports)]
    c_= newdf_2015[newdf_2015.Dest.isin(was_airports)]
    d_= newdf_2016[newdf_2016.Dest.isin(was_airports)]
    e_= newdf_2017[newdf_2017.Dest.isin(was_airports)]

    was_air = pd.concat([a, b, c, d, e, a_, b_, c_, d_, e_], ignore_index=True)
    print("Washington airports dataset dimension: ", was_air.shape)

    # save dataset for the future usage
    was_air.to_csv('./assets/washington.csv', index=False)

Как я уже упоминал ранее, я собирался спланировать идентификацию самолетов с указанием модели, производителя и возраста, предоставив хвостовой номер в наборе данных. В 2,2 миллиона наборов данных было найдено около 6000 уникальных конечных чисел. Поэтому я решил использовать Selenium для веб-скрапинга с flightradar24.com, известного своей службой отслеживания полетов в реальном времени. Этот сайт содержит подробный код самолета, серийный номер, возраст и дату доставки пользователям, подписавшимся на платную подписку. Следя за сайтом, после некоторых тестов с Selenium я успешно удалил информацию о тысячах самолетов. Вы можете найти больше на моем GitHub.

Когда весь набор данных подготовлен, приступим к исследовательскому анализу данных и проектированию функций. У меня есть несколько золотых самородков, которые я нашел на основе данных.

В национальной столице есть три международных / национальных аэропорта: международный аэропорт имени Тургуда Маршалла в Балтиморе / Вашингтоне (кодовое название IATA - BWI: Baltimore, MD), национальный аэропорт имени Рональда Рейгана в Вашингтоне (округ Колумбия: Арлингтон, штат Вирджиния), международный аэропорт Вашингтона Даллес (IAD: Даллес, Вирджиния) Из этих трех аэропортов наибольшее количество рейсов имеет BWI, за ним следуют DCA и IAD. Интересно, что все аэропорты показали некоторое снижение в феврале и повышение в марте. Моя догадка такая же, как и у вас, весенние каникулы!

Если учитывать полеты как в исходную, так и в исходную, первое место заняла компания Southwest, за которой следуют United, American и Delta. (Как вы можете видеть, дочерние авиалинии не были переклассифицированы, по которым они выполнялись, и поскольку в наборе данных также отдельно указаны US Airways)

Прежде чем мы скажем, какие авиалинии показали лучшие и худшие результаты - угадайте основную причину, чтобы прочитать это далеко, чтобы утолить жажду и любопытство, - давайте поговорим еще об одном техническом моменте. Я хотел использовать время отправления и прибытия, зарегистрированное в наборе данных, в качестве предиктора для моей модели. С помощью Бена Шейвера я нашел Mr. Сообщение в блоге Яна Лондона о циклическом преобразовании времени. Код и мыслительный процесс части моего проекта вдохновлен блогом, и заслуга в этом принадлежит мистеру Лондону и Бену. По сути, мы преобразуем время в синусоидальное и косинусное преобразование. После вычисления sin_time и cos_time вы можете разбить график на 24-часовые часы.

Как вы можете видеть на разноцветных часах выше, задержки рейсов привели к дополнительной внеплановой работе в аэропорту.

Вот анализ вылета и прилета рейсов, которые задержались более чем на 15 минут по сравнению с запланированным временем. На первой странице красной линией показано среднее значение отложенной ставки. На второй странице в качестве кода и сюжета указана ссылка на Mr. Фабьен Даниэль, его учебник по Kaggle , представил, как каждая авиакомпания ожидает средних минут задержки в последовательностях вылета и прибытия.

Проблемы: слишком много неизвестных значений в информации о самолетах

Хорошо, вернемся к исходным выводам и предположениям. Можно ли прогнозировать задержки рейсов с моделями и производителями самолетов? Мой короткий ответ - да, это возможно, но мой более длинный ответ - я не могу получить значимый результат в данный момент. Причина в том, что я получил слишком много информации о неизвестных самолетах с сайта flightradar24.com. Из 6000 уникальных хвостовых номеров после того, как я успешно завершил свою работу с селеновым ботом, я получил около 20% неизвестных или нулевых данных. Поэтому моя задача и новое путешествие в том, что мне нужно найти лучший источник для сбора информации о самолете на основе его бортового номера. Если у кого-то есть мысли или предложения по поводу моих амбициозных проектов, я буду более чем счастлив пообщаться с вами и поучиться у вас. Как новый специалист по данным, я всегда готов выслушать все отзывы и доработать свою работу. Всю мою текущую работу и процессы можно найти на моем GitHub. Большое спасибо за то, что прочитали это.