我有一个pandas数据框,我填写了这个:
import pandas.io.data as web
test = web.get_data_yahoo('QQQ')
iPython中的数据框如下所示:
In [13]: test
Out[13]:
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 729 entries, 2010-01-04 00:00:00 to 2012-11-23 00:00:00
Data columns:
Open 729 non-null values
High 729 non-null values
Low 729 non-null values
Close 729 non-null values
Volume 729 non-null values
Adj Close 729 non-null values
dtypes: float64(5), int64(1)
当我将一列除以另一列时,我得到一个具有令人满意的小数位数的float64结果。我甚至可以将一列除以另一列偏移一,例如test.Open[1:]/test.Close[:]
,并获得令人满意的小数位数。但是,当我将列除以偏移量时,我只得到1:
In [83]: test.Open[1:] / test.Close[:]
Out[83]:
Date
2010-01-04 NaN
2010-01-05 0.999354
2010-01-06 1.005635
2010-01-07 1.000866
2010-01-08 0.989689
2010-01-11 1.005393
...
In [84]: test.Open[1:] / test.Open[:]
Out[84]:
Date
2010-01-04 NaN
2010-01-05 1
2010-01-06 1
2010-01-07 1
2010-01-08 1
2010-01-11 1
我可能错过了一些简单的事情。为了从这种计算中获得有用的价值,我需要做些什么?在此先感谢您的帮助。
答案 0 :(得分:5)
如果您希望在列和滞后值之间进行操作,则应该执行test.Open / test.Open.shift()
之类的操作。
shift
重新调整数据并采用可选的周期数。
答案 1 :(得分:0)
当你test.Open[1:]/test.Close
时,你可能无法得到你的想法。 Pandas根据它们的索引匹配行,所以你仍然得到一列的每个元素除以另一列中的相应元素(而不是一行后面的元素)。这是一个例子:
>>> print d
A B C
0 1 3 7
1 -2 1 6
2 8 6 9
3 1 -5 11
4 -4 -2 0
>>> d.A / d.B
0 0.333333
1 -2.000000
2 1.333333
3 -0.200000
4 2.000000
>>> d.A[1:] / d.B
0 NaN
1 -2.000000
2 1.333333
3 -0.200000
4 2.000000
请注意,两个操作返回的值相同。第二个只有第一个nan
,因为第一个操作数中没有相应的值。
如果你真的想对偏移行进行操作,你需要深入研究支撑pandas DataFrame的numpy数组,以绕过pandas的索引对齐功能。您可以使用列的values
属性获取这些内部结构。
>>> d.A.values[1:] / d.B.values[:-1]
array([-0.66666667, 8. , 0.16666667, 0.8 ])
现在你真正得到的每个值除以另一列中的值。请注意,在这里你必须显式地切片第二个操作数以留下最后一个元素,使它们的长度相等。
所以你可以做同样的事情来将列除以自身的偏移版本:
>>> d.A.values[1:] / d.A.values[:-1]
45: array([-2. , -4. , 0.125, -4. ])