Python实现邮件发送,python自动群发邮件
作为数据分析师,我们需要经常做统计分析图表。但是当陈述太多的时候,往往要花费我们大部分的时间去做。本文将利用Python实现报表自动化,并将其发送到邮箱。有需要可以参考一下。
00-1010项目背景1。报告自动化目的2。报表自动化范围3。实施步骤1。读取数据源文件2。计算数据帧3。自动发送邮件。
目录
作为数据分析师,我们需要经常做统计分析图表。但是当陈述太多的时候,往往要花费我们大部分的时间去做。这耽误了我们花很多时间在数据分析上。但作为数据分析师,我们应该尽量去挖掘表格和图表背后隐藏的相关信息,而不是简单的做表格和图表,然后发报告。既然举报工作是不可避免的,那么应该如何运用所学的技术来更好的处理工作呢?这就需要我们自己做一个Python小程序来实现,让我们有更多的时间去做数据分析。我们称让程序自动运行的过程为自动化。
项目背景
1.节省时间,提高效率
自动化总是能节省时间,提高我们的工作效率。让我们的编程尽可能的减少各个功能实现代码的耦合,更好的维护代码。这将为我们节省大量时间,让我们有时间去做更有价值、更有意义的工作。
2.减少错误
如果编码效果正确,总是可以使用的,但是如果人为操作,可能会出现一些错误。留给固定的程序更放心。当需求发生变化时,只能修改一些代码来解决问题。
一、报表自动化目的
首先,我们需要根据业务需求做出我们需要的报表。并非每个报告都需要自动化。一些复杂的二次开发指标数据需要自动编程,可能会隐藏各种bug。因此,我们需要总结我们在工作中需要使用的语句的特征。以下是我们需要综合考虑的几个方面:
1.频率
对于业务中经常使用的一些表,我们可能必须将这些表包括在自动化过程的范围内。比如客户信息清单、销售流水报表、业务亏损报表、环比报表等。
有必要将这些常用的报告自动化。对于那些偶尔需要用到的报表,或者二次开发指标,以及需要复制统计数据的报表,不需要自动化这些报表。
2.开发时间
这相当于成本和利率。如果一些报表很难自动化,超过了我们一般统计分析所需的时间,就没有必要自动化。因此,当您开始自动化工作时,您应该衡量哪个更短:开发脚本所花费的时间和手动制作表格所花费的时间。当然,我会提供一个实现方案,但只是针对一些常见的简单报表。
3.流程
对于我们报表的每个流程和步骤,每个公司都不一样,需要根据业务场景进行编码,实现每个步骤的功能。所以我们做的流程要符合商业逻辑,做的程序也要符合逻辑。
二、报表自动化范围
首先,我们需要知道我们需要什么指标:
指数
总体概览指标反映了数据指标的总体规模。
对比指标直接比相邻时间段的指标差。
相邻时间段内同一时间点的指标比较。
趋势指数中位数众数平均数/加权平均数离差指数标准偏差方差四分位全距离(范围)最大界限减去最小界限相关指数r
让我们以一个简单的报告来进行模拟实现:
三、实现步骤
首先,我们需要知道我们的数据来自哪里,也就是数据来源。我们最终的数据处理被转换成数据帧用于分析。
的,所以需要对数据源进行转化为DataFrame形式:
import pandas as pdimport json
import pymysql
from 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_excel
def read_json(file):
with open(file,r)as json_f:
df_json=pd.read_json(json_f)
return df_json
def read_sql(table):
sql_cmd =SELECT * FROM %s%table
df_sql=pd.read_sql(sql_cmd,engine)
return df_sql
def read_csv(file):
df_csv=pd.read_csv(file)
return df_csv
以上代码均通过测试可以正常使用,但是pandas的read函数针对不同的形式的文件读取,其read函数参数也有不同的含义,需要直接根据表格的形式来调整。
其他read函数将会在文章写完之后后续补上,除了read_sql需要连接数据库之外,其他的都是比较简单的。
第二步:DataFrame计算
我们以用户信息为例:
我们需要统计的指标为:
#指标说明
单表图:
前十个产品受众最多的地区
#将城市空值的一行删除df=df[df[city_num].notna()]
#删除error
df=df.drop(df[df[city_num]==error].index)
#统计 df = df.city_num.value_counts()
我们仅获取前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))
将图表保存起来:
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()
封装后就可以直接使用了:
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发送邮件主要借助到smtplib和email这个两个模块。
- smtplib:主要用来建立和断开与服务器连接的工作。
- email:主要用来设置一些些与邮件本身相关的内容。
不同种类的邮箱服务器连接地址不一样,大家根据自己平常使用的邮箱设置相应的服务器进行连接。这里博主用网易邮箱展示:
首先需要开启POP3/SMTP/IMAP服务:
之后便可以根据授权码使用python登入了。
import smtplibfrom email import encoders
from email.header import Header
from email.utils import parseaddr,formataddr
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from 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]=asubject
msg[to]=areceiver
msg[Cc]=acc
msg[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报表自动化的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。