8. 文件结构设计与模块化

知识基础

学习目标

  • 可以基于报告内容和形式组织报告自动化脚本的文档结构
  • 在编写不同报告的数据分析模块时产生技术积累
  • 对分析模块进行泛用话处理,以便于积累更多通用模块

在7.1的数据读取章节我们有出现一个把函数分类放置的处理:
把str2num放入tools模块,数据读取放入datapipeline模块,在此我们同样是要进行类似的工作,把不同的函数进行分类处理

1. 文件组织形式

一般来说自动化报告的组织形式如下:

格式:

  • 文件夹 : 加粗倾斜
  • 数据文件 : 倾斜
  • 执行模块 : 加粗
  • 未分类文件 : 无
  • report 自动化报告的工作目录

    • _init_.py

    • main.ipynb 文件的主执行和调试文件,显示内容和结果,及进行自定义

    • data 保存数据文件 Save data to be used or generated

      • dynamic_data.csv

      dynamic_data.csv是经常变化的,每篇报告都会使用不同的数据

      • static_data.csv

      static_data.csv是更新频率很低的,或者数据虽然会更新但是被所有报告所共用,比如存储了做预测时使用的拟合参数,文本关联矩阵,或者随着报告制作而变化的总体均值方差,用于纵向比较。而在多人协作时,此类数据放在共用数据库更佳。

    • image 存放生成的图片文件 Save image

    • report 存放生成的报告

    • template 存放报告生成需要的模板

      • template.html 生成HTML形式报告所用模板
      • template.tex 生成PDF报告需要的模板,这里我们使用python先生成Tex,然后Tex再生成PDF

      模板的后缀只影响用编辑器打开模板时的格式,不影响Jinja2生成模板,因为这些内容都是使用python来进行的文件读取

    • tools.py 保存工具型函数,可多次复用并且功能单一

    • datapipeline.py 数据读取和预处理,可从中直接取出清洗后数据

    • ImageFactory.py 图片工具包,可以把设置完毕的图片模板保存在此处,方便多次使用

    • models.py 定义文档结构

    • items.py 定义分析时会使用的数据结构

    • analysis.py 存放成熟的分析方法,多是从main.ipynb中提取出来

    • configs.py 设置报告的参数,比如作者,日期,数据源等等,每次使用时可以仅仅修改设置便生成不同报告

    • readme.txt 报告的说明文件

    类似于此处的文档结构说明可加入之后的readme文件中,具体说明文件目录中各文件功能,还可以更加详细地说明内含方法

    • requirements.txt 关于报告生成所用python环境中所用包及其版本的规定,为之后使用环境配置方便,直接pip install -r requirements.txt安装

2. 报告产生流程

作报告,原材料就是数据,数据分析就是一个个加工步骤,且产出的报告或者说结论就是最终的产品,接下来要介绍数据是怎么在这个框架中变成产品的

  • 数据获取后存入data,数据获取方式业务之间各有不同,再次不做说明,爬虫和数据库的教程网上应该有做好的可用

  • datapipeline.py中的模块可以对data中的数据自动进行数据清洗工作,可能会需要configs.py中的设置

  • models.py中已经定义好的数据结构可以对从datapipeline.py导入的清洗好的数据进行进一步处理

  • main.ipynb

    configs.py导入设置

    models.py导入文档结构和数据结构

    ImageFactory.py导入image模板

    datapipeline.py导入处理好的数据

    tools.py导入数据分析工具

    分析数据

    生成图片

    添加说明和人工分析

    保存到document类

    使用template中的模板渲染document生成report

  • 当main.ipynb的方法稳定成熟后,可以模块化后提取出所使用的数据结构放入items.py,提取出所使用的分析方法放入analysis.py,把半自动化报告中的自定义部分依旧留在main.ipynb中

3. 工作流程

  1. 把需要使用的数据文件放入data文件夹中,
    数据分两种,一种是生成报告使用的支持数据,更新变动很慢,但每次作报告都需要使用,比如行业均值方差啊,拟合结果的参数啊,这种建议建立数据库使用sql管理;一种是和报告一一对应的,这种放在data文件夹中很合适。
  2. 对configs.py进行设置
  3. 执行main.py在ipynb中显示图片和文字结果,若是半自动则进行人工文字补充
  4. 执行main.py中导出report.html

4. 添加注释

依旧使用7.1数据读取章节中的例子,当时是很粗略地说“把str2num放入tools模块,数据读取放入datapipeline模块”,但是具体操作的时候仅仅是复制粘贴是不够的,为了方便复用和泛用,还需要加下注释。

def str2num(string):
    """
    str2num(string)
    
    Get number for a string.
    
    Parameters
    ----------
    string : a string with the format like '$2.1', '$1, 333' or '&4,3'
    
    Returns
    -------
    out : float
    
    Examples
    --------
    >>> str2num('$2.3')
    2.3
    """
    if not isinstance(string, str):
        string = str(string)
    string = string.replace(',','')
    regular_expression = '\d+\.?\d*'
    pattern = re.compile(regular_expression)
    match = pattern.search(string)
    if match:
        return float(match.group())
    else:
        return float('nan')

可以使用str2num查看效果

?str2num
Object `str2num` not found.

5. 数据读取独立

一般的数据读取步骤,可以简单地按照数据读取顺序放入文件datapipeline.py文件,之后使用时可以直接从datapipeline导入:

from datapipeline import data

而数据的预处理过程同样在datapipeline.py中完成

import pandas as pd
converters = {'Price':str2num,
              'Rank':str2num,
              'Rating':str2num,
              'Sales':str2num,
              'Revenue':str2num,
              'Reviews':str2num
             }
try:
    data = pd.read_csv('./data/data.csv', converters=converters, header=7, index_col=0)
except BaseException as e:
    print(e)

而在Example_1中我们把数据的读取放在了分析模块中,虽然数据已经是处理好的pkl数据,也可以这么直接读取,但是进行解耦操作,单独出来更好。

6. 功能单一的方法(func)加入Class中

像是2. 报告结构规定中print_structure这种打印document结构的方法是依赖于document使用的,因此不适合放入tools.py,放入Document中和实例绑定更合适。
还有6. 报告内容生成中生成html的方法,同样放入Document中

进行修改后的结果请参照Example_3


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容