利用Python處理Excel數據
本文數據的處理基本上使用的是pandas庫,實踐發現該庫確實十分強大。
首先可以按照【原】十分鐘搞定pandas - ChaoSimple - 博客園 將上面的例子逐一熟悉一 下,有個概念即可,號稱十分鐘可以熟悉,但還是花了2個多小時才走了一遍。在實踐中如果遇到不會的可以在該網址中找到相應的模塊,然後進入詳細界面進行深入學習。數據分析過程:一、預處理1、讀取數據df = pd.read_excel(.../朝陽醫院2016年銷售數據1.xlsx,sheet_name=Sheet)
一句話生成dataframe,接下來基本上就是利用dataframe進行分析了
2、刪除缺失值,雖然實際上沒有,但也需要這一步df = df.dropna(how = any,axis=0)
3、修改列名,中文名稱是無法在dataframe中直接用字元串表示出來的
#改名names = [time,cardNum,drugID,drugName,saleNum,virtualMoney,actualMoney]df.columns = names
4、排序,一般按照時間排序
由於時間格式是 「2016-01-01 星期五」 這樣日期星期混合的,需要將中文切割出去,並將時間轉換成datetime格式
df1 = df.copy()df1[time] = pd.to_datetime(df[time].str.split( ).str.get(0))df1.sort(columns = time,inplace = True)
由於接下來需要用到起始時間,最終時間以及時間間隔,所以對日期進行了預處理
startTime = df1.iloc[0, 0]endTime = df1.iloc[-3, 0]delta = (endTime - startTime) / np.timedelta64(1, D) # D代表day,s代表秒month = delta / 30
二、業務指標分析
業務一、月均消費次數月均消費次數=總消費次數/月份數def monthConsumeF(dataframe): #按照日期及社保賬號來清洗數據,將每個人一天的所有消費次數算作一次消費 mcdf = dataframe.drop_duplicates([time,cardNum]) consumeNumber = len(mcdf) monthConsume = int(consumeNumber / month) # 月消費次數 print 月消費次數:, monthConsume調用 monthConsumeF(df1)output: 月消費次數: 809
這裡結果有些不同,因為7月有19天,如果直接取整算6個月那計算結果將會有較大偏差,所以我覺得平均月份取小數較好
業務二、月均消費金額月均消費金額=總消費金額/月份數def monthMoneyF(dataframe): actualMoneySum = pd.Series.sum(dataframe[actualMoney]) # print actualMoneySum monthMoney = int(actualMoneySum / month) print 月均消費金額:, monthMoney調用 monthMoneyF(df1)output:月均消費金額: 45694
業務三、客單價
客單價=總消費金額/總消費次數def ptsF(dataframe): actualMoneySum = pd.Series.sum(dataframe[actualMoney]) consumeNumber = len(dataframe.drop_duplicates([time,cardNum])) pts = actualMoneySum/consumeNumber print 客單價:, pts調用 ptsF(df1)output:客單價: 56.4339125602
業務四、消費趨勢
消費趨勢是按周計算的
def trendF(dataframe): trend = dataframe.loc[:, [time, actualMoney]] trend[time] = pd.to_datetime(trend[time]) trend = trend.set_index(time) # 按周分割並計算周消費總和 s = trend[actualMoney].resample(W).sum() trendNew = pd.Series.to_frame(s) # index format 將年月日 改為 年周 trendNew.index = trendNew.index.format(formatter=lambda x:x.strftime(%Y-%W)) # print df5 trendNew.plot() plt.legend(loc=best) plt.show()
主要是這一句
s = trend[actualMoney].resample(W).sum()trendNew = pd.Series.to_frame(s)
按照周計算每周的銷售總額,這樣得出的是一個序列,再將其轉換為dataframe,這樣便於直接作圖
業務五、列出各類藥品售出數量的排名def saleNumF(dataframe): drug = dataframe.loc[:, [drugName, saleNum]] #按藥品名進行歸類並計算藥品賣出總和 s1 = drug.groupby(drug.drugName.str[:])[saleNum].sum() drugNew = pd.Series.to_frame(s1) drugNew = drugNew.sort_values(by=saleNum, ascending=False) #太擁擠了分成兩張圖 drugPart1 = drugNew.iloc[0:34, :] drugPart2 = drugNew.iloc[34:, :] ax1 = drugPart1.plot.barh(alpha=0.75, rot=0,fontsize=8) ax2 = drugPart2.plot.barh(alpha=0.75, rot=0,fontsize=8) ax1.set_xlim(0,2000) ax2.set_xlim(0,2000) plt.show()
def weekdayF(dataframe): timeDF = dataframe.drop_duplicates([time, cardNum]) timeDF = timeDF.loc[:, [time]] timeDF[num] = 1 timeDF[time] = pd.to_datetime(timeDF[time]) #將日期換算成周幾 timeDF[weekday] = timeDF[time].dt.dayofweek weekday = timeDF.loc[:, [weekday, num]] s2 = weekday.groupby(weekday)[num].sum() weekdayNew = pd.Series.to_frame(s2) weekdayNew[weekdays] = [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] weekdayNew = weekdayNew.set_index(weekdays) print weekdayNew weekdayNew.plot(kind=bar) plt.show()
plt.rcParams[font.sans-serif] = [SimHei] # 指定默認字體plt.rcParams[axes.unicode_minus] = False # 解決保存圖像是負號-顯示為方塊的問題
這是一次簡單的數據分析,主要是熟悉了pandas的使用並更多的了解了數據分析流程,接下來將進行更加複雜的數據分析學習。
推薦閱讀:
※R語言 數據Excel的導入與導出
※揭秘BDP的五大隱藏但超實用的功能,99%的人都會用到!
※職位速遞:知名互聯網金融公司高級數據分析工程師(年薪30~50W)
※你沒有自己想像的那樣努力
※初學R並實現探索性數據分析
TAG:數據分析 |