Python數據分析基礎與應用電子活頁5-24藥品銷量數據預處理_第1頁
Python數據分析基礎與應用電子活頁5-24藥品銷量數據預處理_第2頁
Python數據分析基礎與應用電子活頁5-24藥品銷量數據預處理_第3頁
Python數據分析基礎與應用電子活頁5-24藥品銷量數據預處理_第4頁
Python數據分析基礎與應用電子活頁5-24藥品銷量數據預處理_第5頁
已閱讀5頁,還剩2頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論