首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas.rolling_correlation,阈值?

Pandas.rolling_correlation,阈值?
EN

Stack Overflow用户
提问于 2015-07-05 00:01:15
回答 1查看 659关注 0票数 0

我正在使用Pandas.rolling_corr计算两个Pandas系列的相关性。

代码语言:javascript
复制
pd.rolling_corr(x, y, 10)

X和y的变化很小。例如

代码语言:javascript
复制
x[0] = 1.3342323
x[1] = 1.3342317

由于相关是协方差除以标准差,所以当标准差为0时,相关应仅为inf或-inf。但是,在我所拥有的数据集中,值非常接近,但没有一个值与另一个值完全相同。但出于某种原因,我在关联中得到了inf或-inf值。

下面是我的问题:在pandas.rolling_corr中是否有一个限制,在这个限制中,如果数字太小,数字就会自动四舍五入?(x<1e-7)

我正在处理的数据集(x和y)位于“float64”中,我已经将chop_threshold设置为0。

编辑*以下是我正在处理的数据示例。我试图计算这两列之间的相关性,但结果是inf。

代码语言:javascript
复制
1144    679.5999998
1144    679.600001
1143.75 679.6000003
1143.75 679.5999993
1143    679.6000009
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-05 19:31:33

我认为这可以更普遍地看作是一个关于精确性的问题,而不是一个相关性的问题。一般来说,你可以预期幕后的事情会以双倍的精度完成,这意味着在小数点13或14位左右,事情会变得不稳定(但在很多情况下,肯定是在小数点11或12位(或更少))。

下面是一个小示例程序,它从'x‘列(1e0)中的1开始,然后逐步下降到1e-20。

代码语言:javascript
复制
pd.options.display.float_format = '{:12,.9f}'.format
df_corr = pd.DataFrame()
diffs = np.arange(4)
for i in range(20):
    df = pd.DataFrame({ 'x': [1,1,1,1], 'y':[5,7,8,6] })
    df['x'] = df['x'] + diffs*.1**i
    df_corr = df_corr.append( pd.rolling_corr(df.x,df.y,3)[2:4], ignore_index=True )

在查看结果之前,请先发表几点意见。首先,熊猫的默认显示有时会隐藏非常小的数字差异,因此您需要强制以某种方式进行更精确的格式化。这里我用了pd.options

第二,我不会在这里添加大量的注释,但是您需要知道的主要是'x‘列在每个循环中都是不同的。如果愿意,可以添加print语句,但前4次迭代如下所示:

代码语言:javascript
复制
iteration     values of column 'x'
0             [ 1.   2.     3.     4.    ]
1             [ 1.   1.1    1.2    1.3   ]
2             [ 1.   1.01   1.02   1.03  ]
3             [ 1.   1.001  1.002  1.003 ]

因此,当我们开始以后的迭代时,差异将非常小,以至于熊猫只会把它看作[1,1,1,1]。那么,实际的问题是,在什么时候,这种差异如此之小,以致于熊猫无法分辨。

为了使其更加具体,这是第8次迭代的样子(而且rolling_corr使用了一个3的窗口,因为这个数据集只有4行):

代码语言:javascript
复制
             x  y
0  1.000000000  5
1  1.000000100  7
2  1.000000200  8
3  1.000000300  6

下面是结果,其中的索引值也给出了迭代次数(因此也给出了列‘x’中差异的精度)。

代码语言:javascript
复制
df_corr

              2            3
0   0.981980506 -0.500000000
1   0.981980506 -0.500000000
2   0.981980506 -0.500000000
3   0.981980506 -0.500000000
4   0.981980506 -0.500000000
5   0.981980506 -0.500000000
6   0.981980505 -0.500000003
7   0.981980501 -0.500000003
8   0.981980492 -0.499999896
9   0.981978898 -0.500001485
10  0.981971784 -0.500013323
11  0.981893289 -0.500133227
12  0.981244570 -0.502373626
13  0.976259968 -0.505124339
14  0.954868546 -0.132598709
15  0.785584405  1.060660172
16  0.000000000  0.000000000
17          nan          nan
18          nan          nan
19          nan          nan

所以你可以看到,你得到了合理的结果,降到了小数点13位(尽管在此之前,精确度在下降),然后它们就会分崩离析,尽管你直到十七号才真正得到南恩。

我不知道如何直接回答你的问题,但希望这能给你一些启示。我想说的是,在这些计算中并没有出现自动舍入这样的事情,但是很难推广。当然,有些算法比其他算法在精确类型问题上处理得更好,但是不可能在此做出任何广泛的概括,即使在熊猫内部的不同功能或方法之间也是如此。(例如,由于精度问题,目前正在讨论numpy是如何得到与熊猫类似功能不同的答案的。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31226102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档