71

Pythonでは、前の行を参照してそれに対して何かを計算するにはどうすればよいですか? 具体的にはdataframespandas次のような株価情報でいっぱいのデータ フレームがあります。

           Date   Close  Adj Close
251  2011-01-03  147.48     143.25
250  2011-01-04  147.64     143.41
249  2011-01-05  147.05     142.83
248  2011-01-06  148.66     144.40
247  2011-01-07  147.93     143.69

このデータフレームを作成した方法は次のとおりです。

import pandas

url = 'http://ichart.finance.yahoo.com/table.csv?s=IBM&a=00&b=1&c=2011&d=11&e=31&f=2011&g=d&ignore=.csv'
data = data = pandas.read_csv(url)

## now I sorted the data frame ascending by date 
data = data.sort(columns='Date')

行番号 2 から始めます。この場合は 250 だと思います (PS - それはインデックスですか?)。このデータフレームのすべてのエントリについて、2011-01-03 と 2011-01-04 の差を計算したいと思います。 . 適切な方法は、現在の行を取得し、前の行を計算し、それらの差を計算する関数を作成し、pandas apply関数を使用してデータフレームを値で更新することだと思います。

それは正しいアプローチですか?もしそうなら、違いを判断するためにインデックスを使用する必要がありますか? (注 - 私はまだ Python 初心者モードなので、インデックスは適切な用語ではない可能性があり、これを実装する正しい方法でさえない可能性があります)

4

3 に答える 3

115

私はあなたがこのようなことをしたいと思います:

In [26]: data
Out[26]: 
           Date   Close  Adj Close
251  2011-01-03  147.48     143.25
250  2011-01-04  147.64     143.41
249  2011-01-05  147.05     142.83
248  2011-01-06  148.66     144.40
247  2011-01-07  147.93     143.69

In [27]: data.set_index('Date').diff()
Out[27]: 
            Close  Adj Close
Date                        
2011-01-03    NaN        NaN
2011-01-04   0.16       0.16
2011-01-05  -0.59      -0.58
2011-01-06   1.61       1.57
2011-01-07  -0.73      -0.71
于 2012-10-29T03:17:30.307 に答える
1

私はパンダを知りません、そして私はそれがこれに特有の何かを持っているとかなり確信しています。ただし、純粋なPythonソリューションを提供します。これは、パンダを使用する必要がある場合でも役立つ可能性があります。

import csv
import urllib

# This basically retrieves the CSV files and loads it in a list, converting
# All numeric values to floats
url='http://ichart.finance.yahoo.com/table.csv?s=IBM&a=00&b=1&c=2011&d=11&e=31&f=2011&g=d&ignore=.csv'
reader = csv.reader(urllib.urlopen(url), delimiter=',')
# We sort the output list so the records are ordered by date
cleaned = sorted([[r[0]] + map(float, r[1:]) for r in list(reader)[1:]])

for i, row in enumerate(cleaned):  # enumerate() yields two-tuples: (<id>, <item>)
    # The try..except here is to skip the IndexError for line 0
    try:
        # This will calculate difference of each numeric field with the same field
        # in the row before this one
        print row[0], [(row[j] - cleaned[i-1][j]) for j in range(1, 7)]
    except IndexError:
        pass
于 2012-10-29T01:04:32.113 に答える