Skip to main content

CP011如何对物联网站点信息扩展

阅读:-


在报表制作的过程中,我们常常需要透过对 2 张表的数据进行关联分析,也就是我们常常说的 merge 操作,经过 merge()操作,可以将 2 个数据表合并为 1 个数据表,而补充更多的数据结构,这就是最基础的制作报表的基础技能。

11 pandas 应用-物联网站点信息扩展

11.1 用例故事

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

1587377854086

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

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

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

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

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

1587377877350

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

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

  1. 左关联

  2. 右关联

  3. 内关联

    4.外关联

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

11.1.1 关联的主要实现方式

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

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

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

在三种方案中:

  1. pandas 方案主要面向的是初级程序员,因为相关的方案开发比较简单,也相对比较好理解。

2.dict{}方案主要面向的是中级程序员,因为这个方案在设计上比较艰困,而优势在于可以处理,超大规模的数据。

3.而 sql 方案则主要面向的是高级程序员,这是因为 dict{}是最重要的 python 内置函数,在精力有限的情况下,要全力专注于内置函数的学习。 而 SQL 则面向的是精力过剩的程序员,一般是高级程序员,因为语法特殊,需要一定的时间成本。

在本章基本要求,是利用 pandas 的方案来实现,扩展方案是利用 dict{}来实现。

11.1.2 需求介绍

在日常报表分析的时候,我们常常需要对报表的信息结构加以筛选和提取,形成新的信息结构。

在 5G 时代,物联网应用比较流行,一个物联网的网络中,一般是有多个工作站(work-station) 组成的, 每个 work-station 在定期上报自己的配置信息,其中有一个非常重要的 DN 字段,用于标示这个 work-station 的身份信息,和我们个人的身份证很类似。

关于 DN 大概的结构说明如下:

ERI-CMHB-WH,SubNetwork=1,ManagedElement=21111,GNBCUCPFunction=6111111,GNODEBPARAM=21111

这个结构中包含了我们日常需要应用的主要的数据。但是相关的数据中还缺乏 id 信息。大致的模型见下图所显示:

1587377989508

11-3 数据关联的模型

在这个模型中,我们需要引入一个新的 data set :workstation-ext, 其中包含了相关的 id 信息。

这两个data set之间,是通过 字段Dn 和basic-DN来关联的。

其中 DN 的结构是:

ERI-CMHB-WH,SubNetwork=1,ManagedElement=20000,GNBCUCPFunction=6111111,GNODEBPARAM=20000

而 basic DN 的信息结构是:

ERI-CMHB-WH,SubNetwork=1,ManagedElement=20000,EnbFunction=1

两个 data set 之间关联的条件是

信息结构 DN{key=sunbnetwork,key=managedElement}=basic DN{key=sunbnetwork,key=managedElement}

那么这两个记录就可以认为是同一个 workstation 的相关信息,此时,就可以实现赋值操作:

Workstation-info-id{key=workstation-id}=

Workstation-ext{key= workstation-id}

11.1.3 用例模型

在本用例中,相关的事件模型简要描述如下:

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

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

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

举例如下:[D:\PAE\workstation-info.csv, D:\PAE\workstation-ext.csv, D:\PAE\workstation-info-id.csv:]

2.应用程序读取输入文件 workstation-info.csv,转换为内存的一个 DF1,并增加一个字段,字段名称为:workstation-id。

读取输入文件workstation-ext.csv,转换为内存中的一个DF2。

3.应用程序将DF1,DF2进行关联处理

3.1 将DF1的字段 DN的信息结构进行字符串提取,ERI-CMHB-WH,SubNetwork=1,ManagedElement=20000,GNBCUCPFunction=6111111,GNODEBPARAM=20000, 生成一个新的字段key1= SubNetwork=1,ManagedElement=20000

