欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Python實(shí)現(xiàn)報(bào)表自動(dòng)化并發(fā)送到郵箱

 更新時(shí)間:2022年07月06日 09:48:07   作者:Python編程學(xué)習(xí)圈  
作為數(shù)據(jù)分析師,我們需要經(jīng)常制作統(tǒng)計(jì)分析圖表。但是報(bào)表太多的時(shí)候往往需要花費(fèi)我們大部分時(shí)間去制作報(bào)表。本文將利用Python實(shí)現(xiàn)報(bào)表自動(dòng)化并發(fā)送到郵箱,需要的可以參考一下

項(xiàng)目背景

作為數(shù)據(jù)分析師,我們需要經(jīng)常制作統(tǒng)計(jì)分析圖表。但是報(bào)表太多的時(shí)候往往需要花費(fèi)我們大部分時(shí)間去制作報(bào)表。這耽誤了我們利用大量的時(shí)間去進(jìn)行數(shù)據(jù)分析。但是作為數(shù)據(jù)分析師我們應(yīng)該盡可能去挖掘表格圖表數(shù)據(jù)背后隱藏關(guān)聯(lián)信息,而不是簡(jiǎn)單的統(tǒng)計(jì)表格制作圖表再發(fā)送報(bào)表。既然報(bào)表的工作不可免除,那我們應(yīng)該如何利用我們所學(xué)的技術(shù)去更好的處理工作呢?這就需要我們制作一個(gè)Python小程序讓它自己去實(shí)現(xiàn),這樣我們就有更多的時(shí)間去做數(shù)據(jù)分析。我們把讓程序自己運(yùn)行的這個(gè)過(guò)程稱(chēng)為自動(dòng)化。

一、報(bào)表自動(dòng)化目的

1.節(jié)省時(shí)間,提高效率

自動(dòng)化總是能夠很好的節(jié)省時(shí)間,提高我們的工作效率。讓我們的程序編程盡可能的降低每個(gè)功能實(shí)現(xiàn)代碼的耦合性,更好的維護(hù)代碼。這樣我們會(huì)節(jié)省很多時(shí)間讓我們有空去做更多有價(jià)值有意義的工作。

2.減少錯(cuò)誤

編碼實(shí)現(xiàn)效果正確無(wú)誤的話(huà)是是可以一直沿用的,如果是人為來(lái)操作的話(huà)反而可能會(huì)犯一些錯(cuò)誤。交給固定的程序來(lái)做更加讓人放心,需求變更時(shí)僅修改部分代碼即可解決問(wèn)題。

二、報(bào)表自動(dòng)化范圍

首先我們需要根據(jù)業(yè)務(wù)需求來(lái)制定我們所需要的報(bào)表,并不是每個(gè)報(bào)表都需要進(jìn)行自動(dòng)化的,一些復(fù)雜二次開(kāi)發(fā)的指標(biāo)數(shù)據(jù)要實(shí)現(xiàn)自動(dòng)化編程的比較復(fù)雜的,而且可能會(huì)隱藏著各種BUG。所以我們需要對(duì)我們工作所要用到的報(bào)表的特性進(jìn)行歸納,以下是我們需要綜合考慮的幾個(gè)方面:

1.頻率

對(duì)于一些業(yè)務(wù)上經(jīng)常需要用到的表,這些表我們可能要納入自動(dòng)化程序的范圍。例如客戶(hù)信息清單、銷(xiāo)售額流量報(bào)表、業(yè)務(wù)流失報(bào)表、環(huán)比同比報(bào)表等。

這些使用頻率較高的報(bào)表,都很有必要進(jìn)行自動(dòng)化。對(duì)于那些偶爾需要使用的報(bào)表,或者是二次開(kāi)發(fā)指標(biāo),需要復(fù)制統(tǒng)計(jì)的報(bào)表,這些報(bào)表就沒(méi)必要實(shí)現(xiàn)自動(dòng)化了。

2.開(kāi)發(fā)時(shí)間

這就相當(dāng)于成本和利率一樣,若是有些報(bào)表自動(dòng)化實(shí)現(xiàn)困難,還超過(guò)了我們普通統(tǒng)計(jì)分析所需要的時(shí)間,就沒(méi)必要去實(shí)現(xiàn)自動(dòng)化。所以開(kāi)始自動(dòng)化工作的時(shí)候要衡量一下開(kāi)發(fā)腳本所耗費(fèi)的時(shí)間和人工做表所耗費(fèi)的時(shí)間哪個(gè)更短了。當(dāng)然我會(huì)提供一套實(shí)現(xiàn)方案,但是僅對(duì)一些常用簡(jiǎn)單的報(bào)表。

3.流程

對(duì)于我們報(bào)表每個(gè)過(guò)程和步驟,每個(gè)公司都有所不同,我們需要根據(jù)業(yè)務(wù)場(chǎng)景去編碼實(shí)現(xiàn)各個(gè)步驟功能。所以我們制作的流程應(yīng)該是符合業(yè)務(wù)邏輯的,制作的程序也應(yīng)該是符合邏輯的。

三、實(shí)現(xiàn)步驟

首先我們需要知道我們需要什么指標(biāo):

指標(biāo)

  • 總體概覽指標(biāo)

反映某一數(shù)據(jù)指標(biāo)的整體大小

  • 對(duì)比性指標(biāo)
  • 環(huán)比

相鄰時(shí)間段內(nèi)的指標(biāo)直接作差

  • 同比

相鄰時(shí)間段內(nèi)某一共同時(shí)間點(diǎn)上指標(biāo)的對(duì)比

  • 集中趨勢(shì)指標(biāo)
  • 中位數(shù)
  • 眾數(shù)
  • 平均數(shù)/加權(quán)平均數(shù)
  • 離散程度指標(biāo)
  • 標(biāo)準(zhǔn)差
  • 方差
  • 四分位數(shù)
  • 全距(極差)
  • 最大界減最小界
  • 相關(guān)性指標(biāo)
  • r

我們拿一個(gè)簡(jiǎn)單的報(bào)表來(lái)進(jìn)行模擬實(shí)現(xiàn):

第一步:讀取數(shù)據(jù)源文件

首先我們要了解我們的數(shù)據(jù)是從哪里來(lái)的,也就是數(shù)據(jù)源。我們最終的數(shù)據(jù)處理都是轉(zhuǎn)化為DataFrame來(lái)進(jìn)行分析的,所以需要對(duì)數(shù)據(jù)源進(jìn)行轉(zhuǎn)化為DataFrame形式:

import pandas as pd
import json
import pymysql
from sqlalchemy import create_engine
 
# 打開(kāi)數(shù)據(jù)庫(kù)連接
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

以上代碼均通過(guò)測(cè)試可以正常使用,但是pandas的read函數(shù)針對(duì)不同的形式的文件讀取,其read函數(shù)參數(shù)也有不同的含義,需要直接根據(jù)表格的形式來(lái)調(diào)整。

其他read函數(shù)將會(huì)在文章寫(xiě)完之后后續(xù)補(bǔ)上,除了read_sql需要連接數(shù)據(jù)庫(kù)之外,其他的都是比較簡(jiǎn)單的。

第二步:DataFrame計(jì)算

我們以用戶(hù)信息為例:

我們需要統(tǒng)計(jì)的指標(biāo)為:

#指標(biāo)說(shuō)明

單表圖:

前十個(gè)產(chǎn)品受眾最多的地區(qū) 

#將城市空值的一行刪除
df=df[df['city_num'].notna()]
#刪除error
df=df.drop(df[df['city_num']=='error'].index)
#統(tǒng)計(jì)    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)
    #統(tǒng)計(jì)
    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'))

將圖表保存起來(lái):

plt.savefig('fig_cat.png')

要是你覺(jué)得matplotlib的圖片不太美觀(guān)的話(huà),你也可以換成echarts的圖片,會(huì)更加好看一些:

pie = Pie()
pie.add("",words)
pie.set_global_opts(title_opts=opts.TitleOpts(title="前十地區(qū)"))
#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="前十地區(qū)"))
    #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)

可以進(jìn)行保存,可惜不是動(dòng)圖:

from snapshot_selenium import snapshot
make_snapshot(snapshot,echart_pie(user_df).render(),"test.png")

保存為網(wǎng)頁(yè)的形式就可以自動(dòng)加載JS進(jìn)行渲染了:

echart_pie(user_df).render('problem.html')
os.system('problem.html')

第三步:自動(dòng)發(fā)送郵件

做出來(lái)的一系列報(bào)表一般都要發(fā)給別人看的,對(duì)于一些每天需要發(fā)送到指定郵箱或者需要發(fā)送多封報(bào)表的可以使用Python來(lái)自動(dòng)發(fā)送郵箱。

在Python發(fā)送郵件主要借助到smtplib和email這個(gè)兩個(gè)模塊。

  • smtplib:主要用來(lái)建立和斷開(kāi)與服務(wù)器連接的工作。
  • email:主要用來(lái)設(shè)置一些些與郵件本身相關(guān)的內(nèi)容。

不同種類(lèi)的郵箱服務(wù)器連接地址不一樣,大家根據(jù)自己平常使用的郵箱設(shè)置相應(yīng)的服務(wù)器進(jìn)行連接。這里博主用網(wǎng)易郵箱展示:

首先需要開(kāi)啟POP3/SMTP/IMAP服務(wù):

之后便可以根據(jù)授權(quán)碼使用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
 
#發(fā)件人郵箱
asender="fanstuck@163.com"
#收件人郵箱
areceiver="1079944650@qq.com"
#抄送人郵箱
acc="fanstuck@163.com"
#郵箱主題
asubject="謝謝關(guān)注"
#發(fā)件人地址
from_addr="fanstuck@163.com"
#郵箱授權(quán)碼
password="####"
#郵件設(shè)置
msg=MIMEMultipart()
msg['Subject']=asubject
msg['to']=areceiver
msg['Cc']=acc
msg['from']="fanstuck"
#郵件正文
body="你好,歡迎關(guān)注fanstuck,您的關(guān)注就是我繼續(xù)創(chuàng)作的動(dòng)力!"
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)
#設(shè)置郵箱服務(wù)器地址和接口
smtp_server="smtp.163.com"
server = smtplib.SMTP(smtp_server,25)
server.set_debuglevel(1)
#登錄郵箱
server.login(from_addr,password)
#發(fā)生郵箱
server.sendmail(from_addr,areceiver.split(',')+acc.split(','),msg.as_string())
#斷開(kāi)服務(wù)器連接
server.quit()

