一個模版讓報表自動生成,領導:這才是數據分析人該乾的事

  大部分的數據分析師都或多或少掉入這樣的陷阱:每天大部分的工作都花在查數上,幹著幹著變成了“查數菇”。看上去幫老闆或其他同事查數據是數據分析師天經地義的任務,怎麼會成為陷阱呢?我來給你分析分析:

  業務部門需求多,查數據的任務量特別大。

  查數據的任務急。運營做了一天活動想第二天早上就看到活動的效果數據;產品新上線了一個新功能,想第一時間看看功能的使用數據;老闆在做決策缺一項數做判斷依據,要快速查詢.....大部分的查數需求都是很急的,業務會一遍又一遍的催。

  手工查數據特別容易出錯。無論多麼簡單的查詢步驟,手工操作都可能導致失誤,尤其是對於頻繁操作又很急迫的查數據任務來說,錯誤發生的可能性就更大了。

  單純的查數不能做很好的數據展示。因為任務瑣碎且緊急,所以時間往往不允許我們靜下心來做數據可視化展現,而是生硬的給出一些數字,這對一般的業務人員不是特別友好,他們可能不能給充分理解數字背後的業務含義,更不可能要求他們自己完成對數據的二次處理以求得出一些進一步的分析,數據應該起到的價值因此會大打折扣。

  查數據對分析師的成長無益。查數據的具體工作基本就是一些SQL和Excel的機械操作,數據分析師在其中即不能提升技能,也不會增長分析經驗,長久來看,多做無益。

  所以,查數據就是這樣一個費時耗精力、低價值、容易錯、零成長的任務,而且因為它的緊急性,你可能很容易把它放在任務清單的最前面去執行,直到你把一大堆查數據任務都完成之後,已經疲憊不堪的你會發現時間已經很晚,而那些真正有價值的分析任務你只能留到明天,可到了明天又會出現很多新的查數據任務,就這樣週而復始,惡性循環!

  有什麼辦法擺脫這樣的惡性循環嗎?答案是:不做!可不做那些業務人員怎麼辦,他們還急著要數據啊,答案是:不自己做!那誰來做呢?答案是:交給自動化報表來做。

  Excel半自動化報表

  簡單而機械的任務不適合人工手動完成但卻很適合機器自動完成,即便你目前除了Excel外一無所有,至少也可以通過搭建半自動Excel模板的方式將所有的查數據需求整合成一張數據報表,這種報表僅需要通過複製粘貼的方式將數據源輸入模板,之後的數據處理和展現都能自動完成。

  這裡我以一個人的健身數據為例,具體操作如下:

  梳理出平時經常要查詢的數據需求。


一個模版讓報表自動生成,領導:這才是數據分析人該乾的事

  將蒐集來的數據源整理成一維表,一般從系統導出或SQL查詢的數據直接就是一維表,所以複製過來就行。有幾個數據源就建幾個sheet。(當然這個案例比較特殊,是需要手動記錄的)


一個模版讓報表自動生成,領導:這才是數據分析人該乾的事

  新建一個sheet起名“展現”,在裡面建立一個時間篩選器

一個模版讓報表自動生成,領導:這才是數據分析人該乾的事

  在新建一個sheet起名“後臺”,將剛才時間篩選器篩選的時間引用過來。

一個模版讓報表自動生成,領導:這才是數據分析人該乾的事

  利用sumif函數,將不同數據源的數據合併在一起,通過時間篩選器引用過來的日期控制顯示的日期行。

一個模版讓報表自動生成,領導:這才是數據分析人該乾的事

  根據這些合併好的數據,創建圖表放入“展現”裡,再美化一下,做成一個數據展現看板。

一個模版讓報表自動生成,領導:這才是數據分析人該乾的事

  python自動化報表

  當然,上述的解決方案還不夠完美,因為畢竟還得每天覆制粘貼一遍,只能算是半自動化報表,還有一方法就是用python 代碼來操控excel進行相似性很高或者重複性、繁瑣的工作。

  具體的過程需要用到3個工具包:

  1.xlrd:從Excel電子表格中提取數據

  2.xlwt:將數據寫入Excel電子表格

  3.xlutils:提供一組處理Excel文件的實用程序

  python操作excel的相關工具包可以具體到操作指定單元格的填充樣式、數值類型、數值大小等,但是這個過程需要一定pandas數據處理功底。具體操作步驟如下:

  1.從指定文件路徑讀取excel表格,進行一定操作,然後保存到另一個excel文件:result.xlsx

  import xlwt

  import xlrd

  from xlutils.copy import copy

  import pandas as pd

  from pandas import DataFrame,Series

  import os

  os.chdir('./')

  # 從指定文件路徑讀取excel表格

  df = pd.read_excel('D:/mypaper/data/data.xlsx')

  # 查看df內容

一個模版讓報表自動生成,領導:這才是數據分析人該乾的事

  # 根據age算出出生年份,增加一列

  import datetime

  import os

  year = datetime.datetime.now().year#獲取當前系統時間對應的年份

  df['birth'] = year-df['age']

  df.to_excel('result.xlsx')#保存到當前工作目錄,可以用os.getcwd()查看

  #查看下此時df的內容,可以看到已經生成了birth這一列

