我有以下代码:
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')]
np.vstack
(或 np.concatenate
)引起错误的原因是因为两个数组的dtypes不匹配。
注意最后一个字段:('Summary_Quote', 'S38')
对('Summary_Quote', 'S34')
。Nysedata的Summary_Quote
列长为38个字节,而nasdaqdata
的列只有34个字节。(编辑:LastSale
列遭受类似的问题。)
发生这种情况是因为genfromtxt
猜测dtype = None
参数设置时猜测列的dtype。对于字符串列,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
返回一个1维形状阵列(n,)。由于nysedata
和nasdaqdata
为1维,我认为最好也返回一个1维数组。)
可能是更容易的解决方案是首先加入两个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)