運(yùn)行測(cè)試: 

下載文件:

完全沒(méi)問(wèn)題?。。?/p>

以上就是基于Python實(shí)現(xiàn)報(bào)表自動(dòng)化并發(fā)送到郵箱的詳細(xì)內(nèi)容,更多關(guān)于Python報(bào)表自動(dòng)化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python中如何實(shí)現(xiàn)真正的按位取反運(yùn)算

    Python中如何實(shí)現(xiàn)真正的按位取反運(yùn)算

    按位取反是位運(yùn)算符,而位運(yùn)算符是應(yīng)用在兩個(gè)數(shù)的運(yùn)算上,會(huì)對(duì)數(shù)字的二進(jìn)制所有位數(shù)進(jìn)行從低到高的運(yùn)算,下面這篇文章主要給大家介紹了關(guān)于Python中如何實(shí)現(xiàn)真正的按位取反運(yùn)算的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • python數(shù)據(jù)分析之單因素分析線(xiàn)性擬合及地理編碼

    python數(shù)據(jù)分析之單因素分析線(xiàn)性擬合及地理編碼

    這篇文章主要介紹了python數(shù)據(jù)分析之單因素分析線(xiàn)性擬合及地理編碼,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • pycharm中導(dǎo)入不了torch包的解決方案

    pycharm中導(dǎo)入不了torch包的解決方案

    這篇文章主要介紹了pycharm中導(dǎo)入不了torch包的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 深度學(xué)習(xí)tensorflow基礎(chǔ)mnist

    深度學(xué)習(xí)tensorflow基礎(chǔ)mnist

    mnist作為深度學(xué)習(xí)中的HelloWorld,該小工程詳細(xì)描述了如何從零開(kāi)始深度學(xué)習(xí),代碼詳細(xì),解釋全面,需要的朋友可以參考下
    2021-04-04
  • PyCharm+PyQt5+QtDesigner配置詳解

    PyCharm+PyQt5+QtDesigner配置詳解

    這篇文章主要介紹了PyCharm+PyQt5+QtDesigner配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • python?獲取list?長(zhǎng)度

    python?獲取list?長(zhǎng)度

    這篇文章主要介紹了python?獲取list?長(zhǎng)度?,下面文章我們將研究獲取長(zhǎng)度列表的不同方法,使用內(nèi)置的len()函數(shù),len是默認(rèn)情況下python提供的內(nèi)置函數(shù),下面進(jìn)入文章了解更多的詳細(xì)內(nèi)容吧
    2022-02-02
  • Python數(shù)據(jù)結(jié)構(gòu)之列表與元組詳解

    Python數(shù)據(jù)結(jié)構(gòu)之列表與元組詳解

    序列是Python中最基本的數(shù)據(jù)結(jié)構(gòu)。序列中的每個(gè)元素都分配一個(gè)數(shù)字 - 它的位置,或索引,第一個(gè)索引是0,第二個(gè)索引是1,依此類(lèi)推,元組與列表類(lèi)似,不同之處在于元組的元素不能修改。元組使用小括號(hào),列表使用方括號(hào)
    2021-10-10
  • jupyter notebook中圖片顯示不出來(lái)的解決

    jupyter notebook中圖片顯示不出來(lái)的解決

    這篇文章主要介紹了jupyter notebook中圖片顯示不出來(lái)的解決操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • python中使用paramiko模塊并實(shí)現(xiàn)遠(yuǎn)程連接服務(wù)器執(zhí)行上傳下載功能

    python中使用paramiko模塊并實(shí)現(xiàn)遠(yuǎn)程連接服務(wù)器執(zhí)行上傳下載功能

    paramiko是用python語(yǔ)言寫(xiě)的一個(gè)模塊,遵循SSH2協(xié)議,支持以加密和認(rèn)證的方式,進(jìn)行遠(yuǎn)程服務(wù)器的連接。這篇文章主要介紹了python中使用paramiko模塊并實(shí)現(xiàn)遠(yuǎn)程連接服務(wù)器執(zhí)行上傳下載功能,需要的朋友可以參考下
    2020-02-02
  • python打開(kāi)url并按指定塊讀取網(wǎng)頁(yè)內(nèi)容的方法

    python打開(kāi)url并按指定塊讀取網(wǎng)頁(yè)內(nèi)容的方法

    這篇文章主要介紹了python打開(kāi)url并按指定塊讀取網(wǎng)頁(yè)內(nèi)容的方法,涉及Python操作URL及網(wǎng)頁(yè)內(nèi)容的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04

最新評(píng)論