Динамическое обновление существующей таблицы Postgres (psycopg2) новыми столбцами (технические индикаторы временных рядов) - PullRequest
1 голос
/ 24 июня 2019

Я работаю с данными финансовых временных рядов (OHLCV) акций и дополняю свой набор данных финансовыми показателями (например, полосами Боллинджера). У меня настроена гипертаблица Postgres / TimescaleDB, и я планирую использовать psycopg2 для выполнения запросов.

То, что я хотел бы сделать, - это возможность автоматически и динамически добавлять столбцы в мои существующие таблицы базы данных с различными техническими показателями из существующей библиотеки / модуля python.

Так, в качестве примера, у меня есть длинная таблица с ежедневными данными OHLCV и тикерами в столбцах для последующей обработки ETL. Я хотел бы запустить пока неопределенное количество индикаторов, скажем, полос Боллинджера (верхний и нижний), RSI, ema и т. Д. Но не хочу вручную каждый раз кодировать эти новые столбцы в SQL через psycopg2. создайте новый индикатор, но вместо этого используйте их как параметры для автоматической настройки в базе данных - либо как перенесенная / новая таблица, либо как в существующую ежедневную таблицу. (что работает лучше всего)

Я огляделся, но не увидел ничего, что бы я распознал как нечто, что могло бы сработать для этого.

1 Ответ

1 голос
/ 25 июня 2019

Я бы посоветовал не изменять ваши таблицы повторно, а вместо этого моделировать данные по-другому.Например, вы можете создать следующие таблицы

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

...