검색
검색
공개 노트 검색
회원가입로그인

[이솦] 파이선으로 배우는 AI 기초 06

요약
  • 인공지능 교육에서 다루는 데이터 유형에는 정형 데이터, 비정형 데이터, 반정형 데이터가 있다.
  • 파이썬의 딕셔너리, 리스트, 튜플과 같은 자료구조의 특징과 사용방법에 대해 배운다.
  • 평균 주식 가격을 계산하는 실습을 통해 파이썬 딕셔너리와 튜플 사용법을 실제 사례에 적용한다.

이솦 | EBS 소프트웨어·인공지능 교육

인공지능이 다루는 데이터에는 정형 데이터, 비정형데이터, 반정형 데이터가 있다.

정형데이터: 데이터의 구조를 파악하기 쉬운 데이터 (지난 번의 엑셀의 생각해 보라)

데이터의 구조를 파악한다 -> 데이터 내에 어떤 값이 있는지 어떤 내용과 속성이 있는지 파악하는 것 -> 기계 학습의 훈련용 데이터로 많이 학습된다.

반 정형데이터: 구조에 대한 정보는 있지만 체계적이지 않은 데이터: Semi structured data로 대표적인 것인 JSON 데이터가 있다.

JSON 데이터: 스프레드 시트에 담을수는 없지만, 데이터의 정보를 파악할수 있는 구조, 데이터는 알수 있지만, 엑셀데이터처럼 가로세로가 명확한 데이터가 아님-> 파이선의 컨테이너중 딕셔너리 구조가 JSON 형태를 만드는 구조

딕셔너리

지난 시간의 리스트를 떠올려 보면, 리스트안의 숫자가 어떤것을 의미하는지는 확실하지 않음

딕셔터리: 어떤 값이 있고 그것이 얼마다 라는 형태로 되어 있다. 리스트는 값만 있지만 딕셔너리는 값을 설명하는 데이터 까지 같이 있다. 연결 형태의 데이터라고 부르기도 한다.

딕셔너미를 서로 연관된 정보를 key와 value로 묶어서 저장하고 활용하는 자료 구조 이다.

데이터를 설명하는 추가 정보 즉 메타 데이터가 있으면 더 좋다.

문법적 특징

리스트는 대괄호 [] 를 쓰지만 리스트=[ 요소1, 요소2.....]

딕셔너리는 중괄호 를 사용한다. 딕셔너리={key1:value1, key2:value2, ...}

중괄호{}안에 key:value의 한쌍의 형태로 표현하며, 각각의 요소는 쉼표로 구별, 1개의 key 에 1개의 value를 연결해서 만들거나, 1개의 key에 여려개의 value를 연결해서 만들수 있다.

딕셔너리에 문자열을 입력할때는 만드시 따옴표를 써야하며, 따옴표가 없다면, 문자열을 key 나 value 가 아니라 새로운 변수로 인식한다. 그래서 NameError 가 발생한다.

리스트 처럼 자료는 쓰고 읽을수 있음, 이때 쓴다는건 지우는것도 포함하며, 딕셔너리 도 자료형이라 읽고 쓸수 있다. 리스트의 값을 바꿀때는 인덱싱을 이용하지만, 딕셔너리의 값을 바꿀때는 key를 이용한다.

member = {'name':'국밥맨', 'age': 46, 'class': '대갈장군', 'height': 187, 'weight': 110, 'waist':120}
member ['color'] = ['black', 'white']
print(member)

이렇게 새로운 리스트를 넣어 주면 프린트시 마지막 요소를 추가해준다.

member = {'name':'국밥맨', 'age': 46, 'class': '대갈장군', 'height': 187, 'weight': 110, 'waist':120}
member ['color'] = ['black', 'white']
del member['height']
print(member)

마찬가지로 이렇게 del을 통해서 요소를 삭제도 가능하다. key를 없애면 value도 따라서 같이 없어진다.

함수를 이용해서 key와 value를 용도에 맞게 활용 가능하다

딕셔너리에 keys, values, items 함수 사용이 가능하다. (철자 주의)

member = {'name':'국밥맨', 'age': 46, 'class': '대갈장군', 'height': 187, 'weight': 110, 'waist':120}
print(member.keys())

이렇게 하면 key 만 나오게 된다. values 는 value 가 나오게 되며 둘다 나오게 하려면 items를 사용하면 된다.

튜플

튜플은 리스트와 비슷하지만 한번 저장한 요소를 바꿀수 없다는 점이 다르다. 따라서 한번 생성된 튜플은 주로 읽기에만 사용한다.

딕셔너리는 중괄호 {}, 리스트는 대괄호 [], 튜플은 소괄호()를 사용한다.

튜플은 소괄호를 쓰고 쉼표로 구별한다. 값을 쉽게 변경하지 못하도록 튜플로 자료를 저정해서 사용한다. 튜플은 변경만 안되지 읽는것은 리스트와 흡사하다. 읽을 때는 인덱스로 접근한다.

