Introducción
En este ejemplo Ejemplo de análisis exploratorio de datos (EDA),en este caso se tratará un dataset en formato csv y queremos hacer un primer exploratorio con Python utilizando la librería Pandas, haciendo uso de un dataset de temperaturas globales medias mensuales para este ejemplo:
Pandas csv data extraction
import pandas as pd file_path = r'.\monthly_mean_global_temperatures.csv' temperatures_df = pd.read_csv(file_path) temperatures_df.info()
y como podemos ver, obtenemos información de alto nivel como:
tipo del objeto que contiene nuestro dataset: pandas dataframe
número de registros: 3288
lista de 3 atributos, con nombres: 'Source', 'Date' y 'Mean'
atributos numéricos: 'Mean' (tipo 'float64')
atributos no numéricos: 'Source' y 'Date' (tipo genérico 'object')
Una vez tenemos datos macroscópicos de nuestro dataset, podemos pasar a revisar algunos registros en más detalle para adquirir algo más de intuición sobre dichos datos, por ejemplo visualizando el contenido de los 10 primeros y últimos registros con todos sus atributos:
dataframe head rows
temperatures_df.head(6)
donde, según podemos apreciar en la columna 'Source', tenemos al parecer dos fuentes distintas de medición para el mismo valor de la temperatura media mensual (ya que el valor 'Date' se repite de dos en dos). Para confirmar esta apreciación, podemos comprobar los valores únicos que contiene nuestro atributo 'Source':
column unique values
temperatures_df.Source.unique()
Una pregunta apropiada sería: ¿tenemos el mismo, o aproximadamente el mismo número de mediciones por parte de ambas fuentes? Para ello realizamos un conteo de los registros para cada valor de 'Source':
temperatures_df.Source.value_counts()
donde vemos que, como esperábamos, hay un número similar (en este caso igual) de mediciones procedentes de ambos sistemas de medición.
Una vez hemos realizado estas comprobaciones, cabe valorar qué queremos hacer con dichas mediciones de temperaturas globales; sea cual sea el objetivo (por ejemplo, realizar una predicción de temperaturas medias futuras) parece lógico escoger separar las medidas de las dos fuentes de medición en dos atributos distintos, o escoger la media de los sistemas de medición existentes para cada mes, o incluso una ponderación entre ellos si disponemos de más información sobre cada uno de dichos sistemas. En este caso, vamos a separar las medidas de cada fuente en dos atributos. Para realizar dicho filtro, vamos a hacer uso de un concepto muy útil en python, denominado máscara (conceptualmente similar a un filtro 'where'):
mask_GCAG
mask_GCAG = temperatures_df['Source'] == 'GCAG' temperatures_df_GCAG = temperatures_df[mask_GCAG] temperatures_df_GCAG.head()
mask_GISTEMP
mask_GISTEMP = temperatures_df['Source'] == 'GISTEMP' temperatures_df_GISTEMP = temperatures_df[mask_GISTEMP] temperatures_df_GISTEMP.head()
Así pues, podemos crear una nueva versión del dataset que contenga como atributos las temperaturas mensuales medias de ambos sistemas de medición:
new_dataset
temperatures_df['GCAG_month_mean_temp'] = temperatures_df_GCAG.Mean temperatures_df['GISTEMP_month_mean_temp'] = temperatures_df_GISTEMP.Mean temperatures_df=temperatures_df.drop(['Source', 'Mean'], axis=1) temperatures_df.head()
Si queremos revisar la estadística descriptiva de los atributos numéricos, podemos utilizar la expresión 'describe()':
dataframe describe
temperatures_df.describe()
que indica que el valor medio de las temperaturas históricas grabadas se sitúa en torno a 0º, variando entre -0.78 y 1.35, indicando además su desviación estándar y los cuartiles.
Si queremos obtener un reporte genérico con pandas profiling, que nos ahorre gran parte del trabajo que tenemos que hacer en esta fase, podríamos aplicar el siguiente método:
pandas profiling
def profile_dataframe(dataframe): from pandas_profiling import ProfileReport profile = ProfileReport(dataframe) profile.to_file(outputfile="df_profiling_report.html") return profile_dataframe(temperatures_df)
Así obtendríamos un reporte en formato html que se puede encontrar adjunto como el siguiente: