3

私はこれで満たされたパンダのデータフレームを持っています:

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

私はおそらく単純なものを見逃しています。この種の計算から有用な値を得るには、どうすればよいでしょうか? よろしくお願いします。

4

2 に答える 2

5

列とラグ値の間で操作を行う場合は、次のようなことを行う必要がありますtest.Open / test.Open.shift()shiftデータを再配置し、オプションのピリオド数を取ります。

于 2012-11-25T15:07:04.357 に答える
0

あなたがそうするとき、あなたはあなたがあなたが思っているものを手に入れていないかもしれませんtest.Open[1:]/test.Close。Pandasはインデックスに基づいて行を照合するため、一方の列の各要素をもう一方の列の対応する要素(1行前の要素ではない)で除算したままになります。次に例を示します。

>>> 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最初のオペランドに対応する値がなかったため、2番目のものは最初のものにちょうどあります。

本当にオフセット行を操作したい場合は、パンダのインデックス整列機能をバイパスするために、パンダのDataFrameを支えるnumpy配列を掘り下げる必要があります。values列の属性を使用して、これらの内部を取得できます。

>>> d.A.values[1:] / d.B.values[:-1]
array([-0.66666667,  8.        ,  0.16666667,  0.8       ])

これで、実際には、各値を他の列の前の値で割った値が得られます。ここでは、2番目のオペランドを明示的にスライスして、最後の要素を省略し、長さを等しくする必要があることに注意してください。

したがって、同じことを実行して、列をそれ自体のオフセットバージョンで分割できます。

>>> d.A.values[1:] / d.A.values[:-1]
45: array([-2.   , -4.   ,  0.125, -4.   ])
于 2012-11-25T06:36:53.713 に答える