3.2 将 DF2 的字段 basic DN 的信息结构进行字符串提取,ERI-CMHB-WH,SubNetwork=1,ManagedElement=20000,EnbFunction=1,生成一个新的字段 key2= SubNetwork=1,ManagedElement=20000

3.3 将DF1和DF2进行merge处理,左关联的条件为DF1[ key1]=DF2[key2], 将DF2 的workstation-id字段,拷贝到DF1的workstation-id字段。

备注: 如果没有关联上,DF1 的 workstation-id 字段为空。

3.4 将DF1,DF2,merge的结果存入的DF3.

4.应用程序将内存中的 data set,也就是新生成的 DF3, 写入输出结果 csv 文件的句柄, 相关文件决对路径来自输入数据。

举例:D:\PAE\workstation-info-id.csv

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

其中执行结果:0 成功

1 失败

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

举例:D:\PAE\workstation-info-id.csv

11.1.4 IPO 分析

11.1.4.1 输入数据分析(I)

1.输入参数为:

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

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

举例如下:[D:\PAE\workstation-info.csv, D:\PAE\workstation-ext.csv, D:\PAE\workstation-info-id.csv:]

两个输入文件分别是:

  1. workstation-info.csv:

1587378050126

  1. workstation-ext.csv

1587378065552

11.1.4.2 处理过程

详细见用例描述

11.1.4.3 输出数据

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

其中执行结果:0 成功 1 失败

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

举例:D:\PAE\workstation-info-id.csv

1587378095502

11.2 设计约束

1、 请使用 python3 以上版本。

2、 请使用 pandas 处理方案。

11.3 扩展实现 1

由于 dict{} 也是一种非常重要的内置结果,在本题中,请提供一种扩展实现。约束条件为:

workstation-info.csv 加载为 pandas DF 格式

workstation-ext.csv 加载为 dict{} 格式

将 DF1 和 dict{}2 进行 merge 操作

11.4 设计方案简介

11.4.1 Dict 方案

11.4.1.1 设计要点

使用 dict 方案拆分 dn 字段

11.4.1.2 调用关系

1587378226499

11.4.1.3 流穿越

1、 read_csv

1587378262116

2、 read_data

1587378275924

3、 合并后

1587378292810

11.4.2 Pandas 方案

11.4.2.1 设计要点

使用 pandas 方案拆分 dn 字段

11.4.2.2 调用关系

1587378321049

11.4.2.3 流穿越

1、读取 df

1587378346036

2、 分割 dn

1587378367351

3、为 df2 标题赋值

[df2.rename(columns = {i:df2.loc[0, i].split('=')[0]},inplace = True) for
 i  in df2   if df2.loc[0, i].find("=")>0 ]

1587378402580

4、 合并源数据及 dn 中所需的信息字段

1587378426913

5、 用相同方法处理,数据库

6、 合并两个 df

1587378451224

5、 输出结果

1587378462607

11.5 Dict 方案详解

11.5.1 1workstation-info 文件处理

11.5.1.1 代码一览

1587378493349

11.5.1.2 打开文件

with open("workstation-info.csv", 'r', encoding='gbk') as f:
    read_info = pd.read_csv(f, usecols=["sequence id", "Dn"], low_memory=False)

输出 df 如下:

1587378550191

11.5.1.3 Iterrows 迭代

for index, value_info in read_info.iterrows():

index 输出如下:

生成自然数,共 2000 多行

1587378594470

value_info 输出如下:

生成 series,为 csv 每一行数据

1587378609695

11.5.1.4 拆分 Dn

info_DN = {item.split('=')[0]: item.split('=')[1] for item in

           value_info["Dn"].split(",") if item.find('=') > 0}

输出字典如下:

1587378668821

11.5.1.5 对拆分后的字典进行字符串拼接

info_new = info_DN["SubNetwork"] + "-" + info_DN["ManagedElement"]

1587378712931

11.5.1.6 使用 loc 逐行插值

read_info.loc[index, “new”] = info_new

新 df 如下:

1587378739405

