点击蓝字关注我们
近期码农身边的几个同事对前面出的Python报表自动化的帖子都表示很实用,同事一度登上粉丝阅读榜的No1。不过最近很不好意思,两周都没更新文章了,给各位粉丝大人道个歉。主要是最近工作太忙,而且最近没想到什么实用内容分享给大家。
后来码农想到了去年年底的一件事情,背景是需要把一张工作表的数据按照省份拆分成不同的sheet,而且还要针对每个省份的数据做图。码农就想到这个案例很适合拿来作为今天分享的主题。
案例数据
今天的案例数据是一份近2年全国各省市的社会零售消费品增速的数据。具体如下
我们任务是需要把每个省的数据拆分到一个单独的sheet里,并且在Sheel里做图展示数据。
今天要用到的Python里的一个非常好用的模块——openpyxl,它是专门用来处理模块是一个读写Excel 2010文档的Python库。它可以通过Python代码来实现Excel的各种操作,包括数据的读写,Excel的格式修改,包括写入Excel的公式,还有作图功能,今天就给大家具体介绍下。
导入数据
导入数据还是使用第一篇帖子分享的read_excel的方法来导入我们的原始数据,代码如下:
import openpyxl
import pandas as pd
df=pd.read_excel(r'E:\python_study\社会零售消费品增速.xlsx')
print(df.head(5))
地区 2017年第二季度 2017年第三季度 2017年第四季度 2018年第一季度 2018年第二季度 2018年第三季度 \
0 北京市 5.6 5.4 5.2 4.7 4.4 4.1
1 天津市 5.5 4.3 1.7 5.8 4.3 3.7
2 河北省 10.6 10.8 10.7 10.6 9.7 9.5
3 山西省 6.6 6.8 6.8 9.3 9.1 9.0
4 内蒙古自治区 9.4 8.4 6.9 6.5 6.9 6.9
2018年第四季度 2019年第一季度 2019年第二季度 2019年第三季度 2019年第四季度
0 2.7 3.8 5.4 4.8 4.4
1 1.7 -2.6 -0.6 -1.4 -0.3
2 9.0 8.4 8.9 8.4 8.4
3 8.2 8.2 8.3 7.8 7.8
4 6.3 4.9 4.0 4.0 4.1
左右滑动查看完整代码
打开一个Excel文件
接下来,我们就在原始的数据表里进行数据的拆分和画图,首先是用openpyxl打开原始数据表。
#打开工作簿,将工作簿存入对象wb
wb=openpyxl.load_workbook(r'E:\python_study\社会零售消费品增速.xlsx')
选择一个省市的数据,这里先以“北京市”为例,后面我们将整个功能封装为一个函数:
prov='北京市'
data=df[df['地区']==prov]
print(data)
地区 2017年第二季度 2017年第三季度 2017年第四季度 2018年第一季度 2018年第二季度 2018年第三季度 \
0 北京市 5.6 5.4 5.2 4.7 4.4 4.1
2018年第四季度 2019年第一季度 2019年第二季度 2019年第三季度 2019年第四季度
0 2.7 3.8 5.4 4.8 4.4
下一步需要先生成一个新的Sheet并且按照省市名称命名,这里用到create_sheet这个函数:
ws=wb.create_sheet(prov)
然后我们把data这个数据写入到新的Sheet里,这里我们需要用到一个循环,用openpyxl写入数据的方法就是按照excel的单元格来操作,所以我们需要按照单元格做遍历,ws.cell(row,column)表示sheet里的单元格,row是行,column是列,都是从1开始计数的,不是0哦。
for i in range(data.columns.shape[0]):
ws.cell(row=1,column=i+1).value=data.columns[i]#写入列名称
ws.cell(row=2,column=i+1).value=data.iloc[0,i]#写入data里的数据项
Excel作图指令
接下来是最重要的画图部分了,这里展示画折线图和柱状图。
from openpyxl.chart import LineChart,BarChart,Reference
#绘图的数据所在区域
dat=Reference(ws,min_col=2,min_row=2,max_row=2,max_col=ws.max_column)
#绘图数据的类别
cat=Reference(ws,min_col=2,min_row=1,max_row=1,max_col=ws.max_column)
#实例化折线图
chart1 = LineChart()
#折线图的样式
chart1.style = 2
#图表名称
chart1.title = prov
#纵轴名称
chart1.y_axis.title = '社会零售消费品增速'
#横轴名称
chart1.x_axis.title = '季度'
#不展示图例
chart1.legend=None
#添加作图的数据,默认作图的数据是按列的,这里的数据是按行的,所以需要True
chart1.add_data(dat,from_rows=True)
#指定绘图数据的类别
chart1.set_categories(cat)
#在A4格作图
ws.add_chart(chart1,'A4')
#柱状图
chart2=BarChart()
chart2.style=4
chart2.title=prov
chart2.y_axis.title = '社会零售消费品增速'
chart2.x_axis.title = '季度'
chart2.legend=None
chart2.add_data(dat,from_rows=True)
chart2.set_categories(cat)
ws.add_chart(chart2,'J4')
左右滑动查看完整代码
这样就完成数据的拆分和作图了,最后我们将这个Excel另存一下:
wb.save(r'E:\python_study\社会零售消费品增速_拆分.xlsx')
我们看下效果图。
最后我们只需要将上面从新建Sheet到画图这部分的代码定义为一个函数,然后执行一遍循环就可以完成这个任务了。
def new_sheet(prov):
data=df[df['地区']==prov]
ws=wb.create_sheet(prov)
for i in range(data.columns.shape[0]):
ws.cell(row=1,column=i+1).value=data.columns[i]
ws.cell(row=2,column=i+1).value=data.iloc[0,i]
from openpyxl.chart import LineChart,BarChart,Reference
#绘图的数据所在区域
dat=Reference(ws,min_col=2,min_row=2,max_row=2,max_col=ws.max_column)
#绘图数据的类别
cat=Reference(ws,min_col=2,min_row=1,max_row=1,max_col=ws.max_column)
#实例化折线图
chart1 = LineChart()
#折线图的样式
chart1.style = 2
#图表名称
chart1.title = prov
#纵轴名称
chart1.y_axis.title = '社会零售消费品增速'
#横轴名称
chart1.x_axis.title = '季度'
#不展示图例
chart1.legend=None
#添加作图的数据,默认作图的数据是按列的,这里的数据是按行的,所以需要True
chart1.add_data(dat,from_rows=True)
#指定绘图数据的类别
chart1.set_categories(cat)
#在A4格作图
ws.add_chart(chart1,'A4')
#柱状图
chart2=BarChart()
chart2.style=4
chart2.title=prov
chart2.y_axis.title = '社会零售消费品增速'
chart2.x_axis.title = '季度'
chart2.legend=None
chart2.add_data(dat,from_rows=True)
chart2.set_categories(cat)
ws.add_chart(chart2,'J4')
for i in df['地区']:
new_sheet(i)
左右滑动查看完整代码
这样我们就可以很方便的实现每个省的数据图表了。
好了,诸位表哥表姐,今天你们学会了?如果还是不懂,可以私信码农哦。
欢迎大家关注码农的公众号哦~~~~拜了个拜
如果你对报表自动化感兴趣,欢迎点击阅读前面的系列哦~~~
【Python报表自动化1】这是一篇可以让你从8点下班变成5点下班的武功秘籍
【Python报表自动化2】这是一篇可以让你从8点下班变成5点下班的武功秘籍
【Python报表自动化3】如何把vlookup函数用到666