原标题:利用python制作报告自动化生成2

根据我上一篇文章的内容,可以对数据进行拆解与透视,只是完成了自动化的第一阶段,并只是运用到pandas这个库,并没有运用到matplotlib画图。如果管理层喜欢读图表,你搞不出图表,那就是还要被批的节奏啊!况且图表表达的数据,总比干巴巴的数字好吧!
也有朋友反馈为什么不用Excel里的宏,我觉得相对VBA来说,python用起来更人性化,简洁。
所以,我们接着把上一篇中的内容;
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
先把需要用到的库导进去,中间的拆解和清洗就省了,同时把这个数据的整体情况,截个图放上来,并读取它。

chanpin3 = chanpin[["第3级部门","产品E","日期"]]
pd.pivot_table(chanpin3,values="产品E",columns="日期",index="第3级部门",aggfunc="sum")
输出:
日期32周第3级部门
会展湾区84前海湾区189前海自贸区56华侨城区80大营销部0宝城区62西丽区13
其实,以上透视也只是汇总数据的一种方式,如果是做图,我更喜欢用汇总函数grouby,下面来看看用汇总函数跟透视有什么不一样的。
chanpin4 = chanpin.groupby(["第3级部门"])["产品B"].sum().sort_values() #查询某一列,然后就可以分组出来
print(chanpin4)
输出:
第3级部门
大营销部 0.0
西丽区 40.5
会展湾区 88.0
华侨城区 89.0
前海自贸区 111.0
宝城区 119.5
前海湾区 201.5
Name: 产品B, dtype: float64
其实是一样的,当然汇总的还可以选择你想汇总的是哪一列的类别数据,比如上面有个大营销部,它的数据是0,几乎没什么作用的,那我可以把它省掉。
chanpin4 = chanpin.query("第3级部门 not in ['大营销部']").groupby(["第3级部门"])["产品B"].sum().sort_values()
print(chanpin4)
输出:
第3级部门
西丽区 40.5
会展湾区 88.0
华侨城区 89.0
前海自贸区 111.0
宝城区 119.5
前海湾区 201.5
Name: 产品B, dtype: float64
这里加了一个not,如果只是很少的类别,那就可以直接写出来,不用not in ,直接in就可以了;
以上还是处于组织数据的阶段,我们还没开始进入做图阶段,接下来就要用到matplotlib这个库的函数作图了,
chanpin4 = pd.DataFrame(chanpin4)
首先是把刚刚那个分组的数据转换成数组DataFrame类型的;
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
如果没有以上两行代码,你的中文字在图表上显示不出来的,这个我深受其苦啊!
chanpin4.plot.bar()
plt.title('产品B',fontsize=18)
输出:

终于出图了,可看这个图,还是发现有点怪,对,就是没有数值。接下来再加上数值就好了。
F = np.arange(6)#这里选6的原因是有6列数据,所以会选择6,
J = np.array(list(chanpin4['产品B']))#这里选择产品B是因为图表取值的问题,把其它的数据添加进去,也同样道理;
plt.ylim(0,300)
for x,y in zip(F,J):
plt.text(x,y+30, '%.0f' % y, ha='center', va= 'bottom',fontsize=14)#记得%分号的后面还有一个Y,这里只是表达Y轴的原因
输出:

到这里,就跟前面的基本上是从数据读取、清洗、拆分、作图基本上完成了整个报告过程,但是,这里也只是完成了一个图的作图流程,但是我有几十个图,那怎么办呢?我是不是要把以上的代码写上几十遍?
如果真是这样,那我还是用Excel来做吧!也正好这点Excel是做不了的,并且繁琐,但是python可以通过定义函数来减少这一过程。
接下来,放大招,看用函数做是什么样的效果的;
def chanpintu(cp):
chanpin5 = chanpin[["诸侯",cp]]
chanpin5 = chanpin.query("诸侯 not in ['大营销部']").groupby(["诸侯"])[cp].sum().sort_values() #查询某一列,然后就可以分组出来
chanpin5 = pd.DataFrame(chanpin5)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
chanpin5.plot.bar()
name = cp+'分析'
plt.title(name,fontsize=18)
k = np.arange(6)#这里选6的原因是有6列数据,所以会选择6,
j = np.array(list(chanpin5[cp]))#这里选择cp是因为图表取值的问题,把其它的数据添加进去,也同样道理;
plt.ylim(0,300)
for x,y in zip(k,j):
plt.text(x,y+20, '%.0f' % y, ha='center', va= 'bottom',fontsize=14)#记得%分号的后面还有一个Y,这里只是表达Y轴的原因
其实,以上是对刚刚那个过程的整理,但是这里定义了一个函数,chanpintu(),变量是cp,就这样我们定义了一个chanpintu的函数,接下来,我们就可以直接用函数做图了,你爱用做多少个图,就做多少个图了。
从编程的角度来说,必须要会函数,不会函数,是很难学好语言的。
chanpintu("产品B")
chanpintu("产品C")

好,用函数作图又向自动化迈进了一步,半天的工作量,是不是十分钟可以搞定啊!返回搜狐,查看更多
责任编辑:
本文介绍利用Python实现报告自动化生成图表。先导入pandas、numpy、matplotlib等库,对数据进行拆解、清洗、分组等操作,用matplotlib函数作图。还通过定义函数简化流程,可按需生成多个图表,相比Excel更高效、简洁。

被折叠的 条评论
为什么被折叠?



