<jupyter_start><jupyter_text>Ejercicio 1: Valores nulos en el Titanic<jupyter_code>import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline<jupyter_output><empty_output><jupyter_text>Lee los datos del csv "titanic.csv" en un DataFrame llamado ``titanic_df`` y estudia sus característica. Usa los atributos/métodos ``columns``, ``describe()`` e intenta entender los datos con su descripción:<jupyter_code>titanic_df = pd.read_csv("titanic.csv")
titanic_df.head()
titanic_df.describe()
titanic_df.columns<jupyter_output><empty_output><jupyter_text>1.   **Survived:** indica si un pasajero sobrevivió o falleció (0 = Fallecido; 1 = Superviviente)2.  **Pclass:** Clase socioeconómica (1 = Upper class; 2 = Middle class; 3 = Lower class)3.   **Name:** Nombre del pasajero4.  **Sex:** Género del pasajero5.  **Age:** Edad del pasajero6.  **SibSp:** Número de hermanos y cónyuges del pasajero a bordo7.  **Parch:** Número de padres e hijos del pasajero a bordo8.   **Ticket:** Número de ticket del pasajero9.   **Fare:** Tarifa pagada por el pasajero10. **Cabin** Número de cabina del pasajero11. **Embarked:** Puerto de embarque del pasajero (C = Cherbourg; Q = Queenstown; S = Southampton)  Usa 2 métodos diferentes para obtener el número de conteos no nulos por columna<jupyter_code>titanic_df.count()
titanic_df.notnull().sum()<jupyter_output><empty_output><jupyter_text>3 columnas tienen valores nulos: Age, Cabin y EmbarkedCalcula el porcentaje de nulos de cada columna numérica<jupyter_code>titanic_df['Age'].isnull().mean()
ser1 = titanic_df.isnull().mean()
ser1[ser1>0]
print('Age:', round((titanic_df['Age'].isna().sum()/titanic_df.shape[0])*100,2),'% missing values')
porce_age = (titanic['Age'].isnull().sum()/len(titanic))*100
porce_age<jupyter_output><empty_output><jupyter_text>Columna Cabin  En función del porcentaje de nulos, ¿cuál crees que podría ser la mejor forma de aproximar esta columna?<jupyter_code>#<jupyter_output><empty_output><jupyter_text>Identifica los valores únicos de esta columna<jupyter_code># titanic["Cabin"]
titanic["Cabin"].unique()

# titanic_df['Cabin'].drop_duplicates()<jupyter_output><empty_output><jupyter_text>Columna Embarked  ¿De qué tipo es la columna Embarked? Obtén los valores únicos:<jupyter_code>print(titanic_df['Embarked'].dtype)
list(titanic_df.Embarked.unique())
titanic_df.dtypes<jupyter_output><empty_output><jupyter_text>Cuenta el número de apariciones de cada valor. Después, obtén tambien el porcentaje de cada uno de ellos.<jupyter_code>titanic_df.groupby('Embarked')['PassengerId'].count()
por_Embarked =(titanic.groupby('Embarked')['PassengerId'].count()/len(titanic['Embarked']))*100
por_Embarked<jupyter_output><empty_output><jupyter_text>¿Cuál sería la mejor aproximación para imputar los datos?<jupyter_code># Propuesta Javier
import numpy as np

valores_nulos = titanic_df["Embarked"].isnull().sum()
fill_values_rand = np.random.choice(por_Embarked.index.values, size=2, p=por_Embarked.values/por_Embarked.values.sum())
print(fill_values_rand)

titanic_fill_embarked = titanic_df.copy()
index_nulos_embarked = titanic_fill_embarked[titanic_fill_embarked["Embarked"].isnull()].index
print(index_nulos_embarked)

