<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python自動化辦公小程序:實現(xiàn)報表自動化和自動發(fā)送到目的郵箱

          共 5080字,需瀏覽 11分鐘

           ·

          2022-08-11 21:31

          ↑ 關注 + 星標 ,每天學Python新技能

          后臺回復【大禮包】送你Python自學大禮包

          項目背景

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

          一、報表自動化目的

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

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

          2.減少錯誤

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

          二、報表自動化范圍

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

          1.頻率

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



          這些使用頻率較高的報表,都很有必要進行自動化。對于那些偶爾需要使用的報表,或者是二次開發(fā)指標,需要復制統(tǒng)計的報表,這些報表就沒必要實現(xiàn)自動化了。


          2.開發(fā)時間

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

          3.流程

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


          三、實現(xiàn)步驟

          首先我們需要知道我們需要什么指標:

          指標

          • 總體概覽指標
            反映某一數(shù)據(jù)指標的整體大小

          • 對比性指標

            • 環(huán)比
              相鄰時間段內(nèi)的指標直接作差

            • 同比
              相鄰時間段內(nèi)某一共同時間點上指標的對比

          • 集中趨勢指標

            • 中位數(shù)

            • 眾數(shù)

            • 平均數(shù)/加權平均數(shù)

          • 離散程度指標

            • 標準差

            • 方差

            • 四分位數(shù)

            • 全距(極差)
              最大界減最小界

          • 相關性指標

            • r


          我們拿一個簡單的報表來進行模擬實現(xiàn):


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

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

          import pandas as pdimport jsonimport pymysqlfrom sqlalchemy import create_engine # 打開數(shù)據(jù)庫連接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函數(shù)針對不同的形式的文件讀取,其read函數(shù)參數(shù)也有不同的含義,需要直接根據(jù)表格的形式來調整。

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

          第二步:DataFrame計算

          我們以用戶信息為例:


          我們需要統(tǒng)計的指標為:


          #指標說明

          單表圖:

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

           產(chǎn)品的受眾地區(qū):

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

          可以進行保存,可惜不是動圖:

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

          保存為網(wǎng)頁的形式就可以自動加載JS進行渲染了:

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

           

           

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

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

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

          smtplib:主要用來建立和斷開與服務器連接的工作。

          email:主要用來設置一些些與郵件本身相關的內(nèi)容。

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

          首先需要開啟POP3/SMTP/IMAP服務:

          之后便可以根據(jù)授權碼使用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 #發(fā)件人郵箱asender="[email protected]"#收件人郵箱areceiver="[email protected]"#抄送人郵箱acc="[email protected]"#郵箱主題asubject="謝謝關注"#發(fā)件人地址from_addr="[email protected]"#郵箱授權碼password="####"#郵件設置msg=MIMEMultipart()msg['Subject']=asubjectmsg['to']=areceivermsg['Cc']=accmsg['from']="fanstuck"#郵件正文body="你好,歡迎關注fanstuck,您的關注就是我繼續(xù)創(chuà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)#設置郵箱服務器地址和接口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())#斷開服務器連接server.quit()

          運行測試: 

           

          下載文件:

          完全沒問題?。?!


          1. 來了,又一個新的SQL刷題網(wǎng)站!

          2. 4K壁紙批量采集,張張精品,全程自動化



          瀏覽 28
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  SWAG国产精品一区二区 | 最新欧美性爱 | 在线黄色免费 | 日韩有码第4页 | 亚洲a黄色视频 |