Python自動化辦公:讓程式自動分析數據製作報表,併發送郵箱

来源:https://www.cnblogs.com/hahaa/archive/2022/09/28/16737731.html
-Advertisement-
Play Games

序言 作為數據分析師,我們需要經常製作統計分析圖表。但是報表太多的時候往往需要花費我們大部分時間去製作報表。這耽誤了我們利用大量的時間去進行數據分析。但是作為數據分析師我們應該儘可能去挖掘表格圖表數據背後隱藏關聯信息,而不是簡單的統計表格製作圖表再發送報表。既然報表的工作不可免除,那我們應該如何利用 ...


序言

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

一、報表自動化目的

1.節省時間,提高效率

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

2.減少錯誤

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

二、報表自動化範圍

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

1.頻率

對於一些業務上經常需要用到的表,這些表我們可能要納入自動化程式的範圍。例如客戶信息清單、銷售額流量報表、業務流失報表、環比同比報表等。

這些使用頻率較高的報表,都很有必要進行自動化。對於那些偶爾需要使用的報表,或者是二次開髮指標,需要複製統計的報表,這些報表就沒必要實現自動化了。

2.開發時間

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

3.流程

對於我們報表每個過程和步驟,每個公司都有所不同,我們需要根據業務場景去編碼實現各個步驟功能。所以我們製作的流程應該是符合業務邏輯的,製作的程式也應該是符合邏輯的。

三、實現步驟

首先我們需要知道我們需要什麼指標,這裡再列出來:

指標

  • 總體概覽指標
    反映某一數據指標的整體大小

  • 對比性指標
    1.同比
    相鄰時間段內某一共同時間點上指標的對比
    2.環比
    相鄰時間段內的指標直接作差

  • 集中趨勢指標
    1.平均數/加權平均數
    2.眾數
    3.中位數

  • 離散程度指標
    1.全距(極差)
    最大界減最小界
    2.四分位數
    3.方差
    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

# 兄弟們學習python,有時候不知道怎麼學,從哪裡開始學。掌握了基本的一些語法或者做了兩個案例後,不知道下一步怎麼走,不知道如何去學習更加高深的知識。
# 那麼對於這些大兄弟們,我準備了大量的免費視頻教程,PDF電子書籍,以及源代碼!
# 還會有大佬解答!
# 都在這個群里了 279199867
# 歡迎加入,一起討論 一起學習!

 

以上代碼均通過測試可以正常使用,但是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="[email protected]"
#收件人郵箱
areceiver="[email protected]"
#抄送人郵箱
acc="[email protected]"
#郵箱主題
asubject="謝謝關註"
#發件人地址
from_addr="[email protected]"
#郵箱授權碼
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教程:代碼總是學完就忘記?100個實戰項目!讓你沉迷學習丨學以致用丨下一個Python大神就是你!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 你知道嗎,在 Jmix 中,REST API 有兩種實現方式! 很多應用是採取前後端分離的方式進行開發。這種模式下,對前端的選擇相對靈活,可以根據團隊的擅長技能選擇流行的 Angular/React/Vue 之一,或者前端為App/小程式等手機應用。Jmix 的一種典型應用場景就是作為這種類型應用程 ...
  • 1.問題分析 1.1. 公司雲桌面win7系統把之前C盤中自帶的py3.7環境給還原了,之前跑得好好的PlayWright案例不能運行了 2.解決過程 2.1. 參考網上的解決方案,說是node的版本問題,但是我將之前可以運行的V12.22.12版本回退到V12.9.1以後,還是不行,但是我發現我的 ...
  • Mac下protobuf生成文件報錯問題解決辦法,windows下就不會這麼麻煩了,如果linux下出現類似報錯信息按照下麵的解決邏輯依然適用。 1、由--go_out引發的報錯 1.報錯信息: user@C02FP58GML7H pbfile % protoc --go_out=./ ./user ...
  • 1.property 裝飾器:裝飾器是在不修改被裝飾對象源代碼以及調用方式的前提下為被裝飾對象添加新功能的可調用對象 property是一個裝飾器,是用來綁定給對象的方法偽造成一個數據屬性 裝飾器property,可以將類中的函數“偽裝成”對象的數據屬性,對象在訪問該特殊屬性時會觸發功能的執行,然後 ...
  • 摘要:本文講解基於傅里葉變換的高通濾波和低通濾波。 本文分享自華為雲社區《[Python圖像處理] 二十三.傅里葉變換之高通濾波和低通濾波》,作者:eastmount 。 一.高通濾波 傅里葉變換的目的並不是為了觀察圖像的頻率分佈(至少不是最終目的),更多情況下是為了對頻率進行過濾,通過修改頻率以達 ...
  • HashMap源碼深度剖析 * HashMap底層數據結構(為什麼引入紅黑樹、存儲數據的過程、哈希碰撞相關問題) * HashMap成員變數(初始化容量是多少、負載因數、數組長度為什麼是2的n次冪) * HashMap擴容機制(什麼時候需要擴容? 怎麼進行擴容?) * JDK7 與 Jdk8比較,J ...
  • 作者:小小____ 來源:segmentfault.com/a/1190000023052493 思維導圖如下 RBAC許可權分析 RBAC 全稱為基於角色的許可權控制,本段將會從什麼是RBAC,模型分類,什麼是許可權,用戶組的使用,實例分析等幾個方面闡述RBAC 思維導圖 繪製思維導圖如下 什麼是RBA ...
  • 如果你有機會跟一些技術大牛接觸的話,你會發現別人不僅是技術上比一般人強很多,而且在做事方面也有許多不一樣的習慣,在職場捲了這麼多年依然保持的習慣,往往是值得我們借鑒和學習的。 今天給大家分享幾個優秀程式員的好習慣,養成這6個習慣,你也能成為編程老司機。 第一,代碼自測再交付 寫完代碼不要急於交付,先 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...