Skip to main content

Pywhio

官方 @ PywhiO. Python大数据, AI技术, 微服务, DRF+REACT前后端分离实践.

2 min read · March 29th 2020 (originally published at pywhio)

Python-Dict应用编程指南-下篇

阅读:-


1 应用编程 1:JSON 应用

1.1 用例介绍

1.1.1 打开一个 json 文件

它是由 results 为 key list 为 value,数据格式如下:

1585401044197

打印数据类型,为 dict

1585401057397

1.1.2 逐层取出数据并修改后写入

Results 打印为 list

1585401201703

1585401221361

对 list 下的 course 用键值对取出报错,因为它是 list 不能用字典的方法取出

1585401236349

我们使用 list 方法,拿 list[1],输出数据如下:

1585401250848

对 list 进行遍历,得到 dict,输格式如下:

1585401267538

查看数据类型:

1585401283444

继续向下取出,replies key 的 value,他是一个 list

1585401302692

遍历 list 继续拿值,for in 后得到 dict

1585401338141

得到的是嵌套的字典,我们用 key 进行查找值,第一个 key user 的值是一个字典,第二个 keydisplay 的值是一个字符串

1585401368120

我们定义一个函数,将上面所有的操作都封装起来,得到取最里层的数据,代码如下:

1585401382970

我们对最底层的数据进行一次修改,对 list 追加一个 str,数据如下:

1585401396111

将修改后的 json 写入本地

1585401408099

2 应用编程 2: 如何利用 dict{}来数据集联合

2.1 应用背景

在日常的应用报表分析处理中,常见的一种处理两个数据集之间的联合操作(merge),也可以称为的关联(join)操作,而作为 join 操作,相关的用例故事见下图:

1585401442485

图 5-1 : merge 操作的应用背景

从上图可见, 在现实世界中,将两个数据集联合成一个数据集的操作分析常见,主要是基于以下几点原因:

1、在现实世界中,存在很多不同的数据源,而从应用的角度,我们往往只希望分析(应用)单一数据源,不希望从多个不同数据源来提取需要的数据。

2、我们关注的数据对象,可能缺乏一些信息结构,而完善这些信息结构则需要引入新数据对象,通过两个数据对象联合的方式补充相关的信息结构。

所以,数据集之间的联合,是最常见的一种数据处理操作。下图是 python 的数据处理模块 pandas 的一个模型讲解,pandas 可以支持标准的数据集合并操作。

1585401484532

图 5-2 数据集之间的 combine 操作

上图是 pandas 支持的标准的数据集之间的联合操作,其中包括

  1. 左关联

  2. 右关联

  3. 内关联

    4.外关联

1、2 都是有就关联没有就不管了。3、是关联之后把空的删除。4、是有没有全更新会出现空值。

2.1.1 关联的主要实现方式

表 5-1 关联(merge)的主要方式

分类组件优势应用场景
数据库Postgres-SQL支撑数据规模比较大中型规模数据
pythonpandas-DF应用比较简单原型验证
pythondict{}节约内存,效率比较高,可以通过集群方式实现大规模数据处理。大规模数据,微服务架构

从上面的表可见,作为一个 python 的程序员,有三种可以实现的方案。

其中基于 dict{}的方案,虽然实现起来并不是比较方便,但是在性能上有很大的优势。

1585401538426

图 5-3 dict{} 的 hash 索引

因为 dict{} 中的 key 已经进行了 hash 化的处理,可以非常快的访问到,所以就很适合在内存中进行高效的查询和关联操作。

所以这就是应用编程中很重要的一个技能。

2.1.2 应用问题描述

1585401563719

图 5-4 应用问题描述

从上图可见,以上是应用中的问题:

  1. check_file 是应用需要的一个报表。但是缺少一些信息结构。

  2. 测试数据库中包含了这些信息结构。

  3. 表 check_file 和测试数据库之间存在关联关系,关联条件是:

Checkfile:归属网元标识 equals 测试数据库:小区 cgi

如果能够匹配,则将“测试数据库“的信息结构进行追加,形成新的结果文件。

相关的处理逻辑见下图:

1585401607413

图 5-5 应用问题

2.1.3 主要的挑战

在这里测试数据库往往是一个非常大的文件,也就是说,包含的记录非常的多。 如果选择 pandas 的方案处理,内存效率很低,所以我们选择 dict{} 来记录相关的测试数据库。

