Пример использования инженерии данных для исследователей COVID-19

Исследователи, надеющиеся использовать общедоступные наборы данных о вирусе sars-cov-2 (широко известном под названием COVID-19), в настоящее время имеют множество вариантов для точек данных. Несмотря на то, что разнообразие доступных данных дает огромное количество информации, ключевой проблемой является то, что данные не хранятся в одном центральном месте, а поддерживаются множеством частных и публичных источников. Данные должны быть собраны из разных мест в сети и объединены, прежде чем они будут сочтены подходящими для анализа.

Целью этого проекта межсетевого взаимодействия является объединение двух общих точек данных, используемых исследователями, заинтересованными в отслеживании эпидемии COVID-19: совокупное количество случаев и смертей, а также коэффициенты использования больниц. Сначала я описываю высокоуровневый поток процессов, а затем углубляюсь в то, как данные были получены и очищены, задачи взаимодействия и, наконец, где найти объединенный набор данных и код, используемый для проекта.

Ход проекта

Рисунок 1 демонстрирует поток проекта. Весь проект выполнен с использованием Python и Pandas в Jupyter Notebook. В формате CSV есть 4 набора данных, содержащих информацию о COVID-19. Первый шаг - импортировать данные непосредственно из источника, репозитория New York Times на github и США. Департамент здравоохранения и социальных служб ». Я начал с набора данных NYT.

Сначала я проверил фрейм данных и выполнил проверки качества, включая проверку длины данных, типов данных и отсутствующих значений. После этого я импортировал наборы данных больничных коек и выполнил те же проверки длины, типов данных и отсутствующих значений, прежде чем перейти к следующим шагам. После импорта каждого набора данных я повторно оценил все типы данных там, где это необходимо, чтобы убедиться, что у меня нет неожиданных значений в окончательном наборе данных. На этом этапе были определены ключевые столбцы для объединения данных: состояние и дата. Здесь я сопоставил названия штатов в наборе данных NYT от полных названий штатов до сокращенных названий, как в трех других наборах данных больничных коек. Теперь один ключевой столбец «состояние» готов к сопоставлению. На следующем этапе я объединил 3 набора данных больничных коек в один фрейм данных, поскольку они имеют одинаковые форматы данных и одинаковые имена столбцов. Сравнивая набор данных новой больничной койки с набором данных NYT, я обнаружил еще одно несоответствие имени ключевого столбца: «дата». Здесь я изменил имя с «collection_date» на «date», чтобы иметь 2 ключевых столбца для выполнения внутреннего соединения для получения окончательного набора данных. Теперь я выполняю последнее соединение и проверяю, все ли столбцы и строки выглядят хорошо. Заметив несколько сбивающих с толку имен столбцов в окончательном фрейме данных, я меняю их имена, чтобы сделать их более удобочитаемыми. Наконец, я проверил, что окончательный объединенный фрейм данных выглядит так, как ожидалось, а затем экспортировал данные в разные форматы файлов.

Описание файлов данных и местоположений

В этом проекте я работал с 4 наборами данных. Первый - это регулярно обновляемые данные о COVID-19 из New York Times, а еще 3 взяты с веб-сайта Министерства здравоохранения и социальных служб. Вы можете получить доступ к файлам данных здесь. Когда вы загружаете файлы, они собирают данные только за последние 30 дней.

Наборы данных Healtdata.gov:

Есть три разных набора данных (все оценки с нижним и верхним доверительными интервалами). Эти файлы представляют собой ежедневные оценки для каждого штата и обновляются еженедельно:

  1. оценка занятости коек в стационаре по состоянию (временные ряды)
  2. оценочные койки в стационаре, занятые пациентами с COVID-19, по штатам (временные ряды)
  3. оценочные койки в отделениях интенсивной терапии по штатам (временные ряды)

Данные COVID-19 о совокупных ежедневных случаях и совокупных ежедневных смертях в каждом штате поддерживаются New York Times и, возможно, могут быть получены здесь. В нем 5 столбцов: дата, состояние, fips, случаи и смерти.

Описание процесса

Считывание данных

Для работы над этим проектом я решил использовать блокнот Jupyter с библиотекой Pandas. Для чтения всех 4 наборов данных я использовал pd.read_csv (). Он считывает CSV в DataFrame, используя путь к файлу. В наборе данных нет дополнительных столбцов или строк, поэтому мне не нужно было использовать функцию пропуска строк функции. Размер набора данных не требует разделения. Данные уже разделены запятыми в формате CSV, который не требует каких-либо дополнительных запросов внутри функции pd.read_csv (), кроме удаления запятых в большом количестве, включая ousand = ',' после пути к файлу. Подробнее о чтении данных в пандах здесь.

