346 Глава 16 • Загрузка
данных
В точке
fill_between()
передается список
dates
для значений x и две серии
значений
y
highs
и
lows
. Аргумент
facecolor
определяет цвет закрашиваемой об-
ласти; мы назначаем ему низкое значение
alpha=0.1
, чтобы заполненная область
соединяла две серии данных, не отвлекая зрителя от передаваемой информации.
На рис. 16.5 показана диаграмма с закрашенной областью между
highs
и
lows
.
Закрашенная область подчеркивает величину расхождения между двумя наборами
данных.
Проверка ошибок
Программа
highs_lows .py
должна нормально работать для погодных данных любого
места. Однако на некоторых метеорологических станциях происходят сбои, и стан-
циям не удается собрать данные (полностью или частично). Отсутствие данных
может привести к исключениям; если исключения не будут обработаны, то про-
грамма аварийно завершится.
Для примера попробуем построить график температур для Долины Смерти (штат
Калифорния). Скопируйте файл
death_valley_2014 .csv
в каталог с программами этой
главы, после чего внесите изменения в
highs_lows .py
для работы с другим набором
данных:
highs_lows.py
...
#
Чтение дат, температурных максимумов и минимумов из файла.
filename = 'death_valley_2014.csv'
with open(filename) as f:
...
При запуске программы происходит ошибка, как видно из последней строки сле-
дующего вывода:
Traceback (most recent call last):
File "highs_lows.py", line 17, in
high = int(row[1])
ValueError: invalid literal for int() with base 10: ''
Трассировка показывает, что Python не может обработать максимальную температу-
ру для одной из дат, потому что не может преобразовать пустую строку
('')
в целое
число. Чтобы понять причину, достаточно заглянуть в файл
death_valley_2014 .csv
:
2014-2-16,,,,,,,,,,,,,,,,,,,0.00,,,-1
Похоже, 16 февраля 2014 года данные не сохранялись; строка максимальной тем-
пературы пуста. Чтобы решить проблему, мы будем выполнять проверку ошибок
при чтении данных из файла для обработки исключений, которые могут возникнуть
при разборе наборов данных. Вот как это делается:
highs_lows.py
...
# Чтение дат, температурных максимумов и минимумов из файла.
filename = 'death_valley_2014.csv'
Формат CSV
347
with open(filename) as f:
reader = csv.reader(f)
header_row = next(reader)
dates, highs, lows = [], [], []
for row in reader:
try:
current_date = datetime.strptime(row[0], "%Y-%m-%d")
high = int(row[1])
low = int(row[3])
except ValueError:
print(current_date, 'missing data')
else:
dates.append(current_date)
highs.append(high)
lows.append(low)
# Plot data.
...
#
Форматирование диаграммы
title = "Daily high and low temperatures - 2014\nDeath Valley, CA"
plt.title(title, fontsize=20)
...
При
анализе каждой строки данных мы пытаемся извлечь дату, максимальную
и минимальную температуру . Если каких-либо данных не хватает, Python вы-
дает ошибку
ValueError
, а мы обрабатываем ее — выводим сообщение с датой, для
которой отсутствуют данные . После вывода ошибки цикл продолжает обработку
следующей порции данных. Если все данные, относящиеся к некоторой дате, про-
читаны без ошибок, выполняется блок
else
, а данные присоединяются к соответ-
ствующим спискам . Так как на диаграмме отображается информация для нового
места, заголовок изменяется, и в него включается название места .
Достарыңызбен бөлісу: