Notieren Sie sich am Beispiel der Titanic-Daten, was zuerst zu tun ist, um die Eigenschaften der Daten zu sehen. Normalerweise ist "Pandas-Profiling" besser, weil es detailliertere Informationen liefert.
import numpy as np
import pandas as pd
pd.set_option('display.max_columns', 100)
import warnings
warnings.filterwarnings('ignore')
import collections
Datenaufbereitung
!wget https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv
Daten lesen & ein wenig verarbeiten
filename = "/content/titanic.csv"
df = pd.read_csv(filename, encoding='utf-8')
#NaN richtig machen
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"]]
Sie können einen solchen Datenrahmen erstellen.
Ich werde später "collection.Counter" verwenden, aber wenn der Wert von NaN "float (" nan ")" ist, wird er nicht gut aggregiert, also ersetzen Sie ihn durch "np.nan". Weitere Informationen finden Sie unter hier.
df = df.replace(float("nan"), np.nan)
Definieren Sie die Datentypen nacheinander.
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
Das Folgende ist der Hauptprozess.
n = df.shape[0]
max_n_unique = 10
n_unique_list=[]
min_data_list=[]
max_data_list=[]
major_data_rate_list=[]
#nur Kategorie
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: #Wenn es viele Kategorien gibt
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
})
Sie können einen Datenrahmen erstellen, der die Eigenschaften solcher Variablen zusammenfasst.
major_data_rate
betrachtet die durch max_n_unique
angegebene Zahl, beispielsweise 10 häufig vorkommende Top 10-Daten, als major und berechnet das Verhältnis dieser Daten. (Es wird davon ausgegangen, dass andere als die Top 10 in der späteren Verarbeitung von "anderen" usw. zusammengefasst werden.)
stack overflow:Why does collections.Counter treat numpy.nan as equal? CS109:A Titanic Probability GitHub:pandas-profiling
Recommended Posts