Desenvolvimento de um mapa interativo de distribuição de coronavírus do tipo 2019-nCoV em Python

O tipo de coronavírus 2019-nCoV, após um surto na cidade chinesa de Wuhan, está se espalhando rapidamente pelo mundo. No momento da redação do artigo original (30 de janeiro de 2020), mais de 9.000 infectados e 213 mortos foram relatados; até hoje (10 de fevereiro de 2020), 40.570 infectados já foram relatados, 910 pessoas morreram. As infecções por coronavírus foram detectadas na França, Austrália, Rússia, Japão, Cingapura, Malásia, Alemanha, Itália, Sri Lanka, Camboja, Nepal e muitos outros países. Ninguém sabe quando o vírus será interrompido. Enquanto isso, o número de casos confirmados de coronavírus está crescendo apenas.

O autor do artigo que estamos traduzindo hoje quer falar sobre como, usando Python, criar um aplicativo simples para rastrear a disseminação do coronavírus. Após concluir o trabalho neste aplicativo, o leitor terá uma página HTML que exibe um mapa da propagação do vírus e um controle deslizante que permite selecionar a data em que os dados são exibidos no mapa.


Mapa interativo da distribuição de

tecnologias do tipo coronavírus 2019-nCoV , como Python 3.7, Pandas, Plotly 4.1.0 e Jupyter Notebook, será usado aqui.

Importar bibliotecas


Vamos começar importando para um projeto baseado nas bibliotecas Jupyter Notebook, Plotly e Pandas.

import plotly.offline as go_offline
import plotly.graph_objects as go
import pandas as pd

Antes de prosseguir, tente executar o código. Se você não viu mensagens de erro, todas as bibliotecas necessárias foram instaladas e estão funcionando corretamente. Se o código falhou em executar, consulte as páginas oficiais do Plotly e Pandas e leia os materiais de referência e instalação para essas bibliotecas. Se você não possui um sistema Jupyter Notebook em execução no seu hardware, recomendo usar o Google Colab , uma plataforma baseada em nuvem que permite trabalhar com o Jupyter Notebook.

Processamento de dados


Os dados que usamos aqui podem ser encontrados aqui . Esta é uma planilha compartilhada dos documentos do Google que é atualizada diariamente. Muito obrigado a todos aqueles que o mantêm atualizados! Você está fazendo um trabalho muito necessário.

Leremos os dados usando o método Pandas read_csv. Mas antes de carregar os dados da tabela, usando o link para ele, precisamos trabalhar com esse link. Agora, parece com o seguinte: Precisamos substituir o fragmento selecionado do link, trazendo o link para este formulário: No código a seguir, inicializamos a variável escrevendo um link para os dados, lendo os dados usando o método e gravando em células vazias que contêm valores .

https://docs.google.com/spreadsheets/d/18X1VM1671d99V_yd-cnUI1j8oSG2ZgfU_q1HfOizErA/edit#gid=0



https://docs.google.com/spreadsheets/d/18X1VM1671d99V_yd-cnUI1j8oSG2ZgfU_q1HfOizErA/export?format=csv&id

urlread_csvNaN0

url='https://docs.google.com/spreadsheets/d/18X1VM1671d99V_yd-cnUI1j8oSG2ZgfU_q1HfOizErA/export?format=csv&id'
data=pd.read_csv(url)
data=data.fillna(0)

Compreender como as estruturas de dados que usamos são estruturadas é extremamente importante nesta fase do trabalho, pois isso determina qual abordagem de processamento de dados aplicamos. Ver os dados usando o comando data.head(). Isso levará à saída das 5 primeiras linhas da tabela.


As primeiras 5 linhas de dados de coronavírus

