반응형
반응형

[python] 과거 당첨번호 중 출현빈도 상위 기준으로 로또번호 추출

 

 

 


"""
    python 기존 로또 당첨번호를 이용한 로또 번호 추출 프로그램

"""



import pandas as pd
import random
from collections import Counter

def load_winning_numbers(filepath="winning_numbers.csv"):
    """
    CSV 파일에서 로또 당첨 번호를 불러옵니다.
    """
    try:
        df = pd.read_csv(filepath)
        # 추첨 번호(drwtNo1 ~ drwtNo6)만 추출합니다.
        winning_nums_cols = [f'drwtNo{i}' for i in range(1, 7)]
        return df[winning_nums_cols]
    except FileNotFoundError:
        print(f"오류: '{filepath}' 파일을 찾을 수 없습니다.")
        print("동행복권 웹사이트 등에서 당첨 번호 데이터를 CSV 파일로 다운로드하여 같은 폴더에 넣어주세요.")
        return None
    except Exception as e:
        print(f"데이터 로딩 중 오류 발생: {e}")
        return None

def analyze_number_frequency(winning_numbers_df):
    """
    각 숫자의 출현 빈도를 분석합니다.
    """
    all_numbers = []
    # 모든 당첨 번호 목록을 하나로 합칩니다.
    for index, row in winning_numbers_df.iterrows():
        all_numbers.extend(row.tolist())
    
    # 각 숫자의 출현 횟수를 셉니다.
    number_counts = Counter(all_numbers)
    
    # 빈도수 기준으로 내림차순 정렬
    sorted_counts = sorted(number_counts.items(), key=lambda item: item[1], reverse=True)
    
    return dict(sorted_counts) # {숫자: 빈도수} 형태로 반환

def generate_random_numbers():
    """
    가장 기본적인 방법으로 6개의 무작위 로또 번호를 생성합니다.
    """
    return sorted(random.sample(range(1, 46), 6))


def generate_numbers_based_on_frequency(number_frequency, num_recommendations=1, exclude_numbers=None):
    """
    과거 당첨 빈도를 기반으로 로또 번호를 추천합니다.
    (이 전략은 통계적 예측이 아닌, 자주 나온 번호 중에서 무작위로 선택하는 방식입니다.)
    """
    if number_frequency is None:
        print("경고: 번호 빈도 분석 데이터를 찾을 수 없어 무작위 번호를 생성합니다.")
        return [generate_random_numbers() for _ in range(num_recommendations)]

    # 빈도수가 높은 순서대로 숫자 목록을 만듭니다.
    # (실제로는 빈도수에 가중치를 두어 추출하는 더 복잡한 알고리즘도 가능합니다)
    sorted_numbers = list(number_frequency.keys())
    
    recommendations = []
    for _ in range(num_recommendations):
        generated_numbers = set()
        
        # 이미 추천된 번호들을 제외할 경우
        if exclude_numbers:
            available_numbers = [num for num in sorted_numbers if num not in exclude_numbers]
        else:
            available_numbers = sorted_numbers
        
        # 혹시 available_numbers가 6개 미만일 경우를 대비
        if len(available_numbers) < 6:
            print("경고: 추천할 수 있는 숫자가 충분하지 않습니다. 모든 번호에서 추출합니다.")
            available_numbers = list(range(1, 46))

        # 빈도수 기반으로 6개의 고유한 번호 추출
        # (단순히 빈도수 높은 순서대로 앞에서 6개 뽑는 것이 아니라,
        # 빈도수를 가중치로 해서 랜덤 샘플링하는 것이 더 무작위적입니다.)
        # 여기서는 편의상, 빈도수 높은 순서대로 나열된 리스트에서 랜덤하게 뽑습니다.
        
        # 더 나은 방법: 빈도수에 비례하여 숫자를 뽑기 (예: [1,1,1,2,2,3] -> 1,2,3이 나올 확률이 다름)
        # 이 예시에서는 단순화하여, 빈도수 순서대로 나열된 숫자 리스트에서 6개를 고유하게 뽑습니다.
        
        # 자주 나온 번호들 중에서 (예: 상위 20개) 무작위로 6개 선택
        top_n_numbers = sorted_numbers[:20] # 상위 20개 번호
        if len(top_n_numbers) < 6:
             # 혹시 상위 20개보다 전체 숫자가 적다면
             top_n_numbers = sorted_numbers

        # 상위 번호들 또는 전체 번호에서 무작위로 6개 선택
        try:
            chosen_numbers = sorted(random.sample(top_n_numbers, 6))
        except ValueError: # 만약 top_n_numbers가 6개 미만일 경우
            chosen_numbers = sorted(random.sample(available_numbers, 6))

        recommendations.append(chosen_numbers)
        
    return recommendations

