下面显示的是将列值与常量进行比较的代码。
我的问题:
很抱歉无法正确格式化代码。
import numpy as np
import pandas as pd
def test_pct_change():
MIN_CHANGE = 0.0050 #.5% For some reason 0.0050 does not work in comparison
data = { 'c1' : pd.Series([100, 110], index=['a', 'b']),
'c2' : pd.Series([100.5, 105, 3.,], index=['a', 'b', 'c']),
'c3' : pd.Series([102, 100, 3.], index=['a', 'b', 'c'])}
df = pd.DataFrame(data)
print df.to_string()
dft_pct = df.pct_change(axis=1) #1: columns
dft_pct['Has_Min_Change'] = (dft_pct.iloc[:, -2] >= MIN_CHANGE) #(dft_pct.iloc[:, -1] >= MIN_CHANGE) &
print 'Percent Change'
print dft_pct.to_string()
答案 0 :(得分:2)
这就是numpy
isclose
考虑数据框df
df = pd.DataFrame(np.random.rand(5, 5))
print(df)
0 1 2 3 4
0 0.362368 0.201145 0.340571 0.733402 0.816436
1 0.216386 0.105877 0.565318 0.102514 0.451794
2 0.221733 0.216303 0.039209 0.482731 0.800290
3 0.200427 0.154020 0.612884 0.695920 0.122780
4 0.986003 0.059244 0.291480 0.270779 0.526996
评估一个我们知道在数学上是正确的平等
((100 + df) / 100 - 1) == (df / 100)
0 1 2 3 4
0 False False False False False
1 False False False False False
2 False False False False False
3 False False False False False
4 False False False False False
让我们看看差异 我们可以舍入到15位小数,它仍然返回全零 这些非常接近。
print(((100 + df) / 100 - 1).sub(df / 100).round(15))
0 1 2 3 4
0 -0.0 0.0 0.0 0.0 0.0
1 -0.0 0.0 0.0 0.0 0.0
2 -0.0 -0.0 0.0 -0.0 -0.0
3 -0.0 0.0 0.0 -0.0 0.0
4 0.0 -0.0 -0.0 0.0 0.0
这就是numpy
isclose
np.isclose(((100 + df) / 100 - 1), (df / 100))
array([[ True, True, True, True, True],
[ True, True, True, True, True],
[ True, True, True, True, True],
[ True, True, True, True, True],
[ True, True, True, True, True]], dtype=bool)
这是使用二进制门执行十进制数学的结果,我们有一个解决方法。
答案 1 :(得分:0)
当以双精度执行计算时,100.5 / 100略小于0.005,因此>= MIN_CHANGE - 1e-15
的计算结果为False。这就是为什么你没有得到" Min Change"从100改为100.5
如果包含此类边缘情况非常重要,您可以使用dft_pct['Has_Min_Change'] = dft_pct.min(axis=1) >= MIN_CHANGE
之类的不等式略微捏造它。
表示所有列满足> = MIN_CHANGE的条件的一种方法是在列上取最小值,并要求它是> = MIN_CHANGE。例如:
min
默认情况下,doc.toString()
会忽略NaN条目。 (注意将布尔值隐式转换为整数,但是:假将其视为0)。