Crear base de datos de precios usando SQLAlchemy y Python

Aprenda a crear una base de datos de precios para criptomonedas, forexfuturos y acciones en PostgreSQL utilizando Python y SQLAlchemy.

Ya debería saber cómo conectarse a una base de datos PostgreSQL usando SQLAlchemy), y puede descargar el código para esta publicación en el Analizando Alpha GitHub Repo.

Pasos para crear la base de datos de precios

A continuación se muestra el código Python demostrado en el video y el cuaderno Jupyter para crear la base de datos en el siguiente diagrama entidad-relación (ERD):

1. Obtener Importaciones

import enum
import numpy as np
import pandas as pd

from sqlalchemy import BigInteger, Boolean, Column, \
                       Date, DateTime, Enum, Float, ForeignKey, Integer, \
                       String, UniqueConstraint, and_, func
from sqlalchemy.orm import relationship
from psql import Base, db, session

Vamos a crear una nueva clase que herede de enum para crear constantes que podamos enumerar para cada uno de los mercados que analizaremos.

2. Crear clase de mercado

class Market(enum.Enum):
    crypto = 'crypto'
    stock = 'stock'
    forex = 'forex'
    futures = 'futures'

3. Crear clases y tablas de SQLAlchemy

Crearemos dos tablas. La primera son las tablas de símbolos y minute_bar, que tienen una relación padre/hijo. Para cada tabla, creamos una clase y la heredamos de Base, lo que le permite a SQLAlchemy saber que se trata de una clase/tabla de SQLAlchemy.

class Symbol(Base):
    __tablename__ = 'symbol'
    id = Column(Integer, primary_key=True, autoincrement=True)
    ticker = Column(String(50), nullable=False)
    name = Column(String(200), nullable=False)
    market = Column(Enum(Market), nullable=False)
    active = Column(Boolean, nullable=False)

Crearemos una relación en la tabla minute_bar que utilice backref. SQLAlchemy entiende mirar las clases e identificar el tipo de relación que existe. En nuestro caso, es una relación de uno a muchos. Además, creamos UniqueConstraint en symbol_id y date; en otras palabras, solo deberíamos tener una barra por fecha por símbolo.

class MinuteBar(Base):
    __tablename__ = 'minute_bar'
    id = Column(BigInteger, primary_key=True)
    date = Column(DateTime, nullable=False)
    open = Column(Float)
    high = Column(Float)
    low = Column(Float)
    close = Column(Float)
    volume = Column(Float)
    symbol_id = Column(Integer,
                      ForeignKey('symbol.id',
                                 onupdate="CASCADE",
                                 ondelete="CASCADE"),
                      nullable=False)
    symbol = relationship('Symbol', backref='minute_bars')
    UniqueConstraint(symbol_id, date)

4. Crear la base de datos

Con nuestras clases de tabla creadas, creemos una función que cree nuestra base de datos. Usamos los metadatos de Base para crear todas nuestras clases que heredan de Base.

def create():
    Base.metadata.create_all(db)
create()

Deja un comentario