Estudamos o clima das cidades russas usando Python

No Python, você pode trabalhar com dados e visualizá-los. Não apenas os programadores se aproveitam disso, mas também os cientistas: biólogos, físicos e sociólogos. Hoje, juntamente com shwars , o curador do nosso salto inicial em Python para o curso de IA , nos transformaremos brevemente em meteorologistas e estudaremos o clima das cidades russas. Nas bibliotecas para visualização e trabalho com dados, usamos Pandas, Matplotlib e Bokeh.



Fazemos a pesquisa nos Notebooks do Azure , a versão baseada em nuvem do Jupyther Notebook. Portanto, para iniciar o Python, não precisamos instalar nada no nosso computador e podemos trabalhar diretamente no navegador. Você só precisa fazer login com sua conta da Microsoft, criar uma biblioteca e o novo laptop Python 3. A seguir, você pode pegar os trechos de código deste artigo e experimentar!

Nós obtemos os dados


Primeiro, importamos as principais bibliotecas que precisamos. O Pandas é uma biblioteca para trabalhar com dados tabulares, ou os chamados quadros de dados, e o pyplot nos permitirá criar gráficos.

import pandas as pd import matplotlib.pyplot as plt 

É fácil encontrar os dados de origem na Internet, mas já os preparamos para você em um formato CSV conveniente. CSV é um formato de texto no qual todas as colunas são separadas por vírgulas. Daí o nome - Valores separados por vírgula.

O Pandas pode abrir arquivos CSV de um disco local e também diretamente da Internet. Os dados em si estão em nosso repositório no GitHub , portanto, apenas precisamos especificar o URL correto.

 data = pd.read_csv("https://raw.githubusercontent.com/shwars/PythonJump/master/Data/climat_russia_cities.csv") data 



Renomeie as colunas da tabela para que seja mais conveniente acessá-las pelo nome. Também precisamos converter seqüências de caracteres em valores numéricos para operar com elas. Quando tentamos fazer isso usando a função pd.to_numeric , descobrimos que ocorre um erro estranho. Isso se deve ao fato de que, em vez de um sinal de menos, um traço longo é usado no texto.

 data.columns=["City","Lat","Long","TempMin","TempColdest","AvgAnnual","TempWarmest","AbsMax","Precipitation"] data["TempMin"] = pd.to_numeric(data["TempMin"]) 

 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) pandas/_libs/src/inference.pyx in pandas._libs.lib.maybe_convert_numeric() ValueError: Unable to parse string "−38.0" ... ... ... ValueError: Unable to parse string "−38.0" at position 0 

Uma moralidade importante decorre desse problema: os dados geralmente vêm em uma forma "suja", o que é inconveniente de usar, e a tarefa de um cientista de dados é trazer esses dados para uma boa visão.
Você pode ver que algumas das colunas da nossa tabela são do tipo object , em vez do tipo numérico float64 . Nessas colunas, substituiremos o traço por menos e, em seguida, converteremos a tabela inteira em um formato numérico. As colunas que não puderem ser convertidas (nomes de cidades) permanecerão inalteradas (para isso, usamos os errors='ignore' chave errors='ignore' ).

 print(data.dtypes) for x in ["TempMin","TempColdest","AvgAnnual"]: data[x] = data[x].str.replace('−','-') data = data.apply(pd.to_numeric,errors='ignore') print(data.dtypes) 

 City object Lat float64 Long float64 TempMin object TempColdest object AvgAnnual object TempWarmest float64 AbsMax float64 Precipitation int64 dtype: object City object Lat float64 Long float64 TempMin float64 TempColdest float64 AvgAnnual float64 TempWarmest float64 AbsMax float64 Precipitation int64 dtype: object 

Pesquisamos dados


Agora que temos dados limpos, podemos tentar criar gráficos interessantes.

Temperatura média anual


Por exemplo, vamos ver como a temperatura média depende da latitude.

 ax = data.plot(x="Lat",y="AvgAnnual",kind="Scatter") ax.set_xlabel("") ax.set_ylabel(" ") 



O gráfico mostra que quanto mais próximo do equador, mais quente.

Gravar cidades


Agora, vamos dar uma olhada nas cidades que são defensoras da temperatura e ver se há uma correlação entre as temperaturas mínima e máxima na cidade.

 ax=data.plot(x="TempMin",y="AbsMax",kind="scatter") ax.set_xlabel("  ") ax.set_ylabel("  ") ax.invert_xaxis() 



Como você pode ver, neste caso, não existe essa correlação. Existem cidades com um clima acentuadamente continental e apenas cidades quentes e frias. Encontramos cidades com uma propagação máxima de temperatura, ou seja, cidades com clima acentuadamente continental.

 data['spread'] = data['TempWarmest'] - data['TempColdest'] data.nlargest(3,'spread') 



Dessa vez, não registramos recordes, mas as médias do mês mais quente e mais frio. Como esperado, a maior dispersão entre as cidades da República de Sakha (Yakutia).

Inverno e verão


Para mais pesquisas, considere cidades dentro de um raio de 300 km de Moscou. Para calcular a distância entre os pontos em latitude e longitude, usamos a biblioteca geopy , que deve primeiro ser instalada usando a pip install .

 !pip install geopy import geopy.distance 

Adicione mais uma coluna à tabela - a distância para Moscou.

 msk_coords = tuple(data.loc[data["City"]==""][["Lat","Long"]].iloc[0]) data["DistMsk"] = data.apply(lambda row : geopy.distance.distance(msk_coords,(row["Lat"],row["Long"])).km,axis=1) data.head() 



Usamos a expressão para selecionar apenas as linhas de interesse para nós.

 msk = data.loc[data['DistMsk']<300] msk 



Para essas cidades, construímos um cronograma de temperaturas mínimas, médias anuais e máximas.

 ax=msk.plot(x="City",y=["TempColdest","AvgAnnual","TempWarmest"],kind="bar",stacked="true") ax.legend(["","",""],loc='lower right') 



Em geral, nenhuma anomalia é observada dentro de 300 quilômetros ao redor de Moscou. Ivanovo está localizado ao norte das demais cidades e, portanto, as temperaturas são vários graus mais baixas.

Trabalhar com dados geográficos


Agora vamos tentar exibir no mapa a precipitação média anual com referência às cidades e ver como a precipitação depende da localização geográfica. Para isso, usamos outra biblioteca de visualização - Bokeh . Ele também precisa ser instalado.

Depois calculamos outra coluna - o tamanho do círculo, que mostrará a quantidade de chuva. O coeficiente é selecionado empiricamente.

 !pip install bokeh from bokeh.io import output_file, output_notebook, show from bokeh.models import ( GMapPlot, GMapOptions, ColumnDataSource, Circle, LogColorMapper, BasicTicker, ColorBar, DataRange1d, PanTool, WheelZoomTool, BoxSelectTool, HoverTool ) from bokeh.models.mappers import ColorMapper, LinearColorMapper from bokeh.palettes import Viridis5 from bokeh.plotting import gmap 

Para trabalhar com o mapa, você precisa da chave da API do Google Maps. Ele deve ser obtido independentemente no site .

Instruções mais detalhadas sobre o uso do Bokeh para plotar gráficos nos mapas podem ser encontradas aqui e aqui .

 google_key = "<INSERT YOUR KEY HERE>" data["PrecipSize"] = data["Precipitation"] / 50.0 map_options = GMapOptions(lat=msk_coords[0], lng=msk_coords[1], map_type="roadmap", zoom=4) plot = gmap(google_key,map_options=map_options) plot.title.text = "    " source = ColumnDataSource(data=data) my_hover = HoverTool() my_hover.tooltips = [('', '@City'),('','@Precipitation')] plot.circle(x="Long", y="Lat", size="PrecipSize", fill_color="blue", fill_alpha=0.8, source=source) plot.add_tools(PanTool(), WheelZoomTool(), BoxSelectTool(), my_hover) output_notebook() show(plot) 



Como você pode ver, a maior quantidade de chuvas ocorre nas cidades costeiras. Embora exista um número bastante grande de cidades onde a precipitação é média ou até mais baixa que o nível nacional.

Todo o código com comentários escritos por Dmitry Soshnikov, você pode ver e executar aqui independentemente.

Sumário


Mostramos os recursos da linguagem sem usar algoritmos complexos, bibliotecas específicas ou escrever centenas de linhas de código. No entanto, mesmo armado com ferramentas padrão, você pode analisar seus dados e tirar algumas conclusões.

Os conjuntos de dados estão longe de estar sempre perfeitamente compostos; portanto, antes de começar a trabalhar com a visualização, é necessário colocá-los em ordem. A qualidade da visualização dependerá em grande parte da qualidade dos dados utilizados.

Há um grande número de vários tipos de tabelas e gráficos, e não é necessário limitar-se apenas às bibliotecas padrão.

Geoplotlib , Plotly , couro minimalista e outros.

Se você quiser aprender mais sobre como trabalhar com dados no Python, além de se familiarizar com a inteligência artificial, convidamos você a um dia intensivo do jumpstart do distrito binário - Python para IA .

Source: https://habr.com/ru/post/pt422463/


All Articles