# --- 메인 프로그램 ---
if __name__ == "__main__":
    file_path = "winning_numbers.csv" # 로또 당첨 번호 CSV 파일 경로
    
    print("==== 로또 번호 추천 프로그램 ====")
    
    # 1. 과거 당첨 번호 로드
    winning_numbers_df = load_winning_numbers(file_path)
    
    if winning_numbers_df is not None:
        # 2. 번호 빈도 분석
        number_frequency = analyze_number_frequency(winning_numbers_df)
        print("\n[과거 당첨 번호 출현 빈도 (상위 10개)]")
        for number, count in list(number_frequency.items())[:10]:
            print(f"  - 숫자 {number}: {count}회")

        # 3. 로또 번호 추천
        num_sets_to_recommend = 5 # 몇 세트의 번호를 추천받을지 설정
        
        # 빈도 기반 추천
        frequency_based_recommendations = generate_numbers_based_on_frequency(
            number_frequency, 
            num_recommendations=num_sets_to_recommend
        )
        
        print(f"\n[과거 당첨 빈도 기반 추천 번호 ({num_sets_to_recommend} 세트)]")
        for i, numbers in enumerate(frequency_based_recommendations):
            print(f"  세트 {i+1}: {numbers}")
            
        # 단순 무작위 추천 (비교용)
        random_recommendations = [generate_random_numbers() for _ in range(num_sets_to_recommend)]
        print(f"\n[단순 무작위 추천 번호 ({num_sets_to_recommend} 세트)]")
        for i, numbers in enumerate(random_recommendations):
            print(f"  세트 {i+1}: {numbers}")
            
    else:
        print("\n데이터 로딩 실패로 인해 번호 추천을 진행할 수 없습니다.")
        print("프로그램을 종료합니다.")
반응형
반응형

[Chrome] 읽기모드 사용하기. reader mode, reading mode

 

크롬 읽기모드 활성화 및 단축키 설정 방법

  1. 크롬 플래그(Flags) 설정 열기: 크롬 주소창에 chrome://flags를 입력하고 엔터를 누릅니다.
  2. 'Reader Mode' 활성화: 검색창에 **'Reader Mode'**를 입력한 후, 해당 항목의 설정을 'Enabled'로 변경합니다.
  3. 크롬 재시작: 설정 변경 후, 하단에 뜨는 'Relaunch' 버튼을 클릭하여 크롬을 재시작합니다.
  4. 읽기모드 활성화 단축키 만들기:
    • 재시작 후, 읽기모드를 적용하고 싶은 웹페이지를 엽니다.
    • 주소창 오른쪽 끝에 책 모양 아이콘이 나타나는데, 이 아이콘을 마우스 오른쪽 버튼으로 클릭합니다.
    • '읽기 모드 바로가기 만들기' 또는 **'단축키 지정'**과 유사한 메뉴를 찾아 원하는 단축키를 설정합니다.

이 방법을 통해 자주 사용하는 웹페이지에서 읽기모드를 더 편리하게 이용할 수 있습니다. 하지만, 모든 웹페이지에서 이 아이콘이 뜨는 것은 아니며, 주로 텍스트가 많은 기사나 블로그 글에서만 활성화됩니다.

 

 

 

 

 

 

반응형
반응형

