Desarrollo de un mapa interactivo de distribución de coronavirus del tipo 2019-nCoV en Python

El coronavirus tipo 2019-nCoV, después de un brote en la ciudad china de Wuhan, se está extendiendo rápidamente por todo el mundo. Al momento de escribir el artículo original (30 de enero de 2020), se informaron más de 9,000 infectados y 213 muertos, hasta el día de hoy (10 de febrero de 2020), ya se han reportado 40,570 infectados, 910 personas han muerto. Se han detectado infecciones por coronavirus en Francia, Australia, Rusia, Japón, Singapur, Malasia, Alemania, Italia, Sri Lanka, Camboya, Nepal y muchos otros países. Nadie sabe cuándo se detendrá el virus. Mientras tanto, el número de casos confirmados de coronavirus solo está creciendo.

El autor del artículo que estamos traduciendo hoy quiere hablar sobre cómo, usando Python, crear una aplicación simple para rastrear la propagación del coronavirus. Después de completar el trabajo en esta aplicación, el lector tendrá una página HTML que muestra un mapa de la propagación del virus y un control deslizante que le permite seleccionar la fecha en la que se muestran los datos en el mapa.




Aquí se utilizará un mapa interactivo de la distribución del coronavirus tipo 2019-nCoV Tecnologías como Python 3.7, Pandas, Plotly 4.1.0 y Jupyter Notebook.

Importar bibliotecas


Comencemos importando a un proyecto basado en Jupyter Notebook, las bibliotecas Plotly y Pandas.

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

Antes de continuar, intente ejecutar el código. Si no vio mensajes de error, todas las bibliotecas necesarias se han instalado y funcionan correctamente. Si el código no se ejecutó, eche un vistazo a las páginas oficiales de Plotly y Pandas y lea los materiales de referencia e instalación para estas bibliotecas. Si no tiene un sistema Jupyter Notebook ejecutándose en su hardware, le recomiendo usar Google Colab , una plataforma basada en la nube que le permite trabajar con Jupyter Notebook.

Procesamiento de datos


Los datos que usamos aquí se pueden encontrar aquí . Esta es una hoja de cálculo compartida de documentos de Google que se actualiza diariamente. ¡Muchas gracias a todos los que lo mantienen actualizado! Estás haciendo un trabajo muy necesario.

Leeremos los datos utilizando el método Pandas read_csv. Pero antes de cargar los datos de la tabla, usando el enlace, necesitamos trabajar con este enlace. Ahora se ve así: Necesitamos reemplazar el fragmento seleccionado del enlace, haciendo que el enlace se vea así: En el siguiente código, inicializamos la variable escribiendo un enlace a los datos, leemos los datos usando el método y lo escribimos en celdas vacías que contienen 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)

Comprender cómo se estructuran las estructuras de datos que utilizamos es extremadamente importante en esta etapa del trabajo, ya que esto determina qué enfoque para el procesamiento de datos aplicamos. Ver los datos utilizando el comando data.head(). Esto conducirá a la salida de las primeras 5 filas de la tabla.


Las primeras 5 filas de datos de coronavirus

En la esquina inferior izquierda puede ver información de que hay 47 columnas en la tabla de datos. Éstos son los nombres de las primeras cinco columnas:country,location_id,location,latitudeylongitude. Otras columnas son pares cuyos nombres se construyen de la siguiente manera:confirmedcase_dd-mm-yyyyydeaths_dd-mm-yyyy. El número total de columnas en la tabla al momento de escribir este material era 47. Esto significa que tenía datos de 21 días a mi disposición ((47-5) / 2 = 21). Si la fecha de inicio para la recopilación de datos fue el 10.01.2020, entonces la fecha de finalización fue el 30.01.2020.

Los nombres de las primeras cinco columnas de la tabla no cambian, pero con el tiempo se agregarán columnas con nuevos nombres a la tabla. Lo que generará nuestro mapa interactivo es una visualización de la distribución del coronavirus con la capacidad de indicar el día según el cual se forma el mapa. Por lo tanto, debemos separar todo el conjunto de datos seleccionando la información para cada día y teniendo en cuenta que las primeras 5 columnas de la tabla no cambian y que cada día se describe en dos columnas. Luego, si observa más de cerca los datos, por ejemplo, los datos del 10.01.2020, resulta que muchas fechas corresponden a esta fecha. De hecho, en esta fecha, la detección de coronavirus se confirmó en un solo lugar, que está marcado por el número correspondiente. Todas las demás líneas en esta fecha contienen solo ceros. Significa,que necesitamos excluir estas líneas del proceso de construcción del mapa.

El proceso de preparación de datos para la visualización se lleva a cabo en un 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 la operación, la salida de cada conjunto de datos se agrega al gráfico Scattergeo usando fig.add_trace. En el momento de la escritura, los datos en base a los cuales se construirán las imágenes están representados por 21 objetos. Puede verificar esto usando el comando fig.data.

Creación de control deslizante


Aquí crearemos un control deslizante con la ayuda de la cual se organiza la selección de datos visualizados en el mapa. Aquí está el 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
)]

El código del control deslizante consta de dos fragmentos principales. El primero es un bucle en el que stepsse llena la lista utilizada al mover el control deslizante del control deslizante. Cuando mueve el control deslizante, se visualiza el conjunto de datos correspondiente y se oculta lo que se muestra antes. La segunda parte del código es la inclusión de la lista construida previamente stepsen el objeto deslizante. Cuando el control deslizante se mueve, selecciona el elemento correspondiente de steps.

Asigne la salida y guárdela como un archivo HTML


Ahora llegamos a la parte final del material. Aquí hablamos sobre cómo mostrar el mapa y cómo guardarlo en formato HTML. Aquí está el código que implementa estas operaciones:

#    
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)

Cuando se muestra un mapa, se ve una representación visual del primer conjunto de datos. Luego hacemos que los contenidos del mapa se actualicen de acuerdo con la posición del control deslizante. Aquí establecemos el título del mapa y ajustamos su altura. En el último paso, mostramos el mapa usando el método fig.show, y luego lo guardamos en HTML usando el método go_offline.plot.

Código completo del proyecto


Aquí está el código completo del proyecto para crear un mapa de distribución de coronavirus del tipo 2019-nCoV. Tenga en cuenta que la última línea responsable de guardar la versión HTML del mapa debe editarse, reemplazando la ruta especificada allí por la que sea relevante para usted.

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)

Resumen


Hemos completado una revisión de una guía sobre cómo crear un mapa interactivo para visualizar la distribución del coronavirus tipo 2019-nCoV. Después de trabajar con este material, aprendió cómo leer datos de las hojas de cálculo públicas de Google, cómo procesar datos usando Pandas y cómo visualizar estos datos en un mapa interactivo usando el control deslizante y Plotly. El resultado del proyecto como una página HTML se puede descargar desde aquí.. La información que se muestra en el mapa depende de la tabla de datos. Cada vez que se ejecuta el código del proyecto, el mapa se actualiza y los datos nuevos de la tabla están disponibles en él. Este es un mapa muy simple. Hay muchas formas de mejorarlo. Por ejemplo, se puede complementar con gráficos adicionales, algunos datos de resumen, etc. Si está interesado, puede hacer todo esto y mucho más usted mismo.

¡Queridos lectores! ¿Para qué tareas utiliza la tecnología Jupyter Notebook?

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


All Articles