Я бы посоветовал не изменять ваши таблицы повторно, а вместо этого моделировать данные по-другому.Например, вы можете создать следующие таблицы
-- 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 Я не проверял этот код, поэтому он может содержать небольшие пробелы.