1 应用编程 1:JSON 应用
1.1 用例介绍
1.1.1 打开一个 json 文件
它是由 results 为 key list 为 value,数据格式如下:
打印数据类型,为 dict
1.1.2 逐层取出数据并修改后写入
Results 打印为 list
对 list 下的 course 用键值对取出报错,因为它是 list 不能用字典的方法取出
我们使用 list 方法,拿 list[1],输出数据如下:
对 list 进行遍历,得到 dict,输格式如下:
查看数据类型:
继续向下取出,replies key 的 value,他是一个 list
遍历 list 继续拿值,for in 后得到 dict
得到的是嵌套的字典,我们用 key 进行查找值,第一个 key user 的值是一个字典,第二个 keydisplay 的值是一个字符串
我们定义一个函数,将上面所有的操作都封装起来,得到取最里层的数据,代码如下:
我们对最底层的数据进行一次修改,对 list 追加一个 str,数据如下:
将修改后的 json 写入本地
2 应用编程 2: 如何利用 dict{}来数据集联合
2.1 应用背景
在日常的应用报表分析处理中,常见的一种处理两个数据集之间的联合操作(merge),也可以称为的关联(join)操作,而作为 join 操作,相关的用例故事见下图:
图 5-1 : merge 操作的应用背景
从上图可见, 在现实世界中,将两个数据集联合成一个数据集的操作分析常见,主要是基于以下几点原因:
1、在现实世界中,存在很多不同的数据源,而从应用的角度,我们往往只希望分析(应用)单一数据源,不希望从多个不同数据源来提取需要的数据。
2、我们关注的数据对象,可能缺乏一些信息结构,而完善这些信息结构则需要引入新数据对象,通过两个数据对象联合的方式补充相关的信息结构。
所以,数据集之间的联合,是最常见的一种数据处理操作。下图是 python 的数据处理模块 pandas 的一个模型讲解,pandas 可以支持标准的数据集合并操作。
图 5-2 数据集之间的 combine 操作
上图是 pandas 支持的标准的数据集之间的联合操作,其中包括
左关联
右关联
内关联
4.外关联
1、2 都是有就关联没有就不管了。3、是关联之后把空的删除。4、是有没有全更新会出现空值。
2.1.1 关联的主要实现方式
表 5-1 关联(merge)的主要方式
分类 | 组件 | 优势 | 应用场景 |
---|---|---|---|
数据库 | Postgres-SQL | 支撑数据规模比较大 | 中型规模数据 |
python | pandas-DF | 应用比较简单 | 原型验证 |
python | dict{} | 节约内存,效率比较高,可以通过集群方式实现大规模数据处理。 | 大规模数据,微服务架构 |
从上面的表可见,作为一个 python 的程序员,有三种可以实现的方案。
其中基于 dict{}的方案,虽然实现起来并不是比较方便,但是在性能上有很大的优势。
图 5-3 dict{} 的 hash 索引
因为 dict{} 中的 key 已经进行了 hash 化的处理,可以非常快的访问到,所以就很适合在内存中进行高效的查询和关联操作。
所以这就是应用编程中很重要的一个技能。
2.1.2 应用问题描述
图 5-4 应用问题描述
从上图可见,以上是应用中的问题:
check_file 是应用需要的一个报表。但是缺少一些信息结构。
测试数据库中包含了这些信息结构。
表 check_file 和测试数据库之间存在关联关系,关联条件是:
Checkfile:归属网元标识 equals 测试数据库:小区 cgi
如果能够匹配,则将“测试数据库“的信息结构进行追加,形成新的结果文件。
相关的处理逻辑见下图:
图 5-5 应用问题
2.1.3 主要的挑战
在这里测试数据库往往是一个非常大的文件,也就是说,包含的记录非常的多。 如果选择 pandas 的方案处理,内存效率很低,所以我们选择 dict{} 来记录相关的测试数据库。
2.2 工参数据库 csv 文件 dict 化加载
2.2.1 使用 csv 组件 DictReader 模块读取 csv 文件
生成数据格式如下:
图 5-6 将 CSV 加载为字典格式
从上图可见,这里使用 csv.dictreader() 方法来实现了将 csv 文件转换为内存中的 dict{} 格式。
2.2.2 遍历 csv_reader
for row in csv_reader:
print(row),输出 OrderedDict 数据格式如下:
结合相关的数据,我们可以发现 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())
输出数据格式如下:
一行数据经过字典生成式以后,得到一个真实的 dict{}。
当迭代到下一行的时候,会生成一个新的 dict{};
2.2.4 根据 dict-hash 选取所需数据
初始化数据:
reports_5g_cell=[]
reports_5g_Nodeb=[]
filelist_value=[]
filelist_add=[]
filelist_key=[]
输出数据格式如下:
2.3 源核查 csv 数据格式处理
读取 csv 文件,新增 厂家,地市,归属网元名称,三个字段。
Read-csv 输出数据格式如下:
2.4 合并共参数据库
2.4.1 对源 csv 核查文件进行迭代
对源 csv 文件通过 pd.read_csv()方法读取得到 df=read_csv,对 df 进行迭代,代码如下:
输出数据格式如下:
2.4.2 通过 dict-hash 判断 NGI 字典是否存在
代码:if df_huawei_data[“归属网元标识”] in record.keys():
判断 源数据归属网元标识,是否在字典的 key 中。
df_huawei_data[“归属网元标识”],数据格式如下:
record.keys(),数据格式如下:
2.4.3 对相同 NGI 进行追加字段
Read-csv 输出数据格式如下:
record.keys(),数据格式如下:
record.Value,数据格式如下:
record -Value 中为 list=[归属网元标识,地市,厂家]
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’]}
工参数据库匹配结果,输出数据格式:
2.5 总结
在本案例的一个核心要点是,如何将 csv 转换为一个 Dict{} 的格式,方便后续转换为需要的 data set。
当我们使用函数 csv.dictreader() 可以很方便的获得内存中的一个对象 csv_reader, 这是内存中不可读对象,所以我们只能用迭代的方式来观察。
字典生成式 如果希望转换为字典,必须采用逐行的方式,将一行数据,转换为一个 dict{}。这里就要用到字典生成式的模式。 使用字典生成式取出结果: new_dict = dict((key, value) for key, value in row.items()) 输出 new-divt 数据格式如下:
按需合成 record{}
基于前面的基础,可以按需合成 record{}
这样就可以转入后续的数据关联处理环节。