인스타그램, 마침내 iPad 앱 출시 (about.instagram.com)

 

- 더 편하게 Reels 감상(아이폰 용과 다르게 릴스가 기본 화면. 타임라인은 탭해야 보임)
- 새로운 팔로잉 탭 도입: 전체(팔로우)/친구(맞팔)/최신(시간순) 보기
- 큰 화면에 최적화된 인스타그램 경험
  * 메시지와 알림 두개의 탭을 같이 보기
  * Reels 감상시 전체화면 크기로 재생하며 댓글보기 가능
- iPadOS 15.1 이상
- Instagram - App Store 링크(기존 앱이 iPad도 지원)

 

https://apps.apple.com/us/app/instagram/id389801252?platform=ipad

 

‎Instagram

‎Little moments lead to big friendships. Share yours on Instagram. — From Meta Connect with friends, find other fans, and see what people around you are up to and into. Explore your interests and post what's going on, from your daily moments to life's

apps.apple.com

 

 

https://about.instagram.com/blog/announcements/instagram-for-ipad/

 

iPad용 Instagram: 소통, 릴스 시청, 탐색을 더 넓히는 방법

iPad용 Instagram을 소개합니다! 릴스, 스토리, 팔로잉 탭을 더 큰 화면에서 볼 수 있도록 설계된 이 앱에서 소통을 이어가고 계속 재미있게 활동해보세요.

about.instagram.com

 

반응형
반응형

[AI] 오픈AI '10년 판짜기'의 여정

 

생성형 AI의 등장 이후 가장 뜨거운 화두는 단연 오픈AI입니다. 하지만 그들은 단순히 강력한 모델을 만드는 데 그치지 않습니다. 오픈AI의 전략은 마치 체스 게임처럼 장기적인 안목으로 설계된 '10년 판짜기'에 가깝죠. 표면적으로는 놀라운 기술적 진보가 전부인 것처럼 보이지만, 그 이면에는 AI 시대의 모든 기술과 시장을 직접 설계하려는 거대한 야망이 숨겨져 있습니다.

 

오픈AI는 크게 두 가지 핵심 축을 중심으로 기업 개발 전략을 전개하고 있습니다. 첫째는 수직적으로 통합된 기술 스택을 구축하기 위한 전략적 인수이며, 둘째는 지배적인 플랫폼 생태계를 조성하기 위한 오픈AI 스타트업 펀드를 통한 벤처 투자입니다. 이러한 이중적 접근 방식은 오픈AI가 연구 중심의 조직에서 성숙한 제품 주도형 기술 대기업으로 빠르게 전환하고 있음을 보여주죠.

 

 

 

오픈AI가 투자했던 스타트업 일부를 보여주는 그래픽입니다. 저는 개발자 도구 '커서'와 에듀테크 '스픽'이 눈에 띄네요. <출처=CB인사이츠>

 

https://www.cbinsights.com/research/openai-investment-strategy/

 

 

 

연결점 찾기 : 다 이유가 있다
 

여기서 잠깐! 오픈AI가 어떤 회사인지를 알고 넘어가는 것도 중요합니다. 오픈AI는 기본적으로 '인공 일반 지능(AGI)이 모든 인류에게 이익을 주도록 보장한다'는 사명을 추구하기 위해 비영리 이사회가 통제하는 이른바 '수익 상한'(capped-profit) 기업이라는 독특한 구조를 채택했습니다. 이 구조는 현재 오픈AI의 기업 전략 전반에 깊은 영향을 미치고 있죠.

 

한편으로는 장기적이고 자본 집약적인 연구를 추구할 수 있는 자유를 부여하지만, 다른 한편으로는 막대한 컴퓨팅 비용을 충당하기 위해 상당한 수익을 창출해야 하는 필요성을 야기합니다.

 

