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

We use cookies. Read the Privacy and Cookie Policy

Программа 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 <module>

. .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'

with open(filename) as f:

reader = csv.reader(f)

header_row = next(reader)

dates, highs, lows = [], [], []

for row in reader:

(1) . . . .try:

. . . . . .current_date = datetime.strptime(row[0], "%Y-%m-%d")

. . . . . .high = int(row[1])

. . . . . .low = int(row[3])

. . . .except ValueError:

(2) . . . . . .print(current_date, 'missing data')

. . . .else:

(3) . . . . . .dates.append(current_date)

. . . . . .highs.append(high)

. . . . . .lows.append(low)

# Plot data.

...

# Форматирование диаграммы

(4)title = "Daily high and low temperatures - 2014 Death Valley, CA"

plt.title(title, fontsize=20)

...

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

Рис. 16.6. Максимальная и минимальная температура в Долине Смерти

При выполнении highs_lows.py мы видим, что данные отсутствуют только для одной даты:

2014-02-16 missing data

Полученная диаграмма изображена на рис. 16.6.

Сравнивая эту диаграмму с диаграммой для Ситки, мы видим, что в Долине Смерти теплей, чем на юго-востоке Аляски (как и следовало ожидать), но при этом температурный диапазон в пустыне более широкий. Высота закрашенной области наглядно демонстрирует этот факт.

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

Упражнения

16-1. Сан-Франциско: к какому месту ближе температура в Сан-Франциско: к Ситке или Долине Смерти? Постройте температурную диаграмму для Сан-Франциско и сравните. (Погодные данные практически для любого места можно загрузить по адресу http://www.wunderground.com/history/. Введите название места и диапазон дат, прокрутите страницу и найдите ссылку Comma-Delimited File. Щелкните правой кнопкой мыши на ссылке и сохраните данные в файле CSV.)

16-2. Сравнение Ситки с Долиной Смерти: разные масштабы температур отражают разные диапазоны данных. Чтобы точно сравнить температурный диапазон в Ситке с температурным диапазоном Долины Смерти, необходимо установить одинаковый масштаб по оси y. Измените параметры оси y для одной или обеих диаграмм на рис. 16.5 и 16.6 и проведите прямое сравнение температурных диапазонов в этих двух местах (или любых других, которые вас интересуют). Также можно попробовать нанести два набора данных на одну диаграмму.

16-3. Осадки: выберите любое место и постройте диаграмму с уровнем осадков. Для начала ограничьтесь данными за один месяц, а когда ваш код заработает, выполните программу для данных за полный год.

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