https://habr.com/ru/post/469259/- Python
- Программирование
- Визуализация данных
- Научно-популярное
- Инфографика
Привет, Хабр.
Про изменение климата сейчас не говорит только ленивый. И случайно найдя неплохой сайт с историческими данными, стало интересно проверить — как же реально менялась температура с годами. Для теста мы возьмем данные с нескольких городов и проанализируем их с помощью 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 года — действительно ли это фактор войны (хотя тут я не уверен), или были какие-то еще события, типа извержения крупных вулканов.
Желающие могут дальше поэкспериментировать самостоятельно.