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并尝试在其上调用一个数组。我希望最后一次打印给出前两个 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(or ) 引发错误的原因np.concatenate是因为两个数组的 dtypes 不匹配。

请注意最后一个字段:('Summary_Quote', 'S38')('Summary_Quote', 'S34'). nysedata 的Summary_Quote列长 38 个字节,而nasdaqdata' 列只有 34 个字节长。(编辑:该LastSale专栏也有类似的问题。)

发生这种情况是因为在设置参数genfromtxt时猜测列的 dtype 。dtype = None对于字符串列,genfromtxt确定包含该列中所有字符串所需的最小字节数。

因此,要堆叠两个数组,必须将较小的数组提升为较大的 dtype:

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

(我之前的回答使用了 np.vstack。这会产生一个形状为 (N,1)recfunctions.stack_arrays的二维数组。返回一个形状为 (N,) 的一维数组。由于nysedatanasdaqdata是一维的,我认为它更好也返回一个一维数组。)

可能更简单的解决方案是先连接两个 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 回答