我建议不要反复修改你的表,而是对数据进行不同的建模。例如,您可以创建以下表格
-- 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
命令创建一个新列。
1我没有测试过这段代码,所以它可能包含一些小问题。