Python - это мощный язык программирования, который широко используется в области анализа данных, включая анализ погодных данных. Давайте на примере анализа годовых температур в Москве разберемся как с его помощью можно выгрузить, предобработать и визуализировать данные новичку в этом деле. 

Для начала, вам потребуется получить доступ к погодным данным. Вы можете использовать API, такие как OpenWeatherMap API, для получения данных о погоде. OpenWeatherMap API предоставляет доступ к текущим и историческим данным о погоде по всему миру.  

В нашем примере обойдемся без использования API и ограничимся загрузкой архива погодных данных с информационного ресурса https://rp5.ru/Погода_в_Москве_(ВДНХ) 
В нашем примере обойдемся без использования API и ограничимся загрузкой архива погодных данных с информационного ресурса https://rp5.ru/Погода_в_Москве_(ВДНХ

Скачиваем архив данных за интересующий период в формате csv или xls, сохраняем его у себя на ПК.  Затем, вы можете использовать библиотеки Python, такие как Pandas и Plotly, для анализа и визуализации данных. Pandas позволяет вам эффективно работать с табличными данными, а Plotly - создавать графики и визуализации. 

В нашем примере будем использовать Pandas для чтения данных из файла excel, а затем использовать функции Pandas для фильтрации, группировки и агрегации данных. 

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt
import matplotlib
import dash 
import plotly.express as px
import plotly as go 

moscow_weather = pd.read_excel('C://moscow_weather.xlsx')

moscow_weather = moscow_weather.rename(columns={'Местное время в Москве (ВДНХ)':'timestamp'})
moscow_weather.info()
Для начала загрузим все необходимые библиотеки (в первой ячейке с кодом). С помощью функции “pd.read_excel” прочитаем архив с погодными данными, не забудьте указать путь до файла на вашем пк. Поменяем названия колонок на более удобные. 
Для начала загрузим все необходимые библиотеки (в первой ячейке с кодом). С помощью функции “pd.read_excel” прочитаем архив с погодными данными, не забудьте указать путь до файла на вашем пк. Поменяем названия колонок на более удобные. 

На этапе предобработки данных переведем все “временные” данные (год, месяц, дата, время и тд.) в формат timestamp для удобства работы с ними в будущем. 

С помощью функции “groupby” сгруппируем данные по годам, а к данным температуры применим агрегацию минимумом, максимумом, суммой и средним. 

Найдем медианные значения каждой из получившихся переменных и посчитаем относительные отклонения от медианной годовой температуры. 

#datetime split
moscow_weather['timestamp'] = pd.to_datetime(moscow_weather['timestamp'])
moscow_weather['year'] = moscow_weather.timestamp.dt.year
moscow_weather['date'] = moscow_weather.timestamp.dt.date
moscow_weather['month'] = moscow_weather.timestamp.dt.month
moscow_weather['time'] = moscow_weather.timestamp.dt.time

annual_sample_temp = moscow_weather

#temperature analysis
annual_sample_temp = annual_sample_temp.groupby(['year'])['T'].agg(['mean','sum', 'min', 'max'])
annual_sample_temp = annual_sample_temp.reset_index()

median_min_T = annual_sample_temp['min'].median()
median_max_T = annual_sample_temp['max'].median()
median_avg_T = annual_sample_temp['sum'].median()
median_avg_T = annual_sample_temp['mean'].median()

annual_sample_temp['rel_mean'] = (annual_sample_temp['mean']-median_avg_T)/annual_sample_temp['mean']

Из получившегося датасета изобразим отклонения от медианного значения температуры на графике. Будем использовать библиотеку Plotly для его создания.

import plotly.graph_objects as go

# Добавляем данные в график
year = annual_sample_temp['year'].to_list()
high = annual_sample_temp['max'].to_list()
low = annual_sample_temp['min'].to_list()
median = annual_sample_temp['mean'].to_list()


fig = go.Figure()
# Создаем графики динамики температуры
fig.add_trace(go.Scatter(x=year, y=high, name='Max',
                         line=dict(color='firebrick', width=4)))
