基本解析クラスの作成

三種類のロトくじにおいて、数字の出現頻度や出現回数などを求める処理は共通化することができます。

そこで、共通化できる部分を基本解析クラスとして作成し、AnalysisBasicクラスと名づけました。
最初に作ったコードは以下の通り。

(ファイル名) analysis_basic.py

from collections import defaultdict
import numpy as np # 後で必要なのでインポートしておく

class AnalysisBasic:
    def __init__(self, loto_data, loto_div):
        """
        loto_data: ロトくじデータ
        loto_div:  ロトくじ区分(5:ミニロト,6:ロト6, 7:ロト7)
        """
        self._data = loto_data # LotoBasicオブジェクトのリスト
        self.div = loto_div

    @property
    def max_no(self):
        """ロトくじ毎の最大数字を返す
        """
        return [31, 43, 37][self.div - 5]

loto_dataは、LotoBasicオブジェクトのリストです。
この中にあるロトくじの全データが入っています。

解析メソッドの追加

これだけでは何もできないので、今回は抽選数字の出現回数と出現頻度を求める関数を書いてみます。

    def frequency(self):
        """抽選数字の出現頻度をリストで返す
        """
        nums_dist = defaultdict(int)
        for loto_basic in self._data:
            for col in range(self.div):
                number = int(loto_basic.nums[col])
                nums_dist[number] += 1

        dist_list = list(range(self.max_no))
        for key in nums_dist.keys():
            dist_list[key-1] = nums_dist[key]

        return dist_list

    def number_ratio(self):
        """抽選数字の出現確率を返す
        """
        nums_ratio = np.array(self.frequency(), dtype=np.float64)
        return nums_ratio / sum(nums_ratio)

そんでもって、loto.pyにこれらの関数を呼び出すコードを追加します。

(ファイル名) loto.py

import sys
import numpy as np
from all_loto import AllLoto
from miniloto_analysis import MinilotoAnalysis
from loto6_analysis import Loto6Analysis
from loto7_analysis import Loto7Analysis
from algo.distribution import distribution
# from algo import distribution as dst

def main():
    if len(sys.argv) != 2:
        print("""引数の数が違います。
loto 種別(5,6,7) 抽選回(1〜)
""")
        sys.exit()

    div = int(sys.argv[1])
    if div < 5 or div > 7:
        print("宝くじ種別が違います。")
        print("""宝くじ種別:
5:ミニロト
6:ロト6
7:ロト7""")
        sys.exit()

    loto_class = [MinilotoAnalysis, Loto6Analysis, Loto7Analysis]

    all_loto = AllLoto()
    loto_data = [all_loto.miniloto, all_loto.loto6, all_loto.loto7]
        
    analysis = loto_class[div-5](loto_data[div-5])

    print(analysis.frequency())
    ratio = analysis.number_ratio()
    for no, i in enumerate(ratio):
        print("{number:2}:{val:5.3}".format(number=no+1, val=i*100))

    print(sum(ratio))

if __name__ == '__main__':
    main()

(実行例)

$ python loto.py 5 ※あるいは、loto 5
[119, 161, 151, 145, 149, 144, 148, 146, 142, 165, 178, 133, 141, 168, 143, 152, 150, 154, 159, 161, 156, 170, 159, 165, 146, 135, 147, 140, 139, 167, 162]
 1: 2.53
 2: 3.43
 3: 3.22
 4: 3.09
 5: 3.17
 6: 3.07
 7: 3.15
 8: 3.11
 9: 3.02
10: 3.51
11: 3.79
12: 2.83
13:  3.0
14: 3.58
15: 3.05
16: 3.24
17: 3.19
18: 3.28
19: 3.39
20: 3.43
21: 3.32
22: 3.62
23: 3.39
24: 3.51
25: 3.11
26: 2.88
27: 3.13
28: 2.98
29: 2.96
30: 3.56
31: 3.45
1.0

ここまでのソースを固めておくので、詳細はそちらをご覧ください。
lotonumber-0.0.6.tar.gz

PyPIにアップロードしてあるので、pipコマンドで開発環境にインストールすることもできます。

$ pip install lotonumber==0.0.6