打开搜狗搜索APP,查看更多精彩资讯
如果你每天都需要输出分析报告,报告模式基本一致,只是更换里面的分析数据,每天重复着同样的工作,费时费力,工作能力没有丝毫的提升,但是如果你学过python,你就可以通过一个脚本自动生成报告,然后上班就可以腾出时间来学习其他的知识。
利用python生成word,我们需要学习一个新的模块:python-docx
首先:
导入需要的模块
创建一个空文档:
简单地几行代码我们就可以创建一个新的word文档,是不是很简单,但是我们今天要做的或许稍有难度,首先先看看我们今天的需求:
今天我们分析一份26所2019年高校开学流量变化
流程是这样的的:通过pandas分析统计数据
通过matplotlib批量生成图表
通过python-docx自动化生成汇报word
报告模式:一个大学一个标题
然后一段描述文字:
一张趋势变化图表
let's go!
现附上最后的结果,然后一步一步解析:
导入两份数据:历史数据,今天的数据
新建一个word:
获取高校的校名清单:
通过循环大学校名清单,一个一个处理:
筛选每次循环到的高校数据:
通过matplotlib画一个1*2的折线图:
将生成的图表保存为图片文件,方便导入到word:
将统计的数据和图表写入到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')