No canto inferior esquerdo, você pode ver as informações de que existem 47 colunas na tabela de dados. Aqui estão os nomes das cinco primeiras colunas:country,location_id,location,latitudeelongitude. Outras colunas são pares cujos nomes são construídos da seguinte maneira:confirmedcase_dd-mm-yyyyedeaths_dd-mm-yyyy. O número total de colunas na tabela no momento da redação deste material era 47. Isso significa que eu tinha dados de 21 dias à minha disposição ((47-5) / 2 = 21). Se a data de início da coleta de dados for 10.01.2020, a data final será 30.01.2020.

Os nomes das cinco primeiras colunas da tabela não são alterados, mas, com o tempo, colunas com novos nomes serão adicionadas à tabela. O que nosso mapa interativo produzirá é uma visualização da distribuição do coronavírus com a capacidade de indicar o dia em que o mapa é formado. Portanto, precisamos separar todo o conjunto de dados selecionando informações para cada dia e levando em consideração que as 5 primeiras colunas da tabela não são alteradas e que todos os dias são descritos por duas colunas. Então, se você examinar com mais atenção os dados, por exemplo, os dados de 10.01.2020, acontece que muitas datas correspondem a essa data. De fato, nessa data, a detecção de coronavírus foi confirmada em apenas um local, marcado pelo número correspondente. Todas as outras linhas nesta data contêm apenas zeros. Isso significa,que precisamos excluir essas linhas do processo de criação do mapa.

O processo de preparação de dados para visualização é realizado em um ciclo.

#  
fig=go.Figure()
col_name=data.columns
n_col=len(data.columns)
date_list=[]
init=4
n_range=int((n_col-5)/2)

#,          
for i in range(n_range):
    col_case=init+1
    col_dead=col_case+1
    init=col_case+1
    df_split=data[['latitude','longitude','country','location',col_name[col_case],col_name[col_dead]]]
    df=df_split[(df_split[col_name[col_case]]!=0)]
    lat=df['latitude']
    lon=df['longitude']
    case=df[df.columns[-2]].astype(int)
    deaths=df[df.columns[-1]].astype(int)
    df['text']=df['country']+'<br>'+df['location']+'<br>'+'confirmed cases: '+ case.astype(str)+'<br>'+'deaths: '+deaths.astype(str)
    date_label=deaths.name[7:17]
    date_list.append(date_label)
    
    #  Scattergeo
    fig.add_trace(go.Scattergeo(
    name='',
    lon=lon,
    lat=lat,
    visible=False,
    hovertemplate=df['text'],
    text=df['text'],
    mode='markers',
    marker=dict(size=15,opacity=0.6,color='Red', symbol='circle'),
    ))

Durante a operação, a saída de cada conjunto de dados é adicionada ao gráfico Scattergeo usando fig.add_trace. No momento da escrita, os dados com base nos quais as imagens serão construídas são representados por 21 objetos. Você pode verificar isso usando o comando fig.data.

Criação de slider


Aqui, criaremos um controle deslizante com a ajuda da qual a seleção dos dados visualizados no mapa está organizada. Aqui está o código relevante:

# 
steps = []
for i in range(len(fig.data)):
    step = dict(
        method="restyle",
        args=["visible", [False] * len(fig.data)],
        label=date_list[i],
    )
    step["args"][1][i] = True  #  i-     "visible"
    steps.append(step)
    
sliders = [dict(
    active=0,
    currentvalue={"prefix": "Date: "},
    pad={"t": 1},
    steps=steps
)]

O código do controle deslizante consiste em dois fragmentos principais. O primeiro é um loop no qual a lista stepsusada ao mover o controle deslizante é preenchida . Quando você move o controle deslizante, o conjunto de dados correspondente é visualizado e o que é exibido antes é oculto. A segunda parte do código é a inclusão da lista construída anteriormente stepsno objeto slider. Quando o controle deslizante se move, ele seleciona o elemento correspondente steps.

Mapeie a saída e salve-a como um arquivo HTML


Agora chegamos à parte final do material. Aqui falamos sobre como exibir o mapa e como salvá-lo no formato HTML. Aqui está o código que implementa essas operações:

#    
fig.data[0].visible=True

