【数据分析学习】数据预处理
將值為0的數據替換為空值
data = data.replace(0.0000, np.nan)統計某一列空值的數量
data['one_column'].isnull().sum()統計缺失值大于某一閾值的列的名字
data_null = [] for data_col in data.columns.values.tolist():if data[data_col].isnull().sum() >= 16:data_null.append(data_col)print(data_col, data[data_col].isnull().sum()) data_null刪除某一列或批量刪除某幾列
data = data.drop('one_column',axis=1) data = data.drop(data_null,axis=1)用均值填充缺失值
avg = data[null_colums].mean() data[null_colums] = data[null_colums].fillna(avg)缺失值分析
def missing_values(df):alldata_na = pd.DataFrame(df.isnull().sum(), columns={'missingNum'})alldata_na['existNum'] = len(df) - alldata_na['missingNum']alldata_na['sum'] = len(df)alldata_na['missingRatio'] = alldata_na['missingNum']/len(df)*100alldata_na['dtype'] = df.dtypes#ascending:默認True升序排列;False降序排列alldata_na = alldata_na[alldata_na['missingNum']>0].reset_index().sort_values(by=['missingNum','index'],ascending=[False,True])alldata_na.set_index('index',inplace=True)return alldata_namissing_values(data_train)是否有單調特征列(單調的特征列很大可能是時間)
#是否有單調特征列(單調的特征列很大可能是時間) def incresing(vals):cnt = 0len_ = len(vals)for i in range(len_-1):if vals[i+1] > vals[i]:cnt += 1return cntfea_cols = [col for col in data_train.columns] for col in fea_cols:cnt = incresing(data_train[col].values)if cnt / data_train.shape[0] >= 0.55:print('單調特征:',col)print('單調特征值個數:', cnt)print('單調特征值比例:', cnt / data_train.shape[0])特征nunique分布
# 特征nunique分布 for feature in categorical_feas:print(feature + "的特征分布如下:")print(data_train[feature].value_counts())plt.hist(data_all[feature], bins=3)plt.show()統計特征值出現頻次大于100的特征
# 統計特征值出現頻次大于100的特征 for feature in categorical_feas:df_value_counts = pd.DataFrame(data_train[feature].value_counts())df_value_counts = df_value_counts.reset_index()df_value_counts.columns = [feature, 'counts'] # change column namesprint(df_value_counts[df_value_counts['counts'] >= 100])Labe 分布
# Labe 分布 fig,axes = plt.subplots(2,3,figsize=(20,5)) fig.set_size_inches(20,12) sns.distplot(data_train['tradeMoney'],ax=axes[0][0]) sns.distplot(data_train[(data_train['tradeMoney']<=20000)]['tradeMoney'],ax=axes[0][1]) sns.distplot(data_train[(data_train['tradeMoney']>20000)&(data_train['tradeMoney']<=50000)]['tradeMoney'],ax=axes[0][2]) sns.distplot(data_train[(data_train['tradeMoney']>50000)&(data_train['tradeMoney']<=100000)]['tradeMoney'],ax=axes[1][0]) sns.distplot(data_train[(data_train['tradeMoney']>100000)]['tradeMoney'],ax=axes[1][1])轉換object類型數據為LabelCode
將取值具有大小意義的類別型變量數據轉變為數值型映射,可使用LabelEncoder對不具實體數值數據編碼
LabelEncoder是用來對分類型特征值進行編碼,即對不連續的數值或文本進行編碼。其中包含以下常用方法:
fit(y) :fit可看做一本空字典,y可看作要塞到字典中的詞。
fit_transform(y):相當于先進行fit再進行transform,即把y塞到字典中去以后再進行transform得到索引值。
inverse_transform(y):根據索引值y獲得原始數據。
transform(y) :將y轉變成索引值。
轉換object類型數據為one-hot編碼
有一些特征并不是以連續值的形式給出。例如:人的性別 [“male”, “female”],來自的國家 [“from Europe”, “from US”, “from Asia”],使用的瀏覽器[“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”]。這種特征可以采用整數的形式進行編碼,如: [“male”, “from US”, “uses Internet Explorer”] 可表示成 [0, 1, 3] ,[“female”, “from Asia”, “uses Chrome”] 可表示成[1, 2, 1]。 但是,這些整數形式的表示不能直接作為某些機器學習算法輸入,因為有些機器學習算法是需要連續型的輸入數據,同一列數據之間數值的大小可代表差異程度。如: [0, 1, 3]與[0,1,0]的特征差異比[0, 1, 3]與[0,1,2]之間的差異要大,但事實上它們的差異是一樣的,都是瀏覽器使用不一樣。
一個解決辦法就是采用OneHotEncoder,這種表示方式將每一個分類特征變量的m個可能的取值轉變成m個二值特征,對于每一條數據這m個值中僅有一個特征值為1,其他的都為0。
對于類別離散型特征,取值間沒有大小意義的,可采用one-hot編碼
MinMaxScaler()
功能是將每個元素(特征,feature)轉換成給定范圍的值。分別縮放和轉換每個特征,以使其處于訓練集的給定范圍內,例如在區間[0,1]。
>>> from sklearn.preprocessing import MinMaxScaler >>> data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]] >>> scaler = MinMaxScaler() >>> print(scaler.fit(data)) MinMaxScaler() >>> print(scaler.data_max_) [ 1. 18.] >>> print(scaler.transform(data)) [[0. 0. ][0.25 0.25][0.5 0.5 ][1. 1. ]] >>> print(scaler.transform([[2, 2]])) [[1.5 0. ]]時間格式預處理
#將update_date從例如2019-02-20的str變為datetime格式,并提取處year、month、day data["year"] = pd.to_datetime(data["update_date"]).dt.year data["month"] = pd.to_datetime(data["update_date"]).dt.month data["day"] = pd.to_datetime(data["update_date"]).dt.day data['week'] = pd.to_datetime(data["update_date"]).dt.week data['weekday'] = pd.to_datetime(data["update_date"]).dt.weekday找出 year 中2019年以后的數據,并將其他數據刪除
data = data[data["year"] >= 2019] #找出 year 中2019年以后的數據,并將其他數據刪除聚合時間數據
# 聚合時間數據 total_balance = data.groupby(['date'])['total_purchase_amt','total_redeem_amt'].sum().reset_index()將時間字符串轉換為10位時間戳
import time #將時間字符串轉換為10位時間戳,時間字符串默認為2017-10-01 13:37:04格式 def date_to_timestamp(date, format_string="%Y/%m/%d %H:%M:%S.%f."):time_array = time.strptime(date, format_string)time_stamp = int(time.mktime(time_array))return time_stamp數據導入和預覽
數據的列columns屬性
數據的空值檢測
空值的替換方式
異常值的處理方式
3segama原則
箱型圖
任意數據的增刪改查
處理后數據的導出
數據的歸一化、標準化
數據分桶
數據正態分布
離散型、連續性數據和非數值數據
數據透視圖
總結
以上是生活随笔為你收集整理的【数据分析学习】数据预处理的全部內容,希望文章能夠幫你解決所遇到的問題。