首页 > 编程 > Python > 正文

Python中的探索性数据分析(功能式)

2020-02-16 11:16:06
字体:
来源:转载
供稿:网友

这里有一些技巧来处理日志文件提取。假设我们正在查看一些Enterprise Splunk提取。我们可以用Splunk来探索数据。或者我们可以得到一个简单的提取并在Python中摆弄这些数据。

在Python中运行不同的实验似乎比试图在Splunk中进行这种探索性的操作更有效。主要是因为我们可以无所限制地对数据做任何事。我们可以在一个地方创建非常复杂的统计模型。

理论上,我们可以在Splunk中做很多的探索。它有各种报告和分析功能。

但是...

使用Splunk需要假设我们知道我们正在寻找什么。在很多情况下,我们不知道我们在寻找什么:我们正在探索。可能会有一些迹象表明,一些RESTful API处理速度很慢,但还不止于此。我们如何继续?

第一步是获取CSV格式的原始数据。怎么办?

读取原始数据

我们将首先用一些附加函数来包装一个CSV.DictReader对象。

面向对象的纯粹主义者会反对这个策略。 “为什么不扩展DictReader?”他们问。我没有一个很好的答案。我倾向于函数式编程和组件的正交性。对于一个纯粹的面向对象的方法,我们不得不使用更复杂的混合来实现这一点。

我们处理日志的一般框架是这样的。

with open("somefile.csv") as source:rdr = csv.DictReader(source)

这使我们可以读取CSV格式的Splunk提取物。我们可以迭代阅读器中的行。这是诀窍#1。这不是 非常 棘手,但我喜欢它。

with open("somefile.csv") as source:rdr = csv.DictReader(source)for row in rdr:print( "{host} {ResponseTime} {source} {Service}".format_map(row) )

我们可以 - 在一定程度上 - 以有用的格式报告原始数据。如果我们想粉饰一下输出,我们可以改变格式字符串。那就可能是“{主机:30s} {回复时间:8s} {来源:s}”或类似的东西。

过滤

常见的情况是我们提取了太多,但其实只需要看一个子集。我们可以更改Splunk过滤器,但是,在完成我们的探索之前,过量使用过滤器令人讨厌。在Python中过滤要容易得多。一旦我们了解到需要什么,就可以在Splunk中完成。

with open("somefile.csv") as source:rdr = csv.DictReader(source)rdr_perf_log = (row for row in rdr if row['source'] == 'perf_log')for row in rdr_perf_log:print( "{host} {ResponseTime} {Service}".format_map(row) )

我们已经加入了一个生成器表达式来过滤源行,能够处理一个有意义的子集。

投影

在某些情况下,我们会添加额外的源数据列,这些列我们并不想使用。所以将通过对每一行进行投影来消除这些数据。

原则上,Splunk从不产生空列。但是,RESTful API日志可能会导致数据集中包含大量列标题,这些列标题是基于请求URI一部分的代理键。这些列将包含来自使用该代理键的一个请求的一行数据。对于其他行,在这一列中没有任何用处。所以要删除这些空列。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表