一個模版讓報表自動生成,領導:這才是數據分析人該乾的事

  2.單元格操作

  # 定義方法:讀取指定目錄下Excel文件某個sheet單元格的值

  def excel_read(file_path,table,x,y):

  data = xlrd.open_workbook(file_path)

  table = data.sheet_by_name(table)

  return table.cell(y,x).value

  # 定義方法:單元格值及樣式

  write_obj_list = []

  def concat_obj(cols,rows,value):

  write_obj_list.append({'cols':cols,'rows':rows,'value':value,\

  'style':xlwt.easyxf('font: name 宋體,height 280;alignment: horiz centre')})

  # 定義方法:合併單元格

  def merge_unit(srows,erows,scols,ecols,value):

  write_obj_list.append({'id':'merge','srows':srows,'erows':erows,'scols':scols,\

  'ecols':ecols,'value':value,'style':xlwt.easyxf('font: name 宋體,height 280;alignment: horiz centre')})

  # 定義方法:更新excel

  excel_update(file_path,write_obj_list,new_path):

  old_excel = xlrd.open_workbook(file_path, formatting_info=True)

  #管道作用

  new_excel = copy(old_excel)

  '''

  通過get_sheet()獲取的sheet有write()方法

  '''

  sheet1 = new_excel.get_sheet(0)

  '''

  1代表是修改第幾個工作表裡,從0開始算是第一個。此處修改第一個工作表

  '''

  for item in write_obj_list:

  if 'id' not in item.keys():

  if 'style' in item.keys():

  sheet1.write(item['rows'], item['cols'], item['value'],item['style'])

  else:

  sheet1.write(item['rows'], item['cols'], item['value'])

  else:

  if 'style' in item.keys():

  sheet1.write_merge(item['srows'],item['erows'],item['scols'], item['ecols'], item['value'],item['style'])

  else:

  sheet1.write_merge(item['srows'],item['erows'],item['scols'], item['ecols'], item['value'])

  '''

  如果報錯 dict_items has no attributes sort

  把syle源碼中--alist.sort() 修改為----> sorted(alist)

  一共修改2次

  '''

  new_excel.save(file_path)

  #參數詳解

  # srows:合併的起始行數

  # erows:合併的結束行數

  # scols:合併的起始列數

  # ecols:合併的結束列數

  # value:合併單元格後的填充值

  # style:合併後填充風格:

  # font: name 宋體

  # height 280;

  # alignment: horiz centre

  # ... 與excel操作基本保持一致

  注意:該方法僅僅是將需要直行的動作保存到一個list中,真正的動作還未執行,執行動作是發生在excel_update方法中

  最終調用excel_update方法,傳入每個單元格需要進行的操作和填充值的write_obj_list以及文件保存路徑file_path,就可以在當前工作目錄下生成想要的Excel結果文件。

  BI數據自動化解決方案

  用python實現自動化的確比excel省力多了,但是對於代碼能不好的人來說,想要快速上手python並且實現這樣的自動化報表沒那麼容易。因此,我建議採用BI等工具實現真正的數據自動化,一能解決大數據量的問題,二能解決報表模版製作的問題

  市場上BI工具比較多,個人比較熟悉的是FineBI,國內的一款BI工具,個人版免費,企業版收費,不過對企業來說,買軟件花的錢和浪費掉的人工成本相比還是划算的)。

  相對於Excel,FineBI的好處是:

  可以直連數倉,免去了人工調取的麻煩。

  支持大數據量處理

  數據分析流程簡單,不用寫代碼,拖拖拽拽就能生成可視化圖表

  模板完成後能夠導出成pdf,或者生成demo鏈接直接發給同事和領導,他們每天打開網頁就能自己看的數據。

  FineBI具備很強的交互性,製作完成的模版可根據自己的需求進行篩選、排序、數據下鑽等功能。

  下面從數據源鏈接、數據可視化和模版分享三個方面具體說說

  數據鏈接

  就上文章開頭說的,業務要各種各樣的數據表,數據分析師就要到各種系統中去取數,有些公司的數據管理混亂,數據分散在各個業務系統總,此時取數將是一個十分浩大的工程,用FineBI就可以很好的解決取數問題,它可以直接和多種數據庫鏈接,也可以導入excel數據集。

  另外,FineBI支持兩種模式獲取數據,可以將數據庫的數據抽取到引擎存儲,離線使用,也可以實時獲取數據庫,數據表中的數據實時更新。

一個模版讓報表自動生成,領導:這才是數據分析人該乾的事

  數據可視化

  FineBI製作數據可視化圖表的過程十分簡單,不用寫代碼,把需要分析字段拖拽到橫縱座標軸,圖表就可以自動生成,就相當於一個更加高級的Excel數據透視表。

  創建圖表組件,把緯度和指標拖拽到橫縱、縱軸,系統會根據選擇的緯度和指標數量自動推薦圖表,而且,FineBI圖表類型很豐富,支持柱形圖,折線圖,餅圖,雷達圖,散點圖,圓環圖,條形圖,儀表盤、堆積圖、面積圖、組合圖,氣泡圖、地圖、GIS地圖、熱力地圖、流向地圖等多種圖表類型和圖表:

一個模版讓報表自動生成,領導:這才是數據分析人該乾的事

一個模版讓報表自動生成,領導:這才是數據分析人該乾的事

  FineBI的儀表板採用的是畫布式的界面,可以隨意添加組件,拖拽自由佈局,靈活程度高

  下面是用FineBI製作的儀表板,數據可以實時刷新,不用重複做表:

一個模版讓報表自動生成,領導:這才是數據分析人該乾的事

  模版分享

  完成了模版製作之後,我們就要把模版發送給業務需求方查看,FineBI可以將儀表版生成公共鏈接,以鏈接的形式分享給同事。對於一些定期要發佈的模版,比如週報、月報之類,可以通過定時調度功能,設定定時任務,服務器會在指定的時間自動生成所需的儀表板,並且可以將生成的結果以郵件、短信、平臺消息通知的方式通知對應的業務需求方,實現郵件自動化。

一個模版讓報表自動生成,領導:這才是數據分析人該乾的事

一個模版讓報表自動生成,領導:這才是數據分析人該乾的事


分享到:


相關文章: