Как стать автором
Обновить

Изменение климата: анализируем температуру в разных городах за последние 100 лет

Время на прочтение4 мин
Количество просмотров48K
Привет, Хабр.

Про изменение климата сейчас не говорит только ленивый. И случайно найдя неплохой сайт с историческими данными, стало интересно проверить — как же реально менялась температура с годами. Для теста мы возьмем данные с нескольких городов и проанализируем их с помощью Pandas и Matplotlib. Заодно выясним, действительно ли челябинские морозы настолько суровы, и где теплее, в Москве или Петербурге.



Также обнаружилось еще несколько любопытных закономерностей. Кому интересно узнать подробности, прошу под кат.

Сбор данных


Я не буду приводить здесь ссылку на сайт, достаточно набрать в гугле «погода и климат летопись», он будет первым. Непосредственно данные отображаются в виде HTML-таблицы:



Она смотрится красиво, но для анализа это не очень удобно. Скопируем данные в csv, для этого я использовал бесплатное расширение для Хрома под названием Copytables. С этим уже можно работать дальше, если все сделано правильно, должен получиться файл следующего вида:

Year,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dev,Avg
2003,-7.3,-8.6,-2.7,4.7,15.5,12.8,20.6,16.9,11.3,5.6,1.1,-2.1,5.7
2004,-6.5,-7.0,1.3,4.6,11.4,15.3,19.0,18.4,12.1,5.9,-1.6,-2.9,5.8
2005,-3.0,-8.9,-6.0,7.1,14.8,16.5,19.3,17.6,13.1,6.0,1.4,-4.1,6.2

Теперь загружаем данные в Pandas dataframe. Данные мы будем смотреть с 1900 года.

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.ticker import FormatStrFormatter, LinearLocator, FuncFormatter


df = pd.read_csv("moscow.csv", sep=',', encoding='utf-8')
df = df[(df['Year'] >= 1900)]

plt.rcParams["figure.figsize"] = (8, 5)
fig, ax = plt.subplots()

def neg_tick(x, pos):
    return '%.1f' % (-x if x else 0)

plt.bar(df['Year'].values, -df['Jan'].values, label=f'{cityname} - January Temperature, C')
plt.plot(df['Year'].values, -df['Jan'].rolling(window=20, min_periods=1).mean(), 'r-')
ax.yaxis.set_major_formatter(FuncFormatter(neg_tick))

plt.legend(loc='best')
plt.tight_layout()
plt.show()

Тут есть одна особенность — я использую «перевернутый» график для отрицательных температур, для чего пришлось использовать класс FuncFormatter и функцию neg_tick.

С кодом все, как можно видеть, ничего сложного. Посмотрим теперь, что же получается. Для сравнения я взял несколько городов — Москву, Петербург и Амстердам. Другие города желающие могут посмотреть самостоятельно.

Москва и Петербург


Я вывожу здесь данные на одном графике, т.к. заодно интересно было сравнить московские температуры с питерскими.

Для зимней температуры возьмем январь. Картинка уже была на КДПВ, но для целостности приведу её еще раз.

Зима, январь:



Лето, июнь:



В Москве действительно климат более континентальный — зимой холоднее, а летом жарче. Еще интересный пик, видимый на графике — реально холодные зимы в 1941-1945 — заметно ниже среднего. Жалобы немцев про «генерала зиму» имели свои основания.

В целом, результаты интересны. Средние температуры действительно меняются в сторону плюса, но зимы стали мягче где-то с 80х, а лето стало теплее уже где-то с 50х. Почему, не знаю.

Также интересно, насколько избирательна человеческая память. Мое детство пришлось на 80е, и мне запомнились морозные зимы под -20, хождение в валенках и ушанке и все такое. Оказывается в 80е морозов в январе было не так уж много, как мне казалось, но видимо, самые холодные дни больше отложились в памяти.

Кстати, стало интересно проверить, насколько суровые холода в Челябинске соответствуют анекдотам:



Да, разница средней температуры почти 2 раза. Когда в Москве средняя температура января -6, в Челябинске -12. Если в Москве средняя температура вдруг будет -20… впрочем, если верить статистике, такое было последний раз в 1942 году. Сколько тогда было в Челябинске неизвестно, данных нет.

Теперь рассмотрим города европейские.

Амстердам


В Амстердаме климат довольно теплый, хотя тенденция в целом сохраняется. Интересны «выбросы» отрицательных температур.

Зима, январь:



Забавно, что средняя температура января в -7 в 1963м настолько впечатлила голландцев, что это попало даже в местный кинематограф.

Летние температуры тоже меняются.

Лето, июнь:



Интересно, что зимы в Амстердаме изменились не так значительно как в Москве и Петербурге, вероятно сказывается влияние моря. Для сравнения, можно посмотреть какой-нибудь континентальный город, например Прагу:



Интересно, что до 40х годов температура росла, затем средние значения снизились. Что изменилось, не знаю. Причем это не какая-то местная климатическая аномалия, такой же эффект был в Зальцбурге:



Как подсказали в комментариях, на графиках видны интересные пики отрицательных температур с периодом в ~20 лет. Что это такое, я не знаю.

Заключение


Собственно, я не метеоролог, так что выводов не будет. Изменения климата определенно есть, отрицать это невозможно, и средние температуры действительно выросли. Интересно также было бы наложить данные на график концентрации СО2 в атмосфере за эти 100 лет, или на какие-то другие события, например на график солнечной активности. Также довольно интересно падение средней температуры после 1940 года — действительно ли это фактор войны (хотя тут я не уверен), или были какие-то еще события, типа извержения крупных вулканов.

Желающие могут дальше поэкспериментировать самостоятельно.
Теги:
Хабы:
Всего голосов 59: ↑52 и ↓7+45
Комментарии89

Публикации

Истории

Работа

Python разработчик
138 вакансий
Data Scientist
61 вакансия

Ближайшие события