MAT281 - Laboratorio N°032¶
Esta semana revisaremos datos del Índice de Libertad de Prensa que confecciona cada año la asociación de Reporteros Sin Fronteras.
Diccionario de datos¶
Variable | Clase | Descripción |
---|---|---|
codigo_iso | caracter | Código ISO del país |
pais | caracter | País |
anio | entero | Año del resultado |
indice | entero | Puntaje Índice Libertad de Prensa (menor puntaje = mayor libertad de prensa) |
ranking | entero | Ranking Libertad de Prensa |
Fuente original y adaptación¶
Los datos fueron extraídos de The World Bank. La fuente original es Reporteros sin Fronteras.
Por otro lado, estos archivos han sido modificado intencionalmente para ocupar todo lo aprendido en clases. A continuación, una breve descripción de cada uno de los data frames:
- libertad_prensa_codigo.csv: contiene la información codigo_iso/pais. Existe un código que tiene dos valores.
- libertad_prensa_01.csv: contiene la información pais/anio/indice/ranking. Los nombres de las columnas estan en mayúscula (antes del año 2010).
- libertad_prensa_02.csv: contiene la información pais/anio/indice/ranking. Los nombres de las columnas estan en mayúscula (después del año 2010).
In [19]:
Copied!
import numpy as np
import pandas as pd
# lectura de datos
archivos_anio = [
'https://raw.githubusercontent.com/fralfaro/MAT281_2024/main/docs/labs/data/libertad_prensa_01.csv',
'https://raw.githubusercontent.com/fralfaro/MAT281_2024/main/docs/labs/data/libertad_prensa_02.csv'
]
df_codigos = pd.read_csv('https://raw.githubusercontent.com/fralfaro/MAT281_2024/main/docs/labs/data/libertad_prensa_codigo.csv')
import numpy as np
import pandas as pd
# lectura de datos
archivos_anio = [
'https://raw.githubusercontent.com/fralfaro/MAT281_2024/main/docs/labs/data/libertad_prensa_01.csv',
'https://raw.githubusercontent.com/fralfaro/MAT281_2024/main/docs/labs/data/libertad_prensa_02.csv'
]
df_codigos = pd.read_csv('https://raw.githubusercontent.com/fralfaro/MAT281_2024/main/docs/labs/data/libertad_prensa_codigo.csv')
El objetivo es tratar de obtener la mayor información posible de este conjunto de datos. Para cumplir este objetivo debe resolver las siguientes problemáticas:
- Lo primero será juntar toda la información en un solo archivo, para ello necesitamos seguir los siguientes pasos:
- a) Crear el archivo df_anio, que contenga la información de libertad_prensa_anio.csv para cada año. Luego, normalice el nombre de las columnas a minúscula.
- b) Encuentre y elimine el dato que esta duplicado en el archivo df_codigo.
- c) Crear el archivo df que junte la información del archivo df_anio con df_codigo por la columna codigo_iso.
Hint: Para juntar por anio ocupe la función pd.concat. Para juntar información por columna ocupe pd.merge.
In [25]:
Copied!
# FIXME
df = pd.DataFrame()
# FIXME
df = pd.DataFrame()
- Encontrar:
- ¿Cuál es el número de observaciones en el conjunto de datos?
- ¿Cuál es el número de columnas en el conjunto de datos?
- Imprime el nombre de todas las columnas
- ¿Cuál es el tipo de datos de cada columna?
- Describir el conjunto de datos (hint: .describe())
In [ ]:
Copied!
# FIXME
# FIXME
- Desarrolle una función
resumen_df(df)
para encontrar el total de elementos distintos y vacíos por columnas.
In [28]:
Copied!
# respuesta
def resumen_df(df):
"""
Función para generar un resumen de un DataFrame que incluye
el número de elementos distintos y vacíos por columna.
Args:
df (pd.DataFrame): DataFrame a resumir.
Returns:
pd.DataFrame: DataFrame resumen con el nombre de las columnas,
cantidad de elementos distintos y cantidad de elementos vacíos.
"""
# Crear un DataFrame de resultado con los nombres de las columnas
nombres = df.columns
result = pd.DataFrame({'nombres': nombres})
# Calcular el número de elementos distintos por columna
result['elementos_distintos'] = 0
# Calcular el número de elementos vacíos (NaN) por columna
result['elementos_vacios'] = 0
return result
# respuesta
def resumen_df(df):
"""
Función para generar un resumen de un DataFrame que incluye
el número de elementos distintos y vacíos por columna.
Args:
df (pd.DataFrame): DataFrame a resumir.
Returns:
pd.DataFrame: DataFrame resumen con el nombre de las columnas,
cantidad de elementos distintos y cantidad de elementos vacíos.
"""
# Crear un DataFrame de resultado con los nombres de las columnas
nombres = df.columns
result = pd.DataFrame({'nombres': nombres})
# Calcular el número de elementos distintos por columna
result['elementos_distintos'] = 0
# Calcular el número de elementos vacíos (NaN) por columna
result['elementos_vacios'] = 0
return result
In [29]:
Copied!
# retornar
resumen_df(df)
# retornar
resumen_df(df)
Out[29]:
nombres | elementos_distintos | elementos_vacios |
---|
- Para los paises latinoamericano, encuentre por año el país con mayor y menor
indice
.
- a) Mediante un ciclo for.
- b) Mediante un groupby.
In [ ]:
Copied!
# respuesta
america = ['ARG', 'ATG', 'BLZ', 'BOL', 'BRA', 'CAN', 'CHL', 'COL', 'CRI',
'CUB', 'DOM', 'ECU', 'GRD', 'GTM', 'GUY', 'HND', 'HTI', 'JAM',
'MEX', 'NIC', 'PAN', 'PER', 'PRY', 'SLV', 'SUR', 'TTO', 'URY',
'USA', 'VEN']
df_america = pd.DataFrame() # FIX ME
# respuesta
america = ['ARG', 'ATG', 'BLZ', 'BOL', 'BRA', 'CAN', 'CHL', 'COL', 'CRI',
'CUB', 'DOM', 'ECU', 'GRD', 'GTM', 'GUY', 'HND', 'HTI', 'JAM',
'MEX', 'NIC', 'PAN', 'PER', 'PRY', 'SLV', 'SUR', 'TTO', 'URY',
'USA', 'VEN']
df_america = pd.DataFrame() # FIX ME
- Para cada país, muestre el indice máximo que alcanzo por anio. Para los datos nulos, rellene con el valor 0.
Hint: Utilice la función pd.pivot_table.
In [ ]:
Copied!
# FIX ME
# FIX ME