ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python/통계에 따른 로또 번호 생성기
    코딩/Python 2024. 5. 9. 21:47
    728x90

    통계에 의한 로또번호 생성기

    방식

    아래 주소를 방문하면 번호별로 당첨된 횟수를 조회할 수 있다.

    https://dhlottery.co.kr/gameResult.do?method=statByNumber

    여기서 찾은 자료를 바탕으로 숫자풀을 만든다.

    숫자*당첨횟수로 구성된 리스트를 만든다. 예를 들어, 1이 두 번, 2가 세 번이면 숫자풀은 [1,1,2,2,2]가 되는 식이다.

    생성된 리스트를 random의 shuffle()로 섞고 첫번째 번호를 저장하고 중복되지 않는 숫자 6 개가 채워질 때까지 반복한다. 6 개가 채워지면 이를 출력하고 다시 10 회를 반복해서 10 개의 조합을 만든다.

    필요한 라이브러리

    import pandas as pd
    import random
    import requests
    from bs4 import BeautifulSoup
    from io import StringIO

    main()

    통계자료를 dataframe으로 가져오고, dataframe의 각 열을 리스트로 변환 후 번호풀을 만든다. 그 후 로또생성기를 10 회 실행하여 10 개의 조합을 만든다.

    상수는 확률파일 저장경로와 확률자료의 url이다.

    def main():
        get_frequency()
    
        numbers = df['번호'].tolist()
        frequencies = df['당첨횟수'].tolist()
    
        numbers_pool = get_numbers_pool(numbers, frequencies)
    
        for i in range(10):
            lottery = get_lottery(numbers_pool)
            print(f"조합 {i+1}: {lottery}")
    
    PATH_LOTTERY = '/Users/Changhun/Life/Coding/MyApps/Life/lottery.csv'
    URL_DATA = 'https://dhlottery.co.kr/gameResult.do?method=statByNumber'
    
    main()

    통계자료를 가져오는 get_frequency():

    로또 사이트에서 통계자료를 가져온다.

    requests로 html을 가져오고, BeautifulSoup으로 파싱한 다음, 통계자료테이블을 pandas Dataframe으로 바꾼 후 반환한다.

    def get_frequency():
        res = requests.get(URL_DATA)
        soup = BeautifulSoup(res.text, 'lxml')
    
        table = soup.find('table', attrs={'class':'tbl_data tbl_data_col'})
    
        df = pd.read_html(StringIO(str(table)))[0]
        df.drop('그래프', axis='columns', inplace=True)
    
        df.to_csv(PATH_LOTTERY, index=False, encoding='utf-8-sig')
    
        return sorted(lottery)

    번호풀을 만드는 get_numbers_pool()

    숫자*빈도의 방식으로 숫자풀을 만들고 반환한다.

    def get_numbers_pool(numbers, frequencies):
        numbers_pool = []
        for num, freq in zip(numbers, frequencies):
            numbers_pool.extend([num] * freq)
    
        return numbers_pool

    빈도에 따라 숫자 조합을 만드는 함수 get_lottery()

    shuffle()로 숫자풀을 섞은 후 나온 첫번 째 숫자들로 번호 세트를 만든다. 중복되지 않는 6 개의 번호묶음을 만들기 위해 for문이 아닌 while문을 사용한다.

    def get_lottery(numbers_pool):
        lottery = []
        i = 0
        while i < 6:
            random.shuffle(numbers_pool)
            number = numbers_pool[0]
    
            if not number in lottery:
                lottery.append(number)
                i += 1
    728x90

    '코딩 > Python' 카테고리의 다른 글

    Python/Pandas/10 minutes to pandas  (0) 2024.05.03
    Pyton/프로그램의 종료, exit() & quit()  (0) 2024.04.17
    Python/프로젝트 패키징  (1) 2024.03.15
    Python/Reference/어휘분석  (1) 2024.03.15
    Python/Reference/소개  (0) 2024.03.15

    댓글

Designed by Tistory.