{"id":92252,"date":"2024-04-09T08:04:54","date_gmt":"2024-04-09T07:04:54","guid":{"rendered":"https:\/\/www.devoteam.com\/expert-view\/analisis-de-datos-mediante-la-libreria-pandas-de-python\/"},"modified":"2024-04-09T08:04:54","modified_gmt":"2024-04-09T07:04:54","slug":"analisis-de-datos-mediante-la-libreria-pandas-de-python","status":"publish","type":"expert-view","link":"https:\/\/devoteam.info\/es\/expert-view\/analisis-de-datos-mediante-la-libreria-pandas-de-python\/","title":{"rendered":"An\u00e1lisis de datos mediante la librer\u00eda Pandas de Python"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">En este art\u00edculo, os mostramos un ejemplo pr\u00e1ctico de an\u00e1lisis de datos mediante&nbsp;<strong>la librer\u00eda Pandas de Python.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Veremos los distintos procesos que se requieren para llevar a cabo esta tarea, ya que&nbsp;<strong>no solo consiste en analizar los datos<\/strong>&nbsp;sino que abarca otros procesos igual de importantes como son la carga de los datos y limpiar los datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Estos dos procesos: obtenci\u00f3n de los datos y limpieza de los mismos, son procesos que son necesarios tambi\u00e9n en el Machine Learning (de hecho suponen cerca del 80% del tiempo empleado).<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Son procesos muy importantes y deben realizarse con cuidado ya que la calidad del resultado del an\u00e1lisis de datos o del modelo generado en el caso de Machine Learning dependen en gran medida de la calidad de los datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>El art\u00edculo se ha realizado en un notebook de Jupyter para que tanto el c\u00f3digo como la documentaci\u00f3n esten en un mismo sitio.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El c\u00f3digo puede ser ejecutado desde una terminal de forma normal (se puede extraer el c\u00f3digo del notebook de forma sencilla desde la interfaz de Jupyter).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para instalar Jupyter puede serguir las instrucciones indicadas en la\u00a0<a href=\"https:\/\/jupyter.org\/install\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>web oficial<\/strong><\/a>\u00a0o\u00a0<a href=\"https:\/\/github.com\/jupyter\/docker-stacks\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>usando Docker<\/strong><\/a>. Tambi\u00e9n se puede usar\u00a0<a href=\"https:\/\/colab.research.google.com\/notebooks\/intro.ipynb#recent=true\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>un servicio online<\/strong><\/a>\u00a0si no se desea instalar nada.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Caso de estudio y objetivo del an\u00e1lisis de datos<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para nuestro ejemplo de an\u00e1lisis de datos utilizaremos&nbsp;<a href=\"https:\/\/datosclima.es\/Aemet2013\/DescargaDatos.html\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>los datos que provee la AEMET<\/strong><\/a>&nbsp;(Agencia estatal de Meteorolog\u00eda). Hemos usado los enlaces disponibles en su web ya que es mas sencilla su descarga.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Los datos contienen informaci\u00f3n diaria sobre&nbsp;<strong>temperatura<\/strong>&nbsp;(m\u00e1xima, m\u00ednima y media),&nbsp;<strong>viento<\/strong>&nbsp;(racha y velocidad m\u00e1xima de las medias) y&nbsp;<strong>precipitaciones<\/strong>&nbsp;(total y por tramo horario) para cada estaci\u00f3n meteorol\u00f3gica de Espa\u00f1a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>En algunos casos falta informaci\u00f3n y eso se tiene que tener en cuenta durante el proceso de limpieza de datos.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por simplificar el dataset,&nbsp;<strong>hemos realizado el an\u00e1lisis de datos \u00fanicamente del mes de Enero del a\u00f1o 2020.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este art\u00edculo pretende ser simplemente un ejemplo de lo sencillo que es realizar operaciones sobre los datos mediante la librer\u00eda Pandas y va a consistir en obtener ciertos valores para tener una visi\u00f3n del clima en las distintas provincias de Espa\u00f1a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>No pretende ser un an\u00e1lisis de datos completo de la informaci\u00f3n meteorol\u00f3gica del mes de Enero en Espa\u00f1a.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>El art\u00edculo con los datos completos lo pod\u00e9is encontrar&nbsp;<a href=\"https:\/\/github.com\/hectorgarzon\/analisis-datos-con-pandas\/blob\/master\/analisis-datos-con-pandas.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">aqu\u00ed<\/a>.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Introducci\u00f3n a Pandas y Python<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Se va a usar el lenguaje Python<\/strong>&nbsp;ya que es probablemente el lenguaje m\u00e1s usado junto a R para el an\u00e1lisis cient\u00edfico de datos, as\u00ed como para el Machine Learning.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este ejercicio, hemos usado la versi\u00f3n 3 de Python.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pandas es la es la librer\u00eda de facto para el tratamiento y an\u00e1lisis de datos cuando usamos Python.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nos proporciona la clase&nbsp;<strong>Dataframe<\/strong>&nbsp;la cual&nbsp;<strong>permite almacenar los datos en un objeto similar a una tabla de una base de datos.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ciertas tareas, hemos utilizado otras librer\u00edas de Python.&nbsp;<strong>Todas ellas se han instalado mediante el gestor de librerias de Python, pip.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Implementaci\u00f3n y preparaci\u00f3n del an\u00e1lisis de datos<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n desglosaremos paso a paso el ejercicio pr\u00e1ctico. Si necesitas ayuda o quieres m\u00e1s informaci\u00f3n no dudes en\u00a0<a href=\"https:\/\/es.devoteam.com\/contacta-con-nosotros\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>ponerte en contacto con nosotros<\/strong><\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Importaci\u00f3n de las librerias necesarias<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">En primer lugar, debemos importar las librer\u00edas que vamos a usar:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Pandas<\/strong>: librer\u00eda principal para la carga y el an\u00e1lisis de datos.<\/li>\n\n\n\n<li><strong>Glob<\/strong>: librer\u00eda para la gesti\u00f3n de ficheros. En nuestro caso se usa \u00fanicamente para realizar la carga de varios ficheros de forma m\u00e1s sencilla.<\/li>\n\n\n\n<li><strong>Numpy<\/strong>: nos proporciona m\u00e9todos de gesti\u00f3n de arrays.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>#!pip install pandas\n#!pip install numpy\nimport pandas as pd\nimport glob\nimport numpy as np<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Carga de datos<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pandas nos permite obtener los datos de diversas fuentes, principalmente ficheros.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Adem\u00e1s, podemos leer directamente de distintos formatos de fichero:&nbsp;<strong>xls, csv, json, etc.<\/strong>&nbsp;En nuestro caso leeremos ficheros xls.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es importante tambi\u00e9n tener en cuenta que&nbsp;<strong>se puede escribir en el fichero el contenido de los datos, es decir, podemos leer los datos, modificarlos y escribirlos de nuevo en fichero.<\/strong>&nbsp;De esta forma podemos hacer procesos de modificaci\u00f3n de datos de forma muy sencilla.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En nuestro caso, obtenemos los ficheros rar que contienen las hojas de c\u00e1lculo con los datos. Cada fichero rar contiene los ficheros xls correspondientes a cada d\u00eda de ese mes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Para nuestro an\u00e1lisis de datos hemos cogido solo 1 mes<\/strong>&nbsp;(Enero), pero ser\u00eda igual de sencillo cargar datos de otros meses.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>!wget https:\/\/datosclima.es\/capturadatos\/Aemet2019-01.rar\n\n--2020-07-09 18:10:33--  https:\/\/datosclima.es\/capturadatos\/Aemet2019-01.rar\nResolving datosclima.es (datosclima.es)... 95.217.108.87\nConnecting to datosclima.es (datosclima.es)|95.217.108.87|:443... connected.\nHTTP request sent, awaiting response... 200 OK\nLength: 1456378 (1.4M) &#91;application\/x-rar-compressed]\nSaving to: \u2018Aemet2019-01.rar.9\u2019\n\nAemet2019-01.rar.9  100%&#91;===================&gt;]   1.39M  3.00MB\/s    in 0.5s\n\n2020-07-09 18:10:33 (3.00 MB\/s) - \u2018Aemet2019-01.rar.9\u2019 saved &#91;1456378\/1456378]<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Instala unrar si es necesario\n!unrar e -o+ Aemet2019-01.rar\nUNRAR 5.50 freeware      Copyright (c) 1993-2017 Alexander Roshal\n\n\nExtracting from Aemet2019-01.rar\n\nExtracting  Aemet2019-01-22.xls                                            3  OK\nExtracting  Aemet2019-01-23.xls                                            6  OK\nExtracting  Aemet2019-01-24.xls                                           10  OK\nExtracting  Aemet2019-01-25.xls                                         1 13  OK\nExtracting  Aemet2019-01-26.xls                                         1 16  OK\nExtracting  Aemet2019-01-27.xls                                         1 19  OK\nExtracting  Aemet2019-01-28.xls                                         2 23  OK\nExtracting  Aemet2019-01-29.xls                                         2 26  OK\nExtracting  Aemet2019-01-30.xls                                         2 30  OK\nExtracting  Aemet2019-01-31.xls                                         3 33  OK\nExtracting  Aemet2019-01-01.xls                                         36  OK\nExtracting  Aemet2019-01-02.xls                                         39  OK\nExtracting  Aemet2019-01-03.xls                                         42  OK\nExtracting  Aemet2019-01-04.xls                                         45  OK\nExtracting  Aemet2019-01-05.xls                                         4 49  OK\nExtracting  Aemet2019-01-06.xls                                         5 52  OK\nExtracting  Aemet2019-01-07.xls                                         5 55  OK\nExtracting  Aemet2019-01-08.xls                                         5 58  OK\nExtracting  Aemet2019-01-09.xls                                         6 61  OK\nExtracting  Aemet2019-01-10.xls                                         6 64  OK\nExtracting  Aemet2019-01-11.xls                                         6 67  OK\nExtracting  Aemet2019-01-12.xls                                         6 70  OK\nExtracting  Aemet2019-01-13.xls                                         7 73  OK\nExtracting  Aemet2019-01-14.xls                                         7 76  OK\nExtracting  Aemet2019-01-15.xls                                         7 79  OK\nExtracting  Aemet2019-01-16.xls                                         8 82  OK\nExtracting  Aemet2019-01-17.xls                                         8 86  OK\nExtracting  Aemet2019-01-18.xls                                         8 89  OK\nExtracting  Aemet2019-01-19.xls                                         9 92  OK\nExtracting  Aemet2019-01-20.xls                                         9 96  OK\nExtracting  Aemet2019-01-21.xls                                         9 99  OK\nAll OK<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Recorremos los ficheros xls ya descomprimidos y los vamos cargando en un objeto dataframe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si vemos el contenido de los ficheros xls&nbsp;<strong>podemos observar que no contienen la fecha de los datos<\/strong>, lo cual es un dato importante para nuestro an\u00e1lisis de datos porque queremos ordenar la informaci\u00f3n por fecha en algunos casos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Para obtener este dato usaremos el nombre del fichero, el cual contiene la fecha a la que corresponden los datos.<\/strong>&nbsp;Vamos a incorporar una columa adicional al dataset con el nombre del fichero que estamos leyendo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>all_files = glob.glob(\"Aemet2019-*.xls\")\n\nfile_list = &#91;]\nfor f in all_files:\n    data = pd.read_excel(f,skiprows=4)\n    data&#91;'source_file'] = f # nueva columna conteniendo el nombre del fichero leido\n    file_list.append(data)\ndf = pd.concat(file_list)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos a ver cuantas filas y columnas contiene nuestro dataset:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df.shape\n(24707, 13)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos comprobar que tiene 24707 filas y 13 columnas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A lo largo del art\u00edculo os iremos mostrando las 5 primeras filas y las 7 primeras columnas para ver c\u00f3mo son los datos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df.head()<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>Estaci\u00f3n<\/th><th>Provincia<\/th><th>Temperatura m\u00e1xima (\u00baC)<\/th><th>Temperatura m\u00ednima (\u00baC)<\/th><th>Temperatura media (\u00baC)<\/th><th>Racha (km\/h)<\/th><th>Velocidad m\u00e1xima (km\/h)<\/th><\/tr><\/thead><tbody><tr><td>0<\/td><td>Estaca de Bares<\/td><td>A Coru\u00f1a<\/td><td>11.2 (15:30)<\/td><td>10.0 (03:40)<\/td><td>10.6<\/td><td>64 (22:20)<\/td><td>49 (22:20)<\/td><\/tr><tr><td>1<\/td><td>As Pontes<\/td><td>A Coru\u00f1a<\/td><td>10.7 (14:00)<\/td><td>4.6 (05:30)<\/td><td>7.6<\/td><td>NaN<\/td><td>NaN<\/td><\/tr><tr><td>2<\/td><td>A Coru\u00f1a<\/td><td>A Coru\u00f1a<\/td><td>13.1 (12:30)<\/td><td>7.4 (02:40)<\/td><td>10.3<\/td><td>41 (18:20)<\/td><td>28 (15:40)<\/td><\/tr><tr><td>3<\/td><td>A Coru\u00f1a Aeropuerto<\/td><td>A Coru\u00f1a<\/td><td>12.6 (15:50)<\/td><td>-0.8 (05:40)<\/td><td>5.9<\/td><td>35 (15:20)<\/td><td>23 (15:20)<\/td><\/tr><tr><td>4<\/td><td>Carballo, Depuradora<\/td><td>A Coru\u00f1a<\/td><td>11.6 (13:40)<\/td><td>-1.4 (03:20)<\/td><td>5.1<\/td><td>NaN<\/td><td>NaN<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Limpieza de datos<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Una parte importante del proceso de obtenci\u00f3n de datos es limpiar su contenido para que sea adecuado a nuestras necesidades y para hacerlos mas c\u00f3modos de usar.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos empezar renombrando las columnas para que sea mas sencillo usarlas y ocupen menos espacio en pantalla.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df=df.rename(columns={'Estaci\u00f3n': 'estacion','Provincia':'provincia','Temperatura m\u00e1xima (\u00baC)':'temp_max','Temperatura m\u00ednima (\u00baC)':'temp_min','Temperatura media (\u00baC)':'temp_med','Racha (km\/h)':'viento_racha','Velocidad m\u00e1xima (km\/h)':'viento_vel_max','Precipitaci\u00f3n 00-24h (mm)':'prec_dia','Precipitaci\u00f3n 00-06h (mm)':'prec_0_6h','Precipitaci\u00f3n 06-12h (mm)':'prec_6_12h','Precipitaci\u00f3n 12-18h (mm)':'prec_12_18h','Precipitaci\u00f3n 18-24h (mm)':'prec_18_24h','source_file':'fecha'})\ndf.head(1)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>estacion<\/th><th>provincia<\/th><th>temp_max<\/th><th>temp_min<\/th><th>temp_med<\/th><th>viento_racha<\/th><th>viento_vel_max<\/th><\/tr><\/thead><tbody><tr><td>0<\/td><td>Estaca de Bares<\/td><td>A Coru\u00f1a<\/td><td>11.2 (15:30)<\/td><td>10.0 (03:40)<\/td><td>10.6<\/td><td>64 (22:20)<\/td><td>49 (22:20)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Observaremos que&nbsp;<strong>en algunas columnas adem\u00e1s del valor num\u00e9rico tambi\u00e9n se tiene la hora<\/strong>, lo cual no nos interesa ya que la informaci\u00f3n tiene que ser num\u00e9rica para nuestro an\u00e1lisis de datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As\u00ed que vamos a quitar esa parte de los datos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df=df.replace(to_replace=r'.(.+)$', value='', regex=True)\ndf.head(1)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>estacion<\/th><th>provincia<\/th><th>temp_max<\/th><th>temp_min<\/th><th>temp_med<\/th><th>viento_racha<\/th><th>viento_vel_max<\/th><\/tr><\/thead><tbody><tr><td>0<\/td><td>Estaca de Bares<\/td><td>A Coru\u00f1a<\/td><td>11.2<\/td><td>10.0<\/td><td>10.6<\/td><td>64<\/td><td>49<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">La columna que hemos creado para disponer del nombre del fichero y as\u00ed disponer de la fecha de los datos contiene m\u00e1s texto adem\u00e1s de la fecha.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos a limpiar el valor para dejar solo la fecha:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df.fecha=df.fecha.replace(regex={'Aemet':'',r'.+xls':''})\ndf.head(1)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>estacion<\/th><th>provincia<\/th><th>temp_max<\/th><th>temp_min<\/th><th>temp_med<\/th><th>viento_racha<\/th><th>fecha<\/th><\/tr><\/thead><tbody><tr><td>0<\/td><td>Estaca de Bares<\/td><td>A Coru\u00f1a<\/td><td>11.2<\/td><td>10.0<\/td><td>10.6<\/td><td>64<\/td><td>2019-01-09<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n veremos de qu\u00e9 tipo son las columnas actualmente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>El tipo se puede definir expl\u00edcitamente al leer el fichero, pero para este art\u00edculo hemos dejado que Pandas lo calcule de forma autom\u00e1tica.<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df.info()\n&lt;class 'pandas.core.frame.DataFrame'&gt;\nInt64Index: 24707 entries, 0 to 796\nData columns (total 13 columns):\n #   Column          Non-Null Count  Dtype\n---  ------          --------------  -----\n 0   estacion        24707 non-null  object\n 1   provincia       24707 non-null  object\n 2   temp_max        23650 non-null  object\n 3   temp_min        23650 non-null  object\n 4   temp_med        23650 non-null  float64\n 5   viento_racha    20072 non-null  object\n 6   viento_vel_max  20203 non-null  object\n 7   prec_dia        23366 non-null  float64\n 8   prec_0_6h       23565 non-null  float64\n 9   prec_6_12h      23565 non-null  float64\n 10  prec_12_18h     23584 non-null  float64\n 11  prec_18_24h     23563 non-null  float64\n 12  fecha           24707 non-null  object\ndtypes: float64(6), object(7)\nmemory usage: 2.6+ MB<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos observar que&nbsp;<strong>hay columnas con tipo \u00abobject\u00bb cuando deber\u00eda ser un float<\/strong>&nbsp;(por ejemplo: temp_max y viento_racha).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Esto es porque hay filas que no tienen valor para esas columnas, luego veremos que hacer con ellas, por ahora vamos a poner los tipos adecuados a cada columna.<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df=df.astype({'estacion': 'string','provincia': 'string', 'temp_max':'float64', 'temp_min':'float64', 'viento_racha':'float64', 'viento_vel_max':'float64','fecha': 'datetime64&#91;ns]'})\ndf&#91;'fecha']=pd.to_datetime(df&#91;\"fecha\"].dt.strftime('%Y-%m-%d'))\ndf.info()\n&lt;class 'pandas.core.frame.DataFrame'&gt;\nInt64Index: 24707 entries, 0 to 796\nData columns (total 13 columns):\n #   Column          Non-Null Count  Dtype\n---  ------          --------------  -----\n 0   estacion        24707 non-null  string\n 1   provincia       24707 non-null  string\n 2   temp_max        23650 non-null  float64\n 3   temp_min        23650 non-null  float64\n 4   temp_med        23650 non-null  float64\n 5   viento_racha    20072 non-null  float64\n 6   viento_vel_max  20203 non-null  float64\n 7   prec_dia        23366 non-null  float64\n 8   prec_0_6h       23565 non-null  float64\n 9   prec_6_12h      23565 non-null  float64\n 10  prec_12_18h     23584 non-null  float64\n 11  prec_18_24h     23563 non-null  float64\n 12  fecha           24707 non-null  datetime64&#91;ns]\ndtypes: datetime64&#91;ns](1), float64(10), string(2)\nmemory usage: 2.6 MB<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Vamos a eliminar las estaciones que tienen filas a las que les faltan datos para estandarizar la informaci\u00f3n.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Realmente habr\u00eda que intentar rellenar los datos que faltan mediante alguna de las t\u00e9cnicas recomendadas (media, propagate last valid observation forward, etc) pero para nuestro ejemplo vamos a simplemente eliminar filas por simplificar.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>estaciones_con_nan=df&#91;df.isnull().any(axis=1)]&#91;'estacion'].unique()\ndf.drop(df&#91;df&#91;'estacion'].isin(estaciones_con_nan)].index, inplace=True)\ndf.isna().sum()<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>estacion          0\nprovincia         0\ntemp_max          0\ntemp_min          0\ntemp_med          0\nviento_racha      0\nviento_vel_max    0\nprec_dia          0\nprec_0_6h         0\nprec_6_12h        0\nprec_12_18h       0\nprec_18_24h       0\nfecha             0\ndtype: int64<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">An\u00e1lisis de datos<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora que ya tenemos los datos limpios vamos a empezar a analizarlos, demostrando que f\u00e1cil es realizarlo con pandas.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Primeros contactos con los datos<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos a usar el m\u00e9todo \u00abdescribe\u00bb para ver de forma sencilla algunas medidas de nuestros datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n es un ejemplo de como podemos seleccionar ciertas columnas por su indice mediante el uso de la librer\u00eda numpy.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df.iloc&#91;:,np.r_&#91;0:8,12:13]].describe()<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th><strong>temp_max<\/strong><\/th><th><strong>temp_min<\/strong><\/th><th><strong>temp_med<\/strong><\/th><th><strong>viento_racha<\/strong><\/th><th><strong>viento_vel_max<\/strong><\/th><th><strong>prec_dia<\/strong><\/th><\/tr><\/thead><tbody><tr><td><strong>count<\/strong><\/td><td>14663.000000<\/td><td>14663.000000<\/td><td>14663.000000<\/td><td>14663.000000<\/td><td>14663.000000<\/td><td>14663.000000<\/td><\/tr><tr><td><strong>mean<\/strong><\/td><td>12.558869<\/td><td>2.557737<\/td><td>7.560342<\/td><td>34.010434<\/td><td>19.691741<\/td><td>1.490009<\/td><\/tr><tr><td><strong>std<\/strong><\/td><td>4.506435<\/td><td>5.256177<\/td><td>4.350412<\/td><td>17.793154<\/td><td>11.139909<\/td><td>5.890856<\/td><\/tr><tr><td><strong>min<\/strong><\/td><td>-5.000000<\/td><td>-20.500000<\/td><td>-7.400000<\/td><td>0.000000<\/td><td>0.000000<\/td><td>0.000000<\/td><\/tr><tr><td><strong>25%<\/strong><\/td><td>9.500000<\/td><td>-1.300000<\/td><td>4.500000<\/td><td>20.000000<\/td><td>12.000000<\/td><td>0.000000<\/td><\/tr><tr><td><strong>50%<\/strong><\/td><td>12.700000<\/td><td>2.100000<\/td><td>7.300000<\/td><td>30.000000<\/td><td>17.000000<\/td><td>0.000000<\/td><\/tr><tr><td><strong>75%<\/strong><\/td><td>15.700000<\/td><td>5.900000<\/td><td>10.200000<\/td><td>45.000000<\/td><td>26.000000<\/td><td>0.000000<\/td><\/tr><tr><td><strong>max<\/strong><\/td><td>27.800000<\/td><td>19.100000<\/td><td>21.100000<\/td><td>146.000000<\/td><td>113.000000<\/td><td>132.800000<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora vamos a mostrar 5 filas al azar como muestreo de los datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n es un ejemplo de selecci\u00f3n de columnas por expresion regular (seleccionamos las que empiezan por el prefijo \u00abtemp_\u00bb)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df.filter(regex='^temp_*', axis=1).sample(5)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>temp_max<\/th><th>temp_min<\/th><th>temp_med<\/th><\/tr><\/thead><tbody><tr><td>36<\/td><td>19.8<\/td><td>3.8<\/td><td>11.8<\/td><\/tr><tr><td>285<\/td><td>8.3<\/td><td>5.7<\/td><td>7.0<\/td><\/tr><tr><td>642<\/td><td>8.5<\/td><td>-4.7<\/td><td>1.9<\/td><\/tr><tr><td>48<\/td><td>17.4<\/td><td>12.4<\/td><td>14.9<\/td><\/tr><tr><td>729<\/td><td>11.8<\/td><td>2.5<\/td><td>7.2<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Medias por provincia<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n mostraremos la media de los valores de cada columna agrup\u00e1ndolos por provincia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Podemos observar que el m\u00e9todo es lo suficientemente inteligente para mostrarnos solo columnas de tipo num\u00e9rico.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Os mostramos el contenido de las 4 primeras provincias (por orden alfab\u00e9tico) y de las 6 primeras columnas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df.groupby('provincia').mean()<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>provincia<\/th><th>temp_max<\/th><th>temp_min<\/th><th>temp_med<\/th><th>viento_racha<\/th><th>viento_vel_max<\/th><th>prec_dia<\/th><\/tr><\/thead><tbody><tr><td>A Coru\u00f1a<\/td><td>12.402765<\/td><td>5.505991<\/td><td>8.958065<\/td><td>43.552995<\/td><td>27.073733<\/td><td>3.329954<\/td><\/tr><tr><td>Alacant\/Alicante<\/td><td>15.780645<\/td><td>3.768664<\/td><td>9.777880<\/td><td>32.852535<\/td><td>18.253456<\/td><td>0.070968<\/td><\/tr><tr><td>Albacete<\/td><td>12.548387<\/td><td>-0.327419<\/td><td>6.117204<\/td><td>32.806452<\/td><td>17.376344<\/td><td>0.114516<\/td><\/tr><tr><td>Almer\u00eda<\/td><td>16.347312<\/td><td>7.915591<\/td><td>12.132258<\/td><td>40.731183<\/td><td>27.166667<\/td><td>0.101613<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Mayores temperaturas m\u00e1ximas por estaci\u00f3n<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos a mostrar los 3 valores mas altos de temperatura m\u00e1xima que se han registrado en el mes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es un ejemplo de c\u00f3mo ordenar por columna,&nbsp;<strong>mostramos solo las columnas que nos interesan y de esas columnas mostramos solo las primeras 3 filas.<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df.sort_values(by='temp_max',ascending=False)&#91;&#91;'fecha','estacion','provincia','temp_max']].head(3)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>fecha<\/th><th>estacion<\/th><th>provincia<\/th><th>temp_max<\/th><\/tr><\/thead><tbody><tr><td>437<\/td><td>2019-01-13<\/td><td>La Aldea de San Nicol\u00e1s<\/td><td>Las Palmas<\/td><td>27.8<\/td><\/tr><tr><td>427<\/td><td>2019-01-26<\/td><td>P\u00e1jara<\/td><td>Las Palmas<\/td><td>25.7<\/td><\/tr><tr><td>437<\/td><td>2019-01-01<\/td><td>La Aldea de San Nicol\u00e1s<\/td><td>Las Palmas<\/td><td>25.6<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Menores temperaturas m\u00ednimas por estaci\u00f3n<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">De forma similar obtenemos los 3 valores m\u00e1s bajos de temperatura m\u00ednima.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df.sort_values(by='temp_min',ascending=True)&#91;&#91;'fecha','estacion','provincia','temp_min']].head(3)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>fecha<\/th><th>estacion<\/th><th>provincia<\/th><th>temp_min<\/th><\/tr><\/thead><tbody><tr><td>522<\/td><td>2019-01-21<\/td><td>Villanueva de la Ca\u00f1ada<\/td><td>Madrid<\/td><td>-20.5<\/td><\/tr><tr><td>639<\/td><td>2019-01-06<\/td><td>Cu\u00e9llar<\/td><td>Segovia<\/td><td>-12.1<\/td><\/tr><tr><td>763<\/td><td>2019-01-06<\/td><td>Sard\u00f3n de Duero<\/td><td>Valladolid<\/td><td>-11.8<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">M\u00e1ximas diferencias entre temperatura max y min por provincia<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora calcularemos una nueva columna restando de la temperatura m\u00e1xima la temperatura m\u00ednima.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vemos que simplemente restamos columnas. Pandas es intuitivo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df&#91;'diff_temp_min_max']=df&#91;'temp_max']-df&#91;'temp_min']\ndf.iloc&#91;df.reset_index().groupby('provincia')&#91;'diff_temp_min_max'].idxmax()].sort_values(by='diff_temp_min_max',ascending=False)&#91;&#91;'fecha','estacion','provincia','diff_temp_min_max','temp_min','temp_max']].head(10)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>fecha<\/th><th>estacion<\/th><th>provincia<\/th><th>diff_temp_min_max<\/th><th>temp_min<\/th><th>temp_max<\/th><\/tr><\/thead><tbody><tr><td>522<\/td><td>2019-01-21<\/td><td>Villanueva de la Ca\u00f1ada<\/td><td>Madrid<\/td><td>30.9<\/td><td>-20.5<\/td><td>10.4<\/td><\/tr><tr><td>763<\/td><td>2019-01-06<\/td><td>Sard\u00f3n de Duero<\/td><td>Valladolid<\/td><td>26.6<\/td><td>-11.8<\/td><td>14.8<\/td><\/tr><tr><td>639<\/td><td>2019-01-06<\/td><td>Cu\u00e9llar<\/td><td>Segovia<\/td><td>26.6<\/td><td>-12.1<\/td><td>14.5<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Mayores rachas de viento en un d\u00eda por provincia<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A continuaci\u00f3n te mostramos un ejemplo de agrupar por una columna (provincia), obtener el m\u00e1ximo de los valores de otra columna (viento_racha) para cada grupo y ordenar posteriormente esas filas.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Todo se realiza en una sola l\u00ednea.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df.iloc&#91;df.reset_index().groupby('provincia')&#91;'viento_racha'].idxmax()].sort_values(by='viento_racha',ascending=False)&#91;&#91;'fecha','estacion','provincia','viento_racha']].head(5)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>fecha<\/th><th>estacion<\/th><th>provincia<\/th><th>viento_racha<\/th><\/tr><\/thead><tbody><tr><td>0<\/td><td>2019-01-29<\/td><td>Estaca de Bares<\/td><td>A Coru\u00f1a<\/td><td>146.0<\/td><\/tr><tr><td>139<\/td><td>2019-01-29<\/td><td>Machichaco<\/td><td>Bizkaia<\/td><td>144.0<\/td><\/tr><tr><td>231<\/td><td>2019-01-27<\/td><td>La Pobla de Benifass\u00e0-Fredes<\/td><td>Castell\u00f3\/Castell\u00f3n<\/td><td>129.0<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Mayores velocidades de viento medio en un d\u00eda por provincia<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">De forma similar, hacemos el c\u00e1lculo de las mayores velocidades de viento medio en un d\u00eda por provincia.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df.iloc&#91;df.reset_index().groupby('provincia')&#91;'viento_vel_max'].idxmax()].sort_values(by='viento_vel_max',ascending=False)&#91;&#91;'fecha','estacion','provincia','viento_vel_max']].head(5)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>fecha<\/th><th>estacion<\/th><th>provincia<\/th><th>viento_vel_max<\/th><\/tr><\/thead><tbody><tr><td>139<\/td><td>2019-01-23<\/td><td>Machichaco<\/td><td>Bizkaia<\/td><td>113.0<\/td><\/tr><tr><td>0<\/td><td>2019-01-29<\/td><td>Estaca de Bares<\/td><td>A Coru\u00f1a<\/td><td>103.0<\/td><\/tr><tr><td>726<\/td><td>2019-01-28<\/td><td>Andorra<\/td><td>Teruel<\/td><td>82.0<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">M\u00e1ximas velocidades de viento por provincia de media<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Vemos un ejemplo de calcular una media por grupo de la forma mas f\u00e1cil e intuitiva posible (con \u00abgroup\u00bb y \u00abmean\u00bb).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df.groupby('provincia').mean()&#91;&#91;'viento_vel_max']].sort_values(by='viento_vel_max',ascending=False).head(5)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>provincia<\/th><th>viento_vel_max<\/th><\/tr><\/thead><tbody><tr><td>Castell\u00f3\/Castell\u00f3n<\/td><td>27.669355<\/td><\/tr><tr><td>Almer\u00eda<\/td><td>27.166667<\/td><\/tr><tr><td>A Coru\u00f1a<\/td><td>27.073733<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">M\u00e1ximas diferencias de temperatura m\u00e1xima entre d\u00edas<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Te mostramos un ejemplo de c\u00f3mo podemos hacer una operaci\u00f3n (restar) entre la fila actual y la fila anterior de forma sencilla: con un \u00abshift\u00bb desplazamos una columna hacia abajo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df&#91;'temp_max_shifted']=df.groupby('estacion')&#91;'temp_max'].transform('shift')\ndf&#91;'dif_prev_temp_max']=df.temp_max-df.temp_max_shifted\ndf.iloc&#91;df.reset_index().groupby('provincia')&#91;'dif_prev_temp_max'].idxmax()].sort_values(by='dif_prev_temp_max',ascending=False)&#91;&#91;'fecha','estacion','provincia','dif_prev_temp_max']].head(5)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>fecha<\/th><th>estacion<\/th><th>provincia<\/th><th>dif_prev_temp_max<\/th><\/tr><\/thead><tbody><tr><td>505<\/td><td>2019-01-01<\/td><td>Rascafr\u00eda<\/td><td>Madrid<\/td><td>16.3<\/td><\/tr><tr><td>605<\/td><td>2019-01-01<\/td><td>Velilla del R\u00edo Carri\u00f3n, Camporredondo de Alba<\/td><td>Palencia<\/td><td>15.5<\/td><\/tr><tr><td>470<\/td><td>2019-01-01<\/td><td>Lagunas de Somoza<\/td><td>Le\u00f3n<\/td><td>14.5<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Racha de d\u00edas seguidos lloviendo por provincia y estaci\u00f3n<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">El proceso de obtener rachas, es decir, n\u00famero de d\u00edas en los que pasa un suceso (en este caso llover) consecutivamente es un proceso algo m\u00e1s elaborado pero que se puede realizar en unas pocas l\u00edneas de c\u00f3digo aprovechando las siguientes funcionalidades del dataframe:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Creaci\u00f3n de una nueva columna<\/strong>&nbsp;cuyo valor se obtiene a partir de otra columna aplicando una funci\u00f3n lambda (c\u00e1lculo de la columna \u00abllueve\u00bb).<\/li>\n\n\n\n<li><strong>Comparaci\u00f3n de valores<\/strong>&nbsp;(operador \u00abne\u00bb) entre columnas de una misma fila.<\/li>\n\n\n\n<li><strong>Desplazamiento<\/strong>&nbsp;(m\u00e9todo \u00abshift\u00bb)&nbsp;<strong>de una columna<\/strong>&nbsp;para disponer de datos anteriores en la misma fila.<\/li>\n\n\n\n<li><strong>Generaci\u00f3n de un n\u00famero secuencial<\/strong>&nbsp;(identificador) de los elementos de cada grupo (m\u00e9todo \u00abcumsum\u00bb).<\/li>\n\n\n\n<li><strong>C\u00e1lculo del n\u00famero de elementos de un grupo<\/strong>&nbsp;(m\u00e9todo \u00abcumcount\u00bb).<\/li>\n\n\n\n<li><strong>Asignaci\u00f3n de un valor a una columna<\/strong>&nbsp;para las filas que cumplan una condici\u00f3n (llueve==0).<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>df&#91;'llueve']=df.prec_dia.apply(lambda x: 1 if x&gt;0 else 0)\n\ndf.sort_values(by=&#91;'estacion','fecha'],ascending=True,inplace=True,ignore_index=True)\n\ndf&#91;'start_of_streak'] = df.llueve.ne(df&#91;'llueve'].shift())\n\ndf&#91;'estacion_anterior']=df&#91;'estacion'].shift()\ndf.loc&#91;(df&#91;'estacion'].ne(df&#91;'estacion_anterior'])), 'start_of_streak'] = True\n\ndf&#91;'streak_id'] = df&#91;'start_of_streak'].cumsum()\ndf&#91;'dias_seguidos_lloviendo'] = df.groupby('streak_id').cumcount() + 1\ndf.loc&#91;(df&#91;'llueve']==0), 'dias_seguidos_lloviendo'] = 0\n\ndf.iloc&#91;df.reset_index().groupby(&#91;'provincia','estacion'])&#91;'dias_seguidos_lloviendo'].idxmax()].sort_values(by='dias_seguidos_lloviendo',ascending=False)&#91;&#91;'estacion','provincia','dias_seguidos_lloviendo']].head(10)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>estacion<\/th><th>provincia<\/th><th>dias_seguidos_lloviendo<\/th><\/tr><\/thead><tbody><tr><td>5083<\/td><td>Elgeta<\/td><td>Gipuzkoa<\/td><td>25<\/td><\/tr><tr><td>14631<\/td><td>Zumarraga<\/td><td>Gipuzkoa<\/td><td>20<\/td><\/tr><tr><td>5455<\/td><td>Forua<\/td><td>Bizkaia<\/td><td>18<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">D\u00f3nde llueve menos d\u00edas seguidos por provincia y estaci\u00f3n<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Aprovechando la nueva columna \u00abdias_seguidos_lloviendo\u00bb podemos sacar esta nueva m\u00e9trica.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df.iloc&#91;df.reset_index().groupby(&#91;'provincia','estacion'])&#91;'dias_seguidos_lloviendo'].idxmax()].sort_values(by='dias_seguidos_lloviendo',ascending=True)&#91;&#91;'estacion','provincia','dias_seguidos_lloviendo']].head(10)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>estacion<\/th><th>provincia<\/th><th>dias_seguidos_lloviendo<\/th><\/tr><\/thead><tbody><tr><td>7781<\/td><td>Lorca, Zarcilla de Ramos<\/td><td>Murcia<\/td><td>0<\/td><\/tr><tr><td>2542<\/td><td>Belmonte<\/td><td>Cuenca<\/td><td>0<\/td><\/tr><tr><td>12617<\/td><td>Tazacorte<\/td><td>Santa Cruz de Tenerife<\/td><td>0<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Mostrar cu\u00e1ntas estaciones hay por provincia y un total general<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos tener copias \u00abtemporales\u00bb del dataframe para hacer operaciones sin destruir el original.&nbsp;<strong>Te lo ilustramos a trav\u00e9s de este ejemplo.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Supongamos que queremos obtener el n\u00famero de estaciones meteorol\u00f3gicas que hay por cada provincia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ello nos quedamos con solo las columnas relevantes: provincia y estaci\u00f3n. Luego eliminamos las filas duplicadas para tener los pares \u00fanicos de provincia-estaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ya nos queda simplemente agrupar por provincia y sacar el n\u00famero de filas por cada grupo. Todo eso lo hacemos en 1 sola l\u00ednea de c\u00f3digo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Finalmente a\u00f1adimos otra fila adicional al resultado con el total de estaciones (un SUM t\u00edpico de Excel).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df_estaciones=df&#91;&#91;'provincia','estacion']].drop_duplicates().groupby('provincia').count()\ndf_estaciones.loc&#91;'Total de estaciones'] = df_estaciones&#91;'estacion'].sum()\ndf_estaciones<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>provincia<\/th><th>estacion<\/th><\/tr><\/thead><tbody><tr><td>A Coru\u00f1a<\/td><td>7<\/td><\/tr><tr><td>Alacant\/Alicante<\/td><td>7<\/td><\/tr><tr><td>Albacete<\/td><td>6<\/td><\/tr><tr><td>Almer\u00eda<\/td><td>6<\/td><\/tr><tr><td>Total de estaciones<\/td><td>26<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusiones del an\u00e1lisis de datos<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hemos visto que es muy sencillo realizar tareas de carga de datos, limpieza de datos y extracci\u00f3n de informaci\u00f3n usando Pandas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Las operaciones que har\u00edamos en una base de datos (agrupar, calcular m\u00e1ximos y m\u00ednimos) e incluso algunas tareas m\u00e1s complejas como obtener rachas se hacen de forma sencilla, r\u00e1pida y lo que es importante de forma program\u00e1tica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Esto \u00faltimo es importante porque el c\u00f3digo puede ser repositorizado, trackeado y ejecutado de forma automatizada.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vemos tambi\u00e9n que se puede sacar informaci\u00f3n relevante de cualquier dataset.&nbsp;<strong>No es necesario llegar a usar algoritmos de Machine Learning para sacar provecho de la informaci\u00f3n disponible a la hora del an\u00e1lisis de datos.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La explotaci\u00f3n de los datos mediante librerias como Pandas hace que podamos extraer informaci\u00f3n valiosa de forma sencilla y r\u00e1pida, algo que es sumamente importante para cualquier empresa, entidad o incluso a nivel particular.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos verlo como una mezcla entre Excel y SQL pero con las ventajas que hemos ido mostrando en este art\u00edculo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Esperamos que os haya gustado este primer contacto con la liberia Pandas y est\u00e9is deseando probarla.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es una librer\u00eda ampliamente usada para las tareas de Machine Learning y Data Science pero es realmente \u00fatil para cualquier persona que tenga que tratar que realizar an\u00e1lisis de datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n esperamos que haya servido como primer contacto con los notebook de Jupyter, que son una herramienta incre\u00edble para tener en un mismo sitio el c\u00f3digo y la documentaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Adem\u00e1s de que permiten compartirlo de forma sencilla y ser un punto de partida para la experimentaci\u00f3n con el c\u00f3digo contenido.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este art\u00edculo, os mostramos un ejemplo pr\u00e1ctico de an\u00e1lisis de datos mediante&nbsp;la librer\u00eda Pandas de Python. Veremos los distintos procesos que se requieren para llevar a cabo esta tarea, ya que&nbsp;no solo consiste en analizar los datos&nbsp;sino que abarca otros procesos igual de importantes como son la carga de los datos y limpiar los [&hellip;]<\/p>\n","protected":false},"featured_media":92253,"template":"","categories":[],"tags":[860,861,862],"industry":[],"class_list":["post-92252","expert-view","type-expert-view","status-publish","has-post-thumbnail","hentry","tag-analisis-de-datos","tag-libreria-pandas","tag-python"],"acf":[],"cards":"\n\t<div class=\"single-post-card\">\n\n\t\t<figure class=\"wp-block-post-featured-image\"><a href=\"https:\/\/devoteam.info\/es\/expert-view\/analisis-de-datos-mediante-la-libreria-pandas-de-python\/\" target=\"_self\" ><img width=\"1920\" height=\"1361\" src=\"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1.jpg\" class=\"attachment-post-thumbnail size-post-thumbnail wp-post-image\" alt=\"An\u00e1lisis de datos mediante la librer\u00eda Pandas de Python\" style=\"aspect-ratio:4\/3;width:100%;object-fit:cover;\" decoding=\"async\" loading=\"lazy\" srcset=\"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1.jpg 1920w, https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1-300x213.jpg 300w, https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1-1024x726.jpg 1024w, https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1-768x544.jpg 768w, https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1-1536x1088.jpg 1536w, https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1-2048x1451.jpg 2048w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/a><\/figure>\n\n\t\t\n\t\t<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-43282307 wp-block-group-is-layout-flex\">\n\t<p style=\"font-style:normal;font-weight:700\" class=\"has-link-color wp-elements-1 wp-block-lp-post-type has-text-color has-primary-color has-small-font-size\">Blog<\/p>\n\n\t\t\n\t\t<h3 style=\"font-style:normal;font-weight:400\" class=\"wp-block-post-title has-base-font-size\"><a href=\"https:\/\/devoteam.info\/es\/expert-view\/analisis-de-datos-mediante-la-libreria-pandas-de-python\/\" target=\"_self\" >An\u00e1lisis de datos mediante la librer\u00eda Pandas de Python<\/a><\/h3><\/div>\n\t\t\n\t<\/div>\n\n","yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.4 (Yoast SEO v28.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>An\u00e1lisis de datos mediante la librer\u00eda Pandas de Python | Devoteam<\/title>\n<meta name=\"description\" content=\"Explora c\u00f3mo la librer\u00eda Pandas en Python revoluciona el an\u00e1lisis de datos. \u00a1Perfecciona tus habilidades en an\u00e1lisis de datos ahora!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devoteam.info\/es\/expert-view\/analisis-de-datos-mediante-la-libreria-pandas-de-python\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"An\u00e1lisis de datos mediante la librer\u00eda Pandas de Python\" \/>\n<meta property=\"og:description\" content=\"Explora c\u00f3mo la librer\u00eda Pandas en Python revoluciona el an\u00e1lisis de datos. \u00a1Perfecciona tus habilidades en an\u00e1lisis de datos ahora!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devoteam.info\/es\/expert-view\/analisis-de-datos-mediante-la-libreria-pandas-de-python\/\" \/>\n<meta property=\"og:site_name\" content=\"Devoteam\" \/>\n<meta property=\"og:image\" content=\"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1361\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data1\" content=\"18 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/es\\\/expert-view\\\/analisis-de-datos-mediante-la-libreria-pandas-de-python\\\/\",\"url\":\"https:\\\/\\\/devoteam.info\\\/es\\\/expert-view\\\/analisis-de-datos-mediante-la-libreria-pandas-de-python\\\/\",\"name\":\"An\u00e1lisis de datos mediante la librer\u00eda Pandas de Python | Devoteam\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/es\\\/expert-view\\\/analisis-de-datos-mediante-la-libreria-pandas-de-python\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/es\\\/expert-view\\\/analisis-de-datos-mediante-la-libreria-pandas-de-python\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/devoteam.info\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/Imagen-Banner-3-scaled-1.jpg\",\"datePublished\":\"2024-04-09T07:04:54+00:00\",\"description\":\"Explora c\u00f3mo la librer\u00eda Pandas en Python revoluciona el an\u00e1lisis de datos. \u00a1Perfecciona tus habilidades en an\u00e1lisis de datos ahora!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/es\\\/expert-view\\\/analisis-de-datos-mediante-la-libreria-pandas-de-python\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/devoteam.info\\\/es\\\/expert-view\\\/analisis-de-datos-mediante-la-libreria-pandas-de-python\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/es\\\/expert-view\\\/analisis-de-datos-mediante-la-libreria-pandas-de-python\\\/#primaryimage\",\"url\":\"https:\\\/\\\/devoteam.info\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/Imagen-Banner-3-scaled-1.jpg\",\"contentUrl\":\"https:\\\/\\\/devoteam.info\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/Imagen-Banner-3-scaled-1.jpg\",\"width\":1920,\"height\":1361},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/es\\\/expert-view\\\/analisis-de-datos-mediante-la-libreria-pandas-de-python\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/devoteam.info\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/devoteam.info\\\/es\\\/expert-view\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"An\u00e1lisis de datos mediante la librer\u00eda Pandas de Python\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/devoteam.info\\\/es\\\/\",\"name\":\"Devoteam\",\"description\":\"AI-Driven Tech Consulting\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/devoteam.info\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"An\u00e1lisis de datos mediante la librer\u00eda Pandas de Python | Devoteam","description":"Explora c\u00f3mo la librer\u00eda Pandas en Python revoluciona el an\u00e1lisis de datos. \u00a1Perfecciona tus habilidades en an\u00e1lisis de datos ahora!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devoteam.info\/es\/expert-view\/analisis-de-datos-mediante-la-libreria-pandas-de-python\/","og_locale":"es_ES","og_type":"article","og_title":"An\u00e1lisis de datos mediante la librer\u00eda Pandas de Python","og_description":"Explora c\u00f3mo la librer\u00eda Pandas en Python revoluciona el an\u00e1lisis de datos. \u00a1Perfecciona tus habilidades en an\u00e1lisis de datos ahora!","og_url":"https:\/\/devoteam.info\/es\/expert-view\/analisis-de-datos-mediante-la-libreria-pandas-de-python\/","og_site_name":"Devoteam","og_image":[{"width":1920,"height":1361,"url":"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Tiempo de lectura":"18 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devoteam.info\/es\/expert-view\/analisis-de-datos-mediante-la-libreria-pandas-de-python\/","url":"https:\/\/devoteam.info\/es\/expert-view\/analisis-de-datos-mediante-la-libreria-pandas-de-python\/","name":"An\u00e1lisis de datos mediante la librer\u00eda Pandas de Python | Devoteam","isPartOf":{"@id":"https:\/\/devoteam.info\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devoteam.info\/es\/expert-view\/analisis-de-datos-mediante-la-libreria-pandas-de-python\/#primaryimage"},"image":{"@id":"https:\/\/devoteam.info\/es\/expert-view\/analisis-de-datos-mediante-la-libreria-pandas-de-python\/#primaryimage"},"thumbnailUrl":"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1.jpg","datePublished":"2024-04-09T07:04:54+00:00","description":"Explora c\u00f3mo la librer\u00eda Pandas en Python revoluciona el an\u00e1lisis de datos. \u00a1Perfecciona tus habilidades en an\u00e1lisis de datos ahora!","breadcrumb":{"@id":"https:\/\/devoteam.info\/es\/expert-view\/analisis-de-datos-mediante-la-libreria-pandas-de-python\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devoteam.info\/es\/expert-view\/analisis-de-datos-mediante-la-libreria-pandas-de-python\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/devoteam.info\/es\/expert-view\/analisis-de-datos-mediante-la-libreria-pandas-de-python\/#primaryimage","url":"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1.jpg","contentUrl":"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1.jpg","width":1920,"height":1361},{"@type":"BreadcrumbList","@id":"https:\/\/devoteam.info\/es\/expert-view\/analisis-de-datos-mediante-la-libreria-pandas-de-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devoteam.info\/es\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/devoteam.info\/es\/expert-view\/"},{"@type":"ListItem","position":3,"name":"An\u00e1lisis de datos mediante la librer\u00eda Pandas de Python"}]},{"@type":"WebSite","@id":"https:\/\/devoteam.info\/es\/#website","url":"https:\/\/devoteam.info\/es\/","name":"Devoteam","description":"AI-Driven Tech Consulting","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devoteam.info\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"}]}},"uagb_featured_image_src":{"full":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1.jpg",1920,1361,false],"thumbnail":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1-150x150.jpg",150,150,true],"medium":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1-300x213.jpg",300,213,true],"medium_large":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1-768x544.jpg",768,544,true],"large":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1-1024x726.jpg",1024,726,true],"1536x1536":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1-1536x1088.jpg",1536,1088,true],"2048x2048":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Imagen-Banner-3-scaled-1-2048x1451.jpg",2048,1451,true]},"uagb_author_info":{"display_name":"Julien Pawlowski","author_link":"https:\/\/devoteam.info\/es\/author\/"},"uagb_comment_info":0,"uagb_excerpt":"En este art\u00edculo, os mostramos un ejemplo pr\u00e1ctico de an\u00e1lisis de datos mediante&nbsp;la librer\u00eda Pandas de Python. Veremos los distintos procesos que se requieren para llevar a cabo esta tarea, ya que&nbsp;no solo consiste en analizar los datos&nbsp;sino que abarca otros procesos igual de importantes como son la carga de los datos y limpiar los&hellip;","_links":{"self":[{"href":"https:\/\/devoteam.info\/es\/wp-json\/wp\/v2\/expert-view\/92252","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devoteam.info\/es\/wp-json\/wp\/v2\/expert-view"}],"about":[{"href":"https:\/\/devoteam.info\/es\/wp-json\/wp\/v2\/types\/expert-view"}],"version-history":[{"count":0,"href":"https:\/\/devoteam.info\/es\/wp-json\/wp\/v2\/expert-view\/92252\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devoteam.info\/es\/wp-json\/wp\/v2\/media\/92253"}],"wp:attachment":[{"href":"https:\/\/devoteam.info\/es\/wp-json\/wp\/v2\/media?parent=92252"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devoteam.info\/es\/wp-json\/wp\/v2\/categories?post=92252"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devoteam.info\/es\/wp-json\/wp\/v2\/tags?post=92252"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/devoteam.info\/es\/wp-json\/wp\/v2\/industry?post=92252"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}