11.5.2 workstation-ext.csv 文件处理

11.5.2.1 代码一览

1587378774332

同理可得

11.5.2.2 最终 df 输出如下:

1587378793093

Head 为:

1587378807519

11.5.3 merger 合并两组数据

代码:

merge_data = read_ext.merge(read_info, how='left', left_on='new', right_on='new')

头部

1587378840230

Df 输出如下:

1587378909659

1.5.4 删除无用数据

代码:

del merge_data["new"]

del merge_data["Dn"]

df 与 head 如下:

1587378935109

11.5.5 写入本地

代码:

merge_data.to_csv("./生成文件.csv", encoding='gbk',index=True)

1587378970184

1.5.6 领域对象模型归纳

相关的 CSv 的处理的领域对象模型见图:

1587379012391

图 11-3 基于dict{}方案拆分DN字段

经过相关的整理以后,可以将另外一个 CSV 文件也进行同样的处理,

这里就获得了两个 DF, 那么接下来,就是常规的 merge() 操作。

相关的原理,见下图所显示:

1587379031666

图 11-4 merge的模型

1.5.7 关键知识点

站点信息扩展-dict{}方案1,对 DF 逐行迭代的方案DF.iterrows()
2,参与迭代的两个对象。index, value_info

重点讲解相关的知识点

11.5.8 对 DF 逐行迭代的方案

11.5.8.1 应用目的

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

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

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

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

11.5.8.2 语法说明

1587379115638

11.5.8.3 case 举例

1587379135846

源数据:

1587379149933

11.5.8.4 注意事项

需注意两个返回值的用法,根据实际场景选择使用

11.6 Pandas 方案详解

11.6.1 领域对象模型

1587379233185

图11-5 拆分DF

从上图可见,是主要的过程。

11.6.1.1 重命名处理

为 df2 标题赋值

[df2.rename(columns = {i:df2.loc[0, i].split('=')[0]},inplace = True) for
 i  in df2   if df2.loc[0, i].find("=")>0 ]

1587379307395

这里是基于列表生成式的机制来实现的。

column,是 rename 函数内置的一个配置,意涵是列名称。

1587379347109

columns:dict-like or functionAlternative to specifying axis (mapper, axis=1 is equivalent to columns=mapper).

1587379361387

11.6.2 关键知识点

站点信息扩展-pandas 方案1、DF 的重命名机制DF.rename()
2、列表生成式方案结合案例讲解机制

11.6.3 DF 的重命名机制

11.6.3.1 应用目的

根据实际需求,对 df 重署名,信息更改

11.6.3.2 语法说明

df2.rename(columns = {i:value})

11.6.3.3 case 举例

举例:

1587379454369

1587379504449

11.6.3.4 注意事项

添加 inplace 为真即修改源数据,否则不修改,需要另赋值句柄

11.6.4 列表生成式方案

11.6.4.1 应用目的

按照题意,设计流转换

11.6.4.2 语法说明

列表生成式

11.6.4.3 case 举例

 [df2.rename(columns = {i:df2.loc[0, i].split('=')[0]},inplace = True) for
  i  in df2   if df2.loc[0, i].find("=")>0 ]

1、Df2 数据结构如下:

1587379689650

for i in df2:

2、print(i)

1587379753125

3、print( df2.loc[0, i])

1587379802620

4、print(df2.loc[0, i].split(’=‘)[0])

1587379856925

11.6.4.4 注意事项

需自己设计方案,按照方案编写代码

11.7 总结

以上是关于两个表进行关联的应用。 在报表制作的过程中,我们常常需要透过对2张表的数据进行关联分析,也就是我们常常说的merge操作,经过merge()操作,可以将2个数据表合并为1个数据表,而补充更多的数据结构,这就是最基础的制作报表的基础技能。

智慧的你,就把这个资料好好总结一下吧。

分享到微博
Starter
MicroServ
Tutorials
Report
Blog