项目背景作为数据分析师,我们需要经常制作统计分析图表。但是当报告太多的时候,往往会占用我们大部分的时间来做报告。这就耽误了我们使用大量时间进行数据分析。但是作为数据分析师,我们应该尽量去挖掘表格和图表数据背后隐藏的关联信息,而不是简单的把统计表做成图表,然后再发报告。既然报表工作是不可避免的,那么我们应该如何利用所学的技术来更好的处理工作呢?这就需要我们自己做一个Python小程序来实现,这样我们就有更多的时间来做数据分析了。我们将这种让程序自行运行的过程称为自动化。一、报表自动化的目的1、节省时间,提高效率自动化总能节省时间,提高我们的工作效率。让我们的程序编程尽可能的降低各个功能实现代码的耦合度,更好的维护代码。这将为我们节省大量时间,让我们腾出时间去做更有价值、更有意义的工作。2.减少错误如果编码的效果是正确的,就可以一直使用。如果手动操作,可能会出现一些错误。交给固定的程序更让人安心。当需求发生变化时,只需修改部分代码即可解决问题。2.报表自动化的范围首先,我们需要根据业务需要,制定自己需要的报表。并非每个报告都需要自动化。一些复杂的二次开发指标数据,实现自动化编程比较复杂,可能会隐藏各种bug。因此,我们需要总结一下我们在工作中需要用到的报表的特点。以下是我们需要综合考虑的几个方面:1.频率对于业务中经常使用的一些表,我们可能会将这些表纳入自动化程序范围。比如客户信息列表、销售流水报表、营业亏损报表、环比和同比报表等。需要将这些经常使用的报表自动化。对于那些偶尔需要用到的报表,或者二次开发的指标,需要复制统计的报表,这些报表不需要自动化。2.开发时间这相当于成本和利率。如果有些报表很难自动化,超过了我们普通统计分析需要的时间,就没有自动化的必要了。因此,在开始自动化工作时,需要衡量开发脚本所花费的时间还是手工制作表格所花费的时间更短。当然,我会提供一套实现方案,但只是针对一些常见的简单报表。3.流程对于我们报告的每个流程和步骤,每个公司都是不同的。我们需要根据业务场景进行编码,实现每一步的功能。所以我们做的流程要符合业务逻辑,我们做的程序也要符合逻辑。3.实施步骤首先我们要知道我们需要什么指标:指标总体概览指标反映了某个数据的总体规模指标比较指标与相邻时间段的指标直接差值与相邻时间段的某个共同时间比较点对点指标的集中趋势指标中位数均值/加权均值离散度指标标准差方差四分位数全范围(极差)最大界减去最小界相关指数r我们拿一个简单的报表来模拟实现:第一步:读取数据源文件。首先我们要了解我们的数据从哪里来,也就是数据源。我们最终的数据处理是转换成DataFrame进行分析,所以需要将数据源转换成DataFrame形式:importpandasaspdimportjsonimportpymysqlfromsqlalchemyimportcreate_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')defread_excel(文件):df_excel=pd.read_excel(file)返回df_exceldefread_json(file):withopen(file,'r')asjson_f:df_json=pd.read_json(json_f)returndf_jsondefread_sql(table):sql_cmd='SELECT*FROM%s'%tabledf_sql=pd.read_sql(sql_cmd,engine)returndf_sqldefread_csv(file):df_csv=pd.read_csv(file)returndf_csv以上代码均通过测试,可以正常使用,但是pandas的read函数是对于不同形式的文件读取,read函数的参数也有不同的含义,需要根据形式直接调整形式。其他阅读功能会在文章写好后补充。除了read_sql需要连接数据库外,其他都比较简单。第二步:DataFrame计算我们以用户信息为例:我们需要统计的指标有:指标说明单表图表:产品受众最多的Top10Regions#删掉一行空值的城市df=df[df['city_num'].notna()]#deleteerrordf=df.drop(df[df['city_num']=='error'].index)#statisticsdf=df.city_num.value_counts()我们只取前10名的城市就好了,打包成饼图:defpie_chart(df):#为城市删除一行空值df=df[df['city_num'].notna()]#删除错误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的图片,会l更好看:pie=Pie()pie.add("",words)pie.set_global_opts(title_opts=opts.TitleOpts(title="Top10regions"))#pie.set_series_opts(label_opts=opts.LabelOpts(user_df))pie.render_notebook()打包后直接使用:defechart_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)你ser_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(值)))pie=Pie()pie.add("",words)pie.set_global_opts(title_opts=opts.TitleOpts(title="top10regions"))#pie.set_series_opts(label_opts=opts.LabelOpts(user_df))returnpie.render_notebook()user_df=read_csv('user_info.csv')echart_pie(user_df)可以保存,可惜不是动图:fromsnapshot_seleniumimportsnapshotmake_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根据授权码登录了。importsmtplibfromemailimportencodersfromemail.headerimportHeaderfromemail.utilsimportparseaddr,formataddrfromemail.mime.applicationimportMIMEApplicationfromemail.mime.multipartimportMIMEMultipartfromemail.mime.textimportMIMEText#Sender'smailboxasender="fanstuck@163com"#收件人邮箱areceiver="1079944650@qq.com"#抄送人邮箱acc="fanstuck@163.com"#邮件主题asubject="谢谢关注"#发件人地址from_addr="fanstuck@163.com"#邮箱授权码password="####"#Mailsettingmsg=MIMEMultipart()msg['Subject']=absubjectmsg['to']=areceivermsg['Cc']=accmsg['from']="fanstuck"#mailtextbody="您好,欢迎来到fanstuck,您的关注是我继续创作的动力!"msg.attach(MIMEText(body,'plain','utf-8'))#addattachmenthtmlFile='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)服务器。set_debuglevel(1)#登录邮箱server.login(from_addr,password)#事件邮箱server.sendmail(from_addr,areceiver.split(',')+acc.split(','),msg.as_string())#break打开服务器连接server.quit()运行测试:下载文件:完全没有问题!!!以上就是本次分享的全部内容。觉得文章还不错的话,请关注公众号:Python编程学习圈,每日干货分享,发送“J”还能收到海量学习资料,涵盖Python电子书和教程,数据库编程、Django、爬虫、云计算等或者去编程学习网了解更多编程技术知识。