Сначала импортируйте панды, затем импортируйте данные с помощью read_csv:

import pandas as pd
new_york_data = pd.read_csv('https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-states.csv')

Очистка

Чтобы визуально проверить фрейм данных, я запускаю new_york_data.head ().

new_york_data.head(5)

patient_all = pd.read_csv('https://healthdata.gov/sites/default/files/estimated_inpatient_all_20210102_1640.csv', thousands = ',')
patient_all.head()

Во-первых, все наборы данных имеют разное количество строк, потому что все наборы данных обновляются по разному расписанию. Поскольку все наборы данных включают временные ряды и информацию о COVID-19 в штатах США, у меня есть два ключевых столбца: «дата» и «состояние», которые будут использоваться для объединения всех наборов данных. Однако столбцы со штатами имеют одинаковое имя столбца, но другой формат (набор данных New York Times имеет полное название штата, а наборы данных больничных коек имеют сокращенные названия штатов); а столбцы временных рядов имеют тот же формат, но разные имена столбцов (date и collection_date), которые мне нужно было исправить до присоединения. Чтобы перемещать наборы данных вместе, нам нужно, чтобы эти два столбца были точно такими же, чтобы задать ключевые столбцы. Для выполнения задачи я использовал функцию map (). Чтобы переназначить DataFrame для перевода штатов США в двухбуквенный код, нам понадобится словарь со всеми штатами США в качестве ключа: значения.

Сначала я создал словарь, с помощью которого мы переназначим значения.

state_abbr = {
    'Alabama': 'AL',
    'Alaska': 'AK',
    'American Samoa': 'AS',
    'Arizona': 'AZ',
    'Arkansas': 'AR',
    'California': 'CA',
    'Colorado': 'CO',
    'Connecticut': 'CT',
    'Delaware': 'DE',
    'District of Columbia': 'DC',
    'Florida': 'FL',
    'Georgia': 'GA',
    'Guam': 'GU',
    'Hawaii': 'HI',
    'Idaho': 'ID',
    'Illinois': 'IL',
    'Indiana': 'IN',
    'Iowa': 'IA',
    'Kansas': 'KS',
    'Kentucky': 'KY',
    'Louisiana': 'LA',
    'Maine': 'ME',
    'Maryland': 'MD',
    'Massachusetts': 'MA',
    'Michigan': 'MI',
    'Minnesota': 'MN',
    'Mississippi': 'MS',
    'Missouri': 'MO',
    'Montana': 'MT',
    'Nebraska': 'NE',
    'Nevada': 'NV',
    'New Hampshire': 'NH',
    'New Jersey': 'NJ',
    'New Mexico': 'NM',
    'New York': 'NY',
    'North Carolina': 'NC',
    'North Dakota': 'ND',
    'Northern Mariana Islands':'MP',
    'Ohio': 'OH',
    'Oklahoma': 'OK',
    'Oregon': 'OR',
    'Pennsylvania': 'PA',
    'Puerto Rico': 'PR',
    'Rhode Island': 'RI',
    'South Carolina': 'SC',
    'South Dakota': 'SD',
    'Tennessee': 'TN',
    'Texas': 'TX',
    'Utah': 'UT',
    'Vermont': 'VT',
    'Virgin Islands': 'VI',
    'Virginia': 'VA',
    'Washington': 'WA',
    'West Virginia': 'WV',
    'Wisconsin': 'WI',
    'Wyoming': 'WY'
}

Затем я переназначил значения столбца 'состояние' по их соответствующим кодам, где new_york_state ['state'] - это доступ к состоянию столбца, а map (us_state_abbrev) - это доступ к словарю с именами состояний.

new_york_data['state'] = new_york_data['state'].map(state_abbr)
print(new_york_data)

Чтобы убедиться, что наборы данных полны, я проверил 1) отсутствующие значения и 2) типы данных в каждом наборе данных, чтобы увидеть кодировку значений данных. Когда я проверяю тип данных для набора данных New York Times, я получаю 2 столбца, указанные как объекты (дата и состояние). Я отформатировал «дату» как «дату и время», а «состояние» остается объектом, потому что столбец имеет все имена состояний.

new_york_data.dtypes

Чтобы выполнить изменение типа данных в столбце даты, я использовал функцию pandas pd.to_datetime в столбце date. Передача errors = ’coerce’ принудительно устанавливает дату выхода за пределы для NaT, в дополнение к принудительному принудительному использованию дат, не являющихся датами (или дат, не подлежащих синтаксическому анализу) для NaT. Более подробную информацию об этой функции можно найти здесь.

new_york_data['date'] = pd.to_datetime(new_york_data['date'], errors='coerce')
new_york_data.dtypes

Теперь данные правильного типа:

Теперь безопасно проверять отсутствующие значения с помощью метода isnull () в пандах с функцией суммы, чтобы увидеть количество нулевых значений в каждом столбце.

missing_values_count = new_york_data.isnull().sum()
missing_values_count

Набор данных NYT не содержит пропущенных значений, типы данных теперь правильные, а ключевые переменные настроены для правильного соединения. Затем я очистил наборы данных о больничных койках. Эти наборы данных имеют в основном числовые значения как целые числа и числа с плавающей запятой; в данном случае единственное изменение, которое мне нужно было внести, - это преобразование «collection_date» в формат даты и времени.

patient_all.dtypes

Чтобы изменить столбец «collection_date», я применяю тот же метод (pd.to_datetime), как упоминалось выше.

Присоединение

Чтобы присоединить наборы данных, я использовал pd.merge () для состояния и даты. Сначала я присоединился к трем наборам данных о состоянии здоровья, потому что имена столбцов идентичны.

mrd = pd.merge(patient_all, beds_covid, on = ['state', 'collection_date'])
all_beds = pd.merge(mrd, icu_beds, on = ['state', 'collection_date'])

Функция merge () содержит имена наборов данных, которые необходимо объединить (пациента_все и кровати_covid) и на = ['state', 'collection_date'] определяет имена ключевых столбцов (т. е. совпадения между двумя таблицами выполняются в этих двух столбцах). После первоначального соединения я изменил имя столбца collection_date на date, как и остальные наборы данных с помощью метода df.rename (), и присоединился к набору данных NYT. Подробнее о слиянии здесь.

all_beds.rename(columns = {'collection_date':'date'}, inplace = True)

Внутри метода rename () мы указываем столбцы, имя которых нужно изменить с 'collection_date' на 'date' (columns = {'collection_date': 'date'}) и inplace = True, что означает, когда inplace = True передается, данные переименовываются на месте (ничего не возвращает). Подробнее о методе переименования можно прочитать здесь.

Окончательный результат

Окончательный результат оказался объединенным только с совпадающими строками из всех 4 наборов данных без пропущенных и повторяющихся значений. Идея, лежащая в основе окончательного результата, состоит в том, чтобы получить набор данных обновленных случаев коронавируса, смертей и количества занятых коек в больницах с разбивкой по датам и штатам на основе имеющихся данных.

В окончательном наборе данных есть 32 столбца с 1581 строкой со всей информацией, необходимой для использования для отслеживания случаев и соотношения количества используемых больничных коек и их количества.

Чтобы упростить чтение окончательного фрейма данных, некоторые имена столбцов, которые трудно читать, были переименованы. В частности, столбцы с именами «Count LL» и «Count UL».

final_dataset.rename(columns = {'Count LL_x':'Count LL_inpatient beds occupied'}, inplace = True) 
final_dataset.rename(columns = {'Count UL_x':'Count UL_inpatient beds occupied'}, inplace = True)
final_dataset.rename(columns = {'Percentage LL_x':'Percentage LL_inpatient beds occupied'}, inplace = True)

Теперь последний DataFrame выглядит подходящим и готов к использованию.

Заключительное слово

Окончательный код и статический набор данных в различных форматах, таких как CSV и JSON, можно найти на моей странице GitHub здесь. Предоставляется файл readMe.md, который направляет пользователя при запуске записной книжки Jupyter. Я рекомендую Typora для прочной уценки.

Это был исследовательский проект по соединению связанных и общедоступных наборов данных из разных источников. Затем я добавлю в этот проект другие связанные данные, которые могут быть полезны для исследователей, например, ограничения COVID-19 для отдельных штатов.

Если вы исследователь, работающий с данными о COVID-19, какие еще точки данных вы хотели бы видеть в связи с окончательным набором данных, созданным здесь?