Добавить в корзинуПозвонить
Найти в Дзене

День 184. Python. Загрузка данных.

Python. Формат CSV. Один из простейших вариантов хранения — запись данных в текстовый файл как серий значений, разделенных запятыми; такой формат хранения получил название CSV (от Comma Separated Values, то есть «значения, разделенные запятыми»). Например, одна строка погодных данных в формате CSV может выглядеть так: 2014-1-5,61,44,26,18,7,-1,56,30,9,30.34,30.27,30.15,,,,10,4,,0.00,0,,195 Начнем с небольшого набора погодных данных в формате CSV, Скачаем допустим файл sitka_weather_07-2014.csv в каталог, в котором сохраняются программы этой главы. Python. Разбор заголовка файлов CSV. Модуль Python csv из стандартной библиотеки разбирает строки файла CSV и позволяет быстро извлечь нужные значения. Начнем с первой строки файла, которая содержит серию заголовков данных: После импортирования модуля csv имя обрабатываемого файла сохраняется в переменной filename. Затем файл открывается, а полученный объект сохраняется в переменной f . Далее программа вызывает метод csv.reader() и передает

Python. Формат CSV.

Один из простейших вариантов хранения — запись данных в текстовый файл как серий значений, разделенных запятыми; такой формат хранения получил название CSV (от Comma Separated Values, то есть «значения, разделенные запятыми»). Например, одна строка погодных данных в формате CSV может выглядеть так:

2014-1-5,61,44,26,18,7,-1,56,30,9,30.34,30.27,30.15,,,,10,4,,0.00,0,,195

Начнем с небольшого набора погодных данных в формате CSV, Скачаем допустим файл sitka_weather_07-2014.csv в каталог, в котором сохраняются программы этой главы.

Python. Разбор заголовка файлов CSV.

Модуль Python csv из стандартной библиотеки разбирает строки файла CSV и позволяет быстро извлечь нужные значения. Начнем с первой строки файла, которая содержит серию заголовков данных:

-2

После импортирования модуля csv имя обрабатываемого файла сохраняется в переменной filename. Затем файл открывается, а полученный объект сохраняется в переменной f . Далее программа вызывает метод csv.reader() и передает ему объект файла в аргументе, чтобы создать объект чтения данных для этого файла. Объект чтения данных сохраняется в переменной reader. Модуль csv содержит функцию next(), которая возвращает следующую строку файла для полученного объекта чтения данных. В следующем листинге функция next() вызывается только один раз для получения первой строки файла, содержащей заголовки. Возвращенные данные сохраняются в header_row.

Python. Печать заголовков и их позиций.

Чтобы читателю было проще понять структуру данных в файле, выведем каждый заголовок и его позицию в списке:

-3
-4

Мы применяем к списку функцию enumerate() для получения индекса каждого элемента и его значения.

Python. Извлечение и чтение данных.

Максимальная температура за каждый день:

-5

Программа создает пустой список с именем highs и перебирает остальные строки в файле. Объект reader продолжает с того места, на котором он остановился в ходе чтения файла CSV, и автоматически возвращает каждую строку после текущей позиции. Так как заголовок уже прочитан, цикл продолжается со второй строки, в которой начинаются фактические данные. При каждом проходе цикла значение с индексом 1 (второй столбец) присоединяется к списку highs. Затем преобразуем строки в числа при помощи функции int(), чтобы данные можно было передать matplotlib:

-6

Python. Нанесение данных на диаграмму.

Для наглядного представления температурных данных мы сначала создадим простую диаграмму дневных максимумов температуры с использованием matplotlib:

-7

Мы передаем при вызове plot() список highs и аргумент c='red' для отображения точек красным цветом. (Максимумы будут выводиться красным цветом, а минимумы синим.) Затем указываются другие аспекты форматирования (например, размер шрифта и метки) Так как даты еще не добавлены, метки для оси x не задаются, но вызов plt.xlabel() изменяет размер шрифта, чтобы метки по умолчанию лучше читались.

-8

Python. Модуль datetime.

Нанесем даты на график, чтобы с ним было удобнее работать. Данные будут читаться в строковом формате, поэтому нам понадобится способ преобразовать строку '2014-7-1' в объект, представляющий эту дату. Чтобы построить объект, соответствующий 1 июля 2014 года, мы воспользуемся методом strptime() из модуля datetime. Посмотрим, как работает strptime() в терминальном окне:

-9

Сначала необходимо импортировать класс datetime из модуля datetime. Затем вызывается метод strptime(), первый аргумент которого содержит строку с датой. Второй аргумент сообщает Python, как отформатирована дата. В данном примере значение '%Y-' сообщает Python, что часть строки, предшествующая первому дефису, должна интерпретироваться как год из четырех цифр; '%m-' приказывает Python интерпретировать часть строки перед вторым дефисом как число, представляющее месяц; наконец, '%d' приказывает Python интерпретировать последнюю часть строки как день месяца от 1 до 31. Метод strptime() может получать различные аргументы, которые описывают, как должна интерпретироваться запись даты. В таблице перечислены некоторые из таких аргументов.

-10

Python. Представление дат на диаграмме.

Научившись обрабатывать данные в файлах CSV, вы сможете улучшить диаграмму температурных данных. Для этого мы извлечем из файла даты ежедневных максимумов и передадим даты и максимумы функции plot():

-11
-12

Мы создаем два пустых списка для хранения дат и температурных максимумов из файла. Затем программа преобразует данные, содержащие информацию даты (row[0]), в объект datetime, который присоединяется к dates. Значения дат и температурных максимумов передаются plot(). Вызов fig.autofmt_xdate() выводит метки дат по диагонали, чтобы они не перекрывались.

Python. Расширение временного диапазона.

Добавим на график новые данные для получения более полной картины погоды. Скопируйте файл sitka_weather_2014.csv, содержащий погодные данные для Ситки за целый год, в каталог с программами этой главы. А теперь сгенерируем график с погодными данными за год:

-13

Значение filename изменено, чтобы в программе использовался новый файл данных sitka_weather_2014.csv, а заголовок диаграммы приведен в соответствие с содержимым.

-14

Python. Нанесение на диаграмму второй серии данных.

Обновленный график содержит значительное количество полезных данных, но график можно сделать еще полезнее, добавив на него данные температурных минимумов. Для этого необходимо прочитать температурные минимумы из файла данных и нанести их на график:

-15
-16

Создается пустой список lows для хранения температурных минимумов, после чего программа извлекает и сохраняет температурный минимум для каждой даты из четвертой позиции каждой строки данных (row[3]). Добавляется вызов plot() для температурных минимумов, которые окрашиваются в синий цвет. Затем остается лишь обновить заголовок диаграммы.

Python. Цветовое выделение части диаграммы.

Затушевать диапазон между минимальной и максимальной дневной температурой. Для этого мы воспользуемся методом fill_between(), который получает серию значений x и две серии значений y и заполняет область между двумя значениями:

-17

Аргумент alpha определяет степень прозрачности вывода. Значение 0 означает полную прозрачность, а 1 (по умолчанию) — полную непрозрачность. Со значением alpha=0.5 красные и синие линии на графике становятся более светлыми.

-18

fill_between() передается список dates для значений x и две серии значений y highs и lows. Аргумент facecolor определяет цвет закрашиваемой области; мы назначаем ему низкое значение alpha=0.1, чтобы заполненная область соединяла две серии данных, не отвлекая зрителя от передаваемой информации.

Python. Проверка ошибок.

Попробуем построить график температур для Долины Смерти (штат Калифорния). Скопируйте файл death_valley_2014.csv в каталог с программами этой главы, после чего внесите изменения в highs_lows.py для работы с другим набором данных:

-19

При запуске программы происходит ошибка, как видно из последней строки следующего вывода:

-20

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

-21

При анализе каждой строки данных мы пытаемся извлечь дату, максимальную и минимальную температуру. Если каких-либо данных не хватает, Python выдает ошибку ValueError, а мы обрабатываем ее — выводим сообщение с датой, для которой отсутствуют данные. После вывода ошибки цикл продолжает обработку следующей порции данных. Если все данные, относящиеся к некоторой дате, прочитаны без ошибок, выполняется блок else, а данные присоединяются к соответствующим спискам. Так как на диаграмме отображается информация для нового места, заголовок изменяется, и в него включается название места.

-22

В данном примере для обработки отсутствующих данных использовался блок try-except-else. Иногда команда continue используется для пропуска части данных, или же данные удаляются после извлечения вызовом remove() или del. Используйте любое работающее решение — лишь бы в результате у вас получилась осмысленная, точная визуализация.