2.2 工参数据库 csv 文件 dict 化加载

2.2.1 使用 csv 组件 DictReader 模块读取 csv 文件

1585401748774

生成数据格式如下:

1585401766805

图 5-6 将 CSV 加载为字典格式

从上图可见,这里使用 csv.dictreader() 方法来实现了将 csv 文件转换为内存中的 dict{} 格式。

1585401778500

2.2.2 遍历 csv_reader

for row in csv_reader:

print(row),输出 OrderedDict 数据格式如下:

1585401808867

结合相关的数据,我们可以发现 CSV 的数据部分,每一行都转换为一个 list[], 而 list[] 的每个元素都是一个字典, 其中:

Key 来自表头,value 来自于当前对应的行。大致的格式为

Ordered dict[(‘key1’, ‘value1’), (‘key2’, ‘value2’), …..( ‘keyn’, ‘valuen’)]

其中这里的 value 是从 csv 的数据行中传入,可能存在空数据的情况。

2.2.3 应用字典生成式,转化为 dict

new_dict = dict((key, value) for key, value in row.items())

输出数据格式如下:

1585401827221

一行数据经过字典生成式以后,得到一个真实的 dict{}。

当迭代到下一行的时候,会生成一个新的 dict{};

2.2.4 根据 dict-hash 选取所需数据

初始化数据:

reports_5g_cell=[]

reports_5g_Nodeb=[]

filelist_value=[]

filelist_add=[]

filelist_key=[]

1585401856691

输出数据格式如下:

1585401868281

1585401881280

2.3 源核查 csv 数据格式处理

读取 csv 文件,新增 厂家,地市,归属网元名称,三个字段。

1585401894455

Read-csv 输出数据格式如下:

1585401909615

2.4 合并共参数据库

2.4.1 对源 csv 核查文件进行迭代

对源 csv 文件通过 pd.read_csv()方法读取得到 df=read_csv,对 df 进行迭代,代码如下:

1585401933552

输出数据格式如下:

1585401954787

2.4.2 通过 dict-hash 判断 NGI 字典是否存在

代码:if df_huawei_data[“归属网元标识”] in record.keys():

判断 源数据归属网元标识,是否在字典的 key 中。

df_huawei_data[“归属网元标识”],数据格式如下:

1585401980581

record.keys(),数据格式如下:

1585401992557

2.4.3 对相同 NGI 进行追加字段

1585402014544

Read-csv 输出数据格式如下:

1585402028389

record.keys(),数据格式如下:

1585402049531

record.Value,数据格式如下:

1585402066385

record -Value 中为 list=[归属网元标识,地市,厂家] 1585402106573

record 数据格式如下:

record={”: [”, ”, ”], ‘460-00-111111-1’: [‘小区 A’, ‘武汉’, ‘厂家 1’], ‘460-00-222222-1’: [‘小区 B’, ‘武汉’, ‘厂家 1’], ‘460-00-333333-4’: [‘小区 C’, ‘武汉’, ‘厂家 1’], ‘460-00-444444-1’: [‘小区 D’, ‘武汉’, ‘厂家 1’], ‘460-00-555555-3’: [‘小区 E’, ‘武汉’, ‘厂家 1’]}

工参数据库匹配结果,输出数据格式:

1585402096091

2.5 总结

1585402265254

在本案例的一个核心要点是,如何将 csv 转换为一个 Dict{} 的格式,方便后续转换为需要的 data set。

  1. 当我们使用函数 csv.dictreader() 可以很方便的获得内存中的一个对象 csv_reader, 这是内存中不可读对象,所以我们只能用迭代的方式来观察。

  2. 字典生成式 如果希望转换为字典,必须采用逐行的方式,将一行数据,转换为一个 dict{}。这里就要用到字典生成式的模式。 使用字典生成式取出结果: new_dict = dict((key, value) for key, value in row.items()) 输出 new-divt 数据格式如下: 1585402283103 备注:迭代一次,生成一个 dict{}

  3. 按需合成 record{}

    1585402308558

基于前面的基础,可以按需合成 record{}

这样就可以转入后续的数据关联处理环节。

1585402321726

分享到微博

Previous

Python-Dict应用编程指南-上篇
Starter
MicroServ
Tutorials
Report
Blog