【问题标题】:Django Models for Time Series Data时间序列数据的 Django 模型
【发布时间】:2018-07-03 12:43:36
【问题描述】:

我和我的朋友们构建了一个买卖股票的应用程序,我们希望在一天结束时保留我们所拥有的每只股票的历史价格。三个最重要的字段是 股票代码价格日期

例如:

01/01/2018 - Bought Stock A, record price of Stock A at end of day(EOD)
01/02/2018 - Did nothing, record price of Stock A at EOD
01/03/2018 - Bought Stock B, record price of Stock A and Stock B at EOD
01/04/2018 - Sell Stock A, record price of Stock B at EOD

我们正在使用 Django 来构建模型。每天我们都会记录我们拥有的每只股票的价格。本组数据仅供外部使用,不会对外公开。

我的初步研究告诉我,为历史价格提供一个表格并将每只股票的每个价格存储为一行并不理想。我不确定使用 Django 时最好的方法是什么。存储所有这些数据的 Django 模型是什么样的?我们应该使用 MYSQL 吗?

【问题讨论】:

    标签: django database django-models time-series


    【解决方案1】:

    你分成 3 个数据模型:

    • 股票模型,包含指向历史、当前价格和数量以及元数据的链接
    • 购买历史的模型
    • 价格历史模型

    这三个都与来自股票模型的外键链接。示例代码:

    from django.db import models
    from django.util.translation import ugettext_lazy as _
    from datetime import date
    
    
    class StockAsset(models.Model):
        symbol = models.CharField(max_length=5)
        amount = models.PositiveIntegerField()
        price = models.FloatField()
    
    class PurchaseHistory(models.Model):
        BUY = 1
        SELL = 2
        ACTION_CHOICES = (
            (BUY, _('buy')),
            (SELL, _('sell')),
        )
        action = models.PositiveIntegerField(choices=ACTION_CHOICES)
        action_date = models.DateTimeField(auto_now_add=True)
        stock = models.ForeignKey(StockAsset,
            on_delete=models.CASCADE, related_name='purchases'
        )
    
    class PriceHistory(models.Model):
        stock = models.ForeignKey(StockAsset, on_delete=models.CASCADE, related_name='price_history')
        price_date = models.DateField(default=date.today)
    

    这样您就可以从 StockAsset 模型中访问所有内容。开始reading here

    为此,选择的数据库类型并不重要。如果您没有偏好,请使用 PostgreSQL。

    【讨论】:

    • 感谢您的回答,梅尔文!这是我的理解,StockAsset 表将跟踪我们对所述库存的最新价格和数量。 PurchaseHistory table 将跟踪我们所有的交易。 PriceHistory 将跟踪 EOD 的所有历史数据。我做对了吗?你知道这是否适用于规模?假设我们有 2000 股股票,我们每天存储 2000 个价格。
    • 它可以很好地扩展,对于大多数用例来说,您最多只能创建两个小表连接。
    • price_date 是一个日期字段,那么您将价格历史存储在哪里?
    • 不要使用 Float 作为货币 - 使用 Decimal。
    • @phi 或更好,int。
    【解决方案2】:

    如果您只关心date,而不关心每一次价格变动的时间戳 那么django-simple-history 是一条路。

    您只需更新值(价格)并将其按时间序列保存在不同的表中,这取决于该库,甚至不需要定义 date 字段。

    class StockAsset(models.Model):
        history = HistoricalRecords()
    
        symbol = models.CharField(...)
        price = models.DecimalField(max_digit=8, decimal_places=2)
    

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 2018-02-02
      • 2013-06-09
      • 1970-01-01
      • 2020-07-21
      相关资源
      最近更新 更多