{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Génesis\n",
"\n",
"---\n",
"\n",
":::{figure-md} markdown-fig\n",
"\n",
"\n",
"**Ilustración realizada por Bernardo Dinamarca**.\n",
":::\n",
"\n",
"¡Hola! Comenzar, en primer lugar, con que el presente notebook es la mejora del primero que realicé. La primera versión del código era repetitiva y por tanto, poco eficiente. Me digne a mejorarla y este fue el resultado (aún no me convence, pero es trabajo honesto). \n",
"\n",
"Esta versión está hecha con un poco más de conocimiento, aunque cabe recalcar, no soy un maestro de la programación, y estoy bastante distante de serlo. Me considero un sobreviviente, y un constante aprendiz."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Importando paquetes\n",
"\n",
"---\n",
"\n",
"En Python, tenemos la posibilidad de importar librerías, que en estricto rigor, es código ya escrito por otras personas. Por tanto, simplifica nuestra tarea, y es perfectamente común trabajar con ellas. En este caso, utilizaremos las siguientes librerías:\n",
"\n",
"- Pandas (librería por especialidad de manipulación de datos). Permite leer y trabajar con distintos tipos de archivos.\n",
"\n",
":::{figure-md} markdown-fig\n",
"
\n",
"\n",
"**Logo de la librería Pandas**.\n",
":::\n",
"\n",
"- Numpy (librería de álgebra que trabaja en conjunto con Pandas).\n",
"\n",
":::{figure-md} markdown-fig\n",
"
\n",
"\n",
"**Logo de la librería Numpy**.\n",
":::\n",
"\n",
"- Y otras varias de Python base.\n",
"\n",
"En el siguiente bloque de código (1), importaremos las librerías necesarias."
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"# Importando paquetes\n",
"\n",
"### Librería de manipulación de datos \n",
"import pandas as pd\n",
"pd.set_option('display.max_columns', 50)\n",
"pd.options.mode.chained_assignment = None # default='warn'\n",
"pd.options.display.float_format = '{:,.2f}'.format\n",
"\n",
"### Librería de álgebra\n",
"import numpy as np\n",
"\n",
"### Librerías para graficar\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.image as mpimg\n",
"import matplotlib as mpl\n",
"import matplotlib.dates as mdates\n",
"import matplotlib.ticker as mtick\n",
"\n",
"### Customizamos para tener fondos transparentes con alta resolución\n",
"mpl.rcParams['figure.dpi']= 300\n",
"mpl.rc(\"savefig\", dpi=300)\n",
"plt.rcParams.update({\n",
" \"figure.facecolor\": (0.0, 0.0, 0.0, 0.0),\n",
" \"axes.facecolor\": (0.0, 0.0, 0.0, 0.0),\n",
" \"savefig.facecolor\": (0.0, 0.0, 0.0, 0.0),\n",
"})\n",
"plt.rc('axes.spines', **{'bottom':True, 'left':True, 'right':False, 'top':False})\n",
"\n",
"### Para formato local\n",
"import locale\n",
"### Según Windows o Ubuntu\n",
"try:\n",
" ### Windows\n",
" locale.setlocale(locale.LC_ALL, 'esp')\n",
"except Exception:\n",
" ### Ubuntu (action)\n",
" locale.setlocale(locale.LC_ALL, 'es_CL.UTF-8')\n",
"\n",
"### Otros paquetes\n",
"import math\n",
"import requests\n",
"import os\n",
"import json as json\n",
"import datetime\n",
"import time\n",
"import IPython.display as display\n",
"from PIL import Image, ImageDraw, ImageFont\n",
"from IPython.display import display, HTML\n",
"\n",
"### Solo de uso esporádico\n",
"import csv\n",
"from io import StringIO\n",
"from io import BytesIO\n",
"import pkg_resources\n",
"import types\n",
"\n",
"### Gracias a joelostblom (https://gitlab.com/joelostblom/session_info)\n",
"import session_info\n",
"\n",
"### Pybtex\n",
"import pybtex.plugin"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Obtención de datos\n",
"\n",
"---\n",
"\n",
"### MICITEC\n",
"\n",
"En función de que, los datos están ampliamente organizados y trabajados por el Ministerio de Ciencia, Tecnología, Conocimiento e Innovación (**MICITEC**) en su GitHub {cite}`MICITEC`, procedemos a leer los archivos .CSV en el siguiente bloque de código. {footcite}`MICITEC`\n",
"\n",
"- Los archivos .CSV refieren a \"comma separated values\", que en español significa \"archivos separados por coma\", y si bien, parecieran tener una estructura desorganizada, en verdad tienen un orden por columna y fila, delimitando cada elemento por una coma. En Data Science son ampliamente utilizados, aunque, en secuencias de datos más amplias (y con mayor peso) se suele utilizar el lenguaje de consulta SQL, dado que la librería Pandas, en un archivo .CSV, debe leer uno y cada uno de los datos, por lo que a medida escala el número de datos, el proceso de lectura de un .CSV se torna ineficiente.\n",
"\n",
"- Para ejemplo práctico, leer bloque de código ([Ejemplo 1](#ejemplo1)).\n",
"\n",
"Sin embargo, al tratar con datos diarios que no han sido registrados por más de dos años, ni con un gran número de variables, no existe ningún inconveniente al trabajar con los archivos separados por coma.\n",
"\n",
"### SOCHIMI\n",
"\n",
"Los datos de la encuesta nacional de la Sociedad Chilena de Medicina Intensiva (SOCHIMI), del producto 48 (csv48), no los consideramos puesto que estos no serán actualizados a futuro."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A continuación (2), haremos un procedimiento similar, pero desde archivos .CSV con mayor número de columnas y brindando como argumento el enlace donde se encuentra el archivo en GitHub."
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
"# Obteniendo datos desde Min. de Ciencia y Tecnología\n",
"\n",
"### csv13 (casos acumulativos), producto 13\n",
"csv13 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto13/CasosNuevosCumulativo_T.csv')\n",
"\n",
"### csv3 (casos por detalle), producto 3\n",
"csv3_detalle = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto3/TotalesPorRegion.csv')\n",
"\n",
"### csv14 (fallecidos cumulativos), producto 14\n",
"csv14 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto14/FallecidosCumulativo_T.csv')\n",
"\n",
"### csv3 (casos cumulativos), producto 3\n",
"csv3 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto3/CasosTotalesCumulativo_T.csv')\n",
"\n",
"### csv7 (pcr cumulativos), producto 7\n",
"csv7 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto7/PCR_T.csv')\n",
"\n",
"### csv36 (residencias sanitarias), producto 36\n",
"csv36 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto36/ResidenciasSanitarias.csv')\n",
"\n",
"### 2.1. csv48 (sochimi), producto 48\n",
"#csv48 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto48/SOCHIMI.csv')\n",
"\n",
"### csv54 (r regional), producto 54\n",
"csv54_regional = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto54/r.regional.csv')\n",
"\n",
"### csv54 (r provincial), producto 54\n",
"csv54_provincial = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto54/r.provincial.csv')\n",
"\n",
"### csv8 (camas uci diarias), producto 8\n",
"csv8 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto8/UCI_T.csv')\n",
"\n",
"### csv58 (camas uci por detalle), producto 58\n",
"csv58 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto58/Camas_UCI_diarias.csv')\n",
"\n",
"### csv76 (vacunación), producto 76\n",
"csv76 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto76/vacunacion.csv')\n",
"\n",
"### csv81 (población por edad), producto 81\n",
"csv81_poblacionedad = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto81/poblacion_comuna_edad.csv')\n",
"\n",
"### csv81 (vacunación por edad 1° dosis), producto 81\n",
"csv81_edad1 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto81/vacunacion_comuna_edad_1eraDosis.csv')\n",
"\n",
"### csv81 (vacunación por edad 2° dosis), producto 81\n",
"csv81_edad2 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto81/vacunacion_comuna_edad_2daDosis.csv')\n",
"\n",
"### csv81 (vacunación por edad única dosis), producto 81\n",
"csv81_edadunica = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto81/vacunacion_comuna_edad_UnicaDosis.csv')\n",
"\n",
"### csv87 (antígenos por región)\n",
"csv87 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto87/Ag.csv')\n",
"\n",
"### csv19 (casos activos por comuna), producto 19\n",
"csv19 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto19/CasosActivosPorComuna_T.csv')\n",
"\n",
"### csv1 (casos confirmados comuna)\n",
"csv1 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto1/Covid-19_T.csv')\n",
"\n",
"### csv74 (paso a paso histórico)\n",
"csv74 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto74/paso_a_paso.csv')\n",
"\n",
"### csv82 (movilidad en la semana y el fin de semana)\n",
"csv82_semana = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto82/ISCI_weeks.csv')\n",
"csv82_finsemana = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto82/ISCI_weekends.csv')\n",
"\n",
"### csv65 (positividad por comuna)\n",
"csv65 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto65/PositividadPorComuna.csv')\n",
"\n",
"### csv66 (cobertura por comuna)\n",
"csv66 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto66/CoberturaPorComuna.csv')\n",
"\n",
"### csv67 (oportunidad en la notificación)\n",
"csv67 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto67/OportunidadPorComuna.csv')\n",
"\n",
"### csv63 (notificación por comuna)\n",
"csv63 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto63/NNotificacionPorComuna.csv')\n",
"\n",
"### csv64 (BAC por comuna)\n",
"csv64 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto64/BACPorComuna.csv')\n",
"\n",
"### csv38 (casos fallecidos por comuna, no procesados por DEIS)\n",
"csv38 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto38/CasosFallecidosPorComuna.csv')\n",
"\n",
"### csv61 (casos fallecidos por comuna, procesados por DEIS)\n",
"csv61 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto61/serie_fallecidos_comuna.csv')\n",
"\n",
"### csv69 (tasa de incidencia provincial, por cada cien mil habitantes, de casos confirmados, calculada por ICOVID Chile)\n",
"csv69_provincial = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto69/carga.provincial.ajustada.csv')\n",
"\n",
"### csv69 (tasa de incidencia regional, por cada cien mil habitantes, de casos confirmados, calculada por ICOVID Chile)\n",
"csv69_regional = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto69/carga.regional.ajustada.csv')\n",
"\n",
"### csv18 (tasa de incidencia histórica acumulada)\n",
"csv18 = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto18/TasaDeIncidencia.csv')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Análisis y manipulación de datos\n",
"\n",
"---\n",
"\n",
"Antes de proceder con el trabajo con los datos, se debe realizar un pequeño análisis, recorriendo aquellas variables que nos sean útiles. Este análisis ya está previamente hecho, dado que, nos basaremos en la disposición de datos del reporte diario del Ministerio de Salud, sumando otros que pueden ser calculados con las librerías de Python a través de operaciones vectoriales sobre las columnas.\n",
"\n",
"Sin embargo, tenemos un inconveniente. Públicamente, en los informes diarios del Ministerio de Salud, no se especificaban casos activos y recuperados. Por dicha razón, con fecha anterior al 21 de junio y 29 del mismo mes, del año 2020, no están disponibles las curvas históricas para casos activos y recuperados, respectivamente, en los archivos del GitHub del MICITEC.\n",
"\n",
"### Arreglo\n",
"\n",
"Para suplir esa falta de datos, los añadiremos de forma manual, los cuales fueron registrados por el Dr. Cristóbal Corral en su seguimiento de la pandemia en Tarapacá. Éstos, fueron estimados de acuerdo a la metodología del Ministerio de Salud en ese entonces.\n",
"\n",
"Los datos a añadir, contemplan hasta el 20 de junio del 2020 en los activos, y hasta el 28 de junio del mismo año para los casos recuperados. Posterior a esas fechas, se realizó el cambio de metodología y se empezó a proporcionar las cifras en los reportes diarios. De hecho, los saltos en las gráficas de casos activos y recuperados se explican por los cambios de metodología.\n",
"\n",
"### ¿Qué es la manipulación de datos?\n",
"\n",
"Por otro lado, suena extraño \"manipular datos\", ¿cierto? La significancia es más simple de lo que parece. Cuando trabajamos con datos, estos suelen venir en formatos no apropiados. En tales casos, una columna que cuantifica debe tener números (int o float) y no palabras (str), del contrario, tendremos inconvenientes a la hora de realizar gráficos. Un ejemplo se puede apreciar a continuación, donde nos interesa la columna de la Región de Tarapacá (y no otras), y también, que las columnas contengan exclusivamente números. Entonces... ¿Por qué alguien pondría una fila de strings (variables de texto) entre medio de columnas con variables numéricas? La función es que podamos identificar a qué región de Chile pertenecen los datos (de otra forma, no podríamos saberlo), pero una vez ya las identificamos, ¡no las necesitamos! Y será necesario limpiar o quitar la fila (en este caso, la fila 'Región').\n",
"\n",
"| Fecha | Casos nuevos | Casos nuevos | ... |\n",
"| --- | --- | --- | --- |\n",
"| Región | Tarapacá | Antofagasta | ... |\n",
"| 06-05-2021 | 115 | 144 | ... |\n",
"| 05-05-2021 | 101 | 76 | ... |\n",
"| 04-05-2021 | 71 | 83 | ... |\n",
"| ... | ... | ... | ... |\n",
"\n",
"Todo ésto es parte de lo que se denomina limpieza de datos, que deberemos realizarlo con anterioridad al análisis exploratorio.\n",
"\n",
"A continuación, y una vez la data limpia, como también, reconocidas las variables que nos pueden ser útiles, debemos utilizar nuestra creatividad, y generar, a partir de la información que tenemos, nuevas variables que permitan resumir o acotar otras, dando a explicar, de mejor forma, los datos de la pandemia.\n",
"\n",
"### Datos por agregar\n",
"\n",
"Si se requieren, abrir un Issue o solicitarlo directamente.\n",
"\n",
"### Datos calculados\n",
"\n",
"Para efectos de contar con mayor cantidad de variables, se calculan:\n",
"\n",
"#### Positividad diaria PCR\n",
"\n",
"La positividad PCR entrega el porcentaje de personas positivas de la cantidad de PCR informados en un determinado intervalo de tiempo. En este caso, en el día.\n",
"\n",
"$$\n",
"\\begin{align}\n",
"\\Large POSITIVIDAD_{diaria} = \\frac{(casos \\ nuevos \\ totales) - (casos \\ por \\ antígeno)}{exámenes \\ pcr \\ informados}\n",
"\\end{align}\n",
"$$ (positividad_diaria)\n",
"\n",
"#### Positividad media móvil semanal\n",
"\n",
"La positividad media móvil semanal se entiende como la media que, a lo menos, requiere siete datos para obtenerse, obteniendo los promedios por ventana de siete días en un determinado conjunto de datos.\n",
"\n",
"$$\n",
"\\begin{align}\n",
"\\Large POSITIVIDAD_{móvil \\ semanal} = \\frac{1}{7}\\sum_{i=1}^{7} Dato_{i}\n",
"\\end{align}\n",
"$$ (positividad_movil)\n",
"\n",
"#### Tasa de crecimiento semanal\n",
"\n",
"Idea original de Dr. Cristóbal Corral, con una tasa de crecimiento capaz de entregar el cambio diario a partir del cociente entre los casos nuevos del día $n$ y los casos nuevos del día $n-1$. Se modifica y se contempla una tasa de crecimiento semanal, a partir de la media móvil de la sumatoria de los casos nuevos registrados en una semana $n$ y la semana $n-1$.\n",
"\n",
"$$ \n",
"\\begin{align}\n",
"\\Large TASA_{crecimiento \\ semanal} = \\frac{\\sum_{i=1}^{7} Dato_{i}}{\\sum_{i=7}^{14} Dato_{i}} \n",
"\\end{align}\n",
"$$ (tasa_crecimiento)\n",
"\n",
"#### Mortalidad específica por cien mil habitantes\n",
"\n",
"La mortalidad específica entrega la cantidad de personas que fallecen por una determinada enfermedad, en un determinado período en una población. El determinado período se entiende en razón de que la pandemia aún no finaliza, y sería erróneo considerar la tasa de letalidad sabiendo que, aún no se registra la cantidad de contagiados y fallecidos totales por la enfermedad. En este caso, la contemplaremos por cada 100.000 habitantes.\n",
"\n",
"$$ \n",
"\\begin{align}\n",
"\\Large MORTALIDAD_{específica} = \\frac{fallecidos \\ acumulados}{población}*100000 \n",
"\\end{align}\n",
"$$ (mortalidad_especifica)\n",
"\n",
"#### UCI diaria aproximada\n",
"\n",
"En razón de que:\n",
"\n",
"- No se entrega una ocupación UCI por región en los reportes diarios del Ministerio de Salud.\n",
"\n",
"- Los datos disponibles respecto a la cantidad de camas disponibles y utilizadas tienen demora en actualizarse en la base de datos del MICITEC.\n",
"\n",
"Ésto nos genera un inconveniente particular, que es no tener un dato diario de la ocupación UCI regional. Para solucionar este problema, ocuparemos una aproximación. A la fecha (2021-05-04), la aproximación UCI diaria tiene un error absoluto del 0.017 ([Ejemplo 2](#ejemplo2)).\n",
"\n",
"La aproximación consiste en utilizar los últimos datos disponibles del producto 58 (csv58) y los datos diarios del producto 8 (csv8), calculando la ocupación de la siguiente forma, por media móvil semanal:\n",
"\n",
"$$\n",
"\\begin{align}\n",
"\\Large UCI_{diaria \\ aproximada} = \\frac{1}{7}\\sum_{i=1}^{7} (\\frac{(pacientes \\ covid_{csv8}) + (pacientes \\ no \\ covid_{csv58})}{(uci \\ disponibles_{csv58})})_{i} \n",
"\\end{align}\n",
"$$ (uci_diaria)\n",
"\n",
"#### Tasa de casos nuevos por cien mil habitantes\n",
"\n",
"Se entiende como la media móvil semanal de casos nuevos por cada cien mil habitantes. Se utiliza ampliamente en el plan Paso a Paso, y debido a la normalización, es un dato perfectamente comparable entre las regiones de Chile. Su cálculo es a partir de:\n",
"\n",
"$$\n",
"\\begin{align}\n",
"\\Large Tasa_{casos \\ nuevos} = \\frac{100000}{7*población}\\sum_{i=1}^{7} Dato_{i}\n",
"\\end{align}\n",
"$$ (tasa_casos)\n",
"\n",
"#### Tasa de incidencia (casos diarios)\n",
"\n",
"La incidencia (casos nuevos por cien mil habitantes diarios) - *que se puede encontrar en la base de datos* - es estimada con un 95% de confianza por ICOVIDCHILE. \n",
"\n",
"El **cálculo de la tasa de incidencia diaria**, a partir de los casos confirmados, es la misma fórmula que de la tasa de casos nuevos por cien mil habitantes, con la diferencia de no aplicar la media móvil semanal y ser cumulativo o acumulativo según lo aclare el nombre de la columna.\n",
"\n",
"#### Días por fase del plan Paso a Paso\n",
"\n",
"Variable que cuantifica la cantidad de días de una determinada fase del plan del Paso a Paso, por comuna. La variable, en sí, no requiere de una descripción. Se subentiende que, se acumulan los días que una determinada comuna estuvo en una determinada fase, haciendo un \"*reset*\" de días por cambio de fase de la comuna en el Paso a Paso.\n",
"\n",
"#### Inmunizaciones\n",
"\n",
"Para cálculo de personas personas inmunizadas consideraremos una metodología particular. La razón de la metodología es a razón de ahorrar mayor trabajo en calcular los intervalos de tiempo por inmunización:\n",
"\n",
"- Puntualmente, entiéndase por inmunización - *para este cálculo particular* -, **la suma de inmunizaciones eventuales** para aquellas personas con menos de dos semanas de innoculadas con 2° dosis o única (según el laboratorio de la vacuna) **e inmunizaciones completas** para personas con más de dos semanas de innoculadas con 2° dosis o única.\n",
"\n",
"- ¿Por qué utilizar el término **inmunización eventual**? Pues, ya que al autor está un poco quemado con programar cosas relacionadas a datos del COVID-19, no quiso programar la diferencia de las personas con inmunidad completa (*la que se logra una vez cumplidas las dos semanas tras su cuadro completo de vacunación*), con las inmunizaciones eventuales (*aquellas que aún no cumplen las dos semanas aprox. tras su cuadro completo de vacunación*). De esta forma, se utiliza el criterio metodológico especificado.\n",
"\n",
"$$\n",
"\\begin{align}\n",
"\\Large Inmunizadas_{total} = Población - Innoculaciones_{2° \\ dosis} - Innoculaciones_{única \\ dosis}\n",
"\\end{align}\n",
"$$ (inmunizadas_total)\n",
"\n",
"$$\n",
"\\begin{align}\n",
"\\Large Inmunizadas_{objetivo} = Población*0.8 - Innoculaciones_{2° \\ dosis} - Innoculaciones_{única \\ dosis}\n",
"\\end{align}\n",
"$$ (inmunizadas_objetivo)\n",
"\n",
"$$\n",
"\\begin{align}\n",
"\\Large Sin_{inmunizar \\ o \\ con \\ protección \\ parcial} = Población - Innoculaciones_{1° \\ dosis}\n",
"\\end{align}\n",
"$$ (sin_inmunizar)\n",
"\n",
"> Debido a que, recientemente, se establece que \"*En todos aquellos hombres menores de 45 años que han recibido una primera dosis de vacuna del laboratorio AstraZeneca, se completara su esquema con una segunda dosis del laboratorio Pfizer- BioNTech*\" de acuerdo al Dashboard del DEIS del Ministerio de Salud, algunos datos producto de metodología pueden variar*.\n",
"\n",
"#### Tasa de activos\n",
"\n",
"La tasa de activos, también denominada incidencia (activos), cuantifica la **velocidad de ocurriencia de infectados**. En este caso, se basa en el lapso temporal de los activos, a partir de los infectados en los últimos 11 días.\n",
"\n",
"Por otro lado, según *Principales medidas en epidemiología* {cite}``medidas-epidemiologia``, \"*En los estudios epidemiológicos en los que el propósito es la investigación causal o la evaluación de medidas preventivas, el interés está dirigido a la medición del flujo que se establece entre la salud y la enfermedad, es decir, a la aparición de casos nuevos. Como ya se mencionó anteriormente, la medida epidemiológica que mejor expresa este cambio de estado es la incidencia, la cual indica la frecuencia con que ocurren nuevos eventos*\" {footcite}``medidas-epidemiologia``.\n",
"\n",
"$$\n",
"\\begin{align}\n",
"\\Large Tasa_{activos} = \\frac{Activos_{confirmados}}{población}*100000\n",
"\\end{align}\n",
"$$ (incidencia)\n",
"\n",
"> La tasa de activos puede variar respecto al informe epidemiológico dado que la del presente repositorio se registra un día después (*con los datos del día anterior por el corte*).\n",
"\n",
"> Al 13 de enero de 2022, se modifica la fórmula empleando la utilizada por el Ministerio de Salud de Chile a modo de cuadrar con lo entregado por el mismo ministerio en sus reportes diarios.\n",
"\n",
"\n",
"### Limpieza de datos\n",
"\n",
"En toda recolección de información, se quiera o no, existirá inconsistencia. Algunos días, se genera inconsistencia producto de:\n",
"\n",
"- Cambios de criterio.\n",
"\n",
"- Suma de cifras de otros días en un día específico (**ajustes históricos considerables**).\n",
"\n",
"Ésto afecta las tendencias y las curvas de los datos cumulativos. \n",
"\n",
"#### Tratamiento\n",
"\n",
"Nuestro trabajo es, dentro de lo posible, limpiar esa inconsistencia. Por lo que, a lo largo del código, se optará por reemplazar los **outliers** (datos atípicos) con cifras del día anterior, **pero, solo en las cifras cumulativas, de modo de no generar descuadre con respecto al Minsal en las cifras acumulativas**.\n",
"\n",
"### Manipulando (*ahora sí*)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"lines_to_next_cell": 2
},
"outputs": [],
"source": [
"# Manipulando datos\n",
"\n",
"### Población segregada por comuna\n",
"poblacion = csv7.loc[1, 'Tarapacá']\n",
"### Población por comuna\n",
"poblaciones_comunales = csv38[csv38['Region'] == 'Tarapaca'][:-2]['Poblacion']\n",
"poblaciones_comunales.index = np.arange(7)\n",
"\n",
"### Obteniendo casos cumulativos\n",
"casos_cumulativos = csv13.loc[:, 'Tarapacá']\n",
"casos_cumulativos.index = csv13['Region']\n",
"\n",
"### Obteniendo casos acumulativos\n",
"casos_acumulativos = csv3.loc[:, 'Tarapacá']\n",
"casos_acumulativos.index = csv3['Region']\n",
"\n",
"### Obteniendo fallecidos acumulativos\n",
"fallecidos_acumulativos = csv14.loc[:, 'Tarapacá']\n",
"fallecidos_diarios = fallecidos_acumulativos - fallecidos_acumulativos.shift(1)\n",
"fallecidos_acumulativos.index, fallecidos_diarios.index = csv14['Region'], csv14['Region']\n",
"\n",
"### Obteniendo PCR\n",
"pcr_cumulativos = csv7.loc[:, 'Tarapacá'][2:]\n",
"pcr_cumulativos.index = csv7['Region'][2:]\n",
"\n",
"### El día 12 de mayo se registraron más casos de los PCR que se informaron, lo que es imposible\n",
"### Asignamos los PCR del 13 de mayo de 2020, a los del 12 de mayo del mismo año\n",
"### Posiblemente, es un dato mal registrado\n",
"pcr_cumulativos['2020-05-13'] = pcr_cumulativos['2020-05-12']\n",
"pcr_acumulativos = pcr_cumulativos.cumsum()\n",
"\n",
"### Obteniendo UCI diaria con COVID-19\n",
"uci_diaria = csv8.loc[:, 'Tarapacá'][2:]\n",
"uci_diaria.index = csv8['Region'][2:]\n",
"\n",
"### Obteniendo detalle de casos (sintomáticos, asintomáticos, etc.)\n",
"casos_detalle = csv3_detalle[csv3_detalle['Region'] == 'Tarapacá']\n",
"\n",
"### Obteniendo residencias\n",
"residencias = csv36[csv36['Region'] == 'Tarapacá']\n",
"\n",
"### Obteniendo encuesta nacional de medicina intensiva (desactualizada)\n",
"# sochimi = csv48[csv48['Region'] == 'Tarapacá']\n",
"\n",
"### Obteniendo detalle de UCI semanal\n",
"uci_detalle = csv58[csv58['Region'] == 'Tarapacá']\n",
"uci_habilitadas = uci_detalle[uci_detalle['Serie'] == 'Camas UCI habilitadas'].loc[:, '2020-04-14':].transpose().iloc[:, 0]\n",
"uci_ocupadas_covid = uci_detalle[uci_detalle['Serie'] == 'Camas UCI ocupadas COVID-19'].loc[:, '2020-04-14':].transpose().iloc[:, 0]\n",
"uci_ocupadas_nocovid = uci_detalle[uci_detalle['Serie'] == 'Camas UCI ocupadas no COVID-19'].loc[:, '2020-04-14':].transpose().iloc[:, 0]\n",
"\n",
"### Añadiendo cifras recopiladas por Dr. Cristóbal Corral con metodología de conteo anterior al criterio actual\n",
"activos_rescatados = [1,4,4,5,5,5,6,8,10,10,12,13,17,20,20,19,22,24,30,33,40,44,52,52,54,60,64,70,72,81,88,99,99,104,109,111,106,120,131,126,130,181,201,217,224,288,324,342,364,383,409,432,484,578,632,700,758,784,797,826,930,982,1038,1077,1152,1186,1264,1302,1389,1369,1452,1466,1519,1540,1549,1598,1658,1734,1727,1745,1705,1696,1720,1747,1696,1736,2066,2019,1987,2000]\n",
"recuperados_rescatados = [1,4,4,5,5,5,6,8,10,10,12,13,17,20,21,23,26,29,35,38,46,52,62,62,66,73,81,90,93,104,114,128,134,142,155,163,168,182,197,199,211,271,294,321,338,416,458,484,519,546,577,614,681,777,843,971,1052,1105,1135,1242,1388,1466,1557,1623,1729,1800,1945,2079,2232,2340,2504,2571,2654,2782,2937,3064,3215,3357, 3545,3650,3775,3952,4087]\n",
"\n",
"### Obteniendo el detalle de los casos\n",
"casos_con_sintomas = casos_detalle[casos_detalle['Categoria'] == 'Casos nuevos con sintomas'].loc[:, '2020-03-03':].transpose().iloc[:, 0]\n",
"casos_sin_sintomas = casos_detalle[casos_detalle['Categoria'] == 'Casos nuevos sin sintomas'].loc[:, '2020-03-03':].transpose().iloc[:, 0]\n",
"casos_sin_notificar = casos_detalle[casos_detalle['Categoria'] == 'Casos nuevos sin notificar'].loc[:, '2020-03-03':].transpose().iloc[:, 0]\n",
"casos_recuperados = casos_detalle[casos_detalle['Categoria'] == 'Casos confirmados recuperados'].loc[:, '2020-03-03':].transpose().iloc[:, 0]\n",
"casos_recuperados['2020-04-07':'2020-06-28'] = recuperados_rescatados\n",
"casos_recuperados_cumulativos = casos_recuperados - casos_recuperados.shift(1)\n",
"### Limpieza de outlier de 981 (solo en cifras cumulativas para no descuadrar cifra acumulada)\n",
"casos_recuperados_cumulativos['2020-06-29'] = casos_recuperados_cumulativos['2020-06-28']\n",
"casos_activos = casos_detalle[casos_detalle['Categoria'] == 'Casos activos confirmados'].loc[:, '2020-03-03':].transpose().iloc[:, 0]\n",
"casos_activos['2020-03-23':'2020-06-20'] = activos_rescatados\n",
"casos_activos_probables = casos_detalle[casos_detalle['Categoria'] == 'Casos activos probables'].loc[:, '2020-03-03':].transpose().iloc[:, 0]\n",
"casos_cumulativos_antigeno = casos_detalle[casos_detalle['Categoria'] == 'Casos nuevos confirmados por antigeno'].loc[:, '2020-03-03':].transpose().iloc[:, 0]\n",
"casos_acumulativos_reinfeccion = casos_detalle[casos_detalle['Categoria'] == 'Casos con sospecha de reinfeccion'].loc[:, '2020-03-03':].transpose().iloc[:, 0]\n",
"\n",
"### Obteniendo el detalle de residencias\n",
"residencias_cupos = residencias[residencias['Categoria'] == 'cupos totales'].loc[:, '2020-05-29':].transpose().iloc[:, 0]\n",
"residencias_usuarios = residencias[residencias['Categoria'] == 'usuarios en residencia'].loc[:, '2020-05-29':].transpose().iloc[:, 0]\n",
"residencias_numero = residencias[residencias['Categoria'] == 'residencias'].loc[:, '2020-05-29':].transpose().iloc[:, 0]\n",
"\n",
"### Obteniendo el detalle de SOCHIMI (producto desactualizado e incompleto)\n",
"#sochimi_uci_ocupadas = sochimi[sochimi['Serie'] == 'Camas ocupadas intensivo'].loc[:, '2020-04-12':].transpose().iloc[:, 0]\n",
"#sochimi_uci_totales = sochimi[sochimi['Serie'] == 'Camas totales intensivo'].loc[:, '2020-04-12':].transpose().iloc[:, 0]\n",
"#sochimi_uti_ocupadas = sochimi[sochimi['Serie'] == 'Camas ocupadas intermedio'].loc[:, '2020-04-12':].transpose().iloc[:, 0]\n",
"#sochimi_uti_totales = sochimi[sochimi['Serie'] == 'Camas totales intermedio'].loc[:, '2020-04-12':].transpose().iloc[:, 0]\n",
"#sochimi_vmi_covid = sochimi[sochimi['Serie'] == 'Vmi covid19 confirmados'].loc[:, '2020-04-12':].transpose().iloc[:, 0]\n",
"#sochimi_vmi_sospecha = sochimi[sochimi['Serie'] == 'Vmi covid19 sospechosos'].loc[:, '2020-04-12':].transpose().iloc[:, 0]\n",
"#sochimi_vmi_ocupados = sochimi[sochimi['Serie'] == 'Vmi ocupados'].loc[:, '2020-04-12':].transpose().iloc[:, 0]\n",
"#sochimi_vmi_totales = sochimi[sochimi['Serie'] == 'Vmi totales'].loc[:, '2020-04-12':].transpose().iloc[:, 0]\n",
"\n",
"### Obteniendo R-efectivo\n",
"r_regional = csv54_regional[csv54_regional['Region'] == 'Tarapacá'][['fecha','r.estimado']]\n",
"r_regional.index = r_regional['fecha']\n",
"r_regional = r_regional['r.estimado']\n",
"r_provincial = csv54_provincial[csv54_provincial['Region'] == 'Tarapacá'][['fecha','r.estimado', 'Provincia']]\n",
"r_provincial.index = r_provincial['fecha']\n",
"r_provincial_iqq = r_provincial[r_provincial['Provincia'] == 'Iquique']['r.estimado']\n",
"r_provincial_tam = r_provincial[r_provincial['Provincia'] == 'Tamarugal']['r.estimado']\n",
"\n",
"### Obteniendo vacunacion\n",
"vacunacion = csv76[csv76['Region'] == 'Tarapacá'].transpose()\n",
"vacunacion = vacunacion.drop('Dosis').drop('Region')\n",
"vacunacion.index, vacunacion = pd.to_datetime(vacunacion.index), vacunacion.astype(int)\n",
"vacunacion.columns = ['1° Dosis', '2° Dosis', 'Unica dosis', 'Refuerzo', '4° Dosis']\n",
"\n",
"### Obteniendo vacunación por edades (dataframe aparte)\n",
"x = np.arange(5, 70, 10)\n",
"vacunacion_etaria = pd.DataFrame([])\n",
"for i in x:\n",
" vacunacion_etaria['{} a {}'.format(csv81_edad1[csv81_edad1['Region'] == 'Tarapaca'].iloc[:, i:i+10].columns[0],\n",
" csv81_edad1[csv81_edad1['Region'] == 'Tarapaca'].iloc[:, i:i+10].columns[-1])] \\\n",
" = [csv81_poblacionedad[csv81_poblacionedad['Region'] == 'Tarapaca'].iloc[:, i:i+10].sum().sum(),\n",
" csv81_edad1[csv81_edad1['Region'] == 'Tarapaca'].iloc[:, i:i+10].sum().sum(), \n",
" csv81_edad2[csv81_edad2['Region'] == 'Tarapaca'].iloc[:, i:i+10].sum().sum(),\n",
" csv81_edadunica[csv81_edad2['Region'] == 'Tarapaca'].iloc[:, i:i+10].sum().sum()]\n",
"vacunacion_etaria.index = ['Poblacion', '1° Dosis', '2° Dosis', 'Unica dosis']\n",
"vacunacion_etaria = vacunacion_etaria.transpose()\n",
"\n",
"### Antígenos en la región\n",
"antigenos = csv87[csv87['Region'] == 'Tarapacá'].loc[:, '2021-06-05':].transpose()\n",
"antigenos_acumulativos = antigenos.cumsum()\n",
"\n",
"### Obteniendo datos comunales\n",
"casoscomuna_acumulativos = csv1[csv1.columns[csv1.columns.str.contains('^Tarapac', na=False)]][4:]\n",
"casoscomuna_acumulativos.columns = 'Casos acumulados en ' + csv1[csv1.columns[csv1.columns.str.contains('^Tarapac', na=False)]].iloc[1].astype(str).\\\n",
"replace('Camina', 'Camiña').replace('Desconocido Tarapaca', 'Comuna desconocida')\n",
"casoscomuna_acumulativos.index = csv1['Region'][4:]\n",
"casoscomuna_acumulativos = casoscomuna_acumulativos.drop('Tasa')\n",
"\n",
"casoscomuna_activos = csv19[csv19.columns[csv19.columns.str.contains('^Tarapac', na=False)]][4:]\n",
"casoscomuna_activos.columns = 'Casos activos en ' + csv19[csv19.columns[csv19.columns.str.contains('^Tarapac', na=False)]].iloc[1].astype(str).\\\n",
"replace('Camina', 'Camiña').replace('Desconocido Tarapaca', 'Comuna desconocida')\n",
"casoscomuna_activos.index = csv19['Region'][4:]\n",
"casoscomuna_activos = casoscomuna_activos[casoscomuna_activos.columns[:-1]]\n",
"incidencia_activos = (((casos_activos)/poblacion)*100000)\n",
"\n",
"### Paso a paso histórico por comuna (descartamos zonas rurales)\n",
"pasopaso_comuna = csv74[csv74['region_residencia'] == 'Tarapacá'].transpose().loc[:, csv74[csv74['region_residencia'] == 'Tarapacá'].transpose().loc['zona',:] != 'Rural']\n",
"pasopaso_comuna.columns = 'Paso a Paso ' + pasopaso_comuna.transpose().loc[:, 'comuna_residencia']\n",
"pasopaso_comuna = pasopaso_comuna.drop(['codigo_region', 'codigo_comuna', 'comuna_residencia', 'zona', 'region_residencia'])\n",
"\n",
"### Movilidad\n",
"movilidad_sem = csv82_semana[csv82_semana['region'] == 1]\n",
"movilidad_finsem = csv82_finsemana[csv82_finsemana['region'] == 1]\n",
"movilidad_comuna = pd.concat([movilidad_sem, movilidad_finsem])\n",
"movilidad_comuna['fecha_inicio'], movilidad_comuna['fecha_termino'] = pd.to_datetime(movilidad_comuna['fecha_inicio']), pd.to_datetime(movilidad_comuna['fecha_termino'])\n",
"movilidad_comuna = movilidad_comuna.sort_values(by=['fecha_inicio'])\n",
"\n",
"### Gracias a Erfan (stackoverflow.com/a/57334167/13746427) ###\n",
"movilidad_comuna['Fecha'] = movilidad_comuna.apply(\n",
" lambda x: pd.date_range(x['fecha_inicio'], x['fecha_termino']), axis=1\n",
")\n",
"movilidad_comuna = (\n",
" movilidad_comuna.explode('Fecha', ignore_index=True)\n",
" .drop(columns=['fecha_inicio', 'fecha_termino'])\n",
")\n",
"\n",
"movilidad_comuna.index = (movilidad_comuna['Fecha'])\n",
"### ¿Por qué no ocupar el Paso a Paso histórico de este archivo? Por la frecuencia de actualización ###\n",
"movilidad_comuna = movilidad_comuna.drop(['region', 'semana','paso', 'region', 'comuna', 'var_salidas_cota_inferior', \\\n",
" 'var_salidas_cota_superior', 'Fecha'], axis=1)\n",
"### Finalmente, código que nos segrega por comuna los valores de la movilidad ###\n",
"movilidad = pd.DataFrame([])\n",
"for comuna in pd.unique(movilidad_comuna.transpose().loc['nom_comuna', :]):\n",
" exec('movilidad[\"{}\"] = movilidad_comuna[movilidad_comuna[\"nom_comuna\"] == \"{}\"][\"var_salidas\"]'\\\n",
" .format(str('Movilidad ' + comuna.capitalize()), comuna))\n",
"movilidad.index = movilidad.index.astype(str)\n",
"movilidad = movilidad.loc['2020-03-03':, :]\n",
"\n",
"### Arreglamos tilde para coincidir\n",
"csv61['Region'] = csv61['Region'].replace('Tarapacá', 'Tarapaca')\n",
"\n",
"### Notificación PCR, búsqueda activa, positividad, cobertura de testeo, oportunidad en la notificación por comuna,\n",
"### fallecidos no procesados por deis y fallecidos procesados por deis\n",
"### Se rellenan días sin registro con la última observación válida\n",
"### Exceptuando días antes del primer caso y últimos días sin información ###\n",
"csvs = ['csv63', 'csv64', 'csv65', 'csv66', 'csv67', 'csv38', \"csv61[csv61['CIE 10'] == 'U07.1']\", \"csv61[csv61['CIE 10'] == 'U07.2']\"]\n",
"var = ['notificacion', 'bac', 'positividad', 'cobertura', 'oportunidad', 'fallecidos', 'fallecidosdeis_conf', 'fallecidosdeis_prob']\n",
"nom = ['Notificacion PCR', 'BAC' , 'Positividad', 'Cobertura de testeo', 'Oportunidad en notificacion', 'Fallecidos', \\\n",
" 'Fallecidos confirmados DEIS', 'Fallecidos probables DEIS']\n",
"i = 0\n",
"for csv in csvs:\n",
" exec('{}_comuna = pd.DataFrame([], index=casos_cumulativos.index)'.format(var[i]))\n",
" exec('{}_comuna = {}_comuna.join({}[{}[\"Region\"] == \"Tarapaca\"].transpose())'.format(var[i], var[i], csv, csv))\n",
" exec('{}_comuna.columns = \"{} \" + {}[{}[\"Region\"] == \"Tarapaca\"].transpose().loc[\"Comuna\", :].replace(\"Camina\", \"Camiña\")'.format(var[i], nom[i], csv, csv))\n",
" exec('for col in {}_comuna: \\\n",
" {}_comuna[col]\\\n",
" [{}_comuna[col].first_valid_index():{}_comuna[col].last_valid_index()] = \\\n",
" {}_comuna[col]\\\n",
" [{}_comuna[col].first_valid_index():{}_comuna[col].last_valid_index()]\\\n",
" .fillna(method=\"ffill\", inplace=False)'.format(var[i], var[i], var[i], var[i], var[i], var[i], var[i]))\n",
" i += 1\n",
"\n",
"### Vacunados con cuadro completo menores de 18 años\n",
"menores18 = csv81_edad2[csv81_edad2['Region'] == 'Tarapaca'].iloc[:, 5:11].sum().sum()\n",
" \n",
"### Incidencia acumulada por comuna\n",
"incidencia_acumulada = csv18[csv18.Region == 'Tarapaca'].transpose().drop(['Region', 'Codigo region', 'Comuna',\n",
" 'Codigo comuna', 'Poblacion'])\n",
"incidencia_acumulada.columns = 'Incidencia acumulada ' + csv18[\n",
" csv18.Region == 'Tarapaca'].transpose().loc['Comuna', :].replace('Total', 'regional')\n",
" \n",
"### Otras cifras\n",
"uciocupacion_nacional = round(((int(csv58[(csv58['Region'] == 'Total') & (csv58['Serie'] == 'Camas UCI ocupadas no COVID-19')].\\\n",
" transpose().iloc[-1]) + int(csv58[(csv58['Region'] == 'Total') & (csv58['Serie'] == 'Camas UCI ocupadas COVID-19')]\\\n",
" .transpose().iloc[-1]))/csv58[(csv58['Region'] == 'Total') & (csv58['Serie'] == 'Camas UCI habilitadas')]\\\n",
" .transpose().iloc[-1])[16] * 100, 0)\n",
"\n",
"### Tasa de incidencia (tasa de casos nuevos pero sin media móvil sem., i. e. casos nuevos por cien mil hab.)\n",
"### Regional\n",
"incidencia_regional = csv69_regional[csv69_regional.Region == 'Tarapacá'].drop(\n",
" ['Codigo region', 'carga.liminf', 'carga.lisup', 'Region'], axis=1)\n",
"incidencia_regional.index = incidencia_regional.fecha\n",
"incidencia_regional.drop(['fecha'], axis=1, inplace=True)\n",
"### Provincial\n",
"incidencia_provincial = csv69_provincial[csv69_provincial['Region'] == 'Tarapacá'][['fecha','carga.estimada', 'Provincia']]\n",
"incidencia_provincial.index = incidencia_provincial['fecha']\n",
"incidencia_provincial_iqq = incidencia_provincial[incidencia_provincial['Provincia'] == 'Iquique']['carga.estimada']\n",
"incidencia_provincial_tam = incidencia_provincial[incidencia_provincial['Provincia'] == 'Tamarugal']['carga.estimada']\n",
"\n",
"### Tasa de casos nuevos por provincia\n",
"tasacasosnuevos_provincial_iqq = incidencia_provincial_iqq.rolling(window=7).mean()\n",
"tasacasosnuevos_provincial_tam = incidencia_provincial_tam.rolling(window=7).mean()\n",
"\n",
"### Datos calculados ###\n",
"\n",
"### Positividad PCR sin redondear\n",
"positividad_diaria = ((casos_cumulativos - casos_cumulativos_antigeno)/pcr_cumulativos)*100\n",
"### Rellenamos datos anteriores al primer registro de los antígenos\n",
"positividad_diaria = positividad_diaria.fillna(100*(casos_cumulativos)/pcr_cumulativos)\n",
"\n",
"### Positividad media móvil redondeada\n",
"positividad_media_movil = positividad_diaria.rolling(7).mean().round(2)\n",
"### Rellenamos datos anteriores al primer registro de los antígenos\n",
"positividad_media_movil = positividad_diaria.fillna(100*(casos_cumulativos)/pcr_cumulativos).rolling(7).mean().round(2)\n",
"\n",
"## Positividad PCR redondeada\n",
"positividad_diaria = positividad_diaria.round(2)\n",
"\n",
"### Positividad diaria ANTÍGENO\n",
"positividad_antigeno = (casos_cumulativos_antigeno[antigenos.first_valid_index():].transpose()/\n",
" antigenos[antigenos.first_valid_index():].transpose() * 100).transpose()\n",
"\n",
"### Positividad media móvil ANTÍGENO\n",
"positividad_antigeno_media_movil = (casos_cumulativos_antigeno[antigenos.first_valid_index():].transpose()/\n",
" antigenos[antigenos.first_valid_index():].transpose() * 100).transpose().rolling(7).mean()\n",
"\n",
"### Tasa de crecimiento semanal y diaria\n",
"crecimiento = casos_cumulativos.rolling(7).sum()/casos_cumulativos.rolling(7).sum().shift(7)\n",
"crecimientodiario = casos_cumulativos/casos_cumulativos.shift(1)\n",
"### Limpieza de outlier de 41\n",
"crecimientodiario['2020-12-13'] = crecimientodiario['2020-12-12']\n",
"\n",
"### Mortalidad específica por cien mil habitantes\n",
"mortalidad_especifica = (((fallecidos_acumulativos) / poblacion)*100000)\n",
"\n",
"### Mortalidad específica por cien mil habitantes por comuna\n",
"j = 0\n",
"me_comuna = pd.DataFrame([])\n",
"for col in fallecidosdeis_conf_comuna:\n",
" me_comuna['Mortalidad especifica comunal {} *'.format(col[28:])] = fallecidosdeis_conf_comuna[col]/poblaciones_comunales[j]*100000\n",
" me_comuna['Mortalidad especifica comunal {} *'.format(col[28:])] = me_comuna['Mortalidad especifica comunal {} *'.format(col[28:])].astype(float)\n",
" j += 1\n",
" \n",
"### UCI diaria aproximada, real y error absoluto\n",
"uci_aprox = (100*(uci_diaria + uci_ocupadas_nocovid)/uci_habilitadas).rolling(7).mean()\n",
"### Rellenamos con últimos disponibles datos las filas faltantes\n",
"uci_aprox.loc[uci_aprox.last_valid_index():] = (100*(uci_diaria + uci_ocupadas_nocovid[uci_ocupadas_nocovid.last_valid_index()])/uci_habilitadas[uci_habilitadas.last_valid_index()]).rolling(7).mean()\n",
"uci_real = (100*(uci_ocupadas_covid + uci_ocupadas_nocovid)/uci_habilitadas).rolling(7).mean()\n",
"error_abs = abs(((uci_real) - (uci_aprox[:uci_habilitadas.last_valid_index()])))\n",
"\n",
"### Tasa de casos nuevos por cien mil habitantes\n",
"tasa_casosnuevos = ((casos_cumulativos.rolling(window=7).mean()/poblacion)*100000)\n",
"\n",
"### Días por fase del plan Paso a Paso\n",
"### Gracias a P.Tillmann (stackoverflow.com/q/25119524/13746427), código para contar duración en días por fase ###\n",
"for col in pasopaso_comuna:\n",
" pasopaso_comuna['Paso a Paso (dias) ' + col[5:]] = pasopaso_comuna.groupby((pasopaso_comuna[col] != pasopaso_comuna[col].shift(1)).cumsum()).cumcount()\n",
"\n",
"### Población yomevacuno\n",
"poblacion_yomevacuno = 286597"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Uniendo en una sola tabla\n",
"\n",
"---\n",
"\n",
"En razón de contar con los datos de la Región de Tarapacá unificados, procederemos a unir todos los datos en una tabla (DataFrame). Absolutamente todos las salidas (imágenes, archivos, descripciones, etc.) se basan en ella.\n",
"\n",
"### ¿Por qué unificar los datos?\n",
"\n",
"La primera vez que trabajé con código en Ciencia de Datos, recuerdo haber utilizado las bases de datos de pétalos y sépalos en R Studio, y me preguntaba, ¿podré algún día generar algo similar en base a determinadas observaciones? Quizás, por allí va el por qué del querer unificar todos los datos en un solo archivo, aunque también, en el anhelo que le pueda servir a alguien en un futuro no muy lejano para cuantificar las cifras de la pandemia del COVID-19 en la Región de Tarapacá... Por cierto, nací iquiqueño y al día en que escribo, 31/05/2021, estoy en vías de emprender migración a otra ciudad. Quizás, Numeral.lab, es el aporte a esta tierra que me brindó, junto con mi familia, todo lo que soy (para bien o para mal, todo es dual). \n",
"\n",
"Los cambios siempre son para mejor."
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n", " | Casos confirmados acumulados | \n", "Casos recuperados acumulados | \n", "Casos fallecidos acumulados | \n", "Casos activos confirmados | \n", "Casos activos probables | \n", "Casos nuevos | \n", "Casos nuevos con sintomas | \n", "Casos nuevos sin sintomas | \n", "Casos nuevos por laboratorio | \n", "Casos nuevos por antigeno | \n", "Casos con sospecha de reinfeccion | \n", "Casos recuperados nuevos | \n", "Casos fallecidos nuevos | \n", "Antigenos informados nuevos | \n", "Antigenos informados acumulados | \n", "PCR informados nuevos | \n", "PCR informados acumulados | \n", "Cupos en residencias | \n", "Usuarios en residencias | \n", "Numero de residencias | \n", "UCI habilitadas | \n", "UCI ocupadas por confirmados | \n", "UCI ocupadas por no confirmados | \n", "UCI ocupacion media movil real | \n", "Re regional | \n", "... | \n", "Incidencia acumulada Alto Hospicio | \n", "Incidencia acumulada Camina | \n", "Incidencia acumulada Colchane | \n", "Incidencia acumulada Huara | \n", "Incidencia acumulada Iquique | \n", "Incidencia acumulada Pica | \n", "Incidencia acumulada Pozo Almonte | \n", "Incidencia acumulada regional | \n", "Positividad media movil * | \n", "Mortalidad especifica * | \n", "Crecimiento semanal * | \n", "Crecimiento diario * | \n", "UCI ocupacion media movil aprox * | \n", "UCI error abs * | \n", "Tasa casos nuevos * | \n", "Positividad antigeno * | \n", "Positividad antigeno media movil * | \n", "Mortalidad especifica comunal Alto Hospicio * | \n", "Mortalidad especifica comunal Camiña * | \n", "Mortalidad especifica comunal Colchane * | \n", "Mortalidad especifica comunal Huara * | \n", "Mortalidad especifica comunal Iquique * | \n", "Mortalidad especifica comunal Pica * | \n", "Mortalidad especifica comunal Pozo Almonte * | \n", "Tasa de activos (incidencia) * | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Fecha | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
2020-03-03 | \n", "0.00 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "0.00 | \n", "0.00 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "... | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "
2020-03-04 | \n", "0.00 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "0.00 | \n", "0.00 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "... | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "
2020-03-05 | \n", "0.00 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "0.00 | \n", "0.00 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "... | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "
2020-03-06 | \n", "0.00 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "0.00 | \n", "0.00 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "... | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "
2020-03-07 | \n", "0.00 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "0.00 | \n", "0.00 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "... | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "
... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
2022-01-15 | \n", "52,716.00 | \n", "46,573.00 | \n", "837.00 | \n", "5,220.00 | \n", "0.00 | \n", "1,136.00 | \n", "603.00 | \n", "98.00 | \n", "435.00 | \n", "273.00 | \n", "116.00 | \n", "563.00 | \n", "1.00 | \n", "893.00 | \n", "88,564.00 | \n", "3,309.00 | \n", "755,909.00 | \n", "455.00 | \n", "403.00 | \n", "7.00 | \n", "31.00 | \n", "5.00 | \n", "20.00 | \n", "73.52 | \n", "NaN | \n", "... | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "16.84 | \n", "218.67 | \n", "2.54 | \n", "1.29 | \n", "73.52 | \n", "0.00 | \n", "197.13 | \n", "30.57 | \n", "25.29 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "1,363.73 | \n", "
2022-01-16 | \n", "53,576.00 | \n", "47,187.00 | \n", "837.00 | \n", "5,465.00 | \n", "0.00 | \n", "877.00 | \n", "376.00 | \n", "146.00 | \n", "355.00 | \n", "259.00 | \n", "122.00 | \n", "614.00 | \n", "0.00 | \n", "694.00 | \n", "89,258.00 | \n", "2,872.00 | \n", "758,781.00 | \n", "455.00 | \n", "419.00 | \n", "7.00 | \n", "31.00 | \n", "6.00 | \n", "16.00 | \n", "72.94 | \n", "NaN | \n", "... | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "18.05 | \n", "218.67 | \n", "2.44 | \n", "0.77 | \n", "72.94 | \n", "0.00 | \n", "210.23 | \n", "37.32 | \n", "28.30 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "1,427.74 | \n", "
2022-01-17 | \n", "54,544.00 | \n", "47,814.00 | \n", "840.00 | \n", "5,802.00 | \n", "0.00 | \n", "982.00 | \n", "401.00 | \n", "140.00 | \n", "441.00 | \n", "184.00 | \n", "130.00 | \n", "627.00 | \n", "3.00 | \n", "595.00 | \n", "89,853.00 | \n", "3,308.00 | \n", "762,089.00 | \n", "455.00 | \n", "373.00 | \n", "7.00 | \n", "31.00 | \n", "8.00 | \n", "21.00 | \n", "76.10 | \n", "NaN | \n", "... | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "19.61 | \n", "219.45 | \n", "2.10 | \n", "1.12 | \n", "76.10 | \n", "0.00 | \n", "222.51 | \n", "30.92 | \n", "28.95 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "1,515.78 | \n", "
2022-01-18 | \n", "55,489.00 | \n", "48,569.00 | \n", "840.00 | \n", "5,992.00 | \n", "1.00 | \n", "944.00 | \n", "460.00 | \n", "86.00 | \n", "398.00 | \n", "186.00 | \n", "141.00 | \n", "755.00 | \n", "0.00 | \n", "580.00 | \n", "90,433.00 | \n", "3,203.00 | \n", "765,292.00 | \n", "455.00 | \n", "398.00 | \n", "7.00 | \n", "31.00 | \n", "9.00 | \n", "16.00 | \n", "77.42 | \n", "NaN | \n", "... | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "20.42 | \n", "219.45 | \n", "1.85 | \n", "0.96 | \n", "71.43 | \n", "5.99 | \n", "233.63 | \n", "32.07 | \n", "30.46 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "1,565.42 | \n", "
2022-01-19 | \n", "56,461.00 | \n", "49,340.00 | \n", "840.00 | \n", "6,193.00 | \n", "0.00 | \n", "974.00 | \n", "510.00 | \n", "140.00 | \n", "324.00 | \n", "312.00 | \n", "145.00 | \n", "771.00 | \n", "0.00 | \n", "990.00 | \n", "91,423.00 | \n", "2,479.00 | \n", "767,771.00 | \n", "455.00 | \n", "438.00 | \n", "7.00 | \n", "NaN | \n", "8.00 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "... | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "22.07 | \n", "219.45 | \n", "1.75 | \n", "1.03 | \n", "72.81 | \n", "NaN | \n", "247.03 | \n", "31.52 | \n", "30.91 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "1,617.93 | \n", "
688 rows × 156 columns
\n", "\n", " | Nombre | \n", "Apellido | \n", "Universidad | \n", "
---|---|---|---|
0 | \n", "Juan | \n", "Ponce | \n", "uchile | \n", "
1 | \n", "Ermógenes | \n", "Pérez | \n", "usch | \n", "
\n", "-----\n", "PIL 8.4.0\n", "bs4 4.10.0\n", "datetime NA\n", "json 2.0.9\n", "locale NA\n", "markdownify NA\n", "math NA\n", "matplotlib 3.4.3\n", "natsort 8.0.2\n", "numpy 1.20.3\n", "os NA\n", "pandas 1.3.4\n", "pkg_resources NA\n", "plotly 5.5.0\n", "pybtex 0.24.0\n", "requests 2.26.0\n", "scipy 1.7.1\n", "seaborn 0.11.2\n", "session_info 1.0.0\n", "sklearn 0.24.2\n", "time NA\n", "types NA\n", "-----\n", "\n", "
\n", "abc NA\n", "anyio NA\n", "argparse 1.1\n", "array NA\n", "ast NA\n", "asyncio NA\n", "atexit NA\n", "attr 21.2.0\n", "babel 2.9.1\n", "backcall 0.2.0\n", "base64 NA\n", "bdb NA\n", "beta_ufunc NA\n", "binascii NA\n", "binom_ufunc NA\n", "bisect NA\n", "bottleneck 1.3.2\n", "brotli NA\n", "bz2 NA\n", "cProfile NA\n", "calendar NA\n", "certifi 2021.10.08\n", "cffi 1.14.6\n", "chardet 4.0.0\n", "charset_normalizer 2.0.4\n", "cmath NA\n", "cmd NA\n", "code NA\n", "codecs NA\n", "codeop NA\n", "collections NA\n", "colorama 0.4.4\n", "colorsys NA\n", "concurrent NA\n", "configparser NA\n", "contextlib NA\n", "contextvars NA\n", "copy NA\n", "copyreg NA\n", "csv 1.0\n", "ctypes 1.1.0\n", "cycler 0.10.0\n", "cython_runtime NA\n", "dataclasses NA\n", "dateutil 2.8.2\n", "debugpy 1.4.1\n", "decimal 1.70\n", "decorator 5.1.0\n", "defusedxml 0.7.1\n", "difflib NA\n", "dis NA\n", "distutils 3.9.7\n", "email NA\n", "encodings NA\n", "entrypoints 0.3\n", "enum NA\n", "errno NA\n", "faulthandler NA\n", "filecmp NA\n", "fnmatch NA\n", "fractions NA\n", "functools NA\n", "gc NA\n", "genericpath NA\n", "getopt NA\n", "getpass NA\n", "gettext NA\n", "glob NA\n", "gzip NA\n", "hashlib NA\n", "heapq NA\n", "hmac NA\n", "html NA\n", "html5lib 1.1\n", "http NA\n", "idna 3.2\n", "imp NA\n", "importlib NA\n", "inspect NA\n", "io NA\n", "ipaddress 1.0\n", "ipykernel 6.4.1\n", "ipython_genutils 0.2.0\n", "ipywidgets 7.6.5\n", "itertools NA\n", "jedi 0.18.0\n", "jinja2 2.11.3\n", "joblib 1.1.0\n", "json5 NA\n", "jsonschema 3.2.0\n", "jupyter_server 1.4.1\n", "jupyterlab_server 2.8.2\n", "keyword NA\n", "kiwisolver 1.3.1\n", "linecache NA\n", "logging 0.5.1.2\n", "lxml 4.6.3\n", "lzma NA\n", "markupsafe 1.1.1\n", "marshal 4\n", "matplotlib_inline NA\n", "mimetypes NA\n", "mkl 2.4.0\n", "mmap NA\n", "mpl_toolkits NA\n", "msvcrt NA\n", "multiprocessing NA\n", "nbclassic NA\n", "nbformat 5.1.3\n", "nbinom_ufunc NA\n", "netrc NA\n", "nt NA\n", "ntpath NA\n", "ntsecuritycon NA\n", "nturl2path NA\n", "numbers NA\n", "numexpr 2.7.3\n", "olefile 0.46\n", "opcode NA\n", "operator NA\n", "packaging 21.0\n", "parso 0.8.2\n", "pathlib NA\n", "pdb NA\n", "pickle NA\n", "pickleshare 0.7.5\n", "pkgutil NA\n", "platform 1.0.8\n", "plistlib NA\n", "posixpath NA\n", "pprint NA\n", "profile NA\n", "prometheus_client NA\n", "prompt_toolkit 3.0.20\n", "pstats NA\n", "psutil 5.8.0\n", "pvectorc NA\n", "pydev_ipython NA\n", "pydevconsole NA\n", "pydevd 2.4.1\n", "pydevd_concurrency_analyser NA\n", "pydevd_file_utils NA\n", "pydevd_plugins NA\n", "pydevd_tracing NA\n", "pydoc NA\n", "pydoc_data NA\n", "pyexpat NA\n", "pygments 2.10.0\n", "pyparsing 3.0.4\n", "pyrsistent NA\n", "pythoncom NA\n", "pytz 2021.3\n", "pywintypes NA\n", "queue NA\n", "quopri NA\n", "random NA\n", "re 2.2.1\n", "reprlib NA\n", "runpy NA\n", "secrets NA\n", "select NA\n", "selectors NA\n", "send2trash NA\n", "shlex NA\n", "shutil NA\n", "signal NA\n", "site NA\n", "six 1.16.0\n", "sniffio 1.2.0\n", "socket NA\n", "socketserver 0.4\n", "socks 1.7.1\n", "soupsieve 2.2.1\n", "sphinxcontrib NA\n", "sqlite3 2.6.0\n", "sre_compile NA\n", "sre_constants NA\n", "sre_parse NA\n", "ssl NA\n", "stat NA\n", "statsmodels 0.12.2\n", "storemagic NA\n", "string NA\n", "stringprep NA\n", "struct NA\n", "subprocess NA\n", "sys 3.9.7 (default, Sep 16 2021, 16:59:28) [MSC v.1916 64 bit (AMD64)]\n", "sysconfig NA\n", "tarfile 0.9.0\n", "tempfile NA\n", "tenacity NA\n", "textwrap NA\n", "threading NA\n", "timeit NA\n", "token NA\n", "tokenize NA\n", "tornado 6.1\n", "traceback NA\n", "traitlets 5.1.0\n", "typing NA\n", "typing_extensions NA\n", "unicodedata NA\n", "unittest NA\n", "urllib NA\n", "urllib3 1.26.7\n", "uu NA\n", "uuid NA\n", "warnings NA\n", "wcwidth 0.2.5\n", "weakref NA\n", "webbrowser NA\n", "webencodings 0.5.1\n", "win32api NA\n", "win32com NA\n", "win32con NA\n", "win32security NA\n", "win32trace NA\n", "winerror NA\n", "winreg NA\n", "wsgiref NA\n", "xml NA\n", "xmlrpc NA\n", "zipfile NA\n", "zipimport NA\n", "zlib 1.0\n", "zmq 22.2.1\n", "zope NA\n", "\n", "
\n", "-----\n", "IPython 7.29.0\n", "jupyter_client 6.1.12\n", "jupyter_core 4.8.1\n", "jupyterlab 3.2.1\n", "notebook 6.4.5\n", "-----\n", "Python 3.9.7 (default, Sep 16 2021, 16:59:28) [MSC v.1916 64 bit (AMD64)]\n", "Windows-10-10.0.22000-SP0\n", "12 logical CPU cores, Intel64 Family 6 Model 158 Stepping 10, GenuineIntel\n", "-----\n", "Session information updated at 2022-01-19 15:39\n", "\n", "