python 生成函数图_利用python制作报告自动化生成2

本文介绍利用Python实现报告自动化生成图表。先导入pandas、numpy、matplotlib等库,对数据进行拆解、清洗、分组等操作,用matplotlib函数作图。还通过定义函数简化流程,可按需生成多个图表,相比Excel更高效、简洁。

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

282656ccfb3140f4b83412e40bc74547.png

根据我上一篇文章的内容,可以对数据进行拆解与透视,只是完成了自动化的第一阶段,并只是运用到pandas这个库,并没有运用到matplotlib画图。如果管理层喜欢读图表,你搞不出图表,那就是还要被批的节奏啊!况且图表表达的数据,总比干巴巴的数字好吧!

也有朋友反馈为什么不用Excel里的宏,我觉得相对VBA来说,python用起来更人性化,简洁。

所以,我们接着把上一篇中的内容;

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

先把需要用到的库导进去,中间的拆解和清洗就省了,同时把这个数据的整体情况,截个图放上来,并读取它。

dfd2bf8cbf5140b3b9eeb5474eaafceb.png

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)

输出:

04530c6cab5f41249a486f3950bb5b64.png

终于出图了,可看这个图,还是发现有点怪,对,就是没有数值。接下来再加上数值就好了。

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轴的原因

输出:

d71f744de40c48a88f0d0e064d1eb09a.png

到这里,就跟前面的基本上是从数据读取、清洗、拆分、作图基本上完成了整个报告过程,但是,这里也只是完成了一个图的作图流程,但是我有几十个图,那怎么办呢?我是不是要把以上的代码写上几十遍?

如果真是这样,那我还是用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")

684adc87d0d14228b9e09ed78d0d91f2.png

好,用函数作图又向自动化迈进了一步,半天的工作量,是不是十分钟可以搞定啊!返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值