【问题标题】:Dynamically updating existing Postgres table (psycopg2) with new columns (time series technical indicators)使用新列(时间序列技术指标)动态更新现有 Postgres 表 (psycopg2)
【发布时间】:2019-11-06 16:24:52
【问题描述】:

我正在处理股票的金融时间序列数据 (OHLCV),并正在使用金融指标(例如布林带)扩充我的数据集。我有一个 Postgres/TimescaleDB 超表设置并计划使用 psycopg2 来运行查询。

我想做的是能够自动和动态地将列添加到我现有的数据库表中,其中包含来自现有 python 库/模块的不同技术指标。

举个例子,我有一个长表,列中有每日 OHLCV 和股票代码数据,以便稍后进行 ETL 处理。我想运行数量尚未确定的指标,例如布林带(上限和下限)、RSI、EMA 等。但不想每次我都通过 psycopg2 在 SQL 中手动编码这些新列创建一个新指标,而是将它们作为参数提供,以便在数据库中自动设置 - 作为迁移/新表,或在现有的每日表中。 (以最有效的方式)

我环顾四周,但没有看到任何我认为可能适用于此的东西。

【问题讨论】:

    标签: python postgresql psycopg2 timescaledb


    【解决方案1】:

    我建议不要重复修改您的表格,而是以不同的方式对数据进行建模。例如,您可以创建以下表格

    -- Table for the original series
    CREATE TABLE series (
      id INTEGER PRIMARY KEY,
      datetime TIMESTAMP NOT NULL,
      symbol TEXT NOT NULL,
      value NUMBER NOT NULL
    );
    
    -- Table for the derived indicators
    CREATE TABLE indicators (
      id INTEGER PRIMARY KEY,
      series_id INTEGER NOT NULL,
      name TEXT NOT NULL,
      value NUMBER NOT NULL,
      FOREIGN KEY (series_id) REFERENCES series(id)
    );
    

    然后,您可以为每个原始系列计算任意数量的指标(存储在 series 中)并将派生值存储在 indicators 中。这种方法还有一个额外的好处,即您不需要评估所有时间序列的所有指标(或者当您不评估所有数据点的所有指标时,有一堆 NULL 列)。

    例如1

    import numpy as np
    import psycopg2
    
    SYMBOL = "GOOG"
    INDICATOR = "EMA"
    
    with psycopg2.connect("your connection string") as conn:
        # Get the data
        with conn.cursor() as cur:
            cur.execute("SELECT id, value FROM series WHERE symbol = %s", (SYMBOL,))
            ids, values = np.transpose(cur.fetchall())
    
        # Calculate the indicator
        indicator_values = evaluate_indicator(values, INDICATOR)
    
        # Insert the indicator values
        with conn.cursor() as cur:
            data = [(series_id, INDICATOR, value) for series_id, value in 
                    zip(ids, indicator_values)]
            cur.executemany("INSERT INTO indicators (series_id, name, value) VALUES (%s, %s, %s)",
                            data)
    

    话虽如此,如果您想沿着扩展表架构的路线前进,您可以在计算每个新指标之前使用ALTER TABLE command 创建一个新列。


    1我没有测试过这段代码,所以它可能包含一些小问题。

    【讨论】:

    • 谢谢!我将不得不试一试,但我明白了 - 而不是重组现有的表(如果我不将指标应用于存储的每个系列,可能会创建空值),我可以创建一个类似的表,其中包含一个列指标系列名称。虽然我不确定我是否得到了“zip”部分。不知道为什么我没想到!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    相关资源
    最近更新 更多