ナンバーズ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予測
あたりも記事にまとめていこうと思います。


コメント