Python在自動化辦公方面,用處還是比較的大的,如果使用起來的話,其辦公的效率會大大的提高。特別是我們在做報表的時候,使用python更加的簡潔方便,那么,怎么實現報表自動化呢?我們制作完報表之后,怎么才能夠自動發送到郵箱呢?下面給大家詳細解答下。
項目背景
作為數據分析師,我們需要經常制作統計分析圖表。但是報表太多的時候往往需要花費我們大部分時間去制作報表。這耽誤了我們利用大量的時間去進行數據分析。但是作為數據分析師我們應該盡可能去挖掘表格圖表數據背后隱藏關聯信息,而不是簡單的統計表格制作圖表再發送報表。既然報表的工作不可免除,那我們應該如何利用我們所學的技術去更好的處理工作呢?這就需要我們制作一個Python小程序讓它自己去實現,這樣我們就有更多的時間去做數據分析。我們把讓程序自己運行的這個過程稱為自動化。
一、報表自動化目的
1.節省時間,提高效率
自動化總是能夠很好的節省時間,提高我們的工作效率。讓我們的程序編程盡可能的降低每個功能實現代碼的耦合性,更好的維護代碼。這樣我們會節省很多時間讓我們有空去做更多有價值有意義的工作。
2.減少錯誤
編碼實現效果正確無誤的話是是可以一直沿用的,如果是人為來操作的話反而可能會犯一些錯誤。交給固定的程序來做更加讓人放心,需求變更時僅修改部分代碼即可解決問題。
二、報表自動化范圍
首先我們需要根據業務需求來制定我們所需要的報表,并不是每個報表都需要進行自動化的,一些復雜二次開發的指標數據要實現自動化編程的比較復雜的,而且可能會隱藏著各種BUG。所以我們需要對我們工作所要用到的報表的特性進行歸納,以下是我們需要綜合考慮的幾個方面:
1.頻率
對于一些業務上經常需要用到的表,這些表我們可能要納入自動化程序的范圍。例如客戶信息清單、銷售額流量報表、業務流失報表、環比同比報表等。
這些使用頻率較高的報表,都很有必要進行自動化。對于那些偶爾需要使用的報表,或者是二次開發指標,需要復制統計的報表,這些報表就沒必要實現自動化了。
2.開發時間
這就相當于成本和利率一樣,若是有些報表自動化實現困難,還超過了我們普通統計分析所需要的時間,就沒必要去實現自動化。所以開始自動化工作的時候要衡量一下開發腳本所耗費的時間和人工做表所耗費的時間哪個更短了。當然我會提供一套實現方案,但是僅對一些常用簡單的報表。
3.流程
對于我們報表每個過程和步驟,每個公司都有所不同,我們需要根據業務場景去編碼實現各個步驟功能。所以我們制作的流程應該是符合業務邏輯的,制作的程序也應該是符合邏輯的。
三、實現步驟
首先我們需要知道我們需要什么指標:
指標
總體概覽指標
反映某一數據指標的整體大小
對比性指標
環比
相鄰時間段內的指標直接作差
同比
相鄰時間段內某一共同時間點上指標的對比
集中趨勢指標
中位數
眾數
平均數/加權平均數
離散程度指標
標準差
方差
四分位數
全距(極差)
最大界減最小界
相關性指標
r
我們拿一個簡單的報表來進行模擬實現:
第一步:讀取數據源文件
首先我們要了解我們的數據是從哪里來的,也就是數據源。我們最終的數據處理都是轉化為DataFrame來進行分析的,所以需要對數據源進行轉化為DataFrame形式:
import pandas as pd import 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 snapshot make_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 smtplib from 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() 運行測試:
下載文件:
綜上所述,這篇文章就給大家介紹到這里了,希望可以給大家帶來更多幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/128308.html
摘要:背景一哥們發了個訴求,總覺得自己的服務器不安全,想搞個定時備份文件并發送到自己的郵箱實現代碼如下簡單說明打包文件這個實現比較初級,直接用命令進行打包發送郵件這個就不說了,現成的模塊直接拿來用日志記錄加上日志,可以很清 背景 一哥們發了個訴求,總覺得自己的服務器不安全,想搞個定時備份文件并發送到自己的郵箱 1 實現代碼如下 # -*- coding: utf-8 -*- from __...
摘要:我是一個知乎輕微重度用戶,之前寫了一只爬蟲幫我爬取并分析它的數據,我感覺這個過程還是挺有意思,因為這是一個不斷給自己創造問題又去解決問題的過程。所以這只爬蟲還有登陸知乎搜索題目的功能。 我一直覺得,爬蟲是許多web開發人員難以回避的點。我們也應該或多或少的去接觸這方面,因為可以從爬蟲中學習到web開發中應當掌握的一些基本知識。而且,它還很有趣。 我是一個知乎輕微重度用戶,之前寫了一只爬...
摘要:自動發送郵件我們把報表做出來以后一般都是需要發給別人查看,對于一些每天需要發的報表或者是需要一次發送多份的報表,這個時候可以考慮借助來自動發送郵件。一份郵件的組成下圖是中發送一份郵件的界面,主要包含發件人收件人抄送人主題正文附件這幾部分。 ...
摘要:量化派是一家數據驅動的科技金融公司,通過人工智能大數據機器學習等前沿技術提供消費信貸撮合及消費場景下的白條服務,每年處理千萬級用戶信用及信用消費申請。 「小楊」最近裝修房子,準備去銀行貸款,但是聽說好多人會因為個人征信問題被銀行拒絕貸款!于是,他先查了一下自己的央行征信,發現竟然沒有自己的征信信息,「小楊」陷入了沉思,自己經常在淘寶、jd 上買東西,也有淘寶花唄和京東白條,怎么會沒有征...
閱讀 911·2023-01-14 11:38
閱讀 878·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1983·2023-01-14 10:34
閱讀 942·2023-01-14 10:24
閱讀 819·2023-01-14 10:18
閱讀 499·2023-01-14 10:09
閱讀 572·2023-01-14 10:02