Python數(shù)據(jù)分析與可視化典型項(xiàng)目實(shí)戰(zhàn)模塊五-商品銷(xiāo)量數(shù)據(jù)分析_第1頁(yè)
Python數(shù)據(jù)分析與可視化典型項(xiàng)目實(shí)戰(zhàn)模塊五-商品銷(xiāo)量數(shù)據(jù)分析_第2頁(yè)
Python數(shù)據(jù)分析與可視化典型項(xiàng)目實(shí)戰(zhàn)模塊五-商品銷(xiāo)量數(shù)據(jù)分析_第3頁(yè)
Python數(shù)據(jù)分析與可視化典型項(xiàng)目實(shí)戰(zhàn)模塊五-商品銷(xiāo)量數(shù)據(jù)分析_第4頁(yè)
Python數(shù)據(jù)分析與可視化典型項(xiàng)目實(shí)戰(zhàn)模塊五-商品銷(xiāo)量數(shù)據(jù)分析_第5頁(yè)
已閱讀5頁(yè),還剩49頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

模塊五商品銷(xiāo)量數(shù)據(jù)分析Python數(shù)據(jù)分析與可視化典型項(xiàng)目實(shí)戰(zhàn)(微課版)【任務(wù)描述】【任務(wù)描述】Excel文件“商品銷(xiāo)售數(shù)據(jù).xlsx”共有1948行、7列數(shù)據(jù),列名分別為:銷(xiāo)售日期、銷(xiāo)售區(qū)域、銷(xiāo)售渠道、銷(xiāo)售訂單、品牌、售價(jià)、銷(xiāo)售數(shù)量。針對(duì)該數(shù)據(jù)集完成以下統(tǒng)計(jì)計(jì)算與數(shù)據(jù)分析操作。(1)統(tǒng)計(jì)月度、季度銷(xiāo)售額。(2)統(tǒng)計(jì)各月的最高銷(xiāo)售額、最低銷(xiāo)售額和平均銷(xiāo)售額。(3)統(tǒng)計(jì)各個(gè)品牌銷(xiāo)售額占比和季度銷(xiāo)售額占比。(4)統(tǒng)計(jì)各區(qū)域月度銷(xiāo)售額。(5)統(tǒng)計(jì)各渠道各個(gè)品牌的銷(xiāo)量。(6)統(tǒng)計(jì)不同售價(jià)區(qū)間的月度銷(xiāo)量占比?!救蝿?wù)實(shí)現(xiàn)】在JupyterNotebook開(kāi)發(fā)環(huán)境中創(chuàng)建tc05-01.ipynb,然后在單元格中編寫(xiě)代碼并輸出對(duì)應(yīng)的結(jié)果。【任務(wù)5-1】商品銷(xiāo)售數(shù)據(jù)處理與統(tǒng)計(jì)分析商品銷(xiāo)售數(shù)據(jù)處理與統(tǒng)計(jì)分析1.導(dǎo)入模塊%configInlineBackend.figure_format='svg'#矢量圖設(shè)置2.導(dǎo)入數(shù)據(jù)path=r'data\商品銷(xiāo)售數(shù)據(jù).xlsx'#默認(rèn)讀取Excel文件的第一個(gè)工作表sales_df=pd.read_excel(path)sales_df.head()3.?dāng)?shù)據(jù)預(yù)處理查看數(shù)據(jù)集的基本信息sales_()商品銷(xiāo)售數(shù)據(jù)處理與統(tǒng)計(jì)分析如果“銷(xiāo)售日期”列數(shù)據(jù)不是規(guī)范的日期格式數(shù)據(jù),即其數(shù)據(jù)類(lèi)型不是“datetime64”,則可以先使用to_datetime()進(jìn)行格式轉(zhuǎn)換,代碼如下:sales_df['銷(xiāo)售日期']=pd.to_datetime(sales_df['銷(xiāo)售日期'])如果轉(zhuǎn)換日期格式時(shí)約定日期格式為“%Y-%m-%d”,則可以寫(xiě)成以下形式:sales_df['銷(xiāo)售日期']=pd.to_datetime(sales_df['銷(xiāo)售日期'],format='%Y-%m-%d',errors='coerce')如果“銷(xiāo)售日期”列數(shù)據(jù)包括星期數(shù)據(jù),則可以使用以下代碼抽取日期數(shù)據(jù)前10位:sales_df['銷(xiāo)售日期']=sales_df['銷(xiāo)售日期'].astype(str).str.slice(0,10)從“銷(xiāo)售日期”列數(shù)據(jù)中獲取“年”“月”“日”“季度”數(shù)據(jù)sales_df['年']=sales_df['銷(xiāo)售日期'].dt.yearsales_df['月']=sales_df['銷(xiāo)售日期'].dt.monthsales_df['日']=sales_df['銷(xiāo)售日期'].dt.daysales_df['季度']=sales_df['銷(xiāo)售日期'].dt.quartersales_df.sample(5)商品銷(xiāo)售數(shù)據(jù)處理與統(tǒng)計(jì)分析對(duì)規(guī)范日期格式的“銷(xiāo)售日期”列數(shù)據(jù),也可以使用split()分離出年、月、日數(shù)據(jù),代碼如下:dateDf=sales_df['銷(xiāo)售日期'].astype(str).str.split("-",2,expand=True)sales_df['年']=dateDf[0]sales_df['月']=dateDf[1]sales_df['日']=dateDf[2]統(tǒng)計(jì)月度銷(xiāo)售額sales_df.groupby('月').銷(xiāo)售額.sum()4.統(tǒng)計(jì)計(jì)算與數(shù)據(jù)分析計(jì)算銷(xiāo)售額sales_df['銷(xiāo)售額']=sales_df.售價(jià)*sales_df.銷(xiāo)售數(shù)量sales_df.head()商品銷(xiāo)售數(shù)據(jù)處理與統(tǒng)計(jì)分析統(tǒng)計(jì)季度銷(xiāo)售額sales_df.groupby('季度').銷(xiāo)售額.sum()統(tǒng)計(jì)各月的最高銷(xiāo)售額(amax)、最低銷(xiāo)售額(amin)和平均銷(xiāo)售額(mean)sales_df.groupby('月').銷(xiāo)售額.agg([np.max,np.min,np.mean])統(tǒng)計(jì)各個(gè)品牌銷(xiāo)售額占比plt.figure(figsize=(10,5))temp=sales_df.groupby('品牌').銷(xiāo)售額.sum()temp.plot(kind='pie',autopct='%.2f%%',fontsize=12)plt.title('各個(gè)品牌銷(xiāo)售額占比',fontsize=16)plt.show()商品銷(xiāo)售數(shù)據(jù)處理與統(tǒng)計(jì)分析統(tǒng)計(jì)季度銷(xiāo)售額占比plt.figure(figsize=(10,5))plt.title('季度銷(xiāo)售額占比',fontsize=16)temp=sales_df.groupby('季度').銷(xiāo)售額.sum()temp.plot(kind='pie',autopct='%.2f%%',fontsize=12)plt.show()統(tǒng)計(jì)各區(qū)域月度銷(xiāo)售額使用groupby()函數(shù)統(tǒng)計(jì)各區(qū)域月度銷(xiāo)售額的代碼如下:sales_df.groupby(['銷(xiāo)售區(qū)域','月']).銷(xiāo)售額.sum()使用pivot_table()函數(shù)統(tǒng)計(jì)各區(qū)域月度銷(xiāo)售額的代碼如下:pd.pivot_table(data=sales_df,columns=['月'],index=['銷(xiāo)售區(qū)域'],values=['銷(xiāo)售額'],aggfunc=np.sum,#指定聚合函數(shù)(默認(rèn)值為np.mean)fill_value=0,#空值填充值margins=True,#是否顯示總計(jì)margins_name='總計(jì)'#設(shè)置總計(jì)名字)商品銷(xiāo)售數(shù)據(jù)處理與統(tǒng)計(jì)分析商品銷(xiāo)售數(shù)據(jù)處理與統(tǒng)計(jì)分析統(tǒng)計(jì)各渠道各個(gè)品牌的銷(xiāo)量使用groupby()函數(shù)統(tǒng)計(jì)各渠道各個(gè)品牌的銷(xiāo)量的代碼如下:sales_df.groupby(['銷(xiāo)售渠道','品牌']).銷(xiāo)售額.sum()使用pivot_table()函數(shù)統(tǒng)計(jì)各渠道各個(gè)品牌的銷(xiāo)量的代碼如下:sales_df.pivot_table(index=['銷(xiāo)售渠道'],columns=['品牌'],values=['銷(xiāo)售額'],aggfunc=np.sum,margins=True,margins_name='總計(jì)')統(tǒng)計(jì)不同售價(jià)區(qū)間月度銷(xiāo)量占比查找售價(jià)最小值與最大值的代碼如下:min_price=sales_df['售價(jià)'].min()max_price=sales_df['售價(jià)'].max()商品銷(xiāo)售數(shù)據(jù)處理與統(tǒng)計(jì)分析劃分售價(jià)區(qū)間的代碼如下:bins=np.arange(min_price,max_price+1,200)按售價(jià)區(qū)間分月統(tǒng)計(jì)銷(xiāo)售數(shù)量的代碼如下:cate=pd.cut(sales_df.售價(jià),bins)sales_df.groupby([cate,'月']).銷(xiāo)售數(shù)量.sum()按售價(jià)區(qū)間數(shù)據(jù)透視各品牌月度求和的代碼如下:sales_df2=pd.pivot_table(data=sales_df,index=cate,columns=['月'],values=['銷(xiāo)售數(shù)量'],aggfunc=np.sum)統(tǒng)計(jì)各售價(jià)區(qū)間銷(xiāo)售數(shù)量占當(dāng)月總銷(xiāo)售數(shù)量比例的代碼如下:ser=sales_df2.sum()sales_df2=np.round(sales_df2.divide(ser)*100,2)商品銷(xiāo)售數(shù)據(jù)處理與統(tǒng)計(jì)分析按百分比格式輸出的代碼如下:sales_df2.applymap(lambdax:f'{x}%')【任務(wù)描述】Excel文件“月餅銷(xiāo)售01.xlsx”共有4520行、6列數(shù)據(jù),列名分別為:商品簡(jiǎn)介、商品名稱(chēng)、店鋪名稱(chēng)、地址、售價(jià)、付款情況。通過(guò)分析多家店鋪中秋月餅的銷(xiāo)售情況,探析哪些月餅賣(mài)得好,哪些店鋪的月餅賣(mài)得好,哪些地區(qū)的月餅賣(mài)得好,哪些價(jià)格區(qū)間的月餅賣(mài)得好,哪些口味的月餅賣(mài)得好。Excel文件“月餅銷(xiāo)售02.xlsx”共有1200行、25列數(shù)據(jù),列名分別為:店鋪名稱(chēng)、商品編號(hào)、商品簡(jiǎn)介、商品名稱(chēng)、品牌名稱(chēng)、折扣、原價(jià)、京東價(jià)、plus會(huì)員價(jià)、總評(píng)論數(shù)、中評(píng)、中評(píng)率、好評(píng)、好評(píng)率、差評(píng)、差評(píng)率、鏈接、毛重、商品產(chǎn)地、類(lèi)別、包裝形式、口味、凈含量、月餅餡類(lèi)別、月餅皮類(lèi)別。針對(duì)該數(shù)據(jù)集主要完成以下數(shù)據(jù)可視化分析操作。(1)繪制銷(xiāo)量排前10位的月餅的銷(xiāo)量條形圖。(2)繪制不同價(jià)格區(qū)間的月餅銷(xiāo)量占比圓環(huán)圖。(3)繪制商品名稱(chēng)詞云圖【任務(wù)實(shí)現(xiàn)】JupyterNotebook開(kāi)發(fā)環(huán)境中創(chuàng)建tc05-02.ipynb,然后在單元格中編寫(xiě)代碼并輸出對(duì)應(yīng)的結(jié)果?!救蝿?wù)5-2】中秋月餅銷(xiāo)量分析中秋月餅銷(xiāo)量分析1.導(dǎo)入模塊導(dǎo)入通用模塊的代碼詳見(jiàn)“本書(shū)導(dǎo)學(xué)”。導(dǎo)入其他模塊的代碼如下:importrefromcollectionsimportCounterfromponentsimportImagefrompyecharts.globalsimportSymbolTypefrommons.utilsimportJsCode2.多家店鋪月餅銷(xiāo)售數(shù)據(jù)讀取與預(yù)處理讀取數(shù)據(jù)df=pd.read_excel(r"data\月餅銷(xiāo)售01.xlsx",usecols={'商品名稱(chēng)','店鋪名稱(chēng)','地址','售價(jià)','付款情況'})df.sample(5)中秋月餅銷(xiāo)量分析去除重復(fù)值print(df.shape)df.drop_duplicates(inplace=True)print(df.shape)從“付款情況”列數(shù)據(jù)獲取月餅銷(xiāo)量由于付款人數(shù)超過(guò)10000后會(huì)直接用“萬(wàn)”替代“10000”,這里我們需要將“萬(wàn)”恢復(fù)為數(shù)字“10000”。#提取數(shù)值df['num']=[re.findall(r'(\d+\.{0,1}\d*)',i)[0]foriindf['付款情況']]df['num']=df['num'].astype('float')#提取結(jié)尾(萬(wàn))df['unit']=[''.join(re.findall(r'(萬(wàn))',i))foriindf['付款情況']]df['unit']=df['unit'].apply(lambdax:10000ifx=='萬(wàn)'else1)#計(jì)算銷(xiāo)量df['銷(xiāo)量']=df['num']*df['unit']中秋月餅銷(xiāo)量分析從非空“地址”列數(shù)據(jù)中提取省份數(shù)據(jù)df=df[df['地址'].notna()]df['省份']=df['地址'].str.split('').apply(lambdax:x[0])刪除多余的列與重置索引#刪除多余的列df.drop(['付款情況','num','unit'],axis=1,inplace=True)#重置索引df=df.reset_index(drop=True)df.sample(5)按“售價(jià)”降序排列df1=df.sort_values(by="售價(jià)",axis=0,ascending=False)中秋月餅銷(xiāo)量分析3.多家店鋪月餅銷(xiāo)售數(shù)據(jù)分析與可視化繪制銷(xiāo)量排前10位的月餅的銷(xiāo)量條形圖shop_top10=df.groupby('商品名稱(chēng)')['銷(xiāo)量'].sum().sort_values(ascending=False).head(10)bar1=(Bar().add_xaxis(shop_top10.index.tolist()[::-1]).add_yaxis('銷(xiāo)量',shop_top10.values.tolist()[::-1]).reversal_axis().set_global_opts(title_opts=opts.TitleOpts(title='銷(xiāo)量排前10位的月餅'),xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30))).set_series_opts(label_opts=opts.LabelOpts(position='right')))#將圖形整體右移grid1=(Grid().add(bar1,grid_opts=opts.GridOpts(pos_left='15%',pos_right='10%')))grid1.render_notebook()中秋月餅銷(xiāo)量分析以下代碼同樣可以繪制銷(xiāo)量排前10位的月餅的銷(xiāo)量條形圖,不同的是其可以實(shí)現(xiàn)矩形的線(xiàn)性漸變效果。color_js="""newecharts.graphic.LinearGradient(0,0,1,0,[{offset:0,color:'#008B8B'},{offset:1,color:'#FF6347'}],false)"""color_js="""newecharts.graphic.LinearGradient(0,0,1,0,[{offset:0,color:'#009ad6'},{offset:1,color:'#ed1941'}],false)"""bar2=(Bar().add_xaxis(shop_top10.index.tolist()[::-1]).add_yaxis('銷(xiāo)量',shop_top10.values.tolist()[::-1],itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_js))).reversal_axis().set_global_opts(title_opts=opts.TitleOpts(title='銷(xiāo)量排前10位的月餅'),xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30)),).set_series_opts(label_opts=opts.LabelOpts(position='right')))#將圖形整體右移grid2=(Grid().add(bar2,grid_opts=opts.GridOpts(pos_left='15%',pos_right='10%')))grid2.render_notebook()2021年長(zhǎng)沙市天氣數(shù)據(jù)分析繪制月餅銷(xiāo)量排名前10位的店鋪的銷(xiāo)量柱形圖繪制全國(guó)各地區(qū)月餅銷(xiāo)量分布地圖對(duì)比分析不同價(jià)格區(qū)間的月餅銷(xiāo)量占比defprice_range(price):ifprice<=50:return'50元以下'elifprice<=100:return'50-100元'elifprice<=300:return'100-300元'else:return'300元以上'df['price_range']=df['售價(jià)'].apply(lambdax:price_range(x))price_cut_num=df.groupby('price_range')['銷(xiāo)量'].sum()data_pair=[list(z)forzinzip(price_cut_num.index,price_cut_num.values)]中秋月餅銷(xiāo)量分析#繪制圓環(huán)圖pie1=(Pie(init_opts=opts.InitOpts(width='750px',height='350px')).add(series_name="銷(xiāo)量",radius=["35%","50%"],data_pair=data_pair,label_opts=opts.LabelOpts(formatter='\n占比5awuucj%'),).set_global_opts(title_opts=dict(text='不同價(jià)格區(qū)間的月餅銷(xiāo)量占比',left='center',top='5%',textStyle=dict(color='#DC143C')),legend_opts=opts.LegendOpts(type_="scroll",pos_left="80%",pos_top="50%",orient="vertical")).set_colors(["#F08080","#FFCC99","#DC143C","#990000"]))pie1.render_notebook()中秋月餅銷(xiāo)量分析繪制月餅口味分布柱形圖繪制商品名稱(chēng)詞云圖importjiebaimportstylecloudfromPILimportImagestop_words=[line.strip('\n')forlineinopen(r'data\stop_words.txt','r',encoding='utf-8').readlines()]stop_words.extend(['logo','10','100','200g','100g','140g','130g','月餅','禮盒','禮盒裝'])contents=df['商品名稱(chēng)'].apply(lambdax:([iforiinjieba.cut(x,cut_all=False)ifinotinstop_words]))content_list=[]temp=[content_list.extend(i)foriincontents.values.tolist()]stylecloud.gen_stylecloud(text=''.join(content_list),font_path=r'data\STXINWEI.TTF',palette='cartocolors.qualitative.Bold_5',#設(shè)置配色方案icon_name='fasfa-gift',#設(shè)置蒙版方案output_name='中秋.png',)Image.open(r"中秋.png")中秋月餅銷(xiāo)量分析如果需要將以上多張可視化圖形在同一個(gè)頁(yè)面中展示,可以使用以下代碼實(shí)現(xiàn)。page=Page(layout=Page.DraggablePageLayout)page.add(bar1,bar2,bar3,map_chart,pie1,)page.render_notebook()4.京東商城月餅銷(xiāo)售數(shù)據(jù)讀取與預(yù)處理數(shù)據(jù)讀取data=pd.read_excel(r'data/月餅銷(xiāo)售02.xlsx',usecols={'店鋪名稱(chēng)','商品名稱(chēng)','品牌名稱(chēng)','折扣','原價(jià)','京東價(jià)','總評(píng)論數(shù)','商品產(chǎn)地'})data.head()中秋月餅銷(xiāo)量分析去除重復(fù)值與重置索引#去除重復(fù)值data.drop_duplicates(inplace=True)#重置索引data=data.reset_index(drop=True)去除“品牌名稱(chēng)”列數(shù)據(jù)中的引號(hào)importredeftranform(x):x=re.search(r"'(.*?)'",x).group(1)returnxdata['品牌名稱(chēng)']=data['品牌名稱(chēng)'].apply(lambdax:tranform(x))去除“折扣”列數(shù)據(jù)中的漢字“折”deftranform_1(x):x=re.search(r"(.*?)折",x).group(1)returnxdata['折扣']=data['折扣'].apply(lambdax:tranform_1(x))將“總評(píng)論數(shù)”列數(shù)據(jù)的尺度統(tǒng)一為“萬(wàn)”deftranform_comment(x):if'萬(wàn)+'inx:x=x.replace('萬(wàn)+','')returnxelif'+'inx:x=float(x.replace('+',''))/10000returnxdata['總評(píng)論數(shù)(萬(wàn))']=data['總評(píng)論數(shù)'].apply(lambdax:tranform_comment(x)).astype('float')data.head()中秋月餅銷(xiāo)量分析獲取總評(píng)論數(shù)超過(guò)100萬(wàn)的銷(xiāo)量數(shù)據(jù)data_new=data[data['總評(píng)論數(shù)(萬(wàn))']>=100.0]data_new獲取數(shù)據(jù)集中出現(xiàn)頻次排前10位的月餅品牌brand=data['品牌名稱(chēng)'].value_counts()[:10]分段統(tǒng)計(jì)京東月餅折扣頻次掃描二維碼在線(xiàn)瀏覽電子活頁(yè)5-1“分段統(tǒng)計(jì)京東月餅折扣頻次”中的代碼及輸出的結(jié)果。中秋月餅銷(xiāo)量分析5.京東商城月餅銷(xiāo)售數(shù)據(jù)分析與可視化繪制總評(píng)論數(shù)超過(guò)100萬(wàn)的月餅原價(jià)柱形圖與折扣曲線(xiàn)圖的組合圖形繪制總評(píng)論數(shù)超過(guò)100萬(wàn)的月餅原價(jià)柱形圖與折扣曲線(xiàn)圖的組合圖形,對(duì)應(yīng)的代碼及繪制的圖形詳見(jiàn)本書(shū)配套的電子活頁(yè)5-5。繪制數(shù)據(jù)集中出現(xiàn)頻次排前10位的月餅品牌頻次柱形圖繪制數(shù)據(jù)集中出現(xiàn)頻次排前10位的月餅品牌頻次柱形圖,對(duì)應(yīng)的代碼及繪制的圖形詳見(jiàn)本書(shū)配套的電子活頁(yè)5-6。繪制京東月餅折扣分布圓環(huán)圖繪制京東月餅折扣分布圓環(huán)圖,對(duì)應(yīng)的代碼及繪制的圖形詳見(jiàn)本書(shū)配套的電子活頁(yè)5-7?!救蝿?wù)描述】Excel文件“藥品銷(xiāo)售數(shù)據(jù).xlsx”共有6578行、7列數(shù)據(jù),列名分別為:購(gòu)藥時(shí)間、社保卡號(hào)、商品編碼、商品名稱(chēng)、銷(xiāo)售數(shù)量、應(yīng)收金額、實(shí)收金額。通過(guò)分析藥品銷(xiāo)售數(shù)據(jù),看看哪些藥品購(gòu)買(mǎi)者較多,哪些天購(gòu)藥者較多等。針對(duì)該數(shù)據(jù)集計(jì)算以下業(yè)務(wù)指標(biāo)。①總消費(fèi)次數(shù)和月均消費(fèi)次數(shù)。②月均消費(fèi)金額。③客戶(hù)單價(jià)。④熱銷(xiāo)藥品的數(shù)量?!救蝿?wù)5-3】藥店藥品銷(xiāo)量分析【任務(wù)5-3】藥店藥品銷(xiāo)量分析【任務(wù)描述】針對(duì)該數(shù)據(jù)集完成以下數(shù)據(jù)可視化分析操作。①繪制折線(xiàn)圖分析藥品每天的消費(fèi)金額。②繪制折線(xiàn)圖分析藥品每月的消費(fèi)趨勢(shì)。③分析銷(xiāo)售數(shù)量排前10位的藥品的銷(xiāo)售情況。④分析一周7天藥品銷(xiāo)售數(shù)量和金額。⑤繪制一周內(nèi)各天的藥品銷(xiāo)量柱形圖和銷(xiāo)量排前10位的柱形圖。【任務(wù)實(shí)現(xiàn)】在JupyterNotebook開(kāi)發(fā)環(huán)境中創(chuàng)建tc05-03.ipynb,然后在單元格中編寫(xiě)代碼并輸出對(duì)應(yīng)的結(jié)果。藥店藥品銷(xiāo)量分析1.導(dǎo)入模塊導(dǎo)入通用模塊的代碼詳見(jiàn)“本書(shū)導(dǎo)學(xué)”,導(dǎo)入其他模塊的代碼如下:frommons.utilsimportJsCode2.導(dǎo)入數(shù)據(jù)path='.\data\藥品銷(xiāo)售數(shù)據(jù).xlsx'0salesDf=pd.read_excel(path,converters={'社??ㄌ?hào)':str,'商品編碼':str})#head()輸出數(shù)據(jù)集前5行,從0開(kāi)始計(jì)數(shù)salesDf.head()藥店藥品銷(xiāo)量分析3.?dāng)?shù)據(jù)審閱查看藥品數(shù)據(jù)集的形狀salesDf.shape查看藥品數(shù)據(jù)集的索引salesDf.index輸出結(jié)果:RangeIndex(start=0,stop=6578,step=1)查看藥品數(shù)據(jù)集的列名salesDf.columns輸出結(jié)果:Index(['購(gòu)藥時(shí)間','社??ㄌ?hào)','商品編碼','商品名稱(chēng)','銷(xiāo)售數(shù)量','應(yīng)收金額','實(shí)收金額'],dtype='object')輸出結(jié)果:(6578,7)藥店藥品銷(xiāo)量分析查看藥品數(shù)據(jù)集的基本信息salesD()將得到的不含空值的“最低溫”列數(shù)據(jù)的數(shù)據(jù)類(lèi)型從object轉(zhuǎn)換為intdefconvert_int(val):returnint(val)data=func_for(data)data['最低溫']=data['最低溫'].apply(convert_int)()藥店藥品銷(xiāo)量分析4.?dāng)?shù)據(jù)預(yù)處理選取子集獲取到的數(shù)據(jù)可能數(shù)據(jù)量非常龐大,并不是每一列都有分析的價(jià)值,這時(shí)候就需要從所有數(shù)據(jù)中選取合適的子集進(jìn)行分析,以從數(shù)據(jù)中獲取盡可能大的價(jià)值。本任務(wù)中不需要選取子集,暫時(shí)可以忽略這一步。本任務(wù)分析Excel工作簿里中的工作表“Sheet1”。列名重命名#字典:舊列名稱(chēng)和新列名稱(chēng)對(duì)應(yīng)關(guān)系colNameDict={'購(gòu)藥時(shí)間':'銷(xiāo)售時(shí)間'}'''inplace參數(shù)的默認(rèn)值是False,表示數(shù)據(jù)集本身不會(huì)變,而會(huì)創(chuàng)建一個(gè)改變后新的數(shù)據(jù)集;當(dāng)inplace的默認(rèn)值是True時(shí),表示數(shù)據(jù)集本身會(huì)改變'''salesDf.rename(columns=colNameDict,inplace=True)salesDf.head()藥店藥品銷(xiāo)量分析統(tǒng)計(jì)缺失值并輸出包含缺失值的行salesDf.isnull().sum()刪除重復(fù)值通過(guò)對(duì)比刪除重復(fù)值的前后數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)集沒(méi)有重復(fù)值。print('刪除重復(fù)值前數(shù)據(jù)集的大小',salesDf.shape)#刪除重復(fù)銷(xiāo)售記錄salesDf=salesDf.drop_duplicates()print('刪除重復(fù)值后數(shù)據(jù)集的大小',salesDf.shape)輸出結(jié)果:刪除重復(fù)值前數(shù)據(jù)集的大小(6578,7)刪除重復(fù)值后數(shù)據(jù)集的大小(6578,7)輸出結(jié)果:輸出包含缺失值的行,對(duì)應(yīng)的代碼如下:salesDf[salesDf.isnull().T.any()]藥店藥品銷(xiāo)量分析處理缺失值處理缺失數(shù)據(jù)常用的方式為刪除含有缺失數(shù)據(jù)的記錄或者利用算法去補(bǔ)全缺失數(shù)據(jù)。#之后操作針對(duì)數(shù)據(jù)集salesDf1進(jìn)行salesDf1=salesDf.copy()print('刪除缺失值之前數(shù)據(jù)集的大小',salesDf1.shape)salesDf1=salesDf1.dropna(axis=0,how='all')salesDf1=salesDf1.dropna(subset=['銷(xiāo)售時(shí)間'],how='any')print('刪除缺失值之后數(shù)據(jù)集的大小',salesDf1.shape)刪除缺失值之前數(shù)據(jù)集的大小(6578,7)刪除缺失值之后數(shù)據(jù)集的大小(6576,7)查看“社保卡號(hào)”為空值的數(shù)據(jù),對(duì)應(yīng)的代碼如下:salesDf1[salesDf1.isnull().T.any()]社??ㄌ?hào)的空值使用“100000000”進(jìn)行填充,對(duì)應(yīng)的代碼如下:salesDf1['社??ㄌ?hào)'].fillna('100000000',inplace=True)print(salesDf1.isnull().sum())#查詢(xún)是否有空值print(salesDf1.isnull().any())藥店藥品銷(xiāo)量分析數(shù)據(jù)轉(zhuǎn)換在導(dǎo)入數(shù)據(jù)時(shí)為了防止導(dǎo)入失敗,會(huì)強(qiáng)制所有數(shù)據(jù)都轉(zhuǎn)換為object類(lèi)型,但實(shí)際數(shù)據(jù)分析過(guò)程中“銷(xiāo)售數(shù)量”列應(yīng)為整(int)型數(shù)據(jù),“應(yīng)收金額”“實(shí)收金額”列應(yīng)為浮點(diǎn)(float)型數(shù)據(jù),“銷(xiāo)售時(shí)間”需要改成時(shí)間格式,因此需要對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換。salesDf1[['銷(xiāo)售數(shù)量']]=salesDf1[['銷(xiāo)售數(shù)量']].astype('int')salesDf1[['應(yīng)收金額']]=salesDf1[['應(yīng)收金額']].astype('float')salesDf1[['實(shí)收金額']]=salesDf1[['實(shí)收金額']].astype('float')#查看每一列數(shù)據(jù)的數(shù)據(jù)類(lèi)型salesDf1.dtypes“銷(xiāo)售時(shí)間”這一列數(shù)據(jù)中存在“星期五”這樣的數(shù)據(jù),但在數(shù)據(jù)分析過(guò)程中不需要用到“星期”,因此要把“銷(xiāo)售時(shí)間”列中的日期和星期使用split()函數(shù)或者slice()函數(shù)進(jìn)行拆分。dateDf=salesDf1['銷(xiāo)售時(shí)間'].astype(str).str.split("",1,expand=True)#修改“銷(xiāo)售時(shí)間”這一列的值salesDf1.loc[:,'銷(xiāo)售時(shí)間']=dateDf1[0]salesDf1['星期']=dateDf1[1]salesDf1.head()輸出結(jié)果:方法1的代碼如下:藥店藥品銷(xiāo)量分析#獲取“銷(xiāo)售時(shí)間”這一列timeSer=salesDf1.loc[:,'銷(xiāo)售時(shí)間']timeSer=timeSer.astype('str')#對(duì)字符串進(jìn)行拆分,獲取銷(xiāo)售日期timeList=[]forvalueintimeSer:#例如2022-01-01星期五,拆分后得到2022-01-01dateStr=value.split('')[0]timeList.append(dateStr)#將列表轉(zhuǎn)換為一維數(shù)據(jù)序列類(lèi)型timeSer=pd.Series(timeList)timeSer.head()方法2的代碼如下:#字符串用split()拆分后得到列表defsptime(time):timelist=[]foriintime:time1=i.split('')[0]timelist.append(time1)timeser=pd.Series(timelist)returntimesertimeSer=salesDf1['銷(xiāo)售時(shí)間'].astype('str')timeSer=sptime(timeSer)timeSer.head()方法3的代碼如下:藥店藥品銷(xiāo)量分析#獲取"銷(xiāo)售時(shí)間"這一列timeSer=salesDf1.loc[:,'銷(xiāo)售時(shí)間']timeSer=timeSer.astype('str')#對(duì)字符串進(jìn)行拆分,獲取銷(xiāo)售日期timeList=[]timeList=timeSer.str.slice(0,10)#將列表轉(zhuǎn)換為一維數(shù)據(jù)序列類(lèi)型timeSer=pd.Series(timeList)timeSer.head()方法4的代碼如下:#參數(shù)errors='coerce'表示:如果原始數(shù)據(jù)不符合日期的格式,轉(zhuǎn)換后的值為空值NaN#參數(shù)format表示原始數(shù)據(jù)中日期的格式salesDf1.loc[:,'銷(xiāo)售時(shí)間']=pd.to_datetime(salesDf1.loc[:,'銷(xiāo)售時(shí)間'],format='%Y-%m-%d',errors='coerce')把“銷(xiāo)售時(shí)間”列數(shù)據(jù)的數(shù)據(jù)類(lèi)型由字符串轉(zhuǎn)換為日期格式,方便后面的數(shù)據(jù)統(tǒng)計(jì)。print(salesDf1.isnull().any())修改為日期格式后有可能會(huì)出現(xiàn)缺失值,查詢(xún)是否有空值的代碼如下:輸出結(jié)果:藥店藥品銷(xiāo)量分析刪除“銷(xiāo)售時(shí)間”列中為空的行日期的字符串格式改為日期格式的過(guò)程中,不符合日期格式的數(shù)值會(huì)被轉(zhuǎn)換為空值,這里需要?jiǎng)h除“銷(xiāo)售時(shí)間”列中為空的行。print('刪除空值之前數(shù)據(jù)集的大小',salesDf1.shape)salesDf1=salesDf1.dropna(subset=['銷(xiāo)售時(shí)間'],how='any')#查詢(xún)是否有空值print(salesDf1.isnull().any())print('刪除空值之后數(shù)據(jù)集的大小',salesDf1.shape)前面用到的“銷(xiāo)售時(shí)間”數(shù)據(jù)并沒(méi)有按順序排列,需要對(duì)其進(jìn)行排序,排序之后索引順序會(huì)被打亂,所以還需要重置一下索引。sort_values()中的參數(shù)by表示按哪一列進(jìn)行排序,參數(shù)ascending=True表示升序排列,參數(shù)ascending=False表示降序排列,參數(shù)na_position=first表示排序的時(shí)候,把空值放到前面,這樣可以比較清晰地看到哪些地方有空值。按“銷(xiāo)售時(shí)間”進(jìn)行升序排列的代碼如下:salesDf1=salesDf1.sort_values(by='銷(xiāo)售時(shí)間',ascending=True,na_position='first')輸出結(jié)果:按照銷(xiāo)售時(shí)間對(duì)數(shù)據(jù)集進(jìn)行排序并重置索引藥店藥品銷(xiāo)量分析重命名行索引的代碼如下:salesDf1=salesDf1.reset_index(drop=True)print('排序后的數(shù)據(jù)集:')salesDf1.head()查看“銷(xiāo)售數(shù)量”“應(yīng)收金額”“實(shí)收金額”列的描述統(tǒng)計(jì)信息的代碼如下:salesDf1[['銷(xiāo)售數(shù)量','應(yīng)收金額','實(shí)收金額']].describe()輸出結(jié)果:處理異常數(shù)據(jù)查看負(fù)值所在行的代碼如下:salesDf1.loc[(salesDf1['銷(xiāo)售數(shù)量']<0)]將負(fù)值轉(zhuǎn)化為正值的代碼如下:salesDf1['銷(xiāo)售數(shù)量']=salesDf1['銷(xiāo)售數(shù)量'].abs()salesDf1['應(yīng)收金額']=salesDf1['應(yīng)收金額'].abs()salesDf1['實(shí)收金額']=salesDf1['實(shí)收金額'].abs()print(salesDf1.shape)輸出結(jié)果:(6553,8)藥店藥品銷(xiāo)量分析刪除異常值后查看數(shù)據(jù)集的大小#通過(guò)查詢(xún)條件篩選數(shù)據(jù)#設(shè)置查詢(xún)條件querySer=salesDf1.loc[:,'銷(xiāo)售數(shù)量']>=0#應(yīng)用查詢(xún)條件篩選數(shù)據(jù)salesDf2=salesDf1.loc[querySer,:]print('刪除異常值之后的數(shù)據(jù)集大?。?,salesDf2.shape)輸出結(jié)果:刪除異常值之后的數(shù)據(jù)集大?。?6553,8)5.計(jì)算業(yè)務(wù)指標(biāo)計(jì)算總消費(fèi)次數(shù)kpi1_Df=salesDf1.drop_duplicates(subset=['銷(xiāo)售時(shí)間','社??ㄌ?hào)'])#totalI:總消費(fèi)次數(shù),即總行數(shù)totalI=kpi1_Df.shape[0]print('總消費(fèi)次數(shù):',totalI)輸出結(jié)果:總消費(fèi)次數(shù):5379藥店藥品銷(xiāo)量分析kpi1_Df=kpi1_Df.sort_values(by='銷(xiāo)售時(shí)間',ascending=True)#重命名行索引kpi1_Df=kpi1_Df.reset_index(drop=True)計(jì)算月份數(shù)第1步:按“銷(xiāo)售時(shí)間”升序排序。#startTime:最小時(shí)間值startTime=kpi1_Df.loc[0,'銷(xiāo)售時(shí)間']#endTime:最大時(shí)間值endTime=kpi1_Df.loc[totalI-1,'銷(xiāo)售時(shí)間']第2步:獲取時(shí)間范圍。#獲取時(shí)間范圍內(nèi)的總天數(shù)daysI=(endTime-startTime).days#月份數(shù):運(yùn)算符“//”表示取整除#返回商的整數(shù)部分,例如9//2的結(jié)果是4monthsI=daysI//30print('月份數(shù):',monthsI)第3步:計(jì)算月份數(shù)。藥店藥品銷(xiāo)量分析kpi1_I=totalI//monthsIprint('月均消費(fèi)次數(shù):',kpi1_I)計(jì)算月均消費(fèi)次數(shù)月均消費(fèi)次數(shù)=總消費(fèi)次數(shù)/月份數(shù)計(jì)算月均消費(fèi)金額月均消費(fèi)金額=總消費(fèi)金額/月份數(shù)#總消費(fèi)金額totalMoneyF=salesDf1.loc[:,'實(shí)收金額'].sum()#月均消費(fèi)金額monthMoneyF=totalMoneyF/monthsIprint('月均消費(fèi)金額:',monthMoneyF)計(jì)算客戶(hù)單價(jià)客戶(hù)單價(jià)=總消費(fèi)金額/總消費(fèi)次數(shù)'''totalMoneyF:總消費(fèi)金額totalI:總消費(fèi)次數(shù)'''pct=totalMoneyF/totalIprint('客戶(hù)單價(jià):',pct)統(tǒng)計(jì)熱銷(xiāo)藥品的數(shù)量設(shè)定銷(xiāo)量超過(guò)100的藥品屬于熱銷(xiāo)藥品re_medicine.loc[(re_medicine['銷(xiāo)售數(shù)量']>100)].count()輸出結(jié)果:

