Python 将元组列表转换为具有命名列的numpy数组(元组列表的genfromtxt)
所以直到现在我还在把CSV读入numpy数组 样本行:Python 将元组列表转换为具有命名列的numpy数组(元组列表的genfromtxt),python,numpy,Python,Numpy,所以直到现在我还在把CSV读入numpy数组 样本行: 20041207,7.04,7.18,6.88,7.10,25981485 守则: import datetime import numpy as np import matplotlib.dates as dt def mkdate(text): return dt.date2num(datetime.datetime.strptime(text, '%Y%m%d')) np.genfromtxt( filena
20041207,7.04,7.18,6.88,7.10,25981485
守则:
import datetime
import numpy as np
import matplotlib.dates as dt
def mkdate(text):
return dt.date2num(datetime.datetime.strptime(text, '%Y%m%d'))
np.genfromtxt(
filename,
delimiter=',',
skip_header=1,
usecols=[1, 2, 5, 3, 4, 6],
names=('date', 'open', 'close', 'high', 'low', 'volume'),
converters={'date': mkdate},
dtype=(
np.float64,
np.float64,
np.float64,
np.float64,
np.float64,
np.int64
)
)
现在我必须切换到数据库。从数据库中获取相关值后,看起来是这样的(元组列表):
现在,我需要将其转换为与以前相同的numpy数组,就像我想象的那样:
[(datetime.datetime(2004, 12, 7, 0, 0), Decimal('7.04000'), Decimal('7.10000'), Decimal('7.18000'), Decimal('6.88000'), 25981485L), (and so on), ... ]
def mkdate(date):
return dt.date2num(date)
np.somefunction(
list_of_tuples,
names=('date', 'open', 'close', 'high', 'low', 'volume'),
converters={
'date': mkdate,
'open': float,
'close': float,
'high': float,
'low': float,
'volume': int,
},
dtype=(
np.float64,
np.float64,
np.float64,
np.float64,
np.float64,
np.int64
)
)
所以要总结一下:我需要将元组列表转换为带有命名列的numpy数组。如果np.readtxt()
不可行,也许您将dict与numpy的1D数组结合就足够了:
tofloat = lambda w: float(w) # must be function not type
converters={
'date': mkdate,
'open': tofloat,
'close': tofloat,
'high': tofloat,
'low': tofloat,
'volume': lambda w: int(w),
}
# dict with 1D lists per column:
dd = dict([(k,[]) for k in converters.keys()])
with open(fname, 'r') as f:
for l in f: # read line
ww = l.split(',') # split line into strings
for w,k in zip(ww,dd.keys()): # iterate over strings and column names
f = converters[k]
dd[k].append(f(w)) # append to proper dict-entry list
# convert to dict with numpy arrays:
dd_a = dict([(k,np.asarray(v)) for k,v in dd.items()])
旁白:如果您使用的是OHLC数据,那么它将比bare
numpy
更容易使用。如果没有更好的方法,我将不得不使用这种方法。但它并不理想,因为我使用前一个数组,如array[index]['column\u name']和array['column\u name'][index],这取决于我需要它做什么。因此,重写代码的重要部分是必要的。不过还是要谢谢你,因为这是一种可行的方法。你实际上可以编写dd\u a['column\u name'][index]
。如果不想更改代码,可以编写一个小的包装类,在该类中使用\uu getitem\uuuu()
重载[]
-运算符,以提供所需的访问方法。