ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SKN Family AI 15기 5월 4주차 회고(1)
    기록../SKN Family AI 15기 2025. 5. 20. 17:06

    ✍️5월 20일 학습 내용


    • 환경 설정(miniconda, jupyternotebook 환경에서 진행)
    • 파이썬의 변수명
      • 문자(a~Z) 또는 언더바(_)로 시작함
      • 숫자로 시작할 수 없음
      • 특수 문자가 들어가지 말아야 함
    • 한 번 만들어진 변수엔 재할당 할 수 있음
    • 파이썬은 인터프리터 언어로 변수 선언 시에 자료형을 정해주지 않아도 OK.
    • 동적 타이핑(Duck Typing)

    파이썬 자료형

    • 숫자형(int, float, double)
      • 숫자의 공학적 표기로 매우 크거나 매우 작은 숫자를 편하게 표현할 수 있다. (e5/e-6)
    • 시퀀스형(문자열, 리스트, 튜플, 딕셔너리)
      • 시퀀스형은 인덱스를 통해 접근 가능한 데이터이다.
    • 불리언형(True/False)
      • 비교 연산자 ( == / != / > / < / >= / <=)
      • 논리연산자(and/or/not)
      • 식별 연산자(int/not in/is/ is not)
        • 비교 연산자와 다르게 동일한 객체(메모리주소)인가를 확인함

    문자열과 메서드

    • format함수 : 문자열의 동적인 할당
      • 문자열 안에서 동적으로 글자를 할당하고 싶을 때 사용
      text = "hello {}!"
      
      text.format("korea")
      # {} 부분에 korea 라는 단어가 들어가게 됨
      
      new_str = "hello {}! Nice to meet {}."
      text.format("Korea", "You")
      # {}에 순차적으로 단어가 들어가게 됨
      
      print (f"string {x}") 
      # {} 자리에 지정한 변수가 들어가게 됨
      

    List 자료형과 시퀀스 순회(for 문을 활용!)

    • 시퀀스 자료형
    • 다른 자료형을 여러개 포함할 수 있음.
    • 리스트 슬라이싱
      • [n:m] → n부터 m-1까지 출력
      • [n:] / [:m] n부터 끝까지 / 0부터 m-1까지 출
      • [n:m:s] n부터 m-1까지 s칸씩 띄어서 출력
      • 음의 인덱스의 이해 : index[len-1]=index[-1]
      • 스텝을 음의 경우로 나타낼 경우 역순으로 출력함
    • in을 사용하여 해당하는 객체가 리스트 안에 들어있는지 확인할 수 있음
    price_1 = 5000
    minute_1 = 20
    
    price_2 = 100
    minute = 1
    for name in korea:
        if name in ["김ㅇㅇ","박ㅁㅁ","이ㅇㅇ"]:
            print(f"\\n 김미영 팀장입니다. {name}님 께서는 {price_2}억원까지 {minute}분이내 통장입금 가능합니다. \\n")
        else: 
            print(f"김미영 팀장입니다. {name}님 께서는 {price_1}만원까지 {minute_1}분이내 통장입금 가능합니다.")
            
            #korea 리스트를 돌면서 이름이 "김ㅇㅇ","박ㅁㅁ","이ㅇㅇ"인 사람들은 다른 문장을 출력함.
    • 파이썬의 연산자
      • 덧셈 (+)
      • 뺄셈 (-)
      • 곱셈 (*)
      • 나눗셈 (/)
      • 정수 나눗셈 (몫) (//)
      • 나머지 (%)
      • 거듭제곱 (*)
    for x in range(0,20):
        if x % 2 == 0:
            print(x)
            #짝수만 출력하기
    • 이중 반복문
    for x in range (2,4):
        for y in range(1,5):
            print(f"{x} * {y} = {x*y}")
    
    2 * 1 = 2
    2 * 2 = 4
    2 * 3 = 6
    2 * 4 = 8
    3 * 1 = 3
    3 * 2 = 6
    3 * 3 = 9
    3 * 4 = 12
    • 주요 리스트 메서드

    메서드 주요 기능 / 주의점

    append(item) 끝에 단일 요소 추가
    insert(index, item) 지정 위치에 단일 요소 삽입
    extend(iterable) 끝에 iterable의 모든 요소 추가
    remove(value) 첫 번째 값 제거 (ValueError)
    pop(index=-1) 지정 위치 요소 제거 및 반환 (IndexError)
    clear() 모든 요소 제거
    index(value, ...) 값이 없으면 ValueError
    count(value) 없으면 0 반환
    sort(key=.., rev=..) 리스트 제자리 정렬 (TypeError)
    reverse() 리스트 순서 제자리 뒤집기
    copy() 원본과 독립적인 복사본 생성 (내부 객체 공유)
    • 리스트 컴프리헨션
      • 리스트를 축약하여 표현할 수 있음
      • 간단하고 알아보기 쉬운 Python 식의 표현
    tmp_2 = [ x for x in range(10) ] #리스트 컴프리헨션
    tmp_2
    
    결과 : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    # 축약하여서 리스트를 추가할 수 있다.
    
    temp3 = [ x for x in range(10) if x%2 == 0]
    temp3
    
    결과 : [0, 2, 4, 6, 8]
    

     


    ✍️5월 21일 학습 내용


    request를 통해 웹 자료 다루기

    import requests
    
    url = "<https://www.starbucks.co.kr/store/getStore.do?r=86N465IIB2>"
    payload = {"in_biz_cds": "0",
    "in_scodes": "0",
    "ins_lat": "37.4745",
    "ins_lng": "126.8918",
    "search_text": "",
    "p_sido_cd": "01",
    "p_gugun_cd": "",
    "in_distance": "0",
    "in_biz_cd": "",
    "isError": "true",
    "searchType": "C",
    "set_date": "",
    "all_store": "0",
    "T03": "0",
    "T01": "0",
    "T27": "0",
    "T12": "0",
    "T09": "0",
    "T30": "0",
    "T05": "0",
    "T22": "0",
    "T21": "0",
    "T36": "0",
    "T43": "0",
    "Z9999": "0",
    "T64": "0",
    "T66": "0",
    "P02": "0",
    "P10": "0",
    "P50": "0",
    "P20": "0",
    "P60": "0",
    "P30": "0",
    "P70": "0",
    "P40": "0",
    "P80": "0",
    "whcroad_yn": "0",
    "P90": "0",
    "P01": "0",
    "new_bool": "0",
    "iend": "1000",
    "rndCod": "XW4W0LA4X8",}
    
    r = requests.post(url, data=payload)
    star = r.json()
    #서울시 스타벅스 매장 정보를 딕셔너리로 받아올 수 있다.
    
    star=star['list']
    
    star
    
    #매장 정보를 출력함. (주피터 lab에서 실행시 렉 주의!!)
    
    for name in star: #star = star['list']를 잊지 말아야 합니다
        if name['s_name'][-1] == "R":
            print(name['s_name'])
        #각 매장 이름의 패턴을 이용하여 원하는 매장 이름만 출력할 수도 있다.
    

    딕셔너리 - 키와 값

    • 딕셔너리는 키와 값을 가지는 자료형. {}로 표기한다.
    • JSON과 같은 양식을 가지고 있음
    temp = {}
    for x in "abcdeaae":
        if x in temp:
            temp[x] = temp[x]+ 1
            #키는 중복으로 있을 수 없기 때문에, 다음의 코드는 중복의 키를 만나면 키에 값이 있다고 판단하고 그 값을 1 더해줌.
        else:
            temp[x] = 1
            # abcdeaae를 키로 두고고, 각 키에 1이라는 값을 할당함.
    
    실행 결과
    {'a': 3, 'b': 1, 'c': 1, 'd': 1, 'e': 2}
    

    😆응용

    각 구군 별로 몇 개의 스타벅스 매장이 있는지 조사해보자!

    gugun_list = {} #각 구군 별 매장 개수를 저장할 딕셔너리를 정의합니다.
    
    for x in star:#리스트화 시킨 star을 순회하면서 검색합니다.
        if x['gugun_name'] in gugun_list:
            gugun_list[x['gugun_name']] +=1
            #중복되는 키가 있다면, 그 키에 대한 값을 +1 시켜줍니다.
        else:
            gugun_list[x['gugun_name']]=1 
            #만약 검색한 이름이 현재 딕셔너리에 없다면 새로운 키로 만들어주고, 그 값을 1로 설정합니다.
        
    

    출력 결과

    {'강남구': 96,
     '강북구': 7,
     '강서구': 32,
     '관악구': 13,
     '광진구': 19,
     '금천구': 14,
     '노원구': 15,
     '도봉구': 7,
     '동작구': 13,
     '마포구': 37,
     '서대문구': 21,
     '서초구': 52,
     '성북구': 17,
     '송파구': 37,
     '양천구': 17,
     '영등포구': 41,
     '은평구': 16,
     '종로구': 40,
     '중구': 50,
     '강동구': 20,
     '구로구': 14,
     '동대문구': 14,
     '성동구': 15,
     '용산구': 25,
     '중랑구': 9} #강남구에 이렇게 많은 스벅 매장이...
    

    문자열 메서드

    • 주요 문자열 메서드
      • split(): 문자열을 리스트로 분리.
      • join(): 문자열 리스트를 하나의 문자열로 결합.
      • replace(): 부분 문자열을 찾아 다른 문자열로 교체.
      • find() : 해당 문자열이 시작되는 인덱스 값을 검색.
      • index(): 부분 문자열의 위치 검색.
      • upper() / lower(): 대소문자 변환.
      • strip() / lstrip() / rstrip(): 양쪽 또는 한쪽 끝의 특정 문자 제거.
      • count(): 부분 문자열의 출현 횟수 계산.
      • startswith() / endswith(): 문자열의 시작 또는 끝 패턴 확인.

    😆응용

    split() 함수를 이용하여 가사에서 가장 많이 쓰인 단어가 무엇인지 출력해보자.

    • 조건 : 한 음절의 단어는 제외!
    lyrics = """따사로운 햇살 속에서
    종소리가 울려 퍼지네
    뺨을 매만지는 바람
    한숨만은 깊어져만 가고
    저 멀리서 핑 도는 눈물
    이름을 붙여준 내일
    포개어지는 미래 빛 라인
    천진난만한 이런 기분도
    신이 나서 날아갈 정도로 웃었던 날도
    사랑스럽고 소중하게 키울 수 있도록
    어렵고 힘들었던 시간을 넘어서
    아주 많은 처음을 주었잖아
    이어져 가서는 닿기를
    천진난만한 이런 기분도
    신이 나서 날아갈 정도로 웃었던 날도
    사랑스럽고 소중하게 키울 수 있도록
    어렵고 힘들었던 시간을 넘어서
    아주 많은 처음을 주었잖아
    이어져 가서는
    천진난만한 이런 기분도
    신이 나서 날아갈 정도로 웃었던 날도
    사랑스럽고 소중하게 키울 수 있도록
    어렵고 힘들었던 시간을 넘어서
    아주 많은 처음을 주었잖아
    이어져 가서는
    이어져 가서는 닿기를""" #여러 줄의 문자열을 표현하기
    
    splited_lyrics = lyrics.split()
    
    phrase = {}
    for x in splited_lyrics:
        if len(x) <=1:
                pass
        else:
                if x in phrase:
                    phrase[x]+=1
                else:
                    phrase[x]=1
    phrase_list = **sorted**(phrase.items(),key=lambda x: x[1], reverse=True)
    print(phrase_list[:10])
    
    [('이어져', 4), ('가서는', 4), ('천진난만한', 3), ('이런', 3), ('기분도', 3), ('신이', 3), ('나서', 3), ('날아갈', 3), ('정도로', 3), ('웃었던', 3)]
    
    • sorted() : 리스트 내용물을 오름차순으로 정렬함.
    • key=lambda x: x[1] : 이것을 사용하면 값을 기준으로 정렬하게 됩니다.

    find() 함수를 사용하여 가산시에 있는 스타벅스 지점을 알아보자!

    for addr in star:
        if addr['addr'].find("가산")>-1: #find()함수는 부재할 경우 -1을 반환합니다.
            print(addr['addr'], addr['addr'])
        '''
        혹은 이런 방법도 있다.
        if '가산' in addr['addr']
        '''
    

    사용자 함수 정의하기

    • 사용자 함수를 정의하기 위해서는 def라는 키워드를 사용한다.
    def get_starbucks(dong):
        #함수 기능
        for addr in star:
            if addr['addr'].find(dong)>-1:
                print(addr['addr'], addr['addr'])
                
                #동 이름을 매개변수로 받아 해당 지역의 스타벅스 지점을 출력한다.
    
    • 안에서 처리한 결과는 보통 return을 통해 반환한다.
    • return을 만나면 함수는 더 진행되지 않기 때문에, return 아래 구문은 실행되지 않는다.
    • 전달해야하는 파라미터 개수가 맞지 않으면, 에러가 발생하기 때문에 주의.
    def multi(x,y):
    		return x*y
    		
    
    result = multi(3,4)
    print(result)
    #결과 : 12
    

    😆BMI 지수를 계산하는 함수를 만들어보자

    #BMI 계산법: 몸무게(kg) / (키(h)*키(h))
    
    def BMI_calculator(height, weight):
        height *= 0.01 #키가 cm 단위로 들어오기 때문에, m로 변환!
        BMI= weight / height**2
        return BMI
    
    BMI_calculator(158,52)
    

    import로 모듈 불러오기

    import로 datetime 모듈을 불러와 사용하기

    import datetime
    
    for day in range(100,1001, 100):
    #오늘로부터 100일, 200일, 300일... 1000일 뒤의 날짜를 출력해주는 프로그램
    
        print(datetime.datetime.today() + datetime.timedelta(days=day), end=" --> ")
        #해당 날의 요일을 출력 (0:월~ 6:일) 
        print((datetime.datetime.today() + datetime.timedelta(days=day)).weekday())
     
    
    datetime.datetime.strptime(x['open_dt'], "%Y%m%d").weekday()
    # 오픈 날짜의 요일을 출력하는 코드
    

    응용!

    datetime을 이용해서 어느 요일에 가장 자주 오픈했는지 확인하기

    #나의 코드
    
    weekday_list = {}
    week_name = ['월','화','수','목','금','토','일']
    
    for w in star_list:
        open_date = datetime.datetime.strptime(w['open_dt'], "%Y%m%d")
        week_day = week_name[open_date.weekday()]
    
        if week_day in weekday_list:
            weekday_list[week_day]+=1
        else:
            weekday_list[week_day]=1
        
    
    • 강사님 코드(참고)
    weekday_list = {}
    week_name = ['월','화','수','목','금','토','일']
    
    for w in star_list:
        week_name = dict(zip(range(0,7), "월화수목금토일"))[datetime.datetime.strptime(w['open_dt'], "%Y%m%d").weekday()]
        
    
        if week_name in weekday_list:
            weekday_list[week_name]+=1
        else:
            weekday_list[week_name]=1
        
    

    경로

    절대경로와 상대경로

    'c:\\User\\Myname\\workspace\\a.txt'
    #절대경로
    
    '.\\a.txt'
    #상대경로
    
    내가 현재 탐색하고 있는 위치에서 상대적으로 표현한 것이 상대경로임. 
    

    Pickle

    파이썬에서 제공하는 객체 저장 모듈

    • pickle은 데이터를 직렬 형식으로 저장하는 형식: 파이썬 객체를 그대로 저장할 수 있다.
    • 확장자명은 .pkl
    • pickle 파일을 불러오는 코드
    import pickle
    
    with open("C:\\\\Users\\\\Playdata\\\\workspace\\\\data\\\\kbo_2024.pkl","rb") as f:
        kbo = pickle.load(f)
        #절대경로 방식
        
    with open("./data/pkl","rb") as f:
        kbo = pickle.load(f)
        #상대경로 방식
        
        #\\는 기본적으로 이스케이프 문자이다. 그러나 윈도우는 파일 주소체계로 백슬래시를 사용한다.
        # 이경우 백슬래쉬를 두 번 작성하나 주소 앞에 r을 붙여서 이스케이프 문자가 아닌라는 것을 상기시켜주면 좋다.
        
    kbo
    #파일을 확인해보면 리스트 객체가 리스트 형태로 저장되어 있음을 확인할 수 있다.
    
    • 현재 작업중인 경로 확인하기
    pwcd
    
    import os
    os.getcwd()
    
    • 상위 폴더로 이동하기
    with open("../Download/kbo.pkl", "r", encoding = "utf-8") as f: #상위 폴더로 이동하여 Download폴더로 이동하는 코드
    
    
    • CSV 파일 열기
    with open(r"C:\\Users\\Playdata\\workspace\\data\\kbo.csv", "r", encoding = "utf-8") as f:
        kbo = f.read()
        #utf-8: 이 파일은 한글로 작성되었다.
    kbo
    

    응용! zip() 이용해서 선수 프로필 딕셔너리로 만들기

    col =kbo.split("\\n")[0].split(",")
    '''
    한 행씩 분리한 다음,첫번째 행(=head)만 추출하여 다시 그 한 행을 쉼표(속성)를 기준으로 분리한다
    '''
    
    kbo_list = []
    for x in kbo.split("\\n")[1:-1]:
        kbo_list.append(dict(zip(col, x.split(","))))
        #zip을 활용하여 선수별 프로필을 딕셔너리 형태로 완성한다.
    

    응용! 선수들의 신장/체중 데이터로 bmi 계산하기

    col =kbo.split("\\n")[0].split(",") #첫줄 = 속성
    kbo_list2 = [dict(zip(col, x.split(","))) for x in kbo.split("\\n")[1:-1]]
    
    for player in  kbo_list2:
        height, weight = player['신장/체중'].split("/")
        #신장/체중 key를 각각 split 하여 각각 다른 키로 만든다.
        height = height.replace("cm", "")#뒤에 있는 단위를 지운다.
        weight = weight.replace("kg", "")
        try:
            player['weight'] = int(weight)
            player['height'] = int(height)#int로 형변환
        except:
            player['weight'] = '' #데이터가 없거나 int로 바꿀 수 없는 경우, 데이터 내용을 아예 삭제.
            player['height'] = ''
    
    bmi_list = []
    for player in kbo_list2:
        try:
            h = player['height']
            w = player['weight']
            bmi = BMI_calculator(h,w)
            name = player['선수명']
            print(f"{name} 선수 의 BMI 지수는 {bmi} 입니다.")
        except:
            pass
    

     

     

     

     

Designed by Tistory.