Skip to main content

CP14如何用字典实现气象站资料扩展

阅读:-


两个表之间的数据关联是一个在报表制作过程中,一个永恒的命题,一般情况下这个操作没什么难度,但是有一种情况下,如果辅表的尺寸特别的大,那么在这种情况下,处理上难免会有效率方面的瓶颈,在这种情况下,

14 Pandas 应用-气象站资料扩展

14.1 用例故事

在前期的气象站的案例中,我们得到了气象站的低温站点清单,那么我们希望结合相关的气象站的资料库,完善相关的信息,相关的领域对象模型简介如下:

1587439607323

图 14-1 资料更新的用例故事

在本用例中,主要的考察点是

1.主 data set 和辅 data set 进行关联的时候,如果能够关联的上,则将字段“是否建档”设定为 0, 并追加相关的字段。

如果不能够关联上,则将字段“是否建档”设定为 1, 将扩展的三个字段设定为 null。

2.尝试辅 data set 用 dict{}来处理。因为 dict{} 是非常重要的数据结构,一定要反复的练习。

14.1.1 用例描述

下面将相关项目的用例进行说明。

1.用户输入期待处理的文件路径,输出结果文件的,相关的信息结构

[ 输入文件绝对路径 1,输入文件决对路径 2,输出文件绝对路径]

举例如下:[D:\PAE\低温站点清单.csv, D:\PAE\站点数据库.csv, D:\PAE\低温站点详单.csv:]

2.应用程序读取输入文件低温站点清单.csv,转换为内存的一个 DF1,并增加一个四个字段,详细说明如下:

新增字段 1:是否建档

新增字段 2: 站点名称

新增字段 3:所属地市

新增字段 4:所属区县

3、应用程序读取输入数据 站点数据库.csv,转换为内存中的一个 DF2。

4、将 DF1 和 DF2 进行 merge 关联,分为 2 个分支

4.1 如果关联成功,将字段“是否建档”,标记为“是”,将相关的三个字段“站点名称”“所属地市”“所属区县”从 DF2 更新到 DF1.

4.2 如果没有关联,将字段“是否建档”,标记为“否”,将相关的三个字段标记为 null

备注:也许可以讨论一种优化的实现方式,开始创建字段的时候,设置为[否,null,null,null], 如果关联成功,则设置为[是,value1,value2,value3]

5,将结果 DF 输出到文件,文件的绝对路径来自入参。

举例如下:D:\PAE\低温站点详单.csv

备注:此处的实现机制还需要确认。

6.应用程序返回程序执行响应 [ 执行结果,输出结果文件信息]

其中执行结果:0 成功

1 失败

输出结果文件信息:提供输出结果文件的决对路径,举例如下:

举例:D:\PAE\低温站点详单.csv

14.1.2 IPO 分析

14.1.2.1 输入数据分析

1.用户输入期待处理的文件路径,输出结果文件的,相关的信息结构

[ 输入文件绝对路径 1,输入文件决对路径 2,输出文件绝对路径]

举例如下:[D:\PAE\低温站点清单.csv, D:\PAE\站点数据库.csv, D:\PAE\低温站点详单.csv:]

输入文件的格式为:

低温站点清单数据样例如下: 1587440479139

站点数据库的数据样例如下:

1587440496528

14.1.2.2 处理过程

参见用例描述

14.1.2.3 输出数据

应用程序返回程序执行响应 [ 执行结果,输出结果文件信息]

其中执行结果:0 成功

1 失败

输出结果文件信息:提供输出结果文件的决对路径,举例如下:

举例:D:\PAE\低温站点详单.csv

1587440597904

1.2 用例约束

1、 请使用 python3 及以上版本

2、 请使用 pandas 完成文件读写,数据更新

14.3 扩展用例

在扩展用例部分,我们会使用 dict{}数据结构来记录站点数据库.csv,

1587440627192

大家会有疑问,如果都用 pandas 的 dataframe,编程会很简单,为什么要用 dick{} 来作为辅表呢? 这是因为,在现实的情况中,站点数据库通常会有非常大的尺寸,通常会有几十万条记录, 在尺寸非常大的情况下,会非常消耗内存,这样会导致程序运行的不稳定,从节省内存的角度,用 dict{}来缓存就非常方便。

1587440643837

图 14-2 dict{} 的hash 索引

而 dict{} 中,相关的 key 都是经过了 hash 化处理的,所以可以非常高效的进行访问。

1587440681174

图 14-3 基于hash()结构快速访问元素

14.3.1 用例描述

相关的扩展用例说明如下:

1.用户输入期待处理的文件路径,输出结果文件的,相关的信息结构

[ 输入文件绝对路径 1,输入文件决对路径 2,输出文件绝对路径]

举例如下:[D:\PAE\低温站点清单.csv, D:\PAE\站点数据库.csv, D:\PAE\低温站点详单.csv:]

2.应用程序读取输入文件低温站点清单.csv,转换为内存的一个 DF1,并增加一个四个字段,详细说明如下:

新增字段 1:是否建档

新增字段 2: 站点名称

新增字段 3:所属地市

新增字段 4:所属区县

3.应用程序读取输入数据 站点数据库.csv,转换为内存中的一个 dict2{}对象。

4.将 DF1 和 dict2{}进行 merge 关联,按照以下顺序

4.1 判断 DF1 的字段“归属网元标识”,是否存在于 dict{} 的字段“站点 id”中, 如果存在,则将将字段“是否建档”,标记为“是”,将相关的三个字段“站点名称”“所属地市”“所属区县”从 dict2{}更新到 DF1.

4.2 如果无法关联,将字段“是否建档”,标记为“否”,将相关的三个字段标记为 null

备注:也许可以讨论一种优化的实现方式,开始创建字段的时候,设置为[否,null,null,null], 如果关联成功,则设置为[是,value1,value2,value3]

5.将结果 DF 输出到文件,文件的绝对路径来自入参。

举例如下:D:\PAE\低温站点详单.csv

备注:此处的实现机制还需要确认。

6.应用程序返回程序执行响应 [ 执行结果,输出结果文件信息]

其中执行结果:0 成功

1 失败

输出结果文件信息:提供输出结果文件的决对路径,举例如下:

举例:D:\PAE\低温站点详单.csv

14.4 设计方案简介

14.4.1 Dict 方案

14.4.1.1 设计要点

1、归一化数据库输出 dict 格式

1587440747313

2、将低温站点清单与 dict 合并

1587440767049

14.4.1.2 流穿越

1、 数据库归一化 dict

1587440784110

2、 读取低温站点清单

1587440802028

3、进行合并

1587440818956

4、 输出文件

1587440844339

14.4.2 Pandas 方案

14.4.2.1 设计要点

1587440881627

14.4.2.2 流穿越

  1. 读取低温站点清单

1587440931208

2.读取站点数据库

1587440950745

3.合并数据

1587441003971

  1. 输出结果

1587441038601

14.5 Pandas 方案详解

14.5.1 领域对象模型

1587441158577

图 14-1 pandas 方案详解

从上图可见,因为 pandas 强大的内置函数,我们通过 df.merge() 方法就可以完成相关的关联操作。

这里唯一的问题是在于:

1.对于关联失败的对象记录,需要标记字段“是否建档”=否

完成相关的操作以后,我们就可以知道在相关的报表中,那些数据是无法匹配数据的。

14.6 Dict{} 方案

14.6.1 领域对象模型

14.6.1.1 站点库转换

1587441656922

图 14-3 站点库转换方案

从上图可见,经过转换以后,“站点数据库”转换为一个 dict{} 格式。

1587441707009

1.6.1.2 Dict{} 关联

1587441730034

图 14-4 Dict{}关联

从上图可见,主要的处理过程主要包括 3 部分:

1.将辅表 datasheet 装载到内存中为 dict{} 形式,并进行格式转换,key 为“归属网元标识”, value 为一个 list,list 中的元素为待扩展的字段信息,本 case 中有 3 个。

2.将主 datasheet 装载到 dataframe 中,增加需要扩展的字段,本 case 中增加 4 个,额外增加一个字段“是否建档”,用于记录相关的主 data sheet 中数据,是否和辅 data sheet 关联上。

3.存在性判断:判断 Dataframe(主 datasheet)的一条记录是否存在于 dict 中(辅 datasheet),有两个分支。

3.1 如果存在,则执行关联操作。

3.2 如果不存在,则将字段“是否建档”标记为否。

14.6.2 关键技能点

气象站资料扩展1,如何对 DF 进行迭代归纳主要的 DF 迭代机制 df.iterrows)()
2,DF 和 dict 关联机制存在性判断的必要性
3,使用 dict 为辅表优势分析其中的内存机制

14.6.3 如何对 DF 进行迭代

详见中篇叙述

例举如下:

14.6.3.1 iterrows

Pandas 的基础结构可以分为两种:数据框和序列。

数据框(DataFrame)是拥有轴标签的二维链表,换言之数据框是拥有标签的行和列组成的矩阵 - 列标签位列名,行标签为索引。Pandas 中的行和列是 Pandas 序列 - 拥有轴标签的一维链表。

iterrows() 是在数据框中的行进行迭代的一个生成器,它返回每行的索引及一个包含行本身的对象。

所以,当我们在需要遍历行数据的时候,就可以使用 iterrows()方法实现了。

源数据:

1587441831517 1587441846285

14.6.4 DF 和 dict 关联机制

14.6.4.1 应用目的

Data 处理阶段,多种数据格式整合,提取有用的 information

14.6.4.2 语法说明

无相关语法,模型需要自己根据实际应用场景进行提炼

14.6.4.3 Case 举例

1587441962313

Dict 格式:

1587441975688

Df 格式:

1587441990231

合并后输出结果:

1587442007186

14.6.3.6 注意事项

需根据实际情况选择,最佳容器进行数据 storage,对多种 storage 中的 data 进行提炼获得 information。

1.使用 df 迭代。

2.初始化匹配文件为 dict。

3.将关键信息转化为 dict 数据格式,key 与 value 对应关系。

  1. 通过 dict-hash,由 key 迅速定位到 value 实现匹配,节省内存占用。

14.6.5 使用 dict 为辅表方案

14.6.5.1 应用目的

  1. 当数据量过大使用纯 df 进行合并,占用内存过高。因为 df 是全部读取后再合并,高效但内存占用大,硬件要求较高。

2.使用 dict 加载大文件为匹配信息,过滤掉无用数据,及时删除,降低内存占用,且合并文件时通过 dict-hash 匹配合并逐行读取,更为轻量,有效降低,内存要求,降低硬件要求减少开发成本。

14.6.5.2 语法说明

需要根据实际情况自己设定字典格式,选择 key 与 value

1587442177168

14.6.5.3 Case 举例

Dict(zip(list,list))

14.6.5.4 注意事项

需要自己根据实际应用需求,设定数据格式

14.7 总结

在本案例中,因为涉及到海量数据的关联分析,所以我们要考虑应用 dict{} 这种特殊的数据结构,方便实现数据的检索和匹配的功能。

分享到微博
Starter
MicroServ
Tutorials
Report
Blog