使用一般函数(特别是Ta-Lib)应用不同的函数及其参数

时间:2018-03-23 15:59:21

标签: python pandas dataframe ta-lib

如果你们可以帮助一个带有pandas df,函数名,需要输入列和参数/ kwargs

的函数,那么

会很感激。

import talib

df的格式为:

                  Open        High         Low       Close     Volume 
Date                                                                          
1993-01-29   43.970001   43.970001   43.750000   43.939999    1003200   
1993-02-01   43.970001   44.250000   43.970001   44.250000     480500
1993-02-02   44.220001   44.380001   44.130001   44.340000     201300

以下代码没问题:

def ApplyIndicator(df, data_col, indicator_func,period):
    df_copy = df.copy()
    col_name = indicator_func.__name__
    df_copy[col_name]=df_copy[data_col].apply(lambda x:indicator_func(x,period))

    return df_copy

样品:

new_df = ApplyIndicator(df,['Close'],talib.SMA,10)

但是,如果我想要一个可以使用不同列的通用ApplyIndi​​cator,例如talib.STOCH,它需要多于1个参数并需要不同的列:

slowk, slowd = STOCH(input_arrays, 5, 3, 0, 3, 0, prices=['high', 'low', 'open'])

对于这种情况,如果假设所有必需列都已在df中,我怎么能在一般talib函数上执行一般的ApplyIndi​​cator函数。

谢谢。

有关这两项功能的更多详情:

SMA(real[, timeperiod=?])

STOCH(high, low, close[, fastk_period=?, slowk_period=?, slowk_matype=?, slowd_period=?, slowd_matype=?])

1 个答案:

答案 0 :(得分:0)

使用原始ApplyIndicator,可以这样做:

def slowk(arr, per):
    return STOCH(arr, 5, 3, 0, 3, 0, prices=['high', 'low', 'open'])[0]

new_df = ApplyIndicator(df,['Close'], slowk, None)

Lambda在这里工作不会因为它的名字总是"",但是通过一些更聪明的列命名它们也应该没问题。

为了使它更优雅,我们可以使用任意数量的属性:

def ApplyIndicator(df, indicator_func, *args):
    col_name = indicator_func.__name__
    df[col_name] = df.apply(lambda x:indicator_func(x, *args))
    return df

new_df = ApplyIndicator(df[['Close']], talib.SMA, 10)
new_df = ApplyIndicator(df[...], STOCH, 5, 3, 0, 3, 0, ['high', 'low', 'open'])

但事实上,整个功能是如此微不足道,用这样的单个调用替换它可能更容易:

df[['slowk', 'slowd']] = df.apply(
    lambda idx, row: STOCH(row, 5, 3, 0, 3, 0, ['high', 'low', 'open']))