import pandas as pd

# --- STEP 1: Dataset di esempio con valori mancanti e tipi eterogenei ---
data = {
    'Age': [25, 30, 35, None],
    'Gender': ['Male', 'Female', 'Male', 'Female'],
    'Salary': [50000, 60000, 70000, None],
    'Married': [True, False, True, None]
}

# --- STEP 2: Creazione del DataFrame ---
df = pd.DataFrame(data)

# --- STEP 3: Ispezione dei tipi di dati inferiti automaticamente da pandas ---
print("Tipi di dati originali:")
print(df.dtypes)
print()

# --- STEP 4: Conversione ai tipi di dati "nullable" ---
df['Age'] = df['Age'].astype('Int64')            # Intero che supporta NaN (pd.NA)
df['Gender'] = df['Gender'].astype('category')   # Categoria per valori discreti ripetuti
df['Salary'] = df['Salary'].astype('Float64')    # Float nullable esplicito
df['Married'] = df['Married'].astype('boolean')  # Booleano che supporta NaN (pd.NA)

# --- STEP 5: Verifica dei tipi dopo la conversione ---
print("Tipi di dati dopo la conversione:")
print(df.dtypes)
print()
print(df)