实验项目名称:pyecharts交互式绘图
实验目的及要求:
(1)掌握pyecharts的基础语法
(2)掌握柱形图的绘制方法
(3)掌握折线图的绘制方法
(4)掌握饼图的绘制方法
(5)掌握并行多图的绘制方法
(6)掌握时间线轮播多图的绘制方法
实验内容:
(1)根据第2章实训2处理后的数据,统计2017年6月销量前5的商品销量、每台售货机每月的总交易额、每台售货机各类(按大类)商品的销售额,并利用这些数据绘制相关图形。
(2)根据第2章实训2处理后的数据,统计2017年每月每台售货机的销售额、每台售货机每月各类(按大类)商品的销售额,并利用这些数据绘制相关图形
实验步骤
(1)获取处理好的数据
In [179]:
#(1)获取处理好的数据 import pandas as pd import numpy as np from pyecharts.charts import Bar,Pie,Line from pyecharts import options as opts data=pd.read_csv('./处理后的数据.csv',encoding='gbk') data.head()
Out[179]:
订单号 | 设备ID | 应付金额 | 实际金额 | 商品 | 支付时间 | 地点 | 状态 | 提现 | 大类 | 二级类 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | DD201708167493663618499909784 | E43A6E078A07631 | 4.5 | 4.5 | 68g好丽友巧克力派2枚 | 2017-01-01 00:53:00 | D | 已出货未退款 | 已提现 | 非饮料 | 饼干糕点 |
1 | DD201708167493663555814061164 | E43A6E078A04172 | 3.0 | 3.0 | 40g双汇玉米热狗肠 | 2017-01-01 01:33:00 | A | 已出货未退款 | 已提现 | 非饮料 | 肉干/豆制品/蛋 |
2 | DD201708167493578526890939886 | E43A6E078A06874 | 5.5 | 5.5 | 430g泰奇八宝粥 | 2017-01-01 08:45:00 | E | 已出货未退款 | 已提现 | 非饮料 | 方便速食 |
3 | DD201708167493683507186615837 | E43A6E078A04228 | 5.0 | 5.0 | 48g好丽友薯愿香烤原味 | 2017-01-01 09:05:00 | C | 已出货未退款 | 已提现 | 非饮料 | 膨化食品 |
4 | DD201708167493759548618252006 | E43A6E078A04134 | 3.0 | 3.0 | 600ml可口可乐 | 2017-01-01 09:41:00 | B | 已出货未退款 | 已提现 | 饮料 | 碳酸饮料 |
(2)设置系统配置项和全局配置项,绘制销量前5的商品销量柱形图
In [180]:
#(2)设置系统配置项和全局配置项,绘制销量前5的商品销量柱形图 data1=data.groupby('商品').count()###按商品分组,统计商品的出现频次====>即为商品的销量 data2=data1.sort_values('订单号',ascending=False).head()['订单号']###获取销量前五的数据 columns={'订单号':'销量'}#对列进行重新命名 data2=pd.DataFrame(data2)###将其转换成一个DataFrame类型 data2=data2.rename(columns=columns)##对列索引进行重新命名 data3=data2.T##将获取已经处理好的数据进行一个转置 init_opts=opts.InitOpts(width='1000px', height='800px') bar=( Bar(init_opts) .add_xaxis(data3.columns.tolist()) .add_yaxis('销量', data3.loc['销量'].tolist(), label_opts=opts.LabelOpts(position='insideTop')) .set_global_opts(title_opts=opts.TitleOpts( title='销量前5的商品销量柱形图')) ) bar.render('销量前5的商品销量柱形图.html') bar.render_notebook()
Out[180]:
(3)设置系统配置项和全局配置项,绘制售货机每月总交易额折线图
In [181]:
#(3)设置系统配置项和全局配置项,绘制售货机每月总交易额折线图 data['支付时间']=pd.to_datetime(data['支付时间'])#将支付时间转换成datetime类型,便于分析 data['月份']=data['支付时间'].dt.month##从数据中提取出销售月份具体是哪月,并将其添加到data当中去 temp=data.groupby(by=['月份','地点'],as_index=False)['实际金额'].sum() x=sorted(list(set(data['月份'].values.tolist()))) x_data=[str(i)+'月' for i in x] location=list(set(temp['地点'].values.tolist())) location=sorted(location) y=[] for i in location: y.append(np.round(temp[temp['地点']==i]['实际金额'].values.tolist(),2))
line=(Line() .add_xaxis(x_data) .add_yaxis('售货机A',y[0],label_opts=opts.LabelOpts(is_show=False)) .add_yaxis('售货机B',y[1],label_opts=opts.LabelOpts(is_show=False)) .add_yaxis('售货机C',y[2],label_opts=opts.LabelOpts(is_show=False)) .add_yaxis('售货机D',y[3],label_opts=opts.LabelOpts(is_show=False)) .add_yaxis('售货机E',y[4],label_opts=opts.LabelOpts(is_show=False)) ) line.render('售货机每月总交易额折线图.html') line.render_notebook()
Out[182]:
(4)设置系统配置项和全局配置项,绘制售货机各类(按大类)商品的销售额饼图
In [183]:
import warnings warnings.filterwarnings('ignore') category_sales = data.groupby(['地点', '大类'])['实际金额'].sum().reset_index() ###写一个类方法,按照大类(非饮料和饮料)和各类(A、B、C、D、E)来对大类重新进行一个命名,可以更加直观看出数据属于哪类 ##以字典形式处理 def dl_gl(dl): mapping = { ('非饮料', 'A'): 'A非饮料', ('非饮料', 'B'): 'B非饮料', ('非饮料', 'C'): 'C非饮料', ('非饮料', 'D'): 'D非饮料', ('非饮料', 'E'): 'E非饮料', ('饮料', 'A'): 'A饮料', ('饮料', 'B'): 'B饮料', ('饮料', 'C'): 'C饮料', ('饮料', 'D'): 'D饮料', } return mapping.get((dl['大类'], dl['地点']), 'E饮料') ##调用方法 category_sales['大类'] = category_sales.apply(dl_gl, axis=1) from pyecharts.charts import Pie # 绘制饼图 pie = Pie() pie.add("", [list(z) for z in zip(category_sales['大类'].values.tolist(), list(category_sales.sum(axis=1)))]) pie.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%")) pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) pie.render('售货机各类(按大类)商品的销售额饼图.html') pie.render_notebook()
#(4)设置系统配置项和全局配置项,绘制售货机各类(按大类)商品的销售额饼图 temp=data.groupby('大类')['实际金额'].sum()##进行分组统计 temp=pd.DataFrame(temp) temp=temp.T##将获取的数据进行一个转置,便于计算 pie = ( Pie() .add('', [list(z) for z in zip(temp.columns.tolist(), temp.loc['实际金额'].values.tolist())]) .set_global_opts(title_opts=opts.TitleOpts(title='售货机各类(按大类)商品的销售额饼图')) .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{c} ({d}%)')) ) pie.render('售货机各类(按大类)商品的销售额饼图2.html') pie.render_notebook()
In [185]:
(5)设置系统配置项和全局配置项,绘制2017年每月每台售货机的销售额的时间线轮播多图
In [186]:
from pyecharts.charts import Timeline # 按售货机和月份分组,计算每台售货机每月的总交易额 data_monthly = data.groupby(['地点', '月份'])['实际金额'].sum().reset_index() # 创建时间线轮播多图 timeline = Timeline() # 添加每个月的图表 for month in data_monthly['月份'].unique().tolist(): bar = ( Bar() .add_xaxis(data_monthly[data_monthly['月份'] == month]['地点'].tolist()) .add_yaxis("销售额", data_monthly[data_monthly['月份'] == month]['实际金额'].tolist()) .set_global_opts(title_opts=opts.TitleOpts(title="2017年{}月每台售货机销售额".format(month))) ) timeline.add(bar, "{}月".format(month)) timeline.render('2017年每月每台售货机的销售额的时间线轮播多图.html') timeline.render_notebook()
Out[186]:
In [187]:
from pyecharts import options as opts from pyecharts.charts import Line, Timeline data['年份']=data['支付时间'].dt.year # 获取2017年每月每台售货机的销售额数据 monthly_amount = data[data['年份'] == 2017].groupby(['地点', '月份']).sum()['实际金额'].reset_index() # 绘制时间线轮播多图 timeline = ( Timeline() .add_schema(play_interval=1000) ) for location in ['A', 'B', 'C','D','E']: line = ( Line() .add_xaxis(monthly_amount[monthly_amount['地点'] == location].月份.tolist()) .add_yaxis("销售额", monthly_amount[monthly_amount['地点'] == location]['实际金额'].tolist()) .set_global_opts(title_opts=opts.TitleOpts(title="售货机{}每月销售额折线图".format(location))) ) timeline.add(line, "{}售货机".format(location)) timeline.render('2017年每月每台售货机的销售额的时间线轮播多图2.html') timeline.render_notebook()
(6)设置系统配置项和全局配置项,绘制售货机每月各类(按大类)商品的销售额饼图的并行多图
In [188]:
#(6)设置系统配置项和全局配置项,绘制售货机每月各类(按大类)商品的销售额饼图的并行多图 from pyecharts import options as opts from pyecharts.charts import Pie from pyecharts import options as opts from pyecharts.charts import Bar,Line,Pie, Timeline,Grid from pyecharts.commons.utils import JsCode from pyecharts.globals import ThemeType import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') colors1= ["#00FF80","#800000"] colors2= ["#000080","#008000 "] colors3= ["red", "yellow"] colors4= ["#FF0080", "#80FF00"] colors5= ["#FF0000", "#00FF00#800000"] # 获取每台售货机各类(按大类)商品的销售额数据 category_amount = data.groupby(['地点', '大类']).sum()['实际金额'].reset_index() # init_opts=opts.InitOpts(width='50px', height='40px') pie1 = ( Pie(init_opts=opts.InitOpts(width='50px', height='40px',theme=ThemeType.LIGHT)) .add("", [list(z) for z in zip(category_amount[category_amount['地点'] == 'A'].大类.tolist(), category_amount[category_amount['地点'] == 'A']['实际金额'].tolist())], radius=["30%", "50%"], center=["15%", "50%"], rosetype="radius" ) .set_colors(colors1) .set_global_opts(title_opts=opts.TitleOpts(title="商品的销售额饼图的并行多图")) ) pie2= ( Pie(init_opts=opts.InitOpts(width='50px', height='40px',theme=ThemeType.VINTAGE)) .add("", [list(z) for z in zip(category_amount[category_amount['地点'] == 'B'].大类.tolist(), category_amount[category_amount['地点'] == 'B']['实际金额'].tolist())], radius=["30%", "50%"], center=["30%", "50%"], rosetype="radius").set_colors(colors1) .set_colors(colors2) ) # 绘制饼图 pie3 = ( Pie(init_opts=opts.InitOpts(width='50px', height='40px',theme=ThemeType.WONDERLAND)) .add("", [list(z) for z in zip(category_amount[category_amount['地点'] == 'C'].大类.tolist(), category_amount[category_amount['地点'] == 'C']['实际金额'].tolist())], radius=["30%", "50%"], center=["50%", "50%"], rosetype="radius") .set_colors(colors3) ) pie4 = ( Pie(init_opts=opts.InitOpts(width='50px', height='40px',theme=ThemeType.ROMA)) .add("", [list(z) for z in zip(category_amount[category_amount['地点'] == 'D'].大类.tolist(), category_amount[category_amount['地点'] == 'D']['实际金额'].tolist())], radius=["30%", "50%"], center=["65%", "50%"], rosetype="radius") .set_colors(colors4) ) pie5 = ( Pie(init_opts=opts.InitOpts(width='50px', height='40px',theme=ThemeType.WESTEROS)) .add("", [list(z) for z in zip(category_amount[category_amount['地点'] == 'E'].大类.tolist(), category_amount[category_amount['地点'] == 'E']['实际金额'].tolist())], radius=["30%", "50%"], center=["85%", "50%"], rosetype="radius") .set_colors(colors5) ) grid = ( Grid() .add(pie1, grid_opts=opts.GridOpts(pos_left="30%", pos_top="30%")) .add(pie2, grid_opts=opts.GridOpts(pos_left="60%", pos_right="30%")) .add(pie3, grid_opts=opts.GridOpts(pos_left="50%", pos_right="5%")) .add(pie4, grid_opts=opts.GridOpts(pos_left="70%", pos_right="5%")) .add(pie5, grid_opts=opts.GridOpts(pos_left="90%", pos_right="5%")) ) grid.render('售货机每月各类(按大类)商品的销售额饼图的并行多图.html') grid.render_notebook()#从左到右分别是A,B,C,D,E
绘制售货机各类(按大类)全年商品的销售额饼图和柱形图的并行多图
In [189]:
import pandas as pd from pyecharts import options as opts from pyecharts.charts import Bar, Line, Pie, Grid, Timeline from pyecharts.charts import Page from pyecharts.globals import ThemeType from pyecharts.charts import Timeline bart = data.groupby(['地点', '大类']).sum()['实际金额'].reset_index() bart=pd.DataFrame(bart) fyl = [] yl = [] for index, row in bart.iterrows(): if row['大类'] == '非饮料' and row['地点'] in ['A', 'B', 'C', 'D', 'E']: fyl.append(row) else: yl.append(row) fyl=pd.DataFrame(fyl) yl=pd.DataFrame(yl) are=['A', 'B', 'C', 'D', 'E'] fyl=fyl['实际金额'].values.tolist() yl=yl['实际金额'].values.tolist() init_opts=opts.InitOpts(width='1200px',height='720px',theme=ThemeType.ROMA) bar=( Bar(init_opts) .add_xaxis(are) .add_yaxis('非饮料',fyl) .add_yaxis('饮料',yl) .set_global_opts(title_opts=opts.TitleOpts(title='售货机每月各类(按大类)商品的销售额饼图的并行多图'), legend_opts=opts.LegendOpts(pos_left="15%",pos_top="25"), yaxis_opts=opts.AxisOpts(name='销售额'), xaxis_opts=opts.AxisOpts(name='地点')) ) area=['售货机A', '售货机B', '售货机C', '售货机D', '售货机E'] pie1=( Pie() .add('',[list(z) for z in zip(area,fyl)], radius=[20,100],center=[750,600]) .set_global_opts(title_opts=opts.TitleOpts(title='非饮料类销售情况',pos_top="60%",pos_left="55%"), legend_opts=opts.LegendOpts(orient='vertical',pos_left="90%",pos_bottom="50")) .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{c} ({d}%)',position="outside",color=['red','blue','green','purple','skyblue'])) ) pie2=( Pie() .add('',[list(z) for z in zip(area,yl)], radius=[15,100],center=[750,200]) .set_global_opts(title_opts=opts.TitleOpts(title='饮料类销售情况',pos_top="50",pos_left="55%"), legend_opts=opts.LegendOpts(orient='vertical',pos_left="90%")) .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{c} \n ({d}%)'),position="outside",color=['red','blue','green','purple','skyblue']) ) grid=(Grid(init_opts=opts.InitOpts(width='1200px',height='720px',theme=ThemeType.ROMA))) grid.add(bar,grid_opts=opts.GridOpts(pos_left="5%", pos_right="60%")) grid.add(pie1,grid_opts=opts.GridOpts(pos_bottom="60",pos_left="60%")) grid.add(pie2,grid_opts=opts.GridOpts(pos_top="60",pos_left="60%")) grid.render('售货机各类(按大类)全年商品的销售额饼图和柱形图的并行多图.html') grid.render_notebook()
实验环境:
硬件:计算机
软件:python+jupyter notebook+matplotlib
实验结果:
销量前5的商品是?
In [191]:
data3.columns
Out[191]:
Index(['怡宝纯净水', '脉动', '东鹏特饮', '阿萨姆奶茶', '营养快线'], dtype='object', name='商品')
答:由(1)可知销量前5的商品是怡宝纯净水、脉动、东鹏特饮、阿萨姆奶茶、营养快线。
售货机每月总交易情况如何?
答:从中可以看出5 ~ 12月相对来说,波动比较大。
从第(3)题售货机每月总交易额折线图和第(5)题2017年每月每台售货机的销售额的时间线轮播多图的折线图结合起来,
可以看出总交易额A售货机在5 ~ 12 月波动比较大,B售货机和C售货机在6 ~ 11月波动较大,
D售货机6 ~ 10 月波动较大,E售货机在7 ~ 12 月波动较大。
在十二个月当中,A售货机和D售货机在十二月份的时候有一个最高点,
B售货机和C售货机在十月份的时候有一个最高点,
E售货机在十一月份的时候有一个最高点,
也就是说这是总交易额最高的时候的月份,销售量最好的时候。
在二月和七月当中各类售货机的总交易额都比较低,和其他月份相比较起来,
在六月份时候,出现5 ~ 6月份总交易额暴涨,6 ~ 7月总交易额爆跌的现象。
总体来看E售货机的总交易额波动最为明显,当先看第(5)题2017年每月每台售货机的销售额的时间线轮播多图的折线图会发现其实波动起#### 伏都比较大,
但是再回过来看第(3)题的图的时候你会发现E售货机的波动起伏最为明显,其他售货机的相对来说平缓一些。
对比发现,E售货机的总交易额就像股票呈现一个暴涨暴跌的状态,如果选择E售货机进行炒股的话,对于稳定性收入的人不太适合。
但总体来说,E售货机的销量额是比较好的,因为它的总交易额在十二个月当中普遍最高。
从第(5)题2017年每月每台售货机的销售额的时间线轮播多图的柱形图来看,
从柱形图当中可以很清楚的看到十二个月里面经常会出现这样的情形E售货机 > C售货机> B售货机 > A售货机> D售货机 ;
按各类售货机来看,总体来说十二月中,E售货机每月的总交易额普遍偏高,D售货机普遍偏低,相对于其他售货机而言。