更好的方法为ta-lib构建numpy数组

时间:2014-01-18 03:04:26

标签: python numpy

我希望有人能救我脱离自己。我正在尝试为TA-Lib创建一个需要为numpy.ndarray的输入数组。我的原始数据在dict列表中作为浮点数。我有以下代码工作,但它似乎是一个可怕的方式来做到这一点。我正在尝试用浮点数的长度“块”创建ndarray,然后用dict值列表填充它,其中“results”看起来像这个截断的版本:

import numpy as np
import pylab
import talib
from talib.abstract import Function
from matplotlib.dates import epoch2num

results=[{'min': 23.154066666666665, 'max': 23.298, 'price': 23.257773259460716, 'amount': 95.17532800000002, 'date': 1389336300, 'close': 23.22373, 'open': 23.26123287671233}, 
{'min': 23.134200000000003, 'max': 23.339819999999996, 'price': 23.271289011315073, 'amount': 2131.7753154199972, 'date': 1389336120, 'close': 23.26123287671233, 'open': 23.25126987951807}]
    open = np.ndarray(shape=(blocks), dtype=float)
    close = np.ndarray(shape=(blocks), dtype=float)
    high = np.ndarray(shape=(blocks), dtype=float)
    low = np.ndarray(shape=(blocks), dtype=float)
    volume = np.ndarray(shape=(blocks), dtype=float)
    ts = np.ndarray(shape=(blocks), dtype=float)
    inputs = {}
    for i in range(len(results)):
        open[i] = results[i].get('open')
        high[i] = results[i].get('max')
        low[i] = results[i].get('min')
        close[i] = results[i].get('close')
        volume[i] = results[i].get('amount')
        ts[i] = epoch2num(results[i].get('date'))
    inputs['open'] = open
    inputs['high'] = high
    inputs['low'] = low
    inputs['close'] = close
    inputs['volume'] = volume
    inputs['ts'] = ts

    sma = Function('sma')
    input_arrays = sma.get_input_arrays()
    for key in input_arrays.keys():
        input_arrays[key] = inputs[key]
    output = sma(input_arrays, timeperiod=3)

我正在关注ta-lib的简短api文档,为'sma'函数创建有效字段的inputs_array,这是有效的,但这是我一段时间以来看到过的最丑陋的事情。由于我提前知道块大小,似乎我不应该做所有这些迭代,但我只是在学习Python,所以我希望有人可以告诉我一个更好/更快的方法来做到这一点。 / p>

由于

2 个答案:

答案 0 :(得分:1)

您可以使用列表推导

results = ...

inputs['open'] = np.array([r.get('open') for r in results], dtype=float)
...

答案 1 :(得分:0)

inputs = {key: np.array([result[key] for result in results]) for key in results[0]}
for new, old in [('high', 'max'), ('low', 'min'), ('volume', 'amount')]:
    inputs[new] = inputs.pop(old)
inputs['ts'] = np.array(map(epoch2num, inputs.pop('date')))
del inputs['price']

主要是第一行,其余的只处理重命名等。但是,假设results中所有词典中的键始终相同,并且至少有一个结果。如果这些要求不合适,请评论。