튜플은 한번 정의하면 바꿀수 없는 형태의 값이다.

튜플로 바꿀수는 있다. 새롭게 튜플로 정의하면 가능하며 이때 튜풀의 값을 바꾼게 아니라, 튜플 전체를 다시 정의 한것이다. 원래 정의한 튜플은 사라지고, 새로 정의한 튜플이 원래 이름을 빼았는 것이다. 튜플은 값을 바꿀수 없다는것을 다시 기억해라.

튜플은 여러개의 값을 묶어서 저장하고 처리할수 있는 장점을 가진 자료형이다. 여러가지 자료를 하나의 컨테이너 변수인 튜플로 저장하는 것을 의미하며 이것을 packing이라고 부른다.

friend = ('감자맨', 8, True)
friend_name, friend_age, friend_male = friend #언패킹
print (friend_name, type (friend_name))

이렇게 튜플로 묶은 것을 다 푼것으로 재정의 해주고 출력하는 것이 가능하다. 언패킹 할때는 튜플의 요소와 언패킹의 요소 수가 같아야 한다. 튜플의 요소가 3개라면 변수도 3개로 지정해야 한다.

언패킹을 사용하면 교환(swap)기능을 쉽게 구현할수 있다. 스왑은 자주 사용하는 기능으로 두가지 변수를 바꾸는 것이다.

a,b=(10, 20)
a,b=b,a
print(a,b)

이렇게 하면 a와 b의 값이 바뀌게 된다.

학습데이터 저장

만나게 될 데이터 중에서 fashion nmist라는 데이터를 만나게 될텐데 독일 Zalando 라는 회사가 10개의 패션 아이템을 자동으로 분류하기 위해서 만든 데이터 이다.

fashion_nmist.load_data() 함수가 만들어 내는 데이터는 튜플이다. ()를 보고 생각하자. 왜 읽어온 훈련 데이터를 리스트가 아니라 튜플로 만들었까? 프로그램 실행 도중에 바꿀수 없기 때문이다. 훈련 데이터가 중간에 변경이 되면 훈련에 지장이 있게 된다. 훈련에 사용하는 데이터는 변하면 안되기 때문에 튜플을 사용한다. 학습 데이터는 튜플로 저장한다.

실습

딕셔너리를 이용해서 평균 주식 가격을 구해보자.

stock = {'월요일': 1240, '화요일': 1280, '수요일': 1210, '목요일': 1340, '금요일': 1140} # 요
average= (stock['월요일']+stock['화요일']+stock['수요일']+stock['목요일']+stock['금요일'])/5
print(average)

{} 표시하는 딕셔너리에서는 key를 부르면 value값이 따라 온다.

조금 더해서

온라인에서 삼성 전자의 주가를 딕셔너리 형태로 지정된 날짜 만큼 표시하는 코드를 만들어 보자

import yfinance as yf
import datetime

# 사용자로부터 시작일과 종료일 입력받기 (형식: 'YYYY-MM-DD')
start_date_str = input("Enter the start date (YYYY-MM-DD): ")
end_date_str = input("Enter the end date (YYYY-MM-DD): ")

# 문자열을 datetime 객체로 변환
start_date = datetime.datetime.strptime(start_date_str, '%Y-%m-%d')
end_date = datetime.datetime.strptime(end_date_str, '%Y-%m-%d')

# 삼성전자 티커 심볼
ticker = '005930.KS'

# 데이터 다운로드
data = yf.download(ticker, start=start_date, end=end_date)

# 데이터프레임을 딕셔너리 리스트로 변환
stock_data = data.reset_index().to_dict('records')

# 각 키의 합계를 저장할 딕셔너리 초기화
sums = {'Open': 0, 'High': 0, 'Low': 0, 'Close': 0, 'Adj Close': 0, 'Volume': 0}

# 데이터 개수
count = len(stock_data)

# 각 날짜의 데이터를 합계에 추가
for record in stock_data:
    sums['Open'] += record['Open']
    sums['High'] += record['High']
    sums['Low'] += record['Low']
    sums['Close'] += record['Close']
    sums['Adj Close'] += record['Adj Close']
    sums['Volume'] += record['Volume']

# 각 키의 평균 계산
averages = {key: value / count for key, value in sums.items()}

# 평균 출력
print("Averages:")
for key, value in averages.items():
    print(f"{key}: {value:.2f}")

만들면 나오는 데이터 date, open, high, low, adj close, volume 라는 키 값을 만들게 된다.각 키을 더 하는 것으로 변경해 보자.

Averages: Open: 82300.00 High: 82925.00 Low: 81550.00 Close: 82500.00 Adj Close: 82500.00 Volume: 20271665.75

이런식으로 결과가 잘 나온다.

조회수 : 34
heart
공유하기
카카오로 공유하기
페이스북 공유하기
트위터로 공유하기
url 복사하기
T
페이지 기반 대답
AI Chat