我在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
会导致在单独的行上返回两个值x
和y
,就像遍历子列表[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. ]]
编辑编辑:
这个问题可以关闭。我一定是误报了哪些数据点是昨天的异常值,这导致我认为当我今天只获得一个结果时,生成器迭代不起作用。在使用某些包含异常值的测试数据后,我的生成器迭代正常工作。