Python generator构建数据pipelines解析

一、关于data pipelines介绍

       在人工智能或者大数据运用中,很多场景下需要通过构建data pipelines来以流式的方式处理数据,譬如在使用大数据集时,这样做可以避免过多占用机器的内存,另外一方面,在业务对话机器人领域,对话机器人在工作时可能需要处理源源不断流入的数据,这时也需要对数据进行流式处理。Rasa从 3.0版本开始使用了基于DAG的图的架构,体现了producer/consumer这样的数据流式处理的思想。

接下来通过使用Python 中generator构建data pipelines来分析如何进行数据的流式处理,首先来看一下这个CSV格式的样例数据集文件:

如果要分析这个文件去得到数据集中关于round为“a”的数据的总的值和平均值(譬如针对raisedAmt),可以考虑如下做法:

  1. 读出文件中的每一行
  2. 把每一行切分得到一个值的list
  3. 提取每个column的名称
  4. 使用column名称和值的list构建一个dictionary
  5. 从dictionary中过滤出你感兴趣的round的数据
  6. 根据过滤出来的round数据计算总的值和平均值

二、应用示例解析

通常可以使用pandas包来完成上述做法,但你也可以仅使用一些generators来完成这样的功能。首先使用一个generator表达式来从这个CSV文件中读取每一行:

接下来使用另外一个generator表达式配合上一步来把每一行的值进行切分并保存到一个list中:

这里创建了一个generator “list_line”,它用于从第1个generator “lines”中循环取值,这是一种使用generator构建pipeline的通常做法。

接下来是从数据集文件中提取column名称,一般来说column名称会放在文件的第一行,所以调用next()就可以获取:

输出结果如下:

总而言之,首先创建一个generator “lines”通过yield机制来逐行读取文件中的内容,其次在另外一个generator “list_line”的内部来迭代访问generator “lines”中的值,从而把文件中的每一行的内容写入一个值的list中。

为了对数据执行过滤操作,根据从文件中提取的column名称构建一个dictionary:

这个generator循环访问list_line产出的数据,然后使用函数zip()和dict()来构建dictionary。接下来使用第4个generator来过滤出你想要的数据:

Python generator构建数据pipelines解析_第1张图片

在这里循环访问dictionary获取键值对,然后根据过滤条件取得相应的数据。需要注意的是执行这个generator表达式并不是立即进行循环访问数据,除非你使用一个for循环或者一个函数来向这个generator请求数据,譬如下面的代码使用函数sum()进行计算,这时就会开始循环访问数据了:

运行之后的输出结果如下:

你可能感兴趣的:(Python,python)