titanic_fill_embarked.loc[index_nulos_embarked, "Embarked"] = fill_values_rand
titanic_fill_embarked.loc[index_nulos_embarked]
list(por_Embarked.index)<jupyter_output><empty_output><jupyter_text>Columna Age  Calcula el porcentaje de valores nulos en función de la clase socioeconómica<jupyter_code>titanic_df.groupby('Pclass').apply(lambda x: x['Age'].isnull().sum())
titanic_df.groupby('Pclass').apply(lambda x: x['Age'].isnull().sum() / x.shape[0])
titanic_df.groupby('Pclass')['Pclass'].count()
titanic_df.groupby('Pclass')['Age'].count()
(titanic_df.groupby('Pclass')['Pclass'].count() - titanic_df.groupby('Pclass')['Age'].count()) / titanic_df.groupby('Pclass')['Pclass'].count()<jupyter_output><empty_output><jupyter_text>Calcula el porcentaje de supervivientes por rango de edad: 0-10, 11-20... (sin tener en cuenta las filas con nulos)<jupyter_code>new_df = titanic_df.drop('Cabin', axis=1)
new_df.dropna(inplace=True)
# new_df['age_category'] = new_df['Age'].astype(str).str[:1] + '0' + ' - ' + new_df['Age'].astype(str).str[:1] + '9'
new_df['age_category'] = new_df['Age'].apply(lambda x: "%s0 - %s9" %(str(x)[:1], str(x)[:1]))
new_df['age_category']
df4 = titanic_df.copy()
df4 = df4[df4['Age'].notnull()]

edades = 10 * (df4['Age'] // 10)
edades

df4['edades'] = edades
df4
round(new_df.groupby('age_category')['PassengerId'].count() / new_df.shape[0],2)
df4.groupby('edades').apply(lambda x: x['Age'].count()/df4.shape[0])*100<jupyter_output><empty_output><jupyter_text>Construye un nuevo DataFrame con las columnas Age y Sex, y rellena los nulos de Age con 0<jupyter_code>titanic_df2 = titanic_df.copy()
titanic_df2['Age'].fillna(0, inplace=True)
titanic_df2<jupyter_output><empty_output><jupyter_text>Dibuja un histograma para ver la distribución de la columna con los nuevos valores. ¿Crees que es una buena aproximación?Para hacer el histograma, utiliza el método ``hist()`` sobre el ``Series`` que quieras representar.<jupyter_code>titanic_df['Age'].hist()
titanic_df2['Age'].hist()<jupyter_output><empty_output><jupyter_text>Créate otro DataFrame con las columnas Age y Sex de nuevo, y usa una función lambda para rellenar los nulos de Age con la media de Age en función del género<jupyter_code>df2 = titanic[['Age', 'Sex']].copy()
ser2 = df2.groupby('Sex').apply(lambda x: x['Age'].fillna(x['Age'].mean()))
ser2
titanic_df['Age'] = titanic_df.groupby("Sex").transform(lambda x: x.fillna(x.mean()))['Age']

titanic_df['Age']<jupyter_output><empty_output><jupyter_text>Dibuja un histograma para ver la distribución de la columna con los nuevos valores. ¿Crees que es una buena aproximación?<jupyter_code>titanic_df2 = titanic_df.copy()
titanic_df2 = titanic_df2[titanic_df2['Age'].notnull()]
rango_edad = ((titanic_df2['Age'].apply(lambda x: int(x/10))) * 10)
# titanic_df2['Rango Edad'] = rango_edad
# titanic_df2.groupby('Rango Edad')['Rango Edad'].count() / len(titanic_df2['Rango Edad'])

titanic_df2['aux'] = rango_edad
titanic_df2[['Age', 'aux']]<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1482318746972388, 'fraction_numerical': 0.015662845147747458, 'mean_word_length': 7.989840348330914, 'pattern_counts': {'":': 0, '<': 61, '<?xml version=': 0, '>': 62, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '15', 'dir': 'jupyter-structured-clean-dedup', 'id': '242183', 'license': 'MIT', 'n_tokens_mistral': 2540, 'n_tokens_neox': 2466, 'n_words': 477, 'path': 'Bloque 2 - Data_Analyst/02_Manejo de datos/02_Missings y outliers/02_Ejercicios Missing Data.ipynb', 'repo_name': 'JuanDG5/bootcamp_thebridge_PTSep20', 'size': '6193'}