銷(xiāo)售數(shù)量39dtype:int64藥店藥品銷(xiāo)量分析re_medicine.query("銷(xiāo)售數(shù)量>100").count()使用query()函數(shù)查詢(xún)熱銷(xiāo)藥品的代碼如下:輸出結(jié)果:

銷(xiāo)售數(shù)量39dtype:int646.?dāng)?shù)據(jù)可視化展示繪制折線(xiàn)圖分析藥品每天的消費(fèi)金額plt.figure(figsize=(16,9))plt.plot(salesDf1['銷(xiāo)售時(shí)間'],salesDf1['實(shí)收金額'])plt.title("按天消費(fèi)金額圖")plt.xlabel("日期")plt.ylabel("實(shí)收金額(元)")plt.xticks(rotation=30)plt.show()藥店藥品銷(xiāo)量分析圖5-6使用pyplot模塊的plot()函數(shù)繪制的按天消費(fèi)金額折線(xiàn)圖藥店藥品銷(xiāo)量分析groupDf1=salesDf1[['銷(xiāo)售時(shí)間','實(shí)收金額']].copy()groupDf1=groupDf1.set_index('銷(xiāo)售時(shí)間')groupDf1.head()使用DataFrame的plot()方法繪制折線(xiàn)圖的代碼如下:然后繪制每天的“實(shí)收金額”折線(xiàn)圖。ax=groupDf1.plot(grid=True,figsize=(15,8))ax.set_ylabel('實(shí)收金額(元)')plt.xticks(rotation=30)plt.show()藥店藥品銷(xiāo)量分析#提取月份salesDf1['月份']=salesDf1['銷(xiāo)售時(shí)間'].dt.month#獲取每月的銷(xiāo)售數(shù)量、應(yīng)收金額和實(shí)收金額的和monthDf=salesDf1.groupby('月份').agg('sum')monthDf=monthDf.reset_index(drop=False)monthDf1=monthDf.drop(axis=1,index=6)data_mounth1繪制折線(xiàn)圖分析藥品每月的消費(fèi)趨勢(shì)觀察藥品銷(xiāo)售數(shù)據(jù)可以看出,7月的銷(xiāo)售數(shù)據(jù)不完整,所以去掉7月的銷(xiāo)售數(shù)據(jù)。剔除銷(xiāo)售數(shù)據(jù)不完整月份的代碼如下:使用DataFrame的plot()方法繪制1-6月銷(xiāo)售數(shù)量、應(yīng)收金額、實(shí)收金額折線(xiàn)圖,對(duì)應(yīng)的代碼如下:ax1=monthDf1.plot(x='月份',secondary_y=['銷(xiāo)售數(shù)量'],x_compat=True,grid=True,figsize=(10,4),marker='o',linewidth=2)plt.title('1-6月藥品銷(xiāo)售趨勢(shì)')ax1.right_ax.set_ylabel('銷(xiāo)售數(shù)量')ax1.set_ylabel(['應(yīng)收金額(元)','實(shí)收金額(元)'])藥店藥品銷(xiāo)量分析圖5-8使用DataFrame的plot()方法繪制1-6月銷(xiāo)售數(shù)量、應(yīng)收金額、實(shí)收金額折線(xiàn)圖藥店藥品銷(xiāo)量分析groupDf=salesDf1#重命名行索引為銷(xiāo)售時(shí)間所在列的值groupDf.index=groupDf['銷(xiāo)售時(shí)間']#按銷(xiāo)售時(shí)間先聚合再按月分組,計(jì)算每個(gè)月的消費(fèi)金額monthDf2=groupDf.groupby(groupDf.index.month).sum()#繪制按月消費(fèi)金額折線(xiàn)圖plt.plot(monthDf2['實(shí)收金額'])plt.title("按月消費(fèi)金額圖")plt.xlabel("月份")plt.ylabel("實(shí)收金額(元)")plt.show()使用pyplot模塊的plot()函數(shù)繪制按月消費(fèi)金額折線(xiàn)圖,對(duì)應(yīng)的代碼如下:從圖5-9所示的輸出結(jié)果可以看出,7月消費(fèi)金額最少,這是因?yàn)?月的數(shù)據(jù)不完整,不具有參考價(jià)值。藥店藥品銷(xiāo)量分析medicine=groupDf[['商品名稱(chēng)','銷(xiāo)售數(shù)量']]re_medicine=medicine.groupby('商品名稱(chēng)')[['銷(xiāo)售數(shù)量']].sum()#對(duì)藥品“銷(xiāo)售數(shù)量”按降序排序re_medicine=re_medicine.sort_values(by="銷(xiāo)售數(shù)量",ascending=False)分析銷(xiāo)售數(shù)量排前10位的藥品的銷(xiāo)售情況聚合統(tǒng)計(jì)各種藥品銷(xiāo)售數(shù)量的代碼如下:截取銷(xiāo)售數(shù)量排前10位藥品的代碼如下:top_medicine=re_medicine.iloc[:10,:]top_medicine使用DataFrame的plot()方法繪制銷(xiāo)售數(shù)量排前10位的藥品的柱形圖,對(duì)應(yīng)的代碼如下:top_medicine.plot(kind='bar')plt.title("銷(xiāo)售數(shù)量排前10位的藥品")plt.xlabel("藥品名稱(chēng)")plt.ylabel("銷(xiāo)售數(shù)量")plt.legend(loc=0)plt.show()藥店藥品銷(xiāo)量分析圖5-10使用DataFrame的plot()方法繪制的銷(xiāo)售數(shù)量排前10位的藥品的柱形圖使用pyplot模塊的barh()方法繪制銷(xiāo)售數(shù)量排前10位的藥品的條形圖,對(duì)應(yīng)的代碼如下:plt.barh(top_medicine._stat_axis.values,top_medicine['銷(xiāo)售數(shù)量'])plt.title("銷(xiāo)售數(shù)量最多的前10種藥品")plt.ylabel("藥品名稱(chēng)")plt.xlabel("銷(xiāo)售數(shù)量")plt.show()藥店藥品銷(xiāo)量分析salesDf1['星期']=salesDf1['銷(xiāo)售時(shí)間'].dt.dayofweek分析一周7天藥品銷(xiāo)售數(shù)量和金額提取“

溫馨提示

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

評(píng)論

0/150

提交評(píng)論