第四關:pandas分析實際案例-藥店銷售資料分析
阿新 • • 發佈:2019-01-01
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