通过实现报表的自动化操作, 并将报表数据自动发送到用户的邮箱信箱中。更新时间在二零二二年七月六号, 具体时间为上午九点四十八分七秒, 作者的名称是编程学习圈。身为一名专门从事数据分析工作的专业人员, 我们是在日常生活与工作当中, 必须得要频繁地去制作出各种用于统计分析的图表内容的。可是呢, 一旦面临到报表数量变得非常多、十分庞大的这种状况之际, 我们通常是需要付出绝大部分的时间与精力去辛苦完成这些报表的制作任务的。因此, 本文将要利用相关的工具与方法来实现对于报表自动化制作的功能并且能够将这些报表直接发送给指定的邮箱地址, 那些对此感兴趣的读者朋友们是可以参考一下本文内容的。项目背景身为数据分析师, 咱们得频繁地去弄那些统计分析图表。可一旦报表量太大了, 通常就会耗费咱们大部分的时间和精力在那儿做报表上。这就直接耽搁了咱们去用大块的时间搞数据分析这件事。然而呢, 作为数据分析师, 咱们按理说得更应该使劲儿去把表格和图表数据背后藏着的关联信息给挖出来, 别光是做个统计表格、画个图表, 然后就把报表发出去这么简单了事。如果报表的工作是必须完成的, 那么我们就应该去运用所掌握的技术来对工作进行更为良好的处理, 为此我们必须制作一个小程序, 让它能够自行地去实现相关任务, 这样一来我们就能拥有更加充裕的时间来开展数据分析这一项活动, 我们把使程序得以自行运行的整个过程称为自动化。一、进行报表自动化的目的。1.这样可以达到节省时间的目的, 同时又能够提高工作效率。自动化这项技术, 通常情况下, 总是能够非常妥善地节约掉不少时间, 并且提升我们的工作效率水平, 它能够让我们的程序编程活动, 尽可能做到降低每一个功能在实现代码过程中的耦合程度, 从而更有利于后续对代码的维护工作, 基于这样的一些情况, 我们大家就能节省下非常多的时间, 有了这些时间之后, 我们就可以空出精力去做更多那些有价值、有意义的工作内容了。2.减少错误如果通过编码来实现的效果是正确的和没有错误的, 那么这套方案是可以一直持续沿用下去的。但是如果让人直接去进行操作的话, 反而有可能会犯下一些错误。把任务交给固定的程序去执行会让人更加放心安心。而且当出现需求变更的情况的时候, 只需要修改少量的部分代码就可以解决遇到的问题了。二、报表自动化范围首先, 我们必须要依据具体的业务要求来确定我们需要制定的报表。并不是所有的报表都需要实现自动化处理。对于一些需要进行二次开发的复杂指标数据来说, 想要通过编程来实现自动化功能是一件比较复杂的事情。这样做很可能会隐藏着多种程序错误的情况。因此, 我们应该对工作中实际使用到的报表的相关特征进行总结归纳, 以下是我们在制定方案时需要进行全面综合考量的几个关键方面。1.频率在业务层面, 有一些数据表是经常需要使用的, 对于这些表, 我们可能需要把它们也纳入到自动化程序的覆盖范围里面去, 比如客户信息清单、销售额流量报表、业务流失报表, 以及环比同比报表等。这些在使用的时候频率变得比较高的报表内容, 都是非常有必要去进行自动化处理的。而对于那些只是偶尔才需要拿出来使用的报表类型, 又或者是需要用到二次开发指标的报表, 以及是需要通过复制来进行统计的报表形式, 这类报表就没有必要非得去实现自动化操作了。2.开发时间这就相当于是成本和利率之间的关系, 若是有些报表自动化实现起来非常困难, 而且所耗费的时间还超出了我们进行普通统计分析所需要的范围, 那么就没有必要去强行实现自动化功能, 所以在一开始推进自动化工作时, 我们需要对开发脚本所花费的时间以及人工制作表格所花费的时间进行深入比较, 看一看哪个用时更短一些, 当然我会提供一套具体的实现方案, 但是这个方案仅适用于那些常用的、并且操作相对简单的报表。3.流程针对我们的报表所涉及的每一个过程以及相关步骤而言, 每家公司的具体实际情况都是存在差异的, 我们需要结合具体的业务场景来开展编码工作, 从而去实现各个步骤的具体功能。因此, 我们所设计的业务流程必须是契合业务逻辑的, 同时我们编写的程序代码也必须是符合逻辑规范的。三、实现步骤第一步, 咱们得把那些需要去盯的指标给搞清楚。指标这是用来反映某一个数据指标, 它的整体性的大小的一个说法。把相邻的那两个段时间里面的指标拿出来, 让它们直接进行一个相减的运算。在一个共同的时间点上, 对相邻时间段内的某一指标进行对比。我们选取一个简易的报表, 来进行模拟实现的展示工作:在第一步这个步骤里面, 大家要去把那个数据源文件给读取进来。首先, 咱们得弄清楚咱们的数据究竟是从哪个地方弄来的, 这地方就是通常所说的数据源, 毕竟咱们最后对数据进行处理时, 都得把它给转化成某种形式, 进而用来做分析工作, 所以必须要把那个数据源给转化成对应的形式。import pandas as pdimport jsonimport pymysqlfrom sqlalchemy import create_engine# 打开数据库连接conn pymysql.connect(hostlocalhost,port3306,userroot,passwdxxxx,charset utf8)enginecreate_engine(mysqlpymysql://root:xxxxlocalhost/mysql?charsetutf8)def read_excel(file):df_excelpd.read_excel(file)return df_exceldef read_json(file):with open(file,r)as json_f:df_jsonpd.read_json(json_f)return df_jsondef read_sql(table):sql_cmd SELECT * FROM %s%tabledf_sqlpd.read_sql(sql_cmd,engine)return df_sqldef read_csv(file):df_csvpd.read_csv(file)return df_csv上述所有代码均已经完成测试, 并且确认能够正常运行, 然而需要指出的是, read函数针对不同类型的文件进行读取操作时, 其所对应的参数含义会存在差异, 因此必须直接依据表格中展示的形式对相关内容做出调整。关于其他的那些read函数, 会等文章写完以后在后面陆续补齐。除了有个连接数据库的步骤之外, 剩下的内容都是相对而言挺简单的。咱们来到第二步, 那就是进行计算啦。咱们就以用户的个人信息作为一个具体的例子来进行说明。我们需要去统计的那些指标啊, 就是这一部分。#指标说明单表图这前十个在受众方面覆盖最广的产品所对应的地区。#将城市空值的一行删除dfdf[df[city_num].notna()]#删除errordfdf.drop(df[df[city_num]error].index)#统计 df df.city_num.value_counts()我们只需要去获取那个排名前10的城市的数据就可以了, 之后要把这些数据给封装成一个饼图的样式。def pie_chart(df):#将城市空值的一行删除dfdf[df[city_num].notna()]#删除errordfdf.drop(df[df[city_num]error].index)#统计df df.city_num.value_counts()df.head(10).plot.pie(subplotsTrue,figsize(5, 6),autopct%.2f%%,radius 1.2,startangle 250,legendFalse)pie_chart(read_csv(user_info.csv))把图表给保存起来。plt.savefig(fig_cat.png)如果你心中觉得当前的图片不够美观, 那么你也可以选择更换为其他的图片, 这样可能会更加好看一些:pie Pie()pie.add(,words)pie.set_global_opts(title_optsopts.TitleOpts(title前十地区))#pie.set_series_opts(label_optsopts.LabelOpts(user_df))pie.render_notebook()在完成封装的工作之后, 你就可以直接使用它了:def echart_pie(user_df):user_dfuser_df[user_df[city_num].notna()]user_dfuser_df.drop(user_df[user_df[city_num]error].index)user_df user_df.city_num.value_counts()nameuser_df.head(10).index.tolist()valueuser_df.head(10).values.tolist()wordslist(zip(list(name),list(value)))pie Pie()pie.add(,words)pie.set_global_opts(title_optsopts.TitleOpts(title前十地区))#pie.set_series_opts(label_optsopts.LabelOpts(user_df))return pie.render_notebook()user_dfread_csv(user_info.csv)echart_pie(user_df)咱们是可以把它给保存下来的, 不过很遗憾啊, 它其实并不是那个会动的动画图像:from snapshot_selenium import snapshotmake_snapshot(snapshot,echart_pie(user_df).render(),test.png)把它保存成网页这种形式以后, 那些JS就会自己加载起来了, 而且也跟着进行渲染操作了。echart_pie(user_df).render(problem.html)os.system(problem.html)第三步: 将自动发送邮件。完成制作之后, 所得出的一系列报表通常都是要发送给其他人去观看的, 因此对于一些每天都要发送到指定的邮箱里头去或者是需要发送好多封这样的报表的业务场景, 可以运用这个功能来实现自动化的发送邮件操作。在发送邮件的时候, 我们主要借助到的还有email 和这个两个模块。