3

Yahoo から S&P500 の株価をダウンロードしていますが、32 ビット整数としてはボリュームが大きすぎます。

def yahoo_prices(ticker, start_date=None, end_date=None, data='d'):

    csv = yahoo_historical_data(ticker, start_date, end_date, data)

    d = [('date',      np.datetime64),
         ('open',      np.float64),
         ('high',      np.float64),
         ('low',       np.float64),
         ('close',     np.float64),
         ('volume',    np.int64),
         ('adj_close', np.float64)]

    return np.recfromcsv(csv, dtype=d)

エラーは次のとおりです。

>>> sp500 = yahoo_prices('^GSPC')
Traceback (most recent call last):
  File "<stdin>", line 108, in <module>
  File "<stdin>", line 74, in yahoo_prices
  File "/usr/local/lib/python2.6/dist-packages/numpy/lib/npyio.py", line 1812, in recfromcsv
    output = genfromtxt(fname, **kwargs)
  File "/usr/local/lib/python2.6/dist-packages/numpy/lib/npyio.py", line 1646, in genfromtxt
    output = np.array(data, dtype=ddtype)
OverflowError: long int too large to convert to int

int64 を使用するように dtype を宣言した場合でも、このエラーが発生するのはなぜですか? これは、io 関数が実際には私の dtype シーケンスを使用していないことを示していますdか?

===編集...例のcsvを追加===

Date,Open,High,Low,Close,Volume,Adj Close
2012-06-15,1329.19,1343.32,1329.19,1342.84,4401570000,1342.84
2012-06-14,1314.88,1333.68,1314.14,1329.10,3687720000,1329.10
2012-06-13,1324.02,1327.28,1310.51,1314.88,3506510000,1314.88
4

2 に答える 2

3

よくわかりませんが、numpy でバグを見つけたと思います。ここに提出しました。

そこで言ったように、npyio.py を開いて 内のこの行を編集するとrecfromcsv:

kwargs.update(dtype=kwargs.get('update', None),

これに:

kwargs.update(dtype=kwargs.get('dtype', None),

次に、長い整数で問題なく動作します(ジョーが回答で書いたように、日時の正確さを確認しませんでした)。日付も変換されていないことに気付くかもしれません。これが機能する特定のコードです。「test.csv」の内容は、例の csv データからコピーして貼り付けたものです。

import numpy as np
d = [('date',      np.datetime64),
    ('open',      np.float64),
    ('high',      np.float64),
    ('low',       np.float64),
    ('close',     np.float64),
    ('volume',    np.int64),
    ('adj_close', np.float64)]
a = np.recfromcsv("test.csv", dtype=d)
print(a)

[ (datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 1329.19, 1343.32, 1329.19, 1342.84, 4401570000, 1342.84)
 (datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 1314.88, 1333.68, 1314.14, 1329.1, 3687720000, 1329.1)
 (datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 1324.02, 1327.28, 1310.51, 1314.88, 3506510000, 1314.88)]

更新: numpy を変更したくない場合は、recfromcsv に関連する numpy コードを使用してください。

また、日時フィールドでネイティブの python オブジェクトを使用して、日時の問題を「修正」しました。それがうまくいくかどうかはわかりません。

import datetime
import numpy as np

d = [('date',     datetime.datetime),
    ('open',      np.float64),
    ('high',      np.float64),
    ('low',       np.float64),
    ('close',     np.float64),
    ('volume',    np.int64),
    ('adj_close', np.float64)]

#a = np.recfromcsv("test.csv", dtype=d)
kwargs = {"dtype": d}
case_sensitive = kwargs.get('case_sensitive', "lower") or "lower"
names = kwargs.get('names', True)
kwargs.update(
    delimiter=kwargs.get('delimiter', ",") or ",",
    names=names,
    case_sensitive=case_sensitive)
output = np.genfromtxt("test.csv", **kwargs)
output = output.view(np.recarray)

print(output)
于 2012-06-16T17:28:37.857 に答える
1

日付文字列を実際の日付に変換する必要があります。最初の列を日時に直接変換できないため、dtype の形式は無視されています。

numpyは、かなり明示的であることを期待し、日付形式を推測することを拒否します。

(編集:これは以前はそうでしたが、今はそうではありません。)

日時オブジェクトが必要です。dateutil.parser文字列から日付/時刻の形式を推測するかどうかを確認してください。

いずれにせよ、次のようなものが必要になります。

from cStringIO import StringIO
import datetime as dt
import numpy as np

dat = """Date,Open,High,Low,Close,Volume,Adj Close
2012-06-15,1329.19,1343.32,1329.19,1342.84,4401570000,1342.84
2012-06-14,1314.88,1333.68,1314.14,1329.10,3687720000,1329.10
2012-06-13,1324.02,1327.28,1310.51,1314.88,3506510000,1314.88"""
infile = StringIO(dat)

d = [('date',      np.datetime64),
     ('open',      np.float64),
     ('high',      np.float64),
     ('low',       np.float64),
     ('close',     np.float64),
     ('volume',    np.int64),
     ('adj_close', np.float64)]


def parse_date(item):
    return dt.datetime.strptime(item, '%Y-%M-%d')

data = np.recfromcsv(infile, converters={0:parse_date}, dtype=d)

しかし、このようなことはpandas輝くところです。次のようなものを使用することを検討してください。

from cStringIO import StringIO
import pandas

dat = """Date,Open,High,Low,Close,Volume,Adj Close
2012-06-15,1329.19,1343.32,1329.19,1342.84,4401570000,1342.84
2012-06-14,1314.88,1333.68,1314.14,1329.10,3687720000,1329.10
2012-06-13,1324.02,1327.28,1310.51,1314.88,3506510000,1314.88"""

infile = StringIO(dat)
data =  pandas.read_csv(infile, index_col=0, parse_dates=True)
于 2012-06-16T17:23:29.383 に答える