绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
python自动化生成分析报告,让你的工作效率提升10倍+
2019-11-19 16:43:36

哗啦圈的梦 



如果你每天都需要输出分析报告,报告模式基本一致,只是更换里面的分析数据,每天重复着同样的工作,费时费力,工作能力没有丝毫的提升,但是如果你学过python,你就可以通过一个脚本自动生成报告,然后上班就可以腾出时间来学习其他的知识。

利用python生成word,我们需要学习一个新的模块:python-docx

首先:

安装模块: pip install python-docx

导入需要的模块

from docx import Document

创建一个空文档:

document = Document()

doc.save('new-file-name.docx')

简单地几行代码我们就可以创建一个新的word文档,是不是很简单,但是我们今天要做的或许稍有难度,首先先看看我们今天的需求:

今天我们分析一份26所2019年高校开学流量变化

流程是这样的的:

通过pandas分析统计数据

通过matplotlib批量生成图表

通过python-docx自动化生成汇报word

报告模式:

一个大学一个标题

然后一段描述文字:

一张趋势变化图表

let's go!

现附上后的结果,然后一步一步解析:

导入两份数据:历史数据,今天的数据

gx1=pd.read_clipboard()

gx2=pd.read_clipboard()

新建一个word:

document = Document()

获取高校的校名清单:

gxlist = gx2["高校"].unique().tolist()

通过循环大学校名清单,一个一个处理:

for each in gxlist:

筛选每次循环到的高校数据:

x = gx2[gx2["高校"] == each]

g = gx1[gx1["大学"] == each]

通过matplotlib画一个1*2的折线图:

sns.set_style("darkgrid")

sns.set_context("notebook", font_scale=1.3, rc={"lines.linewidth": 1.5})

# 该方法会返回画图对象和坐标对象ax,figsize是设置子图长宽(1200,800)

fig, ax = plt.subplots(figsize=(18, 10), ncols=1, nrows=2)

ax[0].plot(x["日期"], x["4G流量"], label="4G流量变化", lw=2, c="r", marker='.')

ax[0].plot(x["日期"], [g["去年开学4G流量"].values[0] for i in range(

len(x["日期"]))], label="去年开学4G流量变化平均值", lw=1.5, ls='-.', c="g")

ax[0].plot(x["日期"], [g["上学期4G流量"].values[0] for i in range(

len(x["日期"]))], label="上学期4G流量变化平均值", lw=1.5, ls=":", c="b")

ax[0].legend(loc="center left") # 添加图列就是右上角的点说明

ax[0].set_title('4G流量变化(GB)')

for a, b in zip(x["日期"], x["4G流量"]):

ax[0].text(a, b+(max(x["4G流量"])-b)*.1, '%.0f' %

b, ha='center', va='top', fontsize=15)

ax[1].plot(x["日期"], x["4G话务量"], label="4G话务量变化", lw=2, c="r", marker='.')

ax[1].plot(x["日期"], [g["去年开学4G总话务"].values[0] for i in range(

len(x["4G话务量"]))], label="去年开学4G话务变化平均值", lw=1.5, ls='-.', c="g")

ax[1].plot(x["日期"], [g["上学期4G总话务"].values[0] for i in range(

len(x["4G话务量"]))], label="上学期4G话务量变化平均值", lw=1.5, ls=":", c="b")

ax[1].legend(loc="center left") # 添加图列就是右上角的点说明··

ax[1].set_title('4G话务量变化(ERL)')

for a1, b1 in zip(x["日期"], x["4G话务量"]):

ax[1].text(a1, b1+(max(x["4G话务量"])-b1)*.1, '%.0f' %

b1, ha='center', va='top', fontsize=15)

fig.suptitle("%s业务量变化图" % each)

fig.autofmt_xdate()

plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签

将生成的图表保存为图片文件,方便导入到word:

plt.savefig("%s.png" % each)

将统计的数据和图表写入到word:

p = document.add_paragraph()

p.add_run(each).bold = True

document.add_paragraph('4G业务量&VOLTE话务量', style='Intense Quote')

paragraph = document.add_paragraph('今日4G流量为:%.2f;VOLTE话务为:%.2f;2G流量为:%.2f;2G话务为:%.2f。' % (

x["4G流量"].values[-1], x["4G话务量"].values[-1], x["2G流量"].values[-1], x["2G话务量"].values[-1]))

document.add_heading("%s业务量变化图:" % each, level=1)

document.add_picture('%s.png' % each, width=Inches(6))

保存文件:

document.save('demo.docx')

python-docx知识点

完整代码:

document = Document()

document.add_heading('\t\t\t大学流量趋势变化报告', 0)

gxlist = gx2["高校"].unique().tolist()

for each in gxlist:

print(each)

x = gx2[gx2["高校"] == each]

g = gx1[gx1["大学"] == each]

# 设定主题

sns.set_style("darkgrid")

sns.set_context("notebook", font_scale=1.3, rc={"lines.linewidth": 1.5})

# 该方法会返回画图对象和坐标对象ax,figsize是设置子图长宽(1200,800)

fig, ax = plt.subplots(figsize=(18, 10), ncols=1, nrows=2)

ax[0].plot(x["日期"], x["4G流量"], label="4G流量变化", lw=2, c="r", marker='.')

ax[0].plot(x["日期"], [g["去年开学4G流量"].values[0] for i in range(

len(x["日期"]))], label="去年开学4G流量变化平均值", lw=1.5, ls='-.', c="g")

ax[0].plot(x["日期"], [g["上学期4G流量"].values[0] for i in range(

len(x["日期"]))], label="上学期4G流量变化平均值", lw=1.5, ls=":", c="b")

ax[0].legend(loc="center left") # 添加图列就是右上角的点说明

ax[0].set_title('4G流量变化(GB)')

for a, b in zip(x["日期"], x["4G流量"]):

ax[0].text(a, b+(max(x["4G流量"])-b)*.1, '%.0f' %

b, ha='center', va='top', fontsize=15)

ax[1].plot(x["日期"], x["4G话务量"], label="4G话务量变化", lw=2, c="r", marker='.')

ax[1].plot(x["日期"], [g["去年开学4G总话务"].values[0] for i in range(

len(x["4G话务量"]))], label="去年开学4G话务变化平均值", lw=1.5, ls='-.', c="g")

ax[1].plot(x["日期"], [g["上学期4G总话务"].values[0] for i in range(

len(x["4G话务量"]))], label="上学期4G话务量变化平均值", lw=1.5, ls=":", c="b")

ax[1].legend(loc="center left") # 添加图列就是右上角的点说明··

ax[1].set_title('4G话务量变化(ERL)')

for a1, b1 in zip(x["日期"], x["4G话务量"]):

ax[1].text(a1, b1+(max(x["4G话务量"])-b1)*.1, '%.0f' %

b1, ha='center', va='top', fontsize=15)

fig.suptitle("%s业务量变化图" % each)

fig.autofmt_xdate()

plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签

plt.savefig("%s.png" % each)

p = document.add_paragraph()

p.add_run(each).bold = True

document.add_paragraph('4G业务量&VOLTE话务量', style='Intense Quote')

paragraph = document.add_paragraph('今日4G流量为:%.2f;VOLTE话务为:%.2f;2G流量为:%.2f;2G话务为:%.2f。' % (

x["4G流量"].values[-1], x["4G话务量"].values[-1], x["2G流量"].values[-1], x["2G话务量"].values[-1]))

document.add_heading("%s业务量变化图:" % each, level=1)

document.add_picture('%s.png' % each, width=Inches(6))

document.save('demo.docx')

 

分享好友

分享这个小栈给你的朋友们,一起进步吧。

应用开发
创建时间:2020-06-17 15:31:04
应用软件开发是指使用程序语言C#、java、 c++、vb等语言编写,主要是用于商业、生活应用的软件的开发。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 栈栈
    专家
戳我,来吐槽~