




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
模塊五商品銷量數(shù)據(jù)分析Python數(shù)據(jù)分析與可視化典型項目實戰(zhàn)(微課版)【任務描述】【任務描述】Excel文件“商品銷售數(shù)據(jù).xlsx”共有1948行、7列數(shù)據(jù),列名分別為:銷售日期、銷售區(qū)域、銷售渠道、銷售訂單、品牌、售價、銷售數(shù)量。針對該數(shù)據(jù)集完成以下統(tǒng)計計算與數(shù)據(jù)分析操作。(1)統(tǒng)計月度、季度銷售額。(2)統(tǒng)計各月的最高銷售額、最低銷售額和平均銷售額。(3)統(tǒng)計各個品牌銷售額占比和季度銷售額占比。(4)統(tǒng)計各區(qū)域月度銷售額。(5)統(tǒng)計各渠道各個品牌的銷量。(6)統(tǒng)計不同售價區(qū)間的月度銷量占比?!救蝿諏崿F(xiàn)】在JupyterNotebook開發(fā)環(huán)境中創(chuàng)建tc05-01.ipynb,然后在單元格中編寫代碼并輸出對應的結果?!救蝿?-1】商品銷售數(shù)據(jù)處理與統(tǒng)計分析商品銷售數(shù)據(jù)處理與統(tǒng)計分析1.導入模塊%configInlineBackend.figure_format='svg'#矢量圖設置2.導入數(shù)據(jù)path=r'data\商品銷售數(shù)據(jù).xlsx'#默認讀取Excel文件的第一個工作表sales_df=pd.read_excel(path)sales_df.head()3.數(shù)據(jù)預處理查看數(shù)據(jù)集的基本信息sales_()商品銷售數(shù)據(jù)處理與統(tǒng)計分析如果“銷售日期”列數(shù)據(jù)不是規(guī)范的日期格式數(shù)據(jù),即其數(shù)據(jù)類型不是“datetime64”,則可以先使用to_datetime()進行格式轉換,代碼如下:sales_df['銷售日期']=pd.to_datetime(sales_df['銷售日期'])如果轉換日期格式時約定日期格式為“%Y-%m-%d”,則可以寫成以下形式:sales_df['銷售日期']=pd.to_datetime(sales_df['銷售日期'],format='%Y-%m-%d',errors='coerce')如果“銷售日期”列數(shù)據(jù)包括星期數(shù)據(jù),則可以使用以下代碼抽取日期數(shù)據(jù)前10位:sales_df['銷售日期']=sales_df['銷售日期'].astype(str).str.slice(0,10)從“銷售日期”列數(shù)據(jù)中獲取“年”“月”“日”“季度”數(shù)據(jù)sales_df['年']=sales_df['銷售日期'].dt.yearsales_df['月']=sales_df['銷售日期'].dt.monthsales_df['日']=sales_df['銷售日期'].dt.daysales_df['季度']=sales_df['銷售日期'].dt.quartersales_df.sample(5)商品銷售數(shù)據(jù)處理與統(tǒng)計分析對規(guī)范日期格式的“銷售日期”列數(shù)據(jù),也可以使用split()分離出年、月、日數(shù)據(jù),代碼如下:dateDf=sales_df['銷售日期'].astype(str).str.split("-",2,expand=True)sales_df['年']=dateDf[0]sales_df['月']=dateDf[1]sales_df['日']=dateDf[2]統(tǒng)計月度銷售額sales_df.groupby('月').銷售額.sum()4.統(tǒng)計計算與數(shù)據(jù)分析計算銷售額sales_df['銷售額']=sales_df.售價*sales_df.銷售數(shù)量sales_df.head()商品銷售數(shù)據(jù)處理與統(tǒng)計分析統(tǒng)計季度銷售額sales_df.groupby('季度').銷售額.sum()統(tǒng)計各月的最高銷售額(amax)、最低銷售額(amin)和平均銷售額(mean)sales_df.groupby('月').銷售額.agg([np.max,np.min,np.mean])統(tǒng)計各個品牌銷售額占比plt.figure(figsize=(10,5))temp=sales_df.groupby('品牌').銷售額.sum()temp.plot(kind='pie',autopct='%.2f%%',fontsize=12)plt.title('各個品牌銷售額占比',fontsize=16)plt.show()商品銷售數(shù)據(jù)處理與統(tǒng)計分析統(tǒng)計季度銷售額占比plt.figure(figsize=(10,5))plt.title('季度銷售額占比',fontsize=16)temp=sales_df.groupby('季度').銷售額.sum()temp.plot(kind='pie',autopct='%.2f%%',fontsize=12)plt.show()統(tǒng)計各區(qū)域月度銷售額使用groupby()函數(shù)統(tǒng)計各區(qū)域月度銷售額的代碼如下:sales_df.groupby(['銷售區(qū)域','月']).銷售額.sum()使用pivot_table()函數(shù)統(tǒng)計各區(qū)域月度銷售額的代碼如下:pd.pivot_table(data=sales_df,columns=['月'],index=['銷售區(qū)域'],values=['銷售額'],aggfunc=np.sum,#指定聚合函數(shù)(默認值為np.mean)fill_value=0,#空值填充值margins=True,#是否顯示總計margins_name='總計'#設置總計名字)商品銷售數(shù)據(jù)處理與統(tǒng)計分析商品銷售數(shù)據(jù)處理與統(tǒng)計分析統(tǒng)計各渠道各個品牌的銷量使用groupby()函數(shù)統(tǒng)計各渠道各個品牌的銷量的代碼如下:sales_df.groupby(['銷售渠道','品牌']).銷售額.sum()使用pivot_table()函數(shù)統(tǒng)計各渠道各個品牌的銷量的代碼如下:sales_df.pivot_table(index=['銷售渠道'],columns=['品牌'],values=['銷售額'],aggfunc=np.sum,margins=True,margins_name='總計')統(tǒng)計不同售價區(qū)間月度銷量占比查找售價最小值與最大值的代碼如下:min_price=sales_df['售價'].min()max_price=sales_df['售價'].max()商品銷售數(shù)據(jù)處理與統(tǒng)計分析劃分售價區(qū)間的代碼如下:bins=np.arange(min_price,max_price+1,200)按售價區(qū)間分月統(tǒng)計銷售數(shù)量的代碼如下:cate=pd.cut(sales_df.售價,bins)sales_df.groupby([cate,'月']).銷售數(shù)量.sum()按售價區(qū)間數(shù)據(jù)透視各品牌月度求和的代碼如下:sales_df2=pd.pivot_table(data=sales_df,index=cate,columns=['月'],values=['銷售數(shù)量'],aggfunc=np.sum)統(tǒng)計各售價區(qū)間銷售數(shù)量占當月總銷售數(shù)量比例的代碼如下:ser=sales_df2.sum()sales_df2=np.round(sales_df2.divide(ser)*100,2)商品銷售數(shù)據(jù)處理與統(tǒng)計分析按百分比格式輸出的代碼如下:sales_df2.applymap(lambdax:f'{x}%')【任務描述】Excel文件“月餅銷售01.xlsx”共有4520行、6列數(shù)據(jù),列名分別為:商品簡介、商品名稱、店鋪名稱、地址、售價、付款情況。通過分析多家店鋪中秋月餅的銷售情況,探析哪些月餅賣得好,哪些店鋪的月餅賣得好,哪些地區(qū)的月餅賣得好,哪些價格區(qū)間的月餅賣得好,哪些口味的月餅賣得好。Excel文件“月餅銷售02.xlsx”共有1200行、25列數(shù)據(jù),列名分別為:店鋪名稱、商品編號、商品簡介、商品名稱、品牌名稱、折扣、原價、京東價、plus會員價、總評論數(shù)、中評、中評率、好評、好評率、差評、差評率、鏈接、毛重、商品產(chǎn)地、類別、包裝形式、口味、凈含量、月餅餡類別、月餅皮類別。針對該數(shù)據(jù)集主要完成以下數(shù)據(jù)可視化分析操作。(1)繪制銷量排前10位的月餅的銷量條形圖。(2)繪制不同價格區(qū)間的月餅銷量占比圓環(huán)圖。(3)繪制商品名稱詞云圖【任務實現(xiàn)】JupyterNotebook開發(fā)環(huán)境中創(chuàng)建tc05-02.ipynb,然后在單元格中編寫代碼并輸出對應的結果。【任務5-2】中秋月餅銷量分析中秋月餅銷量分析1.導入模塊導入通用模塊的代碼詳見“本書導學”。導入其他模塊的代碼如下:importrefromcollectionsimportCounterfromponentsimportImagefrompyecharts.globalsimportSymbolTypefrommons.utilsimportJsCode2.多家店鋪月餅銷售數(shù)據(jù)讀取與預處理讀取數(shù)據(jù)df=pd.read_excel(r"data\月餅銷售01.xlsx",usecols={'商品名稱','店鋪名稱','地址','售價','付款情況'})df.sample(5)中秋月餅銷量分析去除重復值print(df.shape)df.drop_duplicates(inplace=True)print(df.shape)從“付款情況”列數(shù)據(jù)獲取月餅銷量由于付款人數(shù)超過10000后會直接用“萬”替代“10000”,這里我們需要將“萬”恢復為數(shù)字“10000”。#提取數(shù)值df['num']=[re.findall(r'(\d+\.{0,1}\d*)',i)[0]foriindf['付款情況']]df['num']=df['num'].astype('float')#提取結尾(萬)df['unit']=[''.join(re.findall(r'(萬)',i))foriindf['付款情況']]df['unit']=df['unit'].apply(lambdax:10000ifx=='萬'else1)#計算銷量df['銷量']=df['num']*df['unit']中秋月餅銷量分析從非空“地址”列數(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)按“售價”降序排列df1=df.sort_values(by="售價",axis=0,ascending=False)中秋月餅銷量分析3.多家店鋪月餅銷售數(shù)據(jù)分析與可視化繪制銷量排前10位的月餅的銷量條形圖shop_top10=df.groupby('商品名稱')['銷量'].sum().sort_values(ascending=False).head(10)bar1=(Bar().add_xaxis(shop_top10.index.tolist()[::-1]).add_yaxis('銷量',shop_top10.values.tolist()[::-1]).reversal_axis().set_global_opts(title_opts=opts.TitleOpts(title='銷量排前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()中秋月餅銷量分析以下代碼同樣可以繪制銷量排前10位的月餅的銷量條形圖,不同的是其可以實現(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('銷量',shop_top10.values.tolist()[::-1],itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_js))).reversal_axis().set_global_opts(title_opts=opts.TitleOpts(title='銷量排前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年長沙市天氣數(shù)據(jù)分析繪制月餅銷量排名前10位的店鋪的銷量柱形圖繪制全國各地區(qū)月餅銷量分布地圖對比分析不同價格區(qū)間的月餅銷量占比defprice_range(price):ifprice<=50:return'50元以下'elifprice<=100:return'50-100元'elifprice<=300:return'100-300元'else:return'300元以上'df['price_range']=df['售價'].apply(lambdax:price_range(x))price_cut_num=df.groupby('price_range')['銷量'].sum()data_pair=[list(z)forzinzip(price_cut_num.index,price_cut_num.values)]中秋月餅銷量分析#繪制圓環(huán)圖pie1=(Pie(init_opts=opts.InitOpts(width='750px',height='350px')).add(series_name="銷量",radius=["35%","50%"],data_pair=data_pair,label_opts=opts.LabelOpts(formatter='\n占比5np55zx%'),).set_global_opts(title_opts=dict(text='不同價格區(qū)間的月餅銷量占比',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()中秋月餅銷量分析繪制月餅口味分布柱形圖繪制商品名稱詞云圖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['商品名稱'].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',#設置配色方案icon_name='fasfa-gift',#設置蒙版方案output_name='中秋.png',)Image.open(r"中秋.png")中秋月餅銷量分析如果需要將以上多張可視化圖形在同一個頁面中展示,可以使用以下代碼實現(xiàn)。page=Page(layout=Page.DraggablePageLayout)page.add(bar1,bar2,bar3,map_chart,pie1,)page.render_notebook()4.京東商城月餅銷售數(shù)據(jù)讀取與預處理數(shù)據(jù)讀取data=pd.read_excel(r'data/月餅銷售02.xlsx',usecols={'店鋪名稱','商品名稱','品牌名稱','折扣','原價','京東價','總評論數(shù)','商品產(chǎn)地'})data.head()中秋月餅銷量分析去除重復值與重置索引#去除重復值data.drop_duplicates(inplace=True)#重置索引data=data.reset_index(drop=True)去除“品牌名稱”列數(shù)據(jù)中的引號importredeftranform(x):x=re.search(r"'(.*?)'",x).group(1)returnxdata['品牌名稱']=data['品牌名稱'].apply(lambdax:tranform(x))去除“折扣”列數(shù)據(jù)中的漢字“折”deftranform_1(x):x=re.search(r"(.*?)折",x).group(1)returnxdata['折扣']=data['折扣'].apply(lambdax:tranform_1(x))將“總評論數(shù)”列數(shù)據(jù)的尺度統(tǒng)一為“萬”deftranform_comment(x):if'萬+'inx:x=x.replace('萬+','')returnxelif'+'inx:x=float(x.replace('+',''))/10000returnxdata['總評論數(shù)(萬)']=data['總評論數(shù)'].apply(lambdax:tranform_comment(x)).astype('float')data.head()中秋月餅銷量分析獲取總評論數(shù)超過100萬的銷量數(shù)據(jù)data_new=data[data['總評論數(shù)(萬)']>=100.0]data_new獲取數(shù)據(jù)集中出現(xiàn)頻次排前10位的月餅品牌brand=data['品牌名稱'].value_counts()[:10]分段統(tǒng)計京東月餅折扣頻次掃描二維碼在線瀏覽電子活頁5-1“分段統(tǒng)計京東月餅折扣頻次”中的代碼及輸出的結果。中秋月餅銷量分析5.京東商城月餅銷售數(shù)據(jù)分析與可視化繪制總評論數(shù)超過100萬的月餅原價柱形圖與折扣曲線圖的組合圖形繪制總評論數(shù)超過100萬的月餅原價柱形圖與折扣曲線圖的組合圖形,對應的代碼及繪制的圖形詳見本書配套的電子活頁5-5。繪制數(shù)據(jù)集中出現(xiàn)頻次排前10位的月餅品牌頻次柱形圖繪制數(shù)據(jù)集中出現(xiàn)頻次排前10位的月餅品牌頻次柱形圖,對應的代碼及繪制的圖形詳見本書配套的電子活頁5-6。繪制京東月餅折扣分布圓環(huán)圖繪制京東月餅折扣分布圓環(huán)圖,對應的代碼及繪制的圖形詳見本書配套的電子活頁5-7?!救蝿彰枋觥縀xcel文件“藥品銷售數(shù)據(jù).xlsx”共有6578行、7列數(shù)據(jù),列名分別為:購藥時間、社??ㄌ枴⑸唐肪幋a、商品名稱、銷售數(shù)量、應收金額、實收金額。通過分析藥品銷售數(shù)據(jù),看看哪些藥品購買者較多,哪些天購藥者較多等。針對該數(shù)據(jù)集計算以下業(yè)務指標。①總消費次數(shù)和月均消費次數(shù)。②月均消費金額。③客戶單價。④熱銷藥品的數(shù)量。【任務5-3】藥店藥品銷量分析【任務5-3】藥店藥品銷量分析【任務描述】針對該數(shù)據(jù)集完成以下數(shù)據(jù)可視化分析操作。①繪制折線圖分析藥品每天的消費金額。②繪制折線圖分析藥品每月的消費趨勢。③分析銷售數(shù)量排前10位的藥品的銷售情況。④分析一周7天藥品銷售數(shù)量和金額。⑤繪制一周內(nèi)各天的藥品銷量柱形圖和銷量排前10位的柱形圖?!救蝿諏崿F(xiàn)】在JupyterNotebook開發(fā)環(huán)境中創(chuàng)建tc05-03.ipynb,然后在單元格中編寫代碼并輸出對應的結果。藥店藥品銷量分析1.導入模塊導入通用模塊的代碼詳見“本書導學”,導入其他模塊的代碼如下:frommons.utilsimportJsCode2.導入數(shù)據(jù)path='.\data\藥品銷售數(shù)據(jù).xlsx'0salesDf=pd.read_excel(path,converters={'社??ㄌ?:str,'商品編碼':str})#head()輸出數(shù)據(jù)集前5行,從0開始計數(shù)salesDf.head()藥店藥品銷量分析3.數(shù)據(jù)審閱查看藥品數(shù)據(jù)集的形狀salesDf.shape查看藥品數(shù)據(jù)集的索引salesDf.index輸出結果:RangeIndex(start=0,stop=6578,step=1)查看藥品數(shù)據(jù)集的列名salesDf.columns輸出結果:Index(['購藥時間','社保卡號','商品編碼','商品名稱','銷售數(shù)量','應收金額','實收金額'],dtype='object')輸出結果:(6578,7)藥店藥品銷量分析查看藥品數(shù)據(jù)集的基本信息salesD()將得到的不含空值的“最低溫”列數(shù)據(jù)的數(shù)據(jù)類型從object轉換為intdefconvert_int(val):returnint(val)data=func_for(data)data['最低溫']=data['最低溫'].apply(convert_int)()藥店藥品銷量分析4.數(shù)據(jù)預處理選取子集獲取到的數(shù)據(jù)可能數(shù)據(jù)量非常龐大,并不是每一列都有分析的價值,這時候就需要從所有數(shù)據(jù)中選取合適的子集進行分析,以從數(shù)據(jù)中獲取盡可能大的價值。本任務中不需要選取子集,暫時可以忽略這一步。本任務分析Excel工作簿里中的工作表“Sheet1”。列名重命名#字典:舊列名稱和新列名稱對應關系colNameDict={'購藥時間':'銷售時間'}'''inplace參數(shù)的默認值是False,表示數(shù)據(jù)集本身不會變,而會創(chuàng)建一個改變后新的數(shù)據(jù)集;當inplace的默認值是True時,表示數(shù)據(jù)集本身會改變'''salesDf.rename(columns=colNameDict,inplace=True)salesDf.head()藥店藥品銷量分析統(tǒng)計缺失值并輸出包含缺失值的行salesDf.isnull().sum()刪除重復值通過對比刪除重復值的前后數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)集沒有重復值。print('刪除重復值前數(shù)據(jù)集的大小',salesDf.shape)#刪除重復銷售記錄salesDf=salesDf.drop_duplicates()print('刪除重復值后數(shù)據(jù)集的大小',salesDf.shape)輸出結果:刪除重復值前數(shù)據(jù)集的大小(6578,7)刪除重復值后數(shù)據(jù)集的大小(6578,7)輸出結果:輸出包含缺失值的行,對應的代碼如下:salesDf[salesDf.isnull().T.any()]藥店藥品銷量分析處理缺失值處理缺失數(shù)據(jù)常用的方式為刪除含有缺失數(shù)據(jù)的記錄或者利用算法去補全缺失數(shù)據(jù)。#之后操作針對數(shù)據(jù)集salesDf1進行salesDf1=salesDf.copy()print('刪除缺失值之前數(shù)據(jù)集的大小',salesDf1.shape)salesDf1=salesDf1.dropna(axis=0,how='all')salesDf1=salesDf1.dropna(subset=['銷售時間'],how='any')print('刪除缺失值之后數(shù)據(jù)集的大小',salesDf1.shape)刪除缺失值之前數(shù)據(jù)集的大小(6578,7)刪除缺失值之后數(shù)據(jù)集的大小(6576,7)查看“社??ㄌ枴睘榭罩档臄?shù)據(jù),對應的代碼如下:salesDf1[salesDf1.isnull().T.any()]社??ㄌ柕目罩凳褂谩?00000000”進行填充,對應的代碼如下:salesDf1['社??ㄌ?].fillna('100000000',inplace=True)print(salesDf1.isnull().sum())#查詢是否有空值print(salesDf1.isnull().any())藥店藥品銷量分析數(shù)據(jù)轉換在導入數(shù)據(jù)時為了防止導入失敗,會強制所有數(shù)據(jù)都轉換為object類型,但實際數(shù)據(jù)分析過程中“銷售數(shù)量”列應為整(int)型數(shù)據(jù),“應收金額”“實收金額”列應為浮點(float)型數(shù)據(jù),“銷售時間”需要改成時間格式,因此需要對數(shù)據(jù)進行轉換。salesDf1[['銷售數(shù)量']]=salesDf1[['銷售數(shù)量']].astype('int')salesDf1[['應收金額']]=salesDf1[['應收金額']].astype('float')salesDf1[['實收金額']]=salesDf1[['實收金額']].astype('float')#查看每一列數(shù)據(jù)的數(shù)據(jù)類型salesDf1.dtypes“銷售時間”這一列數(shù)據(jù)中存在“星期五”這樣的數(shù)據(jù),但在數(shù)據(jù)分析過程中不需要用到“星期”,因此要把“銷售時間”列中的日期和星期使用split()函數(shù)或者slice()函數(shù)進行拆分。dateDf=salesDf1['銷售時間'].astype(str).str.split("",1,expand=True)#修改“銷售時間”這一列的值salesDf1.loc[:,'銷售時間']=dateDf1[0]salesDf1['星期']=dateDf1[1]salesDf1.head()輸出結果:方法1的代碼如下:藥店藥品銷量分析#獲取“銷售時間”這一列timeSer=salesDf1.loc[:,'銷售時間']timeSer=timeSer.astype('str')#對字符串進行拆分,獲取銷售日期timeList=[]forvalueintimeSer:#例如2022-01-01星期五,拆分后得到2022-01-01dateStr=value.split('')[0]timeList.append(dateStr)#將列表轉換為一維數(shù)據(jù)序列類型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['銷售時間'].astype('str')timeSer=sptime(timeSer)timeSer.head()方法3的代碼如下:藥店藥品銷量分析#獲取"銷售時間"這一列timeSer=salesDf1.loc[:,'銷售時間']timeSer=timeSer.astype('str')#對字符串進行拆分,獲取銷售日期timeList=[]timeList=timeSer.str.slice(0,10)#將列表轉換為一維數(shù)據(jù)序列類型timeSer=pd.Series(timeList)timeSer.head()方法4的代碼如下:#參數(shù)errors='coerce'表示:如果原始數(shù)據(jù)不符合日期的格式,轉換后的值為空值NaN#參數(shù)format表示原始數(shù)據(jù)中日期的格式salesDf1.loc[:,'銷售時間']=pd.to_datetime(salesDf1.loc[:,'銷售時間'],format='%Y-%m-%d',errors='coerce')把“銷售時間”列數(shù)據(jù)的數(shù)據(jù)類型由字符串轉換為日期格式,方便后面的數(shù)據(jù)統(tǒng)計。print(salesDf1.isnull().any())修改為日期格式后有可能會出現(xiàn)缺失值,查詢是否有空值的代碼如下:輸出結果:藥店藥品銷量分析刪除“銷售時間”列中為空的行日期的字符串格式改為日期格式的過程中,不符合日期格式的數(shù)值會被轉換為空值,這里需要刪除“銷售時間”列中為空的行。print('刪除空值之前數(shù)據(jù)集的大小',salesDf1.shape)salesDf1=salesDf1.dropna(subset=['銷售時間'],how='any')#查詢是否有空值print(salesDf1.isnull().any())print('刪除空值之后數(shù)據(jù)集的大小',salesDf1.shape)前面用到的“銷售時間”數(shù)據(jù)并沒有按順序排列,需要對其進行排序,排序之后索引順序會被打亂,所以還需要重置一下索引。sort_values()中的參數(shù)by表示按哪一列進行排序,參數(shù)ascending=True表示升序排列,參數(shù)ascending=False表示降序排列,參數(shù)na_position=first表示排序的時候,把空值放到前面,這樣可以比較清晰地看到哪些地方有空值。按“銷售時間”進行升序排列的代碼如下:salesDf1=salesDf1.sort_values(by='銷售時間',ascending=True,na_position='first')輸出結果:按照銷售時間對數(shù)據(jù)集進行排序并重置索引藥店藥品銷量分析重命名行索引的代碼如下:salesDf1=salesDf1.reset_index(drop=True)print('排序后的數(shù)據(jù)集:')salesDf1.head()查看“銷售數(shù)量”“應收金額”“實收金額”列的描述統(tǒng)計信息的代碼如下:salesDf1[['銷售數(shù)量','應收金額','實收金額']].describe()輸出結果:處理異常數(shù)據(jù)查看負值所在行的代碼如下:salesDf1.loc[(salesDf1['銷售數(shù)量']<0)]將負值轉化為正值的代碼如下:salesDf1['銷售數(shù)量']=salesDf1['銷售數(shù)量'].abs()salesDf1['應收金額']=salesDf1['應收金額'].abs()salesDf1['實收金額']=salesDf1['實收金額'].abs()print(salesDf1.shape)輸出結果:(6553,8)藥店藥品銷量分析刪除異常值后查看數(shù)據(jù)集的大小#通過查詢條件篩選數(shù)據(jù)#設置查詢條件querySer=salesDf1.loc[:,'銷售數(shù)量']>=0#應用查詢條件篩選數(shù)據(jù)salesDf2=salesDf1.loc[querySer,:]print('刪除異常值之后的數(shù)據(jù)集大?。?,salesDf2.shape)輸出結果:刪除異常值之后的數(shù)據(jù)集大?。?6553,8)5.計算業(yè)務指標計算總消費次數(shù)kpi1_Df=salesDf1.drop_duplicates(subset=['銷售時間','社??ㄌ?])#totalI:總消費次數(shù),即總行數(shù)totalI=kpi1_Df.shape[0]print('總消費次數(shù):',totalI)輸出結果:總消費次數(shù):5379藥店藥品銷量分析kpi1_Df=kpi1_Df.sort_values(by='銷售時間',ascending=True)#重命名行索引kpi1_Df=kpi1_Df.reset_index(drop=True)計算月份數(shù)第1步:按“銷售時間”升序排序。#startTime:最小時間值startTime=kpi1_Df.loc[0,'銷售時間']#endTime:最大時間值endTime=kpi1_Df.loc[totalI-1,'銷售時間']第2步:獲取時間范圍。#獲取時間范圍內(nèi)的總天數(shù)daysI=(endTime-startTime).days#月份數(shù):運算符“//”表示取整除#返回商的整數(shù)部分,例如9//2的結果是4monthsI=daysI//30print('月份數(shù):',monthsI)第3步:計算月份數(shù)。藥店藥品銷量分析kpi1_I=totalI//monthsIprint('月均消費次數(shù):',kpi1_I)計算月均消費次數(shù)月均消費次數(shù)=總消費次數(shù)/月份數(shù)計算月均消費金額月均消費金額=總消費金額/月份數(shù)#總消費金額totalMoneyF=salesDf1.loc[:,'實收金額'].sum()#月均消費金額monthMoneyF=totalMoneyF/monthsIprint('月均消費金額:',monthMoneyF)計算客戶單價客戶單價=總消費金額/總消費次數(shù)'''totalMoneyF:總消費金額totalI:總消費次數(shù)'''pct=totalMoneyF/totalIprint('客戶單價:',pct)統(tǒng)計熱銷藥品的數(shù)量設定銷量超過100的藥品屬于熱銷藥品re_medicine.loc[(re_medicine['銷售數(shù)量']>100)].count()輸出結果:
銷售數(shù)量39dtype:int64藥店藥品銷量分析re_medicine.query("銷售數(shù)量>100").count()使用query()函數(shù)查詢熱銷藥品的代碼如下:輸出結果:
銷售數(shù)量39dtype:int646.數(shù)據(jù)可視化展示繪制折線圖分析藥品每天的消費金額plt.figure(figsize=(16,9))plt.plot(salesDf1['銷售時間'],salesDf1['實收金額'])plt.title("按天消費金額圖")plt.xlabel("日期")plt.ylabel("實收金額(元)")plt.xticks(rotation=30)plt.show()藥店藥品銷量分析圖5-6使用pyplot模塊的plot()函數(shù)繪制的按天消費金額折線圖藥店藥品銷量分析groupDf1=salesDf1[['銷售時間','實收金額']].copy()groupDf1=groupDf1.set_index('銷售時間')groupDf1.head()使用DataFrame的plot()方法繪制折線圖的代碼如下:然后繪制每天的“實收金額”折線圖。ax=groupDf1.plot(grid=True,figsize=(15,8))ax.set_ylabel('實收金額(元)')plt.xticks(rotation=30)plt.show()藥店藥品銷量分析#提取月份salesDf1['月份']=salesDf1['銷售時間'].dt.month#獲取每月的銷售數(shù)量、應收金額和實收金額的和monthDf=salesDf1.groupby('月份').agg('sum')monthDf=monthDf.reset_index(drop=False)monthDf1=monthDf.drop(axis=1,index=6)data_mounth1繪制折線圖分析藥品每月的消費趨勢觀察藥品銷售數(shù)據(jù)可以看出,7月的銷售數(shù)據(jù)不完整,所以去掉7月的銷售數(shù)據(jù)。剔除銷售數(shù)據(jù)不完整月份的代碼如下:使用DataFrame的plot()方法繪制1-6月銷售數(shù)量、應收金額、實收金額折線圖,對應的代碼如下:ax1=monthDf1.plot(x='月份',secondary_y=['銷售數(shù)量'],x_compat=True,grid=True,figsize=(10,4),marker='o',linewidth=2)plt.title('1-6月藥品銷售趨勢')ax1.right_ax.set_ylabel('銷售數(shù)量')ax1.set_ylabel(['應收金額(元)','實收金額(元)'])藥店藥品銷量分析圖5-8使用DataFrame的plot()方法繪制1-6月銷售數(shù)量、應收金額、實收金額折線圖藥店藥品銷量分析groupDf=salesDf1#重命名行索引為銷售時間所在列的值groupDf.index=groupDf['銷售時間']#按銷售時間先聚合再按月分組,計算每個月的消費金額monthDf2=groupDf.groupby(groupDf.index.month).sum()#繪制按月消費金額折線圖plt.plot(monthDf2['實收金額'])plt.title("按月消費金額圖")plt.xlabel("月份")plt.ylabel("實收金額(元)")plt.show()使用pyplot模塊的plot()函數(shù)繪制按月消費金額折線圖,對應的代碼如下:從圖5-9所示的輸出結果可以看出,7月消費金額最少,這是因為7月的數(shù)據(jù)不完整,不具有參考價值。藥店藥品銷量分析medicine=groupDf[['商品名稱','銷售數(shù)量']]re_medicine=medicine.groupby('商品名稱')[['銷售數(shù)量']].sum()#對藥品“銷售數(shù)量”按降序排序re_medicine=re_medicine.sort_values(by="銷售數(shù)量",ascending=False)分析銷售數(shù)量排前10位的藥品的銷售情況聚合統(tǒng)計各種藥品銷售數(shù)量的代碼如下:截取銷售數(shù)量排前10位藥品的代碼如下:top_medicine=re_medicine.iloc[:10,:]top_medicine使用DataFrame的plot()方法繪制銷售數(shù)量排前10位的藥品的柱形圖,對應的代碼如下:top_medicine.plot(kind='bar')plt.title("銷售數(shù)量排前10位的藥品")plt.xlabel("藥品名稱")plt.ylabel("銷售數(shù)量")plt.legend(loc=0)plt.show()藥店藥品銷量分析圖5-10使用DataFrame的plot()方法繪制的銷售數(shù)量排前10位的藥品的柱形圖使用pyplot模塊的barh()方法繪制銷售數(shù)量排前10位的藥品的條形圖,對應的代碼如下:plt.barh(top_medicine._stat_axis.values,top_medicine['銷售數(shù)量'])plt.title("銷售數(shù)量最多的前10種藥品")plt.ylabel("藥品名稱")plt.xlabel("銷售數(shù)量")plt.show()藥店藥品銷量分析salesDf1['星期']=salesDf1['銷售時間'].dt.dayofweek分析一周7天藥品銷售數(shù)量和金額提取“
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江省效實中學2024-2025學年高考語文試題3年高考模擬題透析2年模擬試題含解析
- 2025年廣西桂平市高三下學期質量調研(一模)歷史試題含解析
- 宜賓市屬國有企業(yè)人力資源中心宜賓臨港投資建設集團有限公司下屬子公司2025年第一批項目制員工公開招聘筆試參考題庫附帶答案詳解
- 2025福建移動春季校園招聘若干人筆試參考題庫附帶答案詳解
- 2025河北石家莊市國有企業(yè)招聘21人筆試參考題庫附帶答案詳解
- 2025榆林中科潔凈能源創(chuàng)新研究院招聘筆試參考題庫附帶答案詳解
- 2025年甘肅敦煌文旅集團有限公司招聘67人筆試參考題庫附帶答案詳解
- 航天主題測試題及答案
- 2025年山東魯泰控股集團有限公司下屬駐陜西煤礦企業(yè)招聘(150人)筆試參考題庫附帶答案詳解
- 2024年度天津市護師類之主管護師模擬考試試卷B卷含答案
- 2025-2030羊毛制品行業(yè)市場調研分析及發(fā)展趨勢與投資前景研究報告
- 房建資料員知識培訓課件
- 新零售背景下的電子商務嘗試試題及答案
- 《商務溝通與談判》課件 第二章 商務溝通原理
- 2024年四川內(nèi)江中考滿分作文《我也有自己的光芒》8
- 深信服aES產(chǎn)品技術白皮書-V1.5
- (高清版)DB11∕T2316-2024重大活動應急預案編制指南
- 小學生航天科技教育課件
- 人工智能機器人研發(fā)合同
- 放射防護知識培訓
- 《社區(qū)智慧養(yǎng)老模式研究的國內(nèi)外文獻綜述》4200字
評論
0/150
提交評論