Парсинг данных и регрессия временных рядов с использованием Darts (обучение с учителем) на данных Covid-19 с веб-сайта Правительства Индонезии
Привет! Как мы знаем, тема Covid-19 до сих пор остается актуальной и обсуждаемой. В этом разделе я расскажу о том, как собрать данные с веб-сайта covid-19.go.id и проанализировать их для прогнозирования ежедневного развития случаев Covid-19.
Для сбора данных необходимо сначала посетить веб-сайт https://data.covid19.go.id/public/index.html. На этом сайте используется API в качестве системы, поэтому мы можем получить информацию и сохранить ее в формате JSON. Первым шагом является поиск ссылки на желаемые данные. Это можно сделать, щелкнув правой кнопкой мыши -> Инспектировать -> Сеть -> перезагрузить веб-сайт -> Ссылка на файл JSON, как показано на рисунке 1.
Затем нужно щелкнуть по файлу и скопировать ссылку, чтобы открыть ее в новой вкладке. Поскольку мы собираем только данные Covid-19 в Индонезии, найдите ссылку, результат которой показан на рисунке 2.
Скопированную ссылку нужно поместить в наш интерактивный инструмент Python. Для этой части нам понадобятся библиотеки pandas, numpy, requests, datetime, time, re (regex) и JSON. Процесс импорта данных выполняется, как показано на рисунке 3. (Примечание: сосредоточьтесь на data_url_indonesia)
На этом этапе нам нужно проверить импортированный файл, чтобы выбрать столбцы данных (функции), которые мы хотим получить. Поскольку мы собираем только данные столбцов "update" и "harian", нам нужно сохранить эту информацию в формате DataFrame, как показано на рисунке 4.
Из DataFrame выше (Data_indonesia) видно, что значения каждого столбца все еще не имеют правильного формата. Поэтому здесь будет выполнен этап предварительной обработки данных. Первое, что нужно сделать, это заменить значение {‘value’: 0}
на 0 в формате целого числа. Есть много способов сделать это, я использую цикл и функцию map - lambda, как показано на рисунке 5.
Затем нужно преобразовать данные в столбце "key_as_string" в формат даты, изменить название столбца на "tanggal" и удалить уникальные компоненты, такие как столбцы "key" и "doc_count". Как и раньше, здесь я использую map - lambda с дополнительными функциями drop и rename, результат которых можно увидеть на рисунке 6.
На этом этапе процесс сбора данных успешно завершен, и рекомендуется сохранить собранные данные в файл csv с помощью функции to_csv для переменной DataFrame.
Теперь перейдем к моделированию данных для прогнозирования ежедневных случаев Covid-19 в Индонезии с помощью регрессии временных рядов. Используется библиотека Darts, которую можно установить по ссылке в сноске. Первым шагом является импорт всех необходимых модулей, как показано на рисунке 7.
Не забудьте проверить данные, которые будут анализироваться, особенно значения NaN. После того, как убедитесь в их безопасности, можно проверить распределение данных, которые будут анализироваться, с помощью функции describe или путем построения гистограммы данных. На рисунке 8 видно, что среднее значение ежедневного числа положительных случаев Covid-19 сильно отличается от 50% данных числа положительных случаев Covid-19, что означает, что данные не имеют нормального распределения. Это можно подтвердить по форме гистограммы, которая имеет "хвостовое" или "распределение с длинным хвостом". Поэтому эти данные нужно преобразовать.
Входные данные, которые будут анализироваться с помощью "обучения с учителем" - регрессии временных рядов, вводятся в новый DataFrame. Мы можем построить график, чтобы увидеть развитие случаев Covid-19 в Индонезии. Прежде чем это сделать, ось x в "tanggal" может быть заменена на "День", используя функцию apply и lambda, в которой ранее была определена дата начала Covid-19, как показано на рисунке 9.
На графике на рисунке 10 видно, что полученный график нелинейный и процесс достаточно случайный. Поэтому в этом разделе ограничимся только данными, представленными голубым графиком, то есть с 440-го дня до 600-го дня.
Как уже упоминалось ранее, данные Covid-19 ежедневно не имеют нормального распределения, поэтому требуется преобразование данных. Это необходимо для того, чтобы наша модель избегала "переобучения". В этом разделе я выполняю преобразование данных в логарифмическую функцию. В библиотеке Darts мы можем импортировать модуль "InvertibleMapper", чтобы преобразовать наши данные в форму log1p и обратно в исходную форму с помощью expm1. Синтаксис, используемый, показан на рисунке 11.
Затем вводим данные, которые будут моделироваться, и преобразуем их в форму "TimeSeries". Мы также можем проверить форму графика регрессии, чтобы убедиться, что он выглядит хорошо, как показано на рисунке 12.
После того, как модель преобразования данных считается хорошей, можно разделить данные на две части: обучающие данные (80%) и данные для проверки (20%). Обучающие данные будут использоваться для моделирования программы машинного обучения, а данные для проверки будут использоваться для проверки точности модели программы в прогнозировании данных. Здесь я использую модель регрессии с модулем "ExponentialSmoothing, AutoARIMA, Theta и Prohet". Результаты "Средней абсолютной процентной ошибки" показывают, что модель с модулем ExponentialSmoothing лучше, чем другие 3 модели, с оценкой 1,47% (рисунок 13). Поэтому здесь я буду использовать модуль ExponentialSmoothing в качестве основной программы.
Модель ExponentialSmoothing снова подгоняется, чтобы она сохранялась в памяти Python, и выполняется прогноз на 26 дней назад от данных модели. Результат показывает, что полученный график выглядит хорошо, и предсказанные значения (голубой график) перекрываются с графиком фактических значений (черный график), как показано на рисунке 14.
Наконец, после получения хорошей модели обучения с учителем, эту модель можно использовать для прогнозирования будущих случаев Covid-19. Например, я буду прогнозировать случаи Covid-19 на 20 дней вперед. Для этого можно взять данные на 20 дней вперед от исходных данных, заменить значения на NaN и преобразовать их в форму TimeSeries, как показано на рисунке 15.
Затем мы можем использовать существующую модель регрессии временных рядов для прогнозирования числа положительных случаев Covid-19 на 20 дней вперед (рисунок 16 (справа)). Полученные данные можно построить на графике, как показано на рисунке 16 (слева). Результат показывает, что количество положительных случаев Covid-19 будет продолжать снижаться ежедневно, но процесс снижения будет достаточно флуктуирующим (иногда будет расти, но в целом будет снижаться).
GitHub - Richard026/Scraping-Data-and-Regression-Model-TimeSeries-Darts
Внесите свой вклад в развитие Richard026/Scraping-Data-and-Regression-Model-TimeSeries-Darts, создав учетную запись на...
github.com
Референс и ссылка на установку Darts: