文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python如何实现报表自动化和自动发送到目的邮箱

2023-07-06 01:20

关注

本文小编为大家详细介绍“Python如何实现报表自动化和自动发送到目的邮箱”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python如何实现报表自动化和自动发送到目的邮箱”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、报表自动化目的

1.节省时间,提高效率

自动化总是能够很好的节省时间,提高我们的工作效率。让我们的程序编程尽可能的降低每个功能实现代码的耦合性,更好的维护代码。这样我们会节省很多时间让我们有空去做更多有价值有意义的工作。

2.减少错误

编码实现效果正确无误的话是是可以一直沿用的,如果是人为来操作的话反而可能会犯一些错误。交给固定的程序来做更加让人放心,需求变更时仅修改部分代码即可解决问题。

二、报表自动化范围

首先我们需要根据业务需求来制定我们所需要的报表,并不是每个报表都需要进行自动化的,一些复杂二次开发的指标数据要实现自动化编程的比较复杂的,而且可能会隐藏着各种BUG。所以我们需要对我们工作所要用到的报表的特性进行归纳,以下是我们需要综合考虑的几个方面:

1.频率

对于一些业务上经常需要用到的表,这些表我们可能要纳入自动化程序的范围。例如客户信息清单、销售额流量报表、业务流失报表、环比同比报表等。

Python如何实现报表自动化和自动发送到目的邮箱

Python如何实现报表自动化和自动发送到目的邮箱

这些使用频率较高的报表,都很有必要进行自动化。对于那些偶尔需要使用的报表,或者是二次开发指标,需要复制统计的报表,这些报表就没必要实现自动化了。

2.开发时间

这就相当于成本和利率一样,若是有些报表自动化实现困难,还超过了我们普通统计分析所需要的时间,就没必要去实现自动化。所以开始自动化工作的时候要衡量一下开发脚本所耗费的时间和人工做表所耗费的时间哪个更短了。当然我会提供一套实现方案,但是仅对一些常用简单的报表。

3.流程

对于我们报表每个过程和步骤,每个公司都有所不同,我们需要根据业务场景去编码实现各个步骤功能。所以我们制作的流程应该是符合业务逻辑的,制作的程序也应该是符合逻辑的。

Python如何实现报表自动化和自动发送到目的邮箱

三、实现步骤

首先我们需要知道我们需要什么指标:

指标

反映某一数据指标的整体大小

相邻时间段内的指标直接作差

相邻时间段内某一共同时间点上指标的对比

Python如何实现报表自动化和自动发送到目的邮箱

我们拿一个简单的报表来进行模拟实现:

第一步:读取数据源文件

首先我们要了解我们的数据是从哪里来的,也就是数据源。我们最终的数据处理都是转化为DataFrame来进行分析的,所以需要对数据源进行转化为DataFrame形式:

import pandas as pdimport jsonimport pymysqlfrom sqlalchemy import create_engine# 打开数据库连接conn = pymysql.connect(host='localhost',port=3306,user='root',passwd='xxxx',charset = 'utf8')engine=create_engine('mysql+pymysql://root:xxxx@localhost/mysql?charset=utf8')def read_excel(file): df_excel=pd.read_excel(file) return df_exceldef read_json(file): with open(file,'r')as json_f: df_json=pd.read_json(json_f) return df_jsondef read_sql(table): sql_cmd ='SELECT * FROM %s'%table df_sql=pd.read_sql(sql_cmd,engine) return df_sqldef read_csv(file): df_csv=pd.read_csv(file) return df_csv

以上代码均通过测试可以正常使用,但是pandas的read函数针对不同的形式的文件读取,其read函数参数也有不同的含义,需要直接根据表格的形式来调整。

其他read函数将会在文章写完之后后续补上,除了read_sql需要连接数据库之外,其他的都是比较简单的。

第二步:DataFrame计算

我们以用户信息为例:

Python如何实现报表自动化和自动发送到目的邮箱

我们需要统计的指标为:

#将城市空值的一行删除df=df[df['city_num'].notna()]#删除errordf=df.drop(df[df['city_num']=='error'].index)#统计df = df.city_num.value_counts()

Python如何实现报表自动化和自动发送到目的邮箱

我们仅获取前10名的城市就好了,封装为饼图:

def pie_chart(df): #将城市空值的一行删除 df=df[df['city_num'].notna()] #删除error df=df.drop(df[df['city_num']=='error'].index) #统计 df = df.city_num.value_counts() df.head(10).plot.pie(subplots=True,figsize=(5, 6),autopct='%.2f%%',radius = 1.2,startangle = 250,legend=False)pie_chart(read_csv('user_info.csv'))

Python如何实现报表自动化和自动发送到目的邮箱

将图表保存起来:

plt.savefig('fig_cat.png')

要是你觉得matplotlib的图片不太美观的话,你也可以换成echarts的图片,会更加好看一些:

pie = Pie()pie.add("",words)pie.set_global_opts(title_opts=opts.TitleOpts(title="前十地区"))#pie.set_series_opts(label_opts=opts.LabelOpts(user_df))pie.render_notebook()

Python如何实现报表自动化和自动发送到目的邮箱

封装后就可以直接使用了:

def echart_pie(user_df): user_df=user_df[user_df['city_num'].notna()] user_df=user_df.drop(user_df[user_df['city_num']=='error'].index) user_df = user_df.city_num.value_counts() name=user_df.head(10).index.tolist() value=user_df.head(10).values.tolist() words=list(zip(list(name),list(value))) pie = Pie() pie.add("",words) pie.set_global_opts(title_opts=opts.TitleOpts(title="前十地区")) #pie.set_series_opts(label_opts=opts.LabelOpts(user_df)) return pie.render_notebook()user_df=read_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')

Python如何实现报表自动化和自动发送到目的邮箱

第三步:自动发送邮件

做出来的一系列报表一般都要发给别人看的,对于一些每天需要发送到指定邮箱或者需要发送多封报表的可以使用Python来自动发送邮箱。

在Python发送邮件主要借助到smtplib和email这个两个模块。

不同种类的邮箱服务器连接地址不一样,大家根据自己平常使用的邮箱设置相应的服务器进行连接。这里博主用网易邮箱展示:

首先需要开启POP3/SMTP/IMAP服务:

Python如何实现报表自动化和自动发送到目的邮箱

之后便可以根据授权码使用python登入了。

import smtplibfrom email import encodersfrom email.header import Headerfrom email.utils import parseaddr,formataddrfrom email.mime.application import MIMEApplicationfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMEText#发件人邮箱asender="fanstuck@163.com"#收件人邮箱areceiver="1079944650@qq.com"#抄送人邮箱acc="fanstuck@163.com"#邮箱主题asubject="谢谢关注"#发件人地址from_addr="fanstuck@163.com"#邮箱授权码password="####"#邮件设置msg=MIMEMultipart()msg['Subject']=asubjectmsg['to']=areceivermsg['Cc']=accmsg['from']="fanstuck"#邮件正文body="你好,欢迎关注fanstuck,您的关注就是我继续创作的动力!"msg.attach(MIMEText(body,'plain','utf-8'))#添加附件htmlFile = 'C:/Users/10799/problem.html'html = MIMEApplication(open(htmlFile , 'rb').read())html.add_header('Content-Disposition', 'attachment', filename='html')msg.attach(html)#设置邮箱服务器地址和接口smtp_server="smtp.163.com"server = smtplib.SMTP(smtp_server,25)server.set_debuglevel(1)#登录邮箱server.login(from_addr,password)#发生邮箱server.sendmail(from_addr,areceiver.split(',')+acc.split(','),msg.as_string())#断开服务器连接server.quit()

运行测试:

Python如何实现报表自动化和自动发送到目的邮箱

下载文件:

Python如何实现报表自动化和自动发送到目的邮箱

读到这里,这篇“Python如何实现报表自动化和自动发送到目的邮箱”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