brunch

You can make anything
by writing

C.S.Lewis

by 유윤식 Jul 23. 2024

Python : 1 / 8145060 (2)

#로또1등 #당첨번호

이제 당첨번호를 모조리 긁어와서 데이터를 만들어본다.


어떤 번호가 당첨이 되는 번호일까?

사실 이 부분은 별로 호기심이 생기지는 않는다.


내 목표는 어떤 순번(즉 모든 경우의 수를 나열했을 때 index 위치가 중요함) 일지가 관심사다.


일단 선행조건으로 위와 같이 1등 당첨번호 히스토리를 가져와야한다.


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


엑셀 다운로드 클릭!


여기서 문제가 pandas 로 바로 읽어들이기가 어렵다.


>> pip install lxml

해당 라이브러리를 설치해줘야 가능하다.



import pandas as pd


path = '../Downloads/lotto600.xls'


res = pd.read_html(path)



근데 문제는 여기서 끝나지 않는다. 다시 한 번 정제가 필요한데,


cols = []

for i, v in zip(res[1].iloc[0].to_list(), res[1].iloc[1].to_list()):

    print(i, v)

    if i == v:

        cols.append(i)

    else:

        cols.append(i + '_' + v)



우선 컬럼을 모두 모아주고,



import polars as pl

df = pl.DataFrame(res[1][2:], schema=cols)



빠른 연산을 위해서 Polars 로 데이터를 다시 읽어주었다.


우선 필요한 컬럼만 빠르게 보기위해서


df = df.select([

    pl.col('년도').cast(pl.Int32),

    pl.col('회차').cast(pl.Int32),

    pl.col('추첨일').str.to_datetime(format="%Y.%m.%d"),

    pl.col('당첨번호_1').cast(pl.Int32),

    pl.col('당첨번호_2').cast(pl.Int32),

    pl.col('당첨번호_3').cast(pl.Int32),

    pl.col('당첨번호_4').cast(pl.Int32),

    pl.col('당첨번호_5').cast(pl.Int32),

    pl.col('당첨번호_6').cast(pl.Int32),

    pl.col('당첨번호_보너스').cast(pl.Int32).alias('당첨번호_7')

])


# 코드가 지저분함 --> 리팩토링 필요함!

df = df.with_columns([

    pl.concat_list(['당첨번호_'+str(i) for i in range(1, 8)]).alias('당첨번호')

])



당첨번호는 리스트로 만들어져있다.


우선 이것만 가져다 사용해도 당첨번호가 이전에 만든 모든 조합에서 몇번째에 해당하는지 알 수 있을 것 같다.


대략 생각나는건 for 구문이나 numpy 의 where, isin 등을 사용하면 될 것 같다.

작가의 이전글 Python : 1 / 8145060
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari