2

私は次のコードを持っています:

from numpy import genfromtxt
nysedatafile = os.getcwd() + '/nyse.txt';
nysedata = genfromtxt(nysedatafile, delimiter='\t', names=True, dtype=None);
nasdaqdatafile = os.getcwd() + '/nasdaq.txt';
nasdaqdata = genfromtxt(nasdaqdatafile, delimiter='\t', names=True, dtype=None);

次に、2つのCSVのデータをマージして、さまざまな機能を試しました。

例えば:

import numpy as np;
alldata = np.array(np.concatenate((nysedata, nasdaqdata)));
print('NYSE stocks:' + str(nysedata.shape[0]));
print('NASDAQ stocks:' + str(nasdaqdata.shape[0]));
print('ALL stocks:' + str(alldata.shape[0]));

戻り値:

TypeError: invalid type promotion    

私も同様numpy.vstackに、その上で配列を呼び出そうとしました。最後の印刷で、前の2つのcsvファイルの行の合計が得られると思います。


編集:このコマンド:

print('NYSE shape:' + str(nysedata.shape));
print('NASDAQ shape:' + str(nasdaqdata.shape));
print('NYSE dtype:' + str(nysedata.dtype));
print('NASDAQ dtype:' + str(nasdaqdata.dtype));

戻り値:

NYSE shape:(3257,)
NASDAQ shape:(2719,)
NYSE dtype:[('Symbol', 'S14'), ('Name', 'S62'), ('LastSale', 'S9'), ('MarketCap', '<f8'), ('ADR_TSO', 'S3'), ('IPOyear', 'S4'), ('Sector', 'S21'), ('industry', 'S62'), ('Summary_Quote', 'S38')]
NASDAQ dtype:[('Symbol', 'S14'), ('Name', 'S62'), ('LastSale', 'S7'), ('MarketCap', '<f8'), ('ADR_TSO', 'S3'), ('IPOyear', 'S4'), ('Sector', 'S21'), ('industry', 'S62'), ('Summary_Quote', 'S34')]
4

1 に答える 1

2

np.vstack(または)がエラーを発生させる理由np.concatenateは、2つの配列のdtypeが一致しないためです。

最後のフィールドに注意してください:('Summary_Quote', 'S38')('Summary_Quote', 'S34')。nysedataのSummary_Quote列の長さは38バイトですが、nasdaqdataの列の長さはわずか34バイトです。(編集:LastSale列にも同様の問題があります。)

これは、パラメータが設定されgenfromtxtているときに列のdtypeを推測するために発生しました。dtype = None文字列列の場合、その列genfromtxtのすべての文字列を含めるために必要な最小バイト数を決定します。

したがって、2つの配列をスタックするには、小さい方の配列を大きい方のdtypeにプロモートする必要があります。

import numpy.lib.recfunctions as recfunctions
recfunctions.stack_arrays([nysedata,nasdaqdata.astype(nysedata.dtype)], usemask = False)

(以前の回答ではnp.vstackを使用しました。これにより、形状の2次元配列(N、1)recfunctions.stack_arraysが返されます。形状の1次元配列(N、)が返されます。nysedatanasdaqdataは1次元なので、より良いと思います。 1次元配列も返します。)

おそらくより簡単な解決策は、最初に2つのcsvファイルを連結してから、次のコマンドを呼び出すことgenfromtxtです。

import numpy as np
import os

cwd = os.getcwd()    
nysedatafile = os.path.join(cwd, 'nyse.txt')
nasdaqdatafile = os.path.join(cwd, 'nasdaq.txt')
alldatafile = os.path.join(cwd, 'all.txt')
with open(nysedatafile) as f1, open(nasdaqdatafile) as f2, open(alldatafile, 'w') as g:
    for line in f1:
        g.write(line)
    next(f2)
    for line in f2:
        g.write(line)

alldata = np.genfromtxt(alldatafile, delimiter='\t', names=True, dtype=None)
于 2012-10-28T00:42:18.357 に答える