fig.add_trace(go.Scatter(x=year, y=low, name = 'Min',
                         line=dict(color='royalblue', width=4)))
fig.add_trace(go.Scatter(x=year, y=median, name='Average',
                         line=dict(color='grey', width=4,
                              dash='dash') # dash options include 'dash', 'dot', and 'dashdot'
))

# Редактировать макет
fig.update_layout(title='Средние, высокие и низкие годовые температуры в Москве',
                   xaxis_title='Год',
                   yaxis_title='Температура (градусы по Цельсию)',
                   hovermode="x unified")

fig.show()

Вот таким нехитрым способом мы подготовили и визуализировали погодные данные по Москве для дальнейшего анализа и поиска отклонений с помощью языка программирования Python. У нас получился интерактивный дашборд, который можно сохранить как отдельно взятое изображение, можно оставить визуализацию только минимальной, максимальной или средней температуры с помощью интерактивных кнопок легенды в правом верхнем углу.

Комментарии (10)


  1. Jury_78
    07.04.2024 14:58

    Plotly

    Это не из JS растет?


    1. economist75
      07.04.2024 14:58

      Из экосистемы JS произрастает бОльшая часть библиотек для графиков в Python (Altair, Bokeh, Holoview, Plotly, Vega). JS - основной стек для графиков вообще.


      1. 150Rus
        07.04.2024 14:58

        Никто не использует большую часть из того что вы написали. А используют то, что вы как раз не написали и что не растёт из экосистемы JS.

        Как же не соврать ради красивого концепта.


        1. economist75
          07.04.2024 14:58

          В чем же мое вранье? Картинка: https://github.com/rougier/python-visualization-landscape
          Логично предположить что рисуют диаграммы больше на тех языках, которые Top-3, а не 10-50-е места, куда попадут лидеры прошлого GNUPlot, R, MatLab итд. Но время неумолимо затирает прежние авторитеты.

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


          1. Jury_78
            07.04.2024 14:58

            У python есть своя графика остальное из JS нужно разве что для WEB.


            1. economist75
              07.04.2024 14:58

              У Python нет практически своей графики/диаграмм, кроме старого, монструозного, но почти неинтерактивного Matplotlib/Seaborn. Среди 500k его либ наверняка есть и другие pure-python рисовалки, но популярность их ничтожно мала по сравнению с JS-либами и Python-обертками над ними. Популярны они не просто так: они быстрее, красивее, удобнее. Одним Matplotlib не обойтись, да и сам он бывает неуклюж. В среднем я создаю 30 новых диаграмм в день, MPL/SNS -задействован лишь в 20% случаев.

              JS сейчас это не только WEB, это огромный слой LAN-приложений, работающих в браузере, Electron-приложений итд. В конце концов это JupyterLab - основная среда для DS. Та же Pandas из коробки поддерживает 7 методов-бэкендов (либ) в методе df.plot(), из которых 6 - из мира JS. Все это вынуждены были повторить и в других DS-платформах в значительной степени.


              1. Jury_78
                07.04.2024 14:58

                Понятно, вам это не нужно, а я только Matplotlib и пользуюсь.


                1. Jury_78
                  07.04.2024 14:58

                  P.S. Кстати последнее обновление от Sept 13, 2023. Что тут старого? :)


                  1. economist75
                    07.04.2024 14:58

                    Там старое всё. Основная часть кода Matplotlib написана вся так давно, что ее можно уважать "за старость". Обновления добавляют мизер или затыкают баги.


  1. gematit
    07.04.2024 14:58
    +1

    Хорошая статья с точки зрения метеоролога, но есть пара нюансов:

    1. Не раскрыта работа с OpenWeatherMap API, что было бы интересно и полезно.

    2. Статья представляет из себя инструкцию «для самых маленьких» о том, как импортировать таблицу excel в pandas и построить пару графиков.

    В общем, хорошая практическая работа для студентов младших курсов.

    P.S. Даже валидации данных нет.