Django + PostgreSQLでナンバーズ3データベースを作る【DB設計】

Django

ナンバーズ3の抽選データを分析するために、
Django + PostgreSQLでデータベースを構築しました。

やりたいことはこのあたりです。

  • ナンバーズ3の抽選結果を保存
  • 機械学習の予測結果を保存
  • 的中判定と収支を管理

この記事では

  • ナンバーズ3のDB設計
  • Django models.py
  • 予測データ管理の方法

をまとめておきます。


ナンバーズ3データベース設計

まずテーブル構成です。

今回の構成はこの2つです。

テーブル役割
Numbers3抽選結果データ
PredictionHistory3予測履歴

このように

抽選結果
↓
予測
↓
的中判定
↓
収支

という流れでデータを管理しています。


ナンバーズ3抽選結果テーブル

ナンバーズ3の基本情報を保存するテーブルです。

保存するデータ

  • 回別
  • 抽せん日
  • 抽せん数字
  • 当選口数
  • 当選金額
  • 販売実績

Djangoモデルはこのように定義しています。

from django.db import models

class Numbers3(models.Model):
    draw_number = models.PositiveIntegerField(verbose_name="回別", unique=True)
    draw_date = models.DateField(verbose_name="抽せん日")
    draw_numbers = models.CharField(verbose_name="抽せん数字", max_length=3)

    straight_wins = models.PositiveIntegerField(verbose_name="ストレート口数")
    straight_amount = models.PositiveIntegerField(verbose_name="ストレート当選金額")

    box_wins = models.PositiveIntegerField(verbose_name="ボックス口数")
    box_amount = models.PositiveIntegerField(verbose_name="ボックス当選金額")

    set_straight_wins = models.PositiveIntegerField(verbose_name="セット(ストレート)口数")
    set_straight_amount = models.PositiveIntegerField(verbose_name="セット(ストレート)当選金額")

    set_box_wins = models.PositiveIntegerField(verbose_name="セット(ボックス)口数")
    set_box_amount = models.PositiveIntegerField(verbose_name="セット(ボックス)当選金額")

    mini_wins = models.PositiveIntegerField(verbose_name="ミニ口数")
    mini_amount = models.PositiveIntegerField(verbose_name="ミニ当選金額")

    sales = models.PositiveIntegerField(verbose_name="販売実績額")

    class Meta:
        verbose_name = "ナンバーズ3"
        verbose_name_plural = "ナンバーズ3"

    def __str__(self):
        return f"第{self.draw_number}回 - {self.draw_date}"

ポイントは

draw_number

unique にしていることです。

ナンバーズ3は回号が一意なので
重複データを防ぐことができます。


予測履歴テーブル

次は 機械学習の予測データです。

ここでは

  • 予測結果
  • 実際の当選結果
  • 的中判定
  • 収支

をまとめて管理します。

Djangoモデルはこのようにしています。

class PredictionHistory3(models.Model):

    draw_number = models.IntegerField(unique=True, verbose_name="回号")

    prediction_date = models.DateField(auto_now_add=True, verbose_name="予測実行日")

    predicted_box_count = models.IntegerField(verbose_name="予測したBOX候補数")

    predicted_n1 = models.CharField(max_length=10, verbose_name="予測候補_百の位")
    predicted_n2 = models.CharField(max_length=10, verbose_name="予測候補_十の位")
    predicted_n3 = models.CharField(max_length=10, verbose_name="予測候補_一の位")

    predicted_box_list = models.TextField(verbose_name="予測BOXリスト")

    actual_draw_numbers = models.CharField(max_length=3, null=True, blank=True, verbose_name="実際の当選数字")
    actual_box_amount = models.IntegerField(null=True, blank=True, verbose_name="実際のBOX当選金額")

    is_hit = models.BooleanField(default=False, verbose_name="的中判定 (BOX)")

    investment = models.IntegerField(verbose_name="投資額")
    winnings = models.IntegerField(default=0, verbose_name="当選金額")
    profit = models.IntegerField(default=0, verbose_name="回号別収支")

    class Meta:
        verbose_name = "ナンバーズ3予測履歴"
        verbose_name_plural = "ナンバーズ3予測履歴"

    def __str__(self):
        return f"第{self.draw_number}回 予測履歴"

このテーブルでは

予測
↓
抽選結果
↓
収支

を一つのレコードで管理しています。


予測データの保存方法

予測データは

Pythonの機械学習スクリプトから
直接PostgreSQLへ保存しています。

lightgbm_num3_4.py

このスクリプトで

  • 予測数字
  • BOX候補

を計算してDBへ保存しています。


収支計算

収支は別スクリプトで計算しています。

numbers3_simulation_detail_history_n2.py

このスクリプトで

  • 的中判定
  • 当選金額
  • 回号別収支

を更新しています。

累積収支は
DBに保存せず、計算で出す形にしています。

これは

  • データの整合性
  • 計算ミス防止

のためです。


ナンバーズ4のデータベース

同じ構造で
ナンバーズ4のデータも保存しています。

class Numbers4(models.Model):

    draw_number = models.PositiveIntegerField(unique=True)
    draw_date = models.DateField()

    draw_numbers = models.CharField(max_length=4)

    straight_wins = models.PositiveIntegerField()
    straight_amount = models.PositiveBigIntegerField()

    box_wins = models.PositiveIntegerField()
    box_amount = models.PositiveBigIntegerField()

    set_straight_wins = models.PositiveIntegerField()
    set_straight_amount = models.PositiveBigIntegerField()

    set_box_wins = models.PositiveIntegerField()
    set_box_amount = models.PositiveBigIntegerField()

    sales = models.PositiveBigIntegerField()

ナンバーズ4は金額が大きいので
BigInteger を使っています。


まとめ

ナンバーズ3の分析用に

Django + PostgreSQLでデータベースを構築しました。

構成は

Numbers3
↓
PredictionHistory3
↓
収支計算

という形になっています。

このデータベースを使って

  • スクレイピング
  • 機械学習予測
  • 収支シミュレーション

などを行っています。

今後は

  • ナンバーズ3スクレイピング
  • LightGBM予測

あたりも記事にまとめていこうと思います。

コメント

タイトルとURLをコピーしました