python sqlserver 列名_报表自动化,三流用Excel,二流用Python,一流用它
從事數據工作的人都知道,企業每天都要做很多報表,這個過程當中會涉及到很多手工操作和常規性報表。為了減少人工介入,節省工作時間,我們會想辦法將一部分操作用工具或代碼來替代,這個過程就稱為報表自動化。
報表自動化如何實現?
報表自動化的起點是能對接數據源,期間能自動化的生成事先設計好格式的報表,最終通過郵件自動推送。具體流程可以分為3個步驟:
1、對接數據源:從數據庫或數據倉庫中取數,生成原始數據sheet或其他工具對接所需要的數據文件格式。
2、設計報表框架:要展示哪些數據指標,什么樣的表頭格式,是否需要用到圖表、函數、空間等,最好手動設計好報表的版式。
3、自動化過程實現:自動化分為兩塊,自動化的數據處理和自動化發送郵件。
用什么工具實現?
實現的路徑有很多。精通Excel的可以通過寫VB腳本來實現,如果你會Python那更好不過,Python可以實現很多自動化設計,可以從讀取到輸出數據一步到位。更直接的,可以用報表工具來實現。所謂三流用Excel,二流用Python,一流直接用現成的報表工具!
我之前做數據報表的流程,一般是先打開數據庫,然后運行一段寫好的 SQL 語句,把數據查詢出來,然后再把數據復制到 Excel 中并制作報表。后面用了 Python 之后,很多工作都可以自動化。再到后面公司上了BI報表系統,做報表就更加自動化和專業化了。
這里簡述下后兩者實現報表自動化的方法。
Python報表自動化
一次自動化的報表制作,通常需要經歷這樣幾個步驟:
- 連接并操作數據庫
- 利用Pandas進行數據清洗和處理
- 操作Excel并開發報表
- 設置定時郵件發送給相關人員
1、連接并操作數據庫
Python可以連接并操作各種數據庫,包括 Oracle、PostgreSQL、MySQL、SQL Server 等等。不同的數據庫,需要安裝不同的第三方模塊,比如說,要操作 Oracle,那么通常需要先安裝 cx_Oracle:
pip install cx_Oracle在開始操作數據庫之前,需要先創建一個數據庫引擎,然后再連接數據庫:
from sqlalchemy import create_engine# 創建數據庫引擎engine = create_engine('oracle://user:password@ip_address:1521/orcl')# 連接數據庫con = engine.connect()如果你有數據庫賬號擁有創建表的權限,那么就可以對數據庫進行增刪改查的操作。
# 增con.execute("insert into usr(id, name) values(1, 'Jim')")con.execute("insert into usr(id, name) values(2, 'Joe')")# 刪con.execute('delete from usr where id = 1')# 改con.execute("update usr set name = 'Jack' where id = 2")# 查sql = 'select id, name from usr where id = :id'import pandas as pddf = pd.read_sql(sa.text(sql), engine, params={'id': 2})df另外,利用Python去執行各種SQL 語句,自動完成更加復雜的數據庫操作。
2、數據處理+自動化報表
在Python執行SQL后,取出以下原始數據:
想要實現的報表如下,這張日報表是用來監控每一天的銷售、發貨和用戶反饋情況。
代碼如下:
# PART2 自動化報表data = pd.read_excel(r'C:甥敳獲cindy407Desktopdelivery_data.xlsx',sheet_name='原始數據')# pandas行和列全部展示pd.options.display.max_rows=Nonepd.options.display.max_columns=None# 1、訂單、銷售金額、發貨訂單數df1 = data.groupby(['銷售時間'])['訂單號'].count() # 銷售訂單數df2 = data.groupby(['銷售時間'])[['數量','銷售金額']].sum() # 銷量和金額df3 = data.groupby(['銷售時間'])['交貨時間'].count() # 交貨訂單數# 2、發貨天數分布# 日期相加減,需先轉變成日期格式,使用applydata['銷售時間1'] = data['銷售時間'].apply(lambda x:datetime.strptime(x.replace('/','-'),'%Y-%m-%d'))data['交貨時間'] = data['交貨時間'].apply(lambda x:datetime.strptime(x.replace('/','-'),'%Y-%m-%d'))data['送貨時間'] = (data['交貨時間'] - data['銷售時間1']).apply(lambda x: x.days)# 連續型字段分成多區間,用pd.cutbin = [0,14,30,60,90,120]data['送貨天數'] = pd.cut(data['送貨時間'] ,bins=bin)# 按銷售時間維度進行統計df4 = data.groupby(['銷售時間','送貨天數'])['銷售時間'].count().unstack()# 3、用戶反饋情況df5 = data.groupby(['銷售時間','貨品用戶反饋'])['銷售時間'].count().unstack()# 4、數據按列拼接df = pd.concat([df1,df2,df3,df4,df5],axis=1)# 5、修改列名df.columns=['銷售訂單數','銷售件數','銷售金額','已交貨訂單數','30-60天交貨占比','90-120天交貨占比','60-90天交貨占比','拒收比例','質量合格比例','返修比例']# 6、將數值轉化成百分比df['60-90天交貨占比'] = df['60-90天交貨占比']/df['已交貨訂單數']df['90-120天交貨占比'] = df['90-120天交貨占比']/df['已交貨訂單數']df['30-60天交貨占比'] = df['30-60天交貨占比']/df['已交貨訂單數']df['拒收比例'] = df['拒收比例']/df['已交貨訂單數']df['質量合格比例'] = df['質量合格比例']/df['已交貨訂單數']df['返修比例'] = df['返修比例']/df['已交貨訂單數']# 7、將匯總和明細存入同一個EXCELwriter =pd.ExcelWriter(r'C:甥敳獲cindy407Desktopdaily_report.xlsx')df.to_excel(writer,sheet_name='匯總數據')data.to_excel(writer,sheet_name='明細數據',index=False)writer.save()3、設置定時郵件發送給相關人員
以上就是一個典型的日報表,源數據不變,報表格式不變,就可以通過這段腳本自動生成,生成的報表也可以實現推送,利用Python實現自動化發送郵件,使用發送郵件的協議SMTP,可以在郵箱的設置頁面中開啟SMTP。
用QQ郵箱來舉例,自動化發郵件的完整代碼如下:
import smtplibfrom email import encoders?from email.header import Header?from email.mime.text import MIMEText?from email.utils import parseaddr,formataddr?from email.mime.application import MIMEApplication?from email.mime.multipart import MIMElMultipart?from email.mime.base import MIMEBase?asender='XXX@qq.com'#發件人郵箱areceiver='XXX@qq.com'#收件人郵箱acc='XXX@qq.com'#抄送人郵箱asubject='2020年XX月XX日報表'#郵件主題from_addr='XXX@qq.com'#郵件主題password='XXXX'授權碼#郵件設置msg=MIMEMultipart()msg['Subject']=asubject?msg['to']=areceiver?msg['Cc']=acc?msg['from']='數據分析不是個事兒'#郵件正文body='您好,這是今天的數據,請查收'#添加郵件正文msg.attach(MIMEText(body,'plain','utf-8'))#添加附件x1sxpart=MIMEApplication(open(r"C:甥敳獲AdministratorDesktop今日數據情況.x1sx",'rb').read())xlsxpart.add header('Content-Disposition',? ? ? ? ? ? ? ? ? ? ’attachment',? ? ? ? ? ? ? ? ? ? filename='今日數據情況.x1sx’)msg.attach(xlsxpart)#設置郵箱服務器地址以及端口smtp_server='smtp.qq.com'server=smtplib.SIMTP(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操作excel,這是很基礎的用法,更高級的做法是用pandas替代excel進行處理再存入Excel。
以上,利用Python可以解決企業日常60%的報表自動化。那剩余的40%呢?
一方面,并不是所有報表都是需要或者適合做自動化的。像日報,周報,這種頻率性很強的東西,就需要自動化。而那些不同活動的效果數據,每次都不一樣,這樣的做自動化就沒有太大意義。
另一方面,一些復雜的報表,尤其是非數據類的報表用Python開發也不適合。比如圖1這種報表格式很復雜的,用代碼憑空構思難度很大;圖2一些用于打印貨單的憑證,需要涉及到數據填報和讀取;還有圖3這種能夠用于分析聯動鉆取的動態報表,開發量很大。
圖1
圖2
圖3
再者,如果說企業數據量涉及千萬上億條數據,python加載數據就會卡頓。數據量大的企業報表需求量也大,一年可能要做上千張報表,用Python開發基本就是招程序員堆人力,這樣的研發做著做著離職率也是極高的,整體的效率就會成問題。
隨著機器變得越來越智能,許多工作都變得越來越自動化,也會推動著我們尋求更加敏捷的工具。其實市面上有很成熟的報表工具、報表控件可以用來開發報表,一旦企業數據業務成熟到一定階段,都會上這一套系統,典型如FineReport。
相比較Python,不要寫代碼,報表設計有類似Excel的可視界面。相比較Excel,可直接對接數據庫讀取寫入,能操作大數據量,性能可隨數據量適配。
報表工具實現報表自動化
企業級的系統追求效率,要讓絕大多數沒有技術基礎的人能用,所以他們在開發工具的時候就會將很多功能零代碼封裝好。那FineReport是怎么實現報表自動化的呢?
簡述幾個報表自動化的功能點吧
- SQL可視界面連接并操作數據源
- 可視化報表模板設計器
- 自動化的數據分發與提醒
1、可視化SQL語句編輯界面連接操作數據源
操作數據源無論是連接數據庫還是Excel,Python每次都要寫一串代碼。FineReport操作數據庫有一個可視化SQL語句編輯面板,在與數據庫鏈接成功后能看到數據庫表和字段,然后拖拽數據表和字段到編輯頁面就可以生成SQL語句。其也能對接各種數據庫和數據倉庫。也能導入Excel數據集、Jason數據集等。
SQL做數據的人都懂,有些人習慣在SQL里處理一些數據,那就可以在取數環節處理一部分表和數據,就像一個內置的navicat。
2、可視化報表模板設計器,三種制作模式覆蓋所有報表類型
讀完庫取完數之后就是作報表。Excel做的是一個個單張報表,FineReport做的是一個個報表哦模板,也就是說一些固定化格式的報表就可以設計統一的報表模板樣式,一勞永逸,后續只要維護維護模板就好。
如圖,FineReport的主面板就是表格模板設計器,表格式、功能操作、函數等都類似Excel,不同點在于Excel是對單個數據操作,這里是對數據字段操作,將需要的數據字段拖到表格中,再配以各種可視化的屬性設置。
設計器針對有三種報表設計模式:普通報表、聚合報表、決策報表。
普通報表模式最貼近Excel,用來做大部分報表包括基礎報表、中國式復雜報表,運算上能多SHEET和跨SHEET計算,兼容EXCEL公式。聚合報表模式用來做一些不規則的報表,像運單表,一些保險單之類的,這種報表要頻繁的合并、拆分單元格,工作極其繁瑣。決策報表模式用來做可視化儀表板、駕駛艙、管理看板等,就像一個空白畫布,把各種可視化圖表拖拽到界面搭建儀表板。
拖拽制作復雜報表
固定報表的查詢,可導出
可視化報表
3、自動化的數據分發與提醒
FineReport是有一個平臺的,上面可以掛在報表,也有一些平臺功能,比如自動化里常用到的報表推送,就可以用它的定時調度與消息提醒功能,就定時生成報表結果,將每日/每月的生產報表推送給對應的人員。發送方式有郵件、短信、平臺、微信、釘釘等。根本不需要寫代碼。
報表自動化只是FineReport的一部分特性,SQL編輯、報表頁面設計、參數查詢設計、填報設置、多層鉆取等基本都是不要寫代碼。相比excel和Python開發,更快速和高效,配置好數據,1到2個小時就可開發出一張報表。
最后
最后,咱們數據從業者要想避免淪為“取數工具”、“表哥”、“表姐”,勢必是要將報表工作自動化的,這樣才能有更多的時間去思考和解決業務相關的問題,而不是陷入重復使用工具的手動操作。
對于制作數據報表這項工作而言,其最終價值也是賦能業務,所以需要從實際業務應用場景出發,去高效制作一套數據管理模版,并推動業務方大大利用。這需要一個數據平臺來承接,需要報表工具來承擔,也是企業利用數據道路上不可阻擋的趨勢。
總結
以上是生活随笔為你收集整理的python sqlserver 列名_报表自动化,三流用Excel,二流用Python,一流用它的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: resnet模型的图像分类结构图_Res
- 下一篇: 服务器 centos 系统漏洞快速修复简