Python數(shù)據(jù)分析基礎(chǔ)與應(yīng)用電子活頁5-24藥品銷量數(shù)據(jù)預(yù)處理_第1頁
Python數(shù)據(jù)分析基礎(chǔ)與應(yīng)用電子活頁5-24藥品銷量數(shù)據(jù)預(yù)處理_第2頁
Python數(shù)據(jù)分析基礎(chǔ)與應(yīng)用電子活頁5-24藥品銷量數(shù)據(jù)預(yù)處理_第3頁
Python數(shù)據(jù)分析基礎(chǔ)與應(yīng)用電子活頁5-24藥品銷量數(shù)據(jù)預(yù)處理_第4頁
Python數(shù)據(jù)分析基礎(chǔ)與應(yīng)用電子活頁5-24藥品銷量數(shù)據(jù)預(yù)處理_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Python數(shù)據(jù)分析基礎(chǔ)與應(yīng)用模塊電子活頁5-24藥品銷售數(shù)據(jù)預(yù)處理【任務(wù)5-1】藥品銷售數(shù)據(jù)預(yù)處理【任務(wù)描述】Excel文件“藥品銷售數(shù)據(jù).xlsx”共有6578行藥店的藥品銷售數(shù)據(jù),該Excel文件共有7列有效數(shù)據(jù),分別為購藥時間、社??ㄌ?、商品編碼、商品名稱、銷售數(shù)量、應(yīng)收金額、實收金額,通過分析藥品銷售數(shù)據(jù),看看哪些藥物購買者較多,哪些天購藥者較多等。本任務(wù)主要完成列名重命名、刪除重復(fù)值、處理缺失值、轉(zhuǎn)換數(shù)據(jù)類型、處理異常數(shù)據(jù)、按照銷售時間對數(shù)據(jù)集進(jìn)行排序并重置索引等數(shù)據(jù)預(yù)處理操作,數(shù)據(jù)導(dǎo)入與審閱詳見模塊4的【任務(wù)4-1】?!救蝿?wù)實現(xiàn)】在JupyterNotebook開發(fā)環(huán)境中創(chuàng)建t5-01.ipynb,然后在單元格中編寫代碼與輸出對應(yīng)的結(jié)果。1.選擇子集在獲取到的數(shù)據(jù)集中,據(jù)量非可能數(shù)常龐大,并不是每一列數(shù)據(jù)都有分析的價值,這時就需要從整個數(shù)據(jù)集中選取合適的子集進(jìn)行分析,這樣能從數(shù)據(jù)中獲取最大價值。本任務(wù)中不需要選取子集,暫時可以忽略這一步。本任務(wù)分析Excel文件中的工作表Sheet1。2.列名重命名在數(shù)據(jù)分析過程中,有些列名和數(shù)據(jù)容易混淆或產(chǎn)生歧義,這不利于數(shù)據(jù)分析,這時可以采用rename()函數(shù)把列名換成容易理解的名稱。代碼如下:#以字典形式指定舊列名和新列名colNameDict={'購藥時間':'銷售時間'}'''inplace參數(shù)的默認(rèn)值是False,表示數(shù)據(jù)集本身不會變,而會創(chuàng)建一個新的數(shù)據(jù)集;若inplace=True,則數(shù)據(jù)集本身會變化'''salesDf.rename(columns=colNameDict,inplace=True)salesDf.head()3.刪除重復(fù)值通過對比刪除重復(fù)值前后數(shù)據(jù),可以發(fā)現(xiàn)本數(shù)據(jù)集中沒有重復(fù)值。代碼如下:print('刪除重復(fù)值前大?。?salesDf.shape)#刪除重復(fù)銷售記錄salesDf=salesDf.drop_duplicates()print('刪除重復(fù)值后大?。?,salesDf.shape)輸出結(jié)果:刪除重復(fù)值前大?。?6578,7)刪除重復(fù)值后大?。?6578,7)4.統(tǒng)計缺失值并輸出包含缺失值的行獲取的藥品銷售數(shù)據(jù)中很有可能存在缺失值,通過數(shù)據(jù)集的基本信息可以推測“銷售時間”和“社??ㄌ枴边@兩列存在缺失值,如果不處理這些缺失值會干擾后面的數(shù)據(jù)分析。(1)統(tǒng)計缺失值代碼如下:salesDf.isnull().sum()輸出結(jié)果:銷售時間2社??ㄌ?商品編碼1商品名稱1銷售數(shù)量1應(yīng)收金額1實收金額1dtype:int64(2)輸出包含缺失值的行代碼如下:salesDf[salesDf.isnull().T.any()]輸出結(jié)果:5.處理缺失值缺失值常用的處理方式為刪除含有缺失值的記錄或者填充缺失值。如果缺失值很少,可以直接將其刪除;如果缺失值量較多,超過了總數(shù)據(jù)量的10%,要根據(jù)業(yè)務(wù)情況進(jìn)行刪除或填充。填充缺失值時,可以采用平均值、中位數(shù)進(jìn)行填充;如果數(shù)據(jù)記錄之間有明顯的順序關(guān)系,則可以采用附近相鄰的數(shù)據(jù)進(jìn)行填充。(1)刪除“銷售時間”列有缺失值的行代碼如下:#后續(xù)操作針對數(shù)據(jù)集salesDf1進(jìn)行salesDf1=salesDf.copy()print('刪除缺失值之前的大?。?,salesDf1.shape)salesDf1=salesDf1.dropna(axis=0,how='all')salesDf1=salesDf1.dropna(subset=['銷售時間'],how='any')print('刪除缺失值之后的大?。?,salesDf1.shape)輸出結(jié)果:刪除缺失值之前的大?。?6578,7)刪除缺失值之后的大?。?6576,7)(2)查看“社??ㄌ枴绷杏腥笔е档男写a如下:salesDf1[salesDf1.isnull().T.any()](3)填充“社??ㄌ枴绷械娜笔е祵Α吧绫?ㄌ枴绷械娜笔е凳褂?00000000進(jìn)行填充。代碼如下:salesDf1['社??ㄌ?].fillna('100000000',inplace=True)print(salesDf1.isnull().sum())#查詢是否有缺失值print(salesDf1.isnull().any())輸出結(jié)果:銷售時間0社??ㄌ?商品編碼0商品名稱0銷售數(shù)量0應(yīng)收金額0實收金額0dtype:int64銷售時間False社??ㄌ朏alse商品編碼False商品名稱False銷售數(shù)量False應(yīng)收金額False實收金額Falsedtype:bool缺失值處理完成后,輸出結(jié)果顯示不再有缺失值。6.轉(zhuǎn)換數(shù)據(jù)類型在導(dǎo)入數(shù)據(jù)時為了防止數(shù)據(jù)導(dǎo)入失敗,會強制令所有數(shù)據(jù)都是object類型,但實際數(shù)據(jù)分析過程中“銷售數(shù)量”列應(yīng)為整型數(shù)據(jù),“應(yīng)收金額”“實收金額”列應(yīng)為浮點型數(shù)據(jù),“銷售時間”列應(yīng)為日期和時間類型數(shù)據(jù),因此需要對數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換。(1)使用astype()函數(shù)轉(zhuǎn)換數(shù)據(jù)類型使用astype()函數(shù)轉(zhuǎn)換數(shù)據(jù)類型的代碼如下:salesDf1[['銷售數(shù)量']]=salesDf1[['銷售數(shù)量']].astype('int')salesDf1[['應(yīng)收金額']]=salesDf1[['應(yīng)收金額']].astype('float')salesDf1[['實收金額']]=salesDf1[['實收金額']].astype('float')#查看每一列的數(shù)據(jù)類型salesDf1.dtypes輸出結(jié)果:銷售時間object社保卡號object商品編碼object商品名稱object銷售數(shù)量int32應(yīng)收金額float64實收金額float64dtype:object(2)分割“銷售時間”列數(shù)據(jù)“銷售時間”這一列數(shù)據(jù)中存在“星期五”這樣的數(shù)據(jù),但在數(shù)據(jù)分析過程中不需要用到“星期”,因此要把“銷售時間”列中日期和星期使用split()函數(shù)或者slice()函數(shù)進(jìn)行分割。有多種方法可以實現(xiàn)分割。方法一,代碼如下:dateDf=salesDf1['銷售時間'].astype(str).str.split("",1,expand=True)#修改“銷售時間”這一列的值salesDf1.loc[:,'銷售時間']=dateDf1[0]salesDf1['星期']=dateDf1[1]salesDf1.head()輸出結(jié)果:方法二,代碼如下:#獲取“銷售時間”這一列的值timeSer=salesDf1.loc[:,'銷售時間']timeSer=timeSer.astype('str')#對字符串進(jìn)行分割,獲取銷售日期timeList=[]forvalueintimeSer:#例如2022-01-01星期五,分割后為:2022-01-01dateStr=value.split('')[0]timeList.append(dateStr)#將列表轉(zhuǎn)行換為一維Series類型數(shù)據(jù)timeSer=pd.Series(timeList)timeSer.head()方法三,代碼如下:#將字符串用split()函數(shù)分割為列表defsptime(time):timelist=[]foriintime:time1=i.split('')[0]timelist.append(time1)timeser=pd.Series(timelist)returntimesertimeSer=salesDf1['銷售時間'].astype('str')timeSer=sptime(timeSer)timeSer.head()方法四,代碼如下:#獲取“銷售時間”這一列的值timeSer=salesDf1.loc[:,'銷售時間']timeSer=timeSer.astype('str')#對字符串進(jìn)行分割,獲取銷售日期timeList=[]timeList=timeSer.str.slice(0,10)#將列表轉(zhuǎn)換為一維Series類型數(shù)據(jù)timeSer=pd.Series(timeList)timeSer.head()(3)將日期的字符串格式改為日期格式把分割后的“銷售時間”列的數(shù)據(jù)類型由字符串類型轉(zhuǎn)換為日期和時間類型,以方便后面的數(shù)據(jù)統(tǒng)計。代碼如下:#參數(shù)errors='coerce'表示如果原始數(shù)據(jù)不符合日期的格式,轉(zhuǎn)換后的值為NaN#參數(shù)format表示原始數(shù)據(jù)中日期的格式salesDf1.loc[:,'銷售時間']=pd.to_datetime(salesDf1.loc[:,'銷售時間'],format='%Y-%m-%d',errors='coerce')修改為日期格式后有可能會出現(xiàn)缺失值,查詢是否有缺失值的代碼如下:print(salesDf1.isnull().any())輸出結(jié)果:7.刪除“銷售時間”列中為空的行將日期的字符串格式改為日期格式的過程中不符合日期格式的數(shù)值會被轉(zhuǎn)換為空值,這里需要刪除“銷售時間”列中為空的行。代碼如下:print('刪除空值之前的大?。?,salesDf1.shape)salesDf1=salesDf1.dropna(subset=['銷售時間'],how='any')#查詢是否有空值print(salesDf1.isnull().any())print('刪除空值之后的大?。?,salesDf1.shape)輸出結(jié)果:8.按照“銷售時間”列對數(shù)據(jù)集進(jìn)行排序并重置索引前面所用到的“銷售時間”列的數(shù)據(jù)并沒有按順序排列,所以需要對其進(jìn)行排序,排序之后索引順序會被打亂,所以也需要重置索引。sort_values()中的參數(shù)by表示按哪一列進(jìn)行排序,參數(shù)ascending=True表示升序排列,參數(shù)ascending=False表示降序排列,參數(shù)na_position=first表示排序的時候把缺失值放到前面,這樣可以比較清晰地看到哪些地方有缺失值。(1)按“銷售時間”列進(jìn)行升序排列代碼如下:salesDf1=salesDf1.sort_values(by='銷售時間',ascending=True,na_position='first')(2)重命名行索引數(shù)中參數(shù)drop=True表示把原來的索引去掉,drop=False表示保留原來的索引。代碼如下:salesDf1=salesDf1.reset_index(drop=True)print('排序后的數(shù)據(jù)集:')salesDf1.head()輸出結(jié)果:排序后的數(shù)據(jù)集:9.處理異常數(shù)據(jù)(1)查看數(shù)據(jù)的統(tǒng)計信息查看“銷售數(shù)量”“應(yīng)收金額”“實收金額”列的統(tǒng)計信息。代碼如下:salesDf1[['銷售數(shù)量','應(yīng)收金額','實收金額']].describe()輸出結(jié)果:(2)查看負(fù)值所在的行通過統(tǒng)計信息可以看到,“銷售數(shù)量”“應(yīng)收金額”“實收金額”這3列數(shù)據(jù)的最小值為負(fù)值,這顯然不合理。下面我們來看一下負(fù)值所在的行。代碼如下:salesDf1.loc[(salesDf1['銷售數(shù)量']<0)]通過上述輸出結(jié)果可以看出:“銷售數(shù)量”“應(yīng)收金額”“實收金額”這3列有多行數(shù)據(jù)出現(xiàn)了負(fù)值,這表示數(shù)據(jù)集中存在異常值,因此要對數(shù)據(jù)進(jìn)一步處理,以排除異常值的影響。(3)將負(fù)值轉(zhuǎn)換為正值代碼如下:salesDf1['銷售數(shù)量']=salesDf1['銷售數(shù)量'].abs()salesDf1['應(yīng)收金額']=salesDf1['應(yīng)收金額'].abs()sa

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論