使用 executor.map 从 Tradermade 获取时间序列数据

Getting timeseries data from Tradermade with executor.map

我正在以时间序列格式从 Tradermade 提取利率,并将时间序列对象与其他一些数据一起添加到利率 class,利率 class 对时间序列数据执行分析,利率对象是然后添加到以符号为键的字典中。

作为编程新手,我遵循了从 Tradermade 获取数据的同步方法。它增加了 66 秒的时间 - 我想避免。

今天我学习了 concurrent.futures 和 ThreadPoolExecutor 的使用。

我 运行 遇到的问题是使用符号列表作为迭代器将 kwarg 参数传递给 executor.map。

虽然我还没有找到解决这个问题的方法,但我已经阅读了 SO 和其他网站上的 QnA - 尽管我是菜鸟,但它可能非常明显 - 所以请善待 :)

我之前的代码贴在下面。在将符号及其时间序列对象添加到 Rates class.

之前,我将使用 tm.timeseries 部分并执行它

不过,我不知道如何将 tm.timeseries 所需的参数传递给 executor.map。

有什么建议吗?

注意:from_date和to_datetime对于每个符号都是相同的

    symbols = [

        'AUDUSD', 'EURUSD', 'GBPUSD', 'USDCAD', 'USDJPY', 'USDCHF', 'AUDCAD', 'AUDCHF', 'AUDJPY', 'AUDNZD', 'CADCHF', 'CADJPY',
        'CHFJPY', 'EURAUD', 'EURCHF', 'EURCAD', 'EURGBP', 'EURJPY', 'EURNZD', 'EURZAR', 'GBPAUD', 'GBPCAD', 'GBPCHF', 'GBPJPY',
        'GBPNZD', 'NZDCAD', 'NZDCHF', 'NZDJPY', 'NZDUSD', 'USDMXN', 'USDNOK', 'USDSEK', 'USDSGD', 'USDTRY', 'USDZAR'
    ]

    rates = {}
    for symbol in symbols:
        if "JPY" in symbol:
            point = 3
        else:
            point = 5
        rates[symbol] = Rates(

            symbol,
            point,
            tm.timeseries(currency=symbol, start=from_date, end=to_datetime,
                          interval="hourly", fields=["open", "high", "low", "close"])

        )

阅读 OS 上接受的答案后,我实施了解决方案并且它有效,如果您想避免参数错误,请不要使用 zip。这是 post:

我设法将时间从 68 秒缩短到 7 秒。

我使用的函数:

def get_timeseries_rates(psymbol, pstart, pend):
    
    currency=psymbol
    start_date= pstart.strftime("%Y-%m-%d-%H:%M")
    end_date= pend.strftime("%Y-%m-%d-%H:%M")
    api_key = ""
    format="split"
    interval="daily"

    df =pd.read_json('https://marketdata.tradermade.com/api/v1/timeseries?currency='
                    +currency+'&api_key='+api_key+'&start_date='+start_date+'&end_date='
                    +end_date+'&format='+format+'&interval='+interval)
    df = pd.DataFrame(df.quotes['data'], columns=df.quotes['columns'])
    
    return df

executor.map 使用 repeat(我没有使用 zip,因为它会抛出预期参数的错误)

rates_timeseries = []

with concurrent.futures.ThreadPoolExecutor() as executor:
    results = executor.map(get_timeseries_rates, symbols, repeat(
        from_date), repeat(to_datetime))

    for result in results:
        rates_timeseries.append(result)