龙空技术网

一个模版让报表自动生成,领导:这才是数据分析人该干的事

聂永真数据可视化设计 131

前言:

而今朋友们对“python自定义报表系统”大体比较关注,兄弟们都需要学习一些“python自定义报表系统”的相关知识。那么小编同时在网上收集了一些关于“python自定义报表系统””的相关知识,希望姐妹们能喜欢,朋友们一起来了解一下吧!

  大部分的数据分析师都或多或少掉入这样的陷阱:每天大部分的工作都花在查数上,干着干着变成了“查数菇”。看上去帮老板或其他同事查数据是数据分析师天经地义的任务,怎么会成为陷阱呢?我来给你分析分析:

  业务部门需求多,查数据的任务量特别大。

  查数据的任务急。运营做了一天活动想第二天早上就看到活动的效果数据;产品新上线了一个新功能,想第一时间看看功能的使用数据;老板在做决策缺一项数做判断依据,要快速查询.....大部分的查数需求都是很急的,业务会一遍又一遍的催。

  手工查数据特别容易出错。无论多么简单的查询步骤,手工操作都可能导致失误,尤其是对于频繁操作又很急迫的查数据任务来说,错误发生的可能性就更大了。

  单纯的查数不能做很好的数据展示。因为任务琐碎且紧急,所以时间往往不允许我们静下心来做数据可视化展现,而是生硬的给出一些数字,这对一般的业务人员不是特别友好,他们可能不能给充分理解数字背后的业务含义,更不可能要求他们自己完成对数据的二次处理以求得出一些进一步的分析,数据应该起到的价值因此会大打折扣。

  查数据对分析师的成长无益。查数据的具体工作基本就是一些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可以将仪表版生成公共链接,以链接的形式分享给同事。对于一些定期要发布的模版,比如周报、月报之类,可以通过定时调度功能,设定定时任务,服务器会在指定的时间自动生成所需的仪表板,并且可以将生成的结果以邮件、短信、平台消息通知的方式通知对应的业务需求方,实现邮件自动化。

标签: #python自定义报表系统