學習筆記(01):Python數據清洗實戰-數據離散化

立即學習:https://edu.csdn.net/course/play/26990/361136?utm_source=blogtoedu

數據離散化

但是異常數據用蓋帽法處理後,df[['Price','Price_new']].describe()的結果和老師實戰的結果是一樣的,但是箱線圖上面還有很多點。不知道什麼原因?詳見下圖:

箱線圖異常

代碼如下:

import numpy as np
import pandas as pd
import os
os.chdir(r'C:/Users/wu_dh/Downloads/數據清洗課程材料/代碼和數據')
df = pd.read_csv('MotorcycleData.csv',encoding = 'gbk',na_values='Na')
# In[ ]:
# 自定義數據格式轉換函數
def f(x):
    if '$' in str(x):
        x = str(x).strip('$')
        x = str(x).replace(',','')
    else:
        x = str(x).replace(',','')
    return float(x)
# In[ ]:
df['Price'] =  df['Price'] .apply(f)   #使用自定義函數格式化價格
df['Mileage'] = df['Mileage'].apply(f) #使用自定義函數格式化里程
# In[ ]:
df.drop_duplicates(subset = ['Condition','Condition_Desc','Price','Location'],inplace = True) #刪除指定變量重複的行
df.dropna() #直接刪除法,等同:df.dropna(how='any',axis = 0)
df.dropna(how='any',axis = 1 ) #只要有缺失,就刪除這一列
df['Price'].fillna(method = 'ffill') #前向填補
# In[ ]:
xbar = df.Price.mean()  #價格均值
xstd = df.Price.std()   #價格標準差
print('標準差法異常值上限檢測:\n',any(df.Price> xbar + 2.5 * xstd))  #價格高於均值+2.5倍標準差
print('標準差法異常值下限檢測:\n',any(df.Price< xbar - 2.5 * xstd))  #價格低於均值-2.5倍標準差
# In[ ]:
df['Price'].describe() #count 記錄數量,mean 均值,std 標準差,min,最小值,25% 25分位數,75% 75分位數,max 最大值
# In[ ]:
Q1 = df.Price.quantile(q = 0.25)
Q3 = df.Price.quantile(q = 0.75)
IQR = Q3 - Q1  # 分位差
print('箱線圖法異常值上限檢測:\n',any(df.Price > Q3 + 1.5 * IQR))
print('箱線圖法異常值下限檢測:\n',any(df.Price < Q1 - 1.5 * IQR))
# In[ ]:
import matplotlib.pyplot as plt
get_ipython().run_line_magic('matplotlib', 'inline')
df.Price.plot(kind ='box')  #繪製箱線圖
# In[ ]:
plt.style.use('seaborn') # 設置繪圖風格
df.Price.plot(kind = 'hist', bins = 30, density = True) # 繪製直方圖
df.Price.plot(kind = 'kde') # 繪製核密度圖
plt.show() # 圖形展現
# In[ ]:
P01 = df.Price.quantile(0.01) #創建1分位數,作爲最小值
P99 = df.Price.quantile(0.99) #創建99分位數,作爲最大值

df['Price_new'] = df['Price'] #先創建一個新變量,進行賦值,後面用蓋帽法處理異常值
df.loc[df['Price'] > P99,'Price_new'] = P99 #凡是大於99分位數的都替換爲99分位數
df.loc[df['Price'] < P01,'Price_new'] = P01#凡是小於1分位數的都替換爲1分位數
# In[ ]:
df[['Price','Price_new']].describe()  #查看替換後的數據分佈情況
# In[ ]:
df['Price_new'].plot(kind ='box') #繪製蓋帽後的箱線圖

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章