«Сделайте Брексит» - Борис Джонсон, премьер-министр Великобритании.

Обратите внимание: Это первая из серии статей, в которых мы будем очищать и анализировать данные о выборах в Великобритании за 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-файл с данными о выборах, и у нас есть пользовательские классы данных, с помощью которых мы обрабатываем эти данные. Мы продолжим обработку этих данных о британских выборах в следующих статьях.