在Python中迭代生成器对象

时间:2014-04-18 15:18:58

标签: python generator

我在Python中有一些代码连接到SQL Server并使用pyodbc返回数据的交叉表。

然后,我逐行对该数据执行一些统计分析,因为每行包含供应商特有的统计数据。我已经让大部分代码工作正常,可以遍历每一行中的每一列并返回大量有用的统计分析。我还有matplotlib工作,创建散点图并在数据上绘制OLS回归线。我需要的最后一个脚本是获取异常值,我使用以下内容:

import statsmodels.api as sm

results = sm.OLS(y, sm.add_constant(x)).fit()
test = results.outlier_test()

test数据如下所示:

[[ -1.66666636e-01   8.70954193e-01   1.00000000e+00]
[  1.85524023e-01   8.56527067e-01   1.00000000e+00]
[ -5.07693609e-01   6.22677469e-01   1.00000000e+00]
[ -5.22476578e-01   6.12716252e-01   1.00000000e+00]
[ -5.40267858e-01   6.00836859e-01   1.00000000e+00]
[ -5.61134260e-01   5.87059066e-01   1.00000000e+00]
[  1.11050592e+01   6.03423147e-07   7.84450092e-06]
[  1.97665390e-01   8.47267021e-01   1.00000000e+00]
[ -3.10806108e-01   7.62329771e-01   1.00000000e+00]
[ -2.02176433e-01   8.43832634e-01   1.00000000e+00]
[  4.36313403e-02   9.66057205e-01   1.00000000e+00]
[ -2.89236184e-01   7.78308296e-01   1.00000000e+00]
[ -5.49558759e-01   5.94681341e-01   1.00000000e+00]]

要迭代这一点并确定这些数据中的异常值:

outliers = ([x[i],y[i]] for i,t in enumerate(test) if t[2] < 0.5)

这在for循环for row in rows中运行,其中rows是从SQL查询返回的行。因此,我正在对每行数据执行此异常值测试,以查找哪些数据点是来自该特定结果集的潜在异常值(交叉表实际上是从另一个查询中提取的计算结果集,但这在此处并不重要)。此test输出适用于数据中的一个row

在某些情况下,数据中存在多个异常值。但是,我似乎无法找到迭代每个outliers对象的方法。无论我尝试什么,我只会在outliers得到第一个异常结果,即使有多个已知的异常值。这不是数据的问题,因为我已经通过其他方法证明了这一点,我似乎无法遍历outliers生成器对象。

我对生成器对象相当新,但我对它们进行了一些研究。我对它们如何工作有一个很好的理解,但即使是我认为正在工作的代码,也不是。

使用类似

的内容
for i in outliers:
    print i

我只获得列表中的第一个异常值:[6, 136.84] - (在上面给出的示例数据中,这是唯一的异常值,但正如本问题中其他地方所述,即使已知多个异常值只有第一个异常值集合中的一个被返回)

使用

for i in list(outliers):
    print i

给了我相同的结果。

使用

for i in list(next(outliers)):
    print i

会导致在单独的行上返回两个值xy,就像遍历子列表[x, y]而不是outliers生成器一样。

我尝试的最后一件事是这个

的各种排列
try:
    for i in next(outliers):
        print list(next(outliers))
except StopIteration:
    pass

我会注意到这个特定代码实际上并不打印任何

我也试过

try:
    if next(outliers, None) != None:
        print list(outliers)
except StopIteration:
    pass

导致

[]

我昨天有一些工作,但由于某种原因,它正在跳过一些结果,我无法弄清楚为什么。不幸的是,我丢失了那段代码,现在我又回到了无法取得进一步进展的方方面面。

编辑:

这是一个test数据集,其中包含多个异常值:

[[-1.06904497  0.31017523  1.        ]
[        inf  0.          0.        ]
[-0.74947341  0.47083534  1.        ]
[-0.61974867  0.54928322  1.        ]
[-0.50178907  0.62667871  1.        ]
[-0.3917734   0.70344466  1.        ]
[-0.28680336  0.78011746  1.        ]
[-0.18448201  0.85732288  1.        ]
[-0.08262629  0.93577921  1.        ]
[ 0.02097215  0.98368044  1.        ]
[ 0.12880164  0.90006829  1.        ]
[ 0.24397502  0.8121827   1.        ]
[ 0.37079182  0.71852659  1.        ]]

编辑编辑:

这个问题可以关闭。我一定是误报了哪些数据点是昨天的异常值,这导致我认为当我今天只获得一个结果时,生成器迭代不起作用。在使用某些包含异常值的测试数据后,我的生成器迭代正常工作。

0 个答案:

没有答案