1. 程式人生 > >第四關:pandas分析實際案例-藥店銷售資料分析

第四關:pandas分析實際案例-藥店銷售資料分析

import pandas as pd
import numpy as np

#讀取資料
filename='E:\sale.xlsx'
xls=pd.ExcelFile(filename,dtype="object")
salesdf=xls.parse('Sheet1',dtype='object')
#打印出前5行資料
print(salesdf.head())

#資料大小,多少行多少列,注意shape後面不新增括號
print(salesdf.shape)

#資料型別:dtypes.後面也是不新增括號
print(salesdf.dtypes)

#資料清洗

#1)更改資料列頭名字
""" inplace=True是資料框本身會改動 inplace=False資料框本身不會變,而會建立一個改動後的新的資料框,預設的是flase """ dictnamecol={"購藥時間":"銷售時間"} salesdf.rename(columns=dictnamecol,inplace=True) print(salesdf.head()) #2) 缺失值處理 print("缺失前的資料大小:",salesdf.shape) salesdf=salesdf.dropna(subset=["銷售時間",'社保卡號'],how="any") print("刪除缺失後的大小:",salesdf.shape) """ 資料型別的轉換:字串轉為日期 銷售數量和金額:字串轉為浮點型,有利於下面的describe進行統計,否則describe就會無法對銷售數量和金額進行統計 """
salesdf.loc[:,"銷售數量"]=salesdf.loc[:,'銷售數量'].astype("float") salesdf.loc[:,"應收金額"]=salesdf.loc[:,'應收金額'].astype("float") salesdf.loc[:,"實收金額"]=salesdf.loc[:,'實收金額'].astype("float") #資料型別的轉換 #定義一個函式,將列表中的字串時間資料分列開,取第一個年月日, def splitsaletime(timecolser): timelist=[] for value in timecolser: datastr=value.split(" "
)[0] timelist.append(datastr) timeser=pd.Series(timelist) return timeser #將excel中的第一行銷售時間提取出來,運用到函式裡面,再將提取出來的字串年月日賦值給銷售時間 timeser=salesdf.loc[:,'銷售時間'] dataser=splitsaletime(timeser) salesdf.loc[:,'銷售時間']=dataser """ 資料型別的轉換:字串轉為日期 """ #errors='coerce' 如果原始資料不符合日期的格式,轉換後的值為空值NaT #format 是原資料中的日期格式 salesdf.loc[:,'銷售時間']=pd.to_datetime(salesdf.loc[:,"銷售時間"],format='%Y-%m-%d',errors="coerce") print(salesdf.dtypes) #以上是銷售時間從重新命名,分列,獲取年月日,再將年月日賦值給銷售時間 #轉換日期過程中不符合日期格式的數值會被轉換為空值, #這裡刪除列(銷售時間,社保卡號)中為空的行 salesdf=salesdf.dropna(subset=['銷售時間','社保卡號'],how='any') print(salesdf.head()) #資料排序 """ by:按哪一列排序 ascending=True,按照降序排列 ascending=False 按照升序排列 """ #按照銷售日期進行升序排列 salesdf=salesdf.sort_values(by="銷售時間",ascending=True) print(salesdf.head()) #經過重新排序後,index的索引列就會重新改變 #重新命名行名(index):排序後的列索引值是之前的行號,需要修改成從0到N的按順序的索引值 salesdf=salesdf.reset_index(drop=True) print(salesdf.head()) #異常值處理 print(salesdf.describe()) #發現存在的銷售數量<0的異常值 #刪除異常值:通過條件篩選出資料 #查詢條件 queryser=salesdf.loc[:,"銷售數量"]>0 #應用查詢條件 print("刪除異常值前:",salesdf.shape) salesdf=salesdf.loc[queryser,:]#布林運算,因為上面的查詢條件得到的是行,所以根據布林索引行對應相應的行。 print("刪除異常值後:",salesdf.shape) #構建模型 #指標1:月平均消費次數 """ 總消費次數:同一天,同一個人的所有消費都算作是一次消費 根據列名(銷售時間,社群卡號),如果這兩個列值同時相同,只保留第一個 將重複的資料刪除 """ kpil_df=salesdf.drop_duplicates(subset=["銷售時間",'社保卡號']) #總得消費次數:有多少行 total=kpil_df.shape[0] print("總得消費次數:",total) #月份數 starttime=kpil_df.loc[0,"銷售時間"] endtime=kpil_df.loc[total-1,'銷售時間'] days=(endtime-starttime).days month=days//30 print("月份數:",month) #業務指標1:月平均消費次數=總次數/月數 kpi1=total/month print("月平均消費次數:",kpi1) #業務指標2:月平均消費額 #因為總得金額是包含同一時間和同一個社保卡號的,因此是不能用kpi_df,應該用去重之前的sale_df totalmoney=salesdf.loc[:,"實收金額"].sum() monthmoney=totalmoney/month print("月平均消費額:",monthmoney) #業務指標3:客單價 ''' 總消費額/總次數 ''' pct=totalmoney/total print("客單價:",pct) 答案如下: 購藥時間 社保卡號 商品編碼 商品名稱 銷售數量 應收金額 實收金額 0 2018-01-01 星期五 001616528 236701 強力VC銀翹片 6 82.8 69 1 2018-01-02 星期六 001616528 236701 清熱解毒口服液 1 28 24.64 2 2018-01-06 星期三 0012602828 236701 感康 2 16.8 15 3 2018-01-11 星期一 0010070343428 236701 三九感冒靈 1 28 28 4 2018-01-15 星期五 00101554328 236701 三九感冒靈 8 224 208 (6578, 7) 購藥時間 object 社保卡號 object 商品編碼 object 商品名稱 object 銷售數量 object 應收金額 object 實收金額 object dtype: object 銷售時間 社保卡號 商品編碼 商品名稱 銷售數量 應收金額 實收金額 0 2018-01-01 星期五 001616528 236701 強力VC銀翹片 6 82.8 69 1 2018-01-02 星期六 001616528 236701 清熱解毒口服液 1 28 24.64 2 2018-01-06 星期三 0012602828 236701 感康 2 16.8 15 3 2018-01-11 星期一 0010070343428 236701 三九感冒靈 1 28 28 4 2018-01-15 星期五 00101554328 236701 三九感冒靈 8 224 208 缺失前的資料大小: (6578, 7) 刪除缺失後的大小: (6575, 7) 銷售時間 datetime64[ns] 社保卡號 object 商品編碼 object 商品名稱 object 銷售數量 object 應收金額 object 實收金額 object dtype: object 銷售時間 社保卡號 商品編碼 商品名稱 銷售數量 應收金額 實收金額 0 2018-01-01 001616528 236701 強力VC銀翹片 6 82.8 69 1 2018-01-02 001616528 236701 清熱解毒口服液 1 28 24.64 2 2018-01-06 0012602828 236701 感康 2 16.8 15 3 2018-01-11 0010070343428 236701 三九感冒靈 1 28 28 4 2018-01-15 00101554328 236701 三九感冒靈 8 224 208 銷售時間 社保卡號 商品編碼 商品名稱 銷售數量 應收金額 實收金額 0 2018-01-01 001616528 236701 強力VC銀翹片 6 82.8 69 3436 2018-01-01 0010616728 865099 硝苯地平片(心痛定) 2 3.4 3 1190 2018-01-01 0010073966328 861409 非洛地平緩釋片(波依定) 5 162.5 145 3859 2018-01-01 0010073966328 866634 硝苯地平控釋片(欣然) 6 111 92.5 3888 2018-01-01 0010014289328 866851 纈沙坦分散片(易達樂) 1 26 23 銷售時間 社保卡號 商品編碼 商品名稱 銷售數量 應收金額 實收金額 0 2018-01-01 001616528 236701 強力VC銀翹片 6 82.8 69 1 2018-01-01 0010616728 865099 硝苯地平片(心痛定) 2 3.4 3 2 2018-01-01 0010073966328 861409 非洛地平緩釋片(波依定) 5 162.5 145 3 2018-01-01 0010073966328 866634 硝苯地平控釋片(欣然) 6 111 92.5 4 2018-01-01 0010014289328 866851 纈沙坦分散片(易達樂) 1 26 23 銷售數量 應收金額 實收金額 count 6549.000000 6549.000000 6549.000000 mean 2.384486 50.449076 46.284370 std 2.375227 87.696401 81.058426 min -10.000000 -374.000000 -374.000000 25% 1.000000 14.000000 12.320000 50% 2.000000 28.000000 26.500000 75% 2.000000 59.600000 53.000000 max 50.000000 2950.000000 2650.000000 [6 rows x 7 columns] 刪除異常值前: (6549, 7) 刪除異常值後: (6506, 7) 總得消費次數: 5342 月份數: 5 月平均消費次數: 1068.4 月平均消費額: 60802.02199999957 客單價: 56.9094178210404