En prenant les données du Titanic comme exemple, notez ce qu'il faut faire en premier pour voir les caractéristiques des données.
Habituellement, pandas-profiling
peut être meilleur car il donne des informations plus détaillées.
import numpy as np
import pandas as pd
pd.set_option('display.max_columns', 100)
import warnings
warnings.filterwarnings('ignore')
import collections
Préparation des données
!wget https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv
Lecture des données et un peu de traitement
filename = "/content/titanic.csv"
df = pd.read_csv(filename, encoding='utf-8')
#Faire NaN correctement
df["Name"] = [di if np.random.rand()>0.1 else float("nan") for di in df["Name"]]
df["Sex"] = [di if np.random.rand()>0.01 else float("nan") for di in df["Sex"]]
df["Age"] = [di if np.random.rand()>0.05 else float("nan") for di in df["Age"]]
#family name
df["f_Name"] = [str(di).split(" ")[-1] if len(str(di).split(" "))>1 else float("nan") for di in df["Name"]]
Vous pouvez créer un bloc de données comme celui-ci.
J'utiliserai collections.Counter
plus tard, mais si la valeur de NaN est float (" nan ")
, il ne sera pas bien agrégé, alors remplacez-le par np.nan
. Pour plus de détails, voir ici
df = df.replace(float("nan"), np.nan)
Définissez les types de données un par un.
target = "Survived"
cate_list = ["Pclass", "Name", "f_Name", "Sex", "Siblings/Spouses Aboard", "Parents/Children Aboard"]
num_list = ["Age", "Fare"]
all_list = cate_list+num_list
Voici le processus principal.
n = df.shape[0]
max_n_unique = 10
n_unique_list=[]
min_data_list=[]
max_data_list=[]
major_data_rate_list=[]
#catégorie uniquement
for colname in all_list:
if colname in cate_list: #cate
n_unique = len(df[colname].unique())
min_data = np.nan
max_data = np.nan
if n_unique>max_n_unique: #S'il y a plusieurs catégories
c = collections.Counter(df[colname])
c_dict = dict(c.most_common(max_n_unique-1))
#k_list = [k for k,v in c_dict.items()]
v_list = [v/n for k,v in c_dict.items()]
major_data_rate = np.sum(v_list)
else:
major_data_rate = np.nan
else: #num
n_unique = np.nan
major_data_rate = np.nan
min_data = df[colname].min()
max_data = df[colname].max()
n_unique_list.append(n_unique)
major_data_rate_list.append(major_data_rate)
min_data_list.append(min_data)
max_data_list.append(max_data)
have_nan = df.loc[:,all_list].isnull().any(axis=0)
nan_rate = df.loc[:,all_list].isnull().sum(axis=0)/n
summary_df = pd.DataFrame({"colname":all_list,
"have_nan":have_nan.values,
"nan_rate":nan_rate.values,
"n_unique":n_unique_list,
"major_data_rate":major_data_rate_list,
"min_data":min_data_list,
"max_data":max_data_list
})
Vous pouvez créer un bloc de données qui résume les caractéristiques de ces variables.
major_data_rate
considère le nombre spécifié par max_n_unique
, par exemple, 10 données Top 10 fréquentes comme étant majeur, et calcule le rapport de ces données. (On suppose que les autres que les 10 premiers seront résumés par les «autres», etc. dans le traitement ultérieur.)
stack overflow:Why does collections.Counter treat numpy.nan as equal? CS109:A Titanic Probability GitHub:pandas-profiling
Recommended Posts