서두에서 잠깐 언급한 대로 오픈AI가 성장을 위해 전략적 인수와 벤처 투자에 집중하는 것도 이 때문입니다. 핵심 기술과 관련 인재를 확보하기 위해 아예 해당 회사를 사들이거나 오픈AI 스타트업 펀드를 통해 생태계를 키우는  것! 이는 AI라는 거대한 '엔진'의 성능을 끌어올리는 동시에 그 엔진을 활용한 다양한 '차량'(외부 애플리케이션)이 번성할 수 있는 환경을 조성하는 이중 전략인 셈입니다.

 

이러한 접근 방식은 단순한 기업 성장을 넘어섭니다. AI 기술 스택의 핵심과 떠오르는 애플리케이션 생태계에 대한 통제권을 확보하려는 정교한 계산이죠. 예를 들어 '록셋'(데이터 인프라)이나 '스탯시그'(제품 테스트) 같은 기업 인수는 핵심 성능 지표에 대한 직접적인 통제권을 부여하고 외부 의존도를 낮춥니다. 동시에 스타트업 펀드는 오픈AI API에 깊숙이 의존하는 기업들에 투자함으로써 높은 전환 비용을 만들고 플랫폼의 '고착 효과'를 강화합니다.


이는 과거 마이크로소프트가 운영체제(OS)를 통해 개발자 생태계를 장악하고, 애플이 하드웨어부터 소프트웨어, 앱스토어까지 모두 통제했던 전략과 매우 유사합니다. 결국 오픈AI는 AGI를 구축하는 것을 넘어 스스로가 필수불가결한 중심이 되는 시장을 설계하고 있는 것입니다. (여러분의 생각은 어떠신가요?)

 

https://stibee.com/api/v1.0/emails/share/AMi-SHhFWDC8OeLrRnnAwjcvkbriMlY

 

지능의 설계자: 오픈AI가 숨긴 '마스터플랜'은?

[미라클레터] 미라클모닝을 하는 이들의 참고서

stibee.com

 

반응형
반응형

[python] Blackhole Glow using python

 

import matplotlib.pyplot as plt, numpy as np
plt.style.use("dark_background")
O = np.linspace(0, 10*np.pi, 2000)
r = 1/(1+0.2*O)
x, y = r*np.cos(O), r*np.sin(O)
plt.scatter(x, y, c=O, cmap="magma", s=3)
plt.axis("equal");
plt.show()

 

반응형
반응형

 

LAG 함수란?

LAG 함수는 SQL 윈도우 함수의 한 종류로, 현재 행을 기준으로 이전 행의 값을 가져오는 역할을 합니다. 주로 시계열 데이터나 순서가 중요한 데이터에서 이전 행의 값과 현재 행의 값을 비교하거나 계산할 때 사용됩니다.

 

LAG (scalar_expression [, offset] [, default]) OVER (
[PARTITION BY partition_expression, ... ]
ORDER BY sort_expression [ASC | DESC], ...
)

 

 

  • scalar_expression: 이전 행에서 가져오고 싶은 컬럼의 이름.
  • offset: 현재 행으로부터 몇 칸 이전의 행을 참조할지 지정합니다. 기본값은 1입니다.
  • default: offset만큼 떨어진 이전 행이 없을 때(보통 첫 번째 행), 반환할 기본값입니다. 기본값은 NULL입니다.
  • PARTITION BY: 데이터를 특정 그룹으로 나눕니다. 그룹이 바뀌면 LAG 연산도 다시 시작됩니다.
  • ORDER BY: 행의 순서를 결정합니다. LAG 함수는 이 순서에 따라 이전 행을 식별합니다.

 

 

 

 

  • LAG(Amount, 1, 0): Amount 컬럼의 값을 가져오되, 1칸 이전 행의 값을 가져오고, 이전 행이 없을 경우 0을 반환합니다.
  • OVER (ORDER BY SaleDate): 데이터를 SaleDate 오름차순으로 정렬하여 LAG 함수가 순서를 인식하도록 합니다.

LAG 함수는 이처럼 이전 값과의 비교, 이전 대비 변화량 계산, 누적 합계 재계산 등 다양한 분석 작업에 매우 유용합니다.

 

 

 

반응형

+ Recent posts