«Сделайте Брексит» - Борис Джонсон, премьер-министр Великобритании.
Обратите внимание: Это первая из серии статей, в которых мы будем очищать и анализировать данные о выборах в Великобритании за 2019 год, опубликованные на сайте Британской избирательной комиссии.
Специалисты по анализу данных говорят, что они тратят большую часть своего времени на очистку данных. В этом уроке мы возьмем необработанные данные о выборах в Великобритании и превратим их в серию очищенных файлов, готовых для анализа.
Голоса поданы, и британский народ, правильно или ошибочно, решил (по словам премьер-министра Бориса Джонсона) завершить Брексит. Как специалисты по данным, мы можем объективно изучить, как избиратели решили добиться Брексита, просмотрев данные о всеобщих выборах в Великобритании, независимо от нашего мнения по этому поводу.
Следует отметить, что старший консультант Доминик Каммингс сделал фундаментальные исследования приоритетом в Великобритании. Специалисты по обработке данных используют Python для большей части своих исследований.
После всеобщих выборов в Великобритании им потребуется около двадцати дней, чтобы опубликовать данные, поэтому данные за 2019 год недоступны в данный момент. Давайте создадим адаптируемый шаблон на основе данных за 2017 год, который затем можно будет повторно использовать для очистки данных о выборах 2019 года.
Шаг 1. Загрузите необработанные данные, изучите первые несколько строк.
Данные о выборах доступны на сайте избирательной комиссии Великобритании здесь. Откройте файл CSV с результатами выборов.
Важное примечание. Кодировка файла в CSV - cp1252. Не пропустите аргумент кодировки в команде Python при открытии документа, иначе будет выдано исключение. Давайте продолжим и напечатаем первые несколько строк, чтобы увидеть, что у нас получилось.
import csv with open(‘2017_UKPGE_electoral_data.csv’,encoding=’cp1252') as uk: uk_elect_reader = csv.reader(uk) result = [i for i in uk_elect_reader] print(result[0:3])
Вот несколько первых строк, показывающих, что нам нужно делать, и формат данных:
[['RESULTS', '', '', '', '', '', '', ''], ['ONS Code', 'PANO', 'Constituency', 'Surname', 'First name', 'Party', 'Party Identifer', 'Valid votes'], ['E14000530', '7', 'Aldershot', 'WALLACE', 'Donna Maria', 'Green Party', 'Green Party', '1090']]
Первая строка - это список пустых строк, которые нам не нужны. Второй содержит заголовки. Третья - первая строка данных. Обратите внимание на формат данных; в этом случае данные представляют собой строки.
Шаг 2. Удалите ненужные строки
Удалите первую строку с помощью pop, потому что это бесполезно. Он содержит только слово «РЕЗУЛЬТАТЫ». Фактические заголовки, которые нам нужны, находятся во второй строке.
result = result.pop(0)
Шаг 3. Сохраните очищенные данные
Создайте новый файл. Запишите каждую строку во вновь созданный файл. Заголовки теперь будут первой строкой.
with open(‘clean_data.csv’, ‘w’, newline=’’) as csvfile: writer = csv.writer(csvfile) for line in result: result_writer.writerow(line)
Как только вы закончите, проверьте файл clean_data, прежде чем двигаться дальше.
Шаг 4. Загрузите очищенный CSV-файл с помощью DictReader.
Давайте загрузим резервную копию данных с помощью DictReader модуля CSV. Модуль DictReader в Python перебирает строки в нашем файле данных о выборах и организует их в словари в переменной с именем uk_elect_reader. DictReader будет захватывать заголовки каждого столбца для использования в качестве ключей словаря.
>>>with open(‘clean_data.csv’) as uk: uk_elect_reader = csv.DictReader(uk) election_results = [row for row in uk_elect_reader]
В строке под этой командой будет сохранен список словарей в переменной с именем selection_results. Это самая головокружительная часть. Переменная selection_results теперь представляет собой список OrderedDicts, а не простой список словарей. DictReaders предоставляют нам список OrderedDicts, которые аналогичны обычным словарям, но хранят свои ключи в том порядке, в котором они были добавлены.
>>>election_results[0] >>>OrderedDict([('ONS Code', 'E14000530'), (‘PANO’, ‘7’), (‘Constituency’, ‘Aldershot’), (‘Surname’, ‘WALLACE’), (‘First name’, ‘Donna Maria’), (‘Party’, ‘Green Party’), (‘Party Identifer’, ‘Green Party’), (‘Valid votes’, ‘1090’)])
Шаг 5. Запишите результаты в файл
Теперь используйте DictWriter, чтобы записать результаты в файл. После создания файла с помощью команды open с именем selection_clean.csv мы создадим переменную fieldnames для хранения списка заголовков. Затем мы можем сохранить объект DictWriter под именем writer, используя переменную fieldnames в качестве аргумента в методе DictWriter.
Чтобы записать заголовки в файл, мы вызываем метод writeheader объекта записи. Наконец, чтобы передать чистые данные из созданной выше переменной selection_results, мы вызываем метод writerow объекта записи .
with open('election_clean.csv', 'w', newline='') as csvfile: #Create column headers for the DictWriter fieldnames = ['ONS Code', 'PANO', 'Constituency', 'Surname', 'First name', 'Party', 'Party Identifer','Valid votes'] #create a DictWriter object called writer writer = csv.DictWriter(csvfile, fieldnames=fieldnames) #write the header to the file writer.writeheader() for row in election_results: writer.writerow(row)
Шаг 6. Используйте классы данных для объединения повторяющихся имен полей
Некоторые из названий полей являются избыточными. На этом шаге вы узнаете, как объединить имя и фамилию с помощью класса данных и заменить название стороны на «Идентификатор стороны».
from dataclasses import dataclass @dataclass class Candidate: ons_code: str #U.K. Office of National Survey number pano: int #British press association number constituency: str #constituency name name: str #candidate's name, party: str #a unique value for each party votes: int #number of votes res = [Result(name='{0} {1}'.format(i['Firstname'], i['Surname']), ons_code=i['ONS Code'], pano=i['PANO'], constituency=i['Constituency'], party=i['Party Identifer'], votes=i['Valid votes']) for i in results]
Теперь у нас есть чистый CSV-файл с данными о выборах, и у нас есть пользовательские классы данных, с помощью которых мы обрабатываем эти данные. Мы продолжим обработку этих данных о британских выборах в следующих статьях.