#       HTML
fig.update_layout(sliders=sliders,title='Coronavirus Spreading Map'+'<br>geodose.com',height=600)
fig.show()
go_offline.plot(fig,filename='F:/html/map_ncov.html',validate=True, auto_open=False)

Quando um mapa é exibido, uma representação visual do primeiro conjunto de dados é visível. Em seguida, atualizamos o conteúdo do mapa de acordo com a posição do controle deslizante. Aqui, definimos o título do mapa e ajustamos sua altura. No último passo, exibir o mapa usando o método fig.show, e depois salvá-lo em HTML utilizando o método go_offline.plot.

Código completo do projeto


Aqui está o código completo do projeto para criar um mapa de distribuição de coronavírus do tipo 2019-nCoV. Observe que a última linha responsável por salvar a versão HTML do mapa precisa ser editada, substituindo o caminho especificado lá pelo que é relevante para você.

import plotly.offline as go_offline
import plotly.graph_objects as go
import pandas as pd

# 
url='https://docs.google.com/spreadsheets/d/18X1VM1671d99V_yd-cnUI1j8oSG2ZgfU_q1HfOizErA/export?format=csv&id'
data=pd.read_csv(url)
data=data.fillna(0)

#  
fig=go.Figure()
col_name=data.columns
n_col=len(data.columns)
date_list=[]
init=4
n_range=int((n_col-5)/2)

#,          
for i in range(n_range):
    col_case=init+1
    col_dead=col_case+1
    init=col_case+1
    df_split=data[['latitude','longitude','country','location',col_name[col_case],col_name[col_dead]]]
    df=df_split[(df_split[col_name[col_case]]!=0)]
    lat=df['latitude']
    lon=df['longitude']
    case=df[df.columns[-2]].astype(int)
    deaths=df[df.columns[-1]].astype(int)
    df['text']=df['country']+'<br>'+df['location']+'<br>'+'confirmed cases: '+ case.astype(str)+'<br>'+'deaths: '+deaths.astype(str)
    date_label=deaths.name[7:17]
    date_list.append(date_label)
    
    #  Scattergeo
    fig.add_trace(go.Scattergeo(
    name='',
    lon=lon,
    lat=lat,
    visible=False,
    hovertemplate=df['text'],
    text=df['text'],
    mode='markers',
    marker=dict(size=15,opacity=0.6,color='Red', symbol='circle'),
    ))


# 
steps = []
for i in range(len(fig.data)):
    step = dict(
        method="restyle",
        args=["visible", [False] * len(fig.data)],
        label=date_list[i],
    )
    step["args"][1][i] = True  #  i-     "visible"
    steps.append(step)
    
sliders = [dict(
    active=0,
    currentvalue={"prefix": "Date: "},
    pad={"t": 1},
    steps=steps
)]

#    
fig.data[0].visible=True

#       HTML
fig.update_layout(sliders=sliders,title='Coronavirus Spreading Map'+'<br>geodose.com',height=600)
fig.show()
go_offline.plot(fig,filename='F:/html/map_ncov_slider.html',validate=True, auto_open=False)

Sumário


Concluímos uma revisão de um guia sobre a criação de um mapa interativo para visualizar a distribuição do coronavírus tipo 2019-nCoV. Depois de trabalhar com este material, você aprendeu a ler dados das planilhas públicas do Google, como processar dados usando o Pandas e como visualizar esses dados em um mapa interativo usando o controle deslizante e Plotly. O resultado do projeto como uma página HTML pode ser baixado aqui.. As informações exibidas no mapa dependem da tabela de dados. Cada vez que o código do projeto é executado, o mapa é atualizado e novos dados da tabela ficam disponíveis nele. Este é um mapa muito simples. Existem muitas maneiras de melhorar isso. Por exemplo, ele pode ser complementado com gráficos adicionais, alguns dados resumidos e assim por diante. Se você estiver interessado, você pode fazer tudo isso e muito mais.

Queridos leitores! Para quais tarefas você usa a tecnologia Notebook Jupyter?

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


All Articles