一、关于data pipelines介绍
在人工智能或者大数据运用中,很多场景下需要通过构建data pipelines来以流式的方式处理数据,譬如在使用大数据集时,这样做可以避免过多占用机器的内存,另外一方面,在业务对话机器人领域,对话机器人在工作时可能需要处理源源不断流入的数据,这时也需要对数据进行流式处理。Rasa从 3.0版本开始使用了基于DAG的图的架构,体现了producer/consumer这样的数据流式处理的思想。
接下来通过使用Python 中generator构建data pipelines来分析如何进行数据的流式处理,首先来看一下这个CSV格式的样例数据集文件:
如果要分析这个文件去得到数据集中关于round为“a”的数据的总的值和平均值(譬如针对raisedAmt),可以考虑如下做法:
二、应用示例解析
通常可以使用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来过滤出你想要的数据:
在这里循环访问dictionary获取键值对,然后根据过滤条件取得相应的数据。需要注意的是执行这个generator表达式并不是立即进行循环访问数据,除非你使用一个for循环或者一个函数来向这个generator请求数据,譬如下面的代码使用函数sum()进行计算,这时就会开始循环访问数据了:
运行之后的输出结果如下: