ASAC 빅데이터 분석가 과정 3일차 - 2 (24.12.06)
파이썬(Python)
파이썬 : 프로그램 언어!!! ==> 스크립트 (작성은 편한데, 속도가 이슈!!)
---> Anaconda : 데이터분석... 핸들링... 패키지!!(+ ML/DL
--> pytorch/ TF etc) : 파이썬!!!
파이썬 vs R vs Java -> ML/DL로 인해 파이썬이 굳
배포판!! --> jupyter (코드 + 문서 + 결과)
데이터 분석/ 핸들링 : 그래프/ 문서/ 테이블..
+++ DL 최근 문서들을... 간단하게...(패키지 불러와서)
+++ 패키지나 표본 모델을 만들기 위해서는 파이썬이 필요
---> Jupyter / Jpouter...
Colab
텍스트는 markdown 언어 양식으로 표현
-> markdown 사용법 검색
코드에서 주석은 #
python
- or틱하게 처리하자
- block 단위 jupyter notebook 실행
당분간 실행하고자 하는 코드 덩어리 위주로 실행
파이썬 머신러닝 Libraries
Pandas, Numpy, Matplotlib, Scipy
DL - PyTorch, Keras, Tensor Flow
Sciti-learn
파이썬의 데이터형식, 반복문/제어문/함수
모듈 -> 함수** //클래스가 편하면 클래스로!
함수가 메인임
Python 기본 Brief //첫인상
- 변수 네이밍 : PEP8
- 변수 네이밍에는 자유로움 . 하지만 기본적인 규칙은 주수해야 함
- 첫 문자는 문자, _
- _(언더스코어)로 시작하는 변수명 : 클래스 내부용
- __(언더스코어)2개 __inti__, __add__ 와 같은 의미가 있어 사용 주의
- for, if, else와 같은 예약어는 피하자
- 대문자로 시작 : 클래스 이름 의미
- *들여쓰기 : 4개의 스페이스 or Tab
- *기준 숫자 : 0
- Mutable vs Immutable : 변경가능한 대상 vs 변경불가능한 대상
//리스트, 튜플의 차이점
- For 반복문 : 여러 개를 다루는 데이터타입의 개별 원소를 Rolling 해주는 개념
-->while-->조건 //거의 안씀 But, 코테의 알고리즘 탐색 DFS, BFS 부분에서 사용
# 처음에 학습하는 과정에서는 에러의 원인을 정확히 이해하고
수정방법까지 파악을 하고 넘어가야 함
에러의 원인을 검색 : 구글링/ stackoverflow/ gpt 등등
단 gpt가 이렇게 고치면 된다고 해요 <-- 이러면 안됨
파이썬 Essential
- 변수 : 값을 저장하기 위한 공간 --> 파이썬의 다양한 자료형&연산자 특징
- 제어문 / 반복문 : 상황에 따른 제어 및 단순 반복을 코드로 구현하기에 가장 중심이 됨
--> 이 부분이 잘 되어야 데이터 핸들링이 가능 --> 파이썬만의 특징이 있는 for을 잘 이해해야 함
- 함수 / 클래스 : 좀 더 구조적으로 기능 중심으로 단순 반복을 처리하기 위해 --> 일반적인 ML/DL의 기본은 함수 정까지 알아도 되지만 최신의 DL등을 하기 위해서는 클래스까지 알아야 함
<변수>
어떠한 값을 대표하는 이름
변수명 = 값 (숫자, 문자, 여러개, 개체 등등)
변수선언 : 항상 왼쪽에 문자로 선언 -> 대입연산자(=)를 통해 값(숫자,문자,객체 등)을 할당한다.
--> 서로 다른 객체들을 서로 "Link 연결" 하는 것 (할당이 아니다)
//변수명으로 사용할 수 없는 예약어들이 존재
변수는 메모리상의 저장 위치 X --> 대입 assignment 하는것
변수에 값 할당 with 연산자
n = n + 1 ---> n +=1
이게 여러번 하거나 , 많이 반복해야하는 경우들에 있어서는 속도 이슈가 발생할 수 있음
변수에서 값을 할당할 때 : 값을 자기 자신을 갱신할 때
규칙에 따라서 :+=, -=, *=, /=
==> 효율적인 코드 실행 속도
파이썬만의 특징 중 하나 : 멀티 할당
==> 데이터 분석쪽 보다는 파이썬을 가지고 코테를 할 때 자주 사용
장점 : 코드가 간결
주로 : 코테에서 잘 쓰면 깔끔하게 작성이 된다
예)값을 교환 두 변수의 값을 교환
일반적인 언어들에서는 중간에 매개체
temp = a
a = b
b = temp
print( a, b)
==> 정렬이라는 알고리즘의 가장 핵심적인 기능 : swap
a , b = b, a
print(a,b)
: swap을 통해 코드가 간결해짐
==> 코테에서는 자주 사용되는 패턴!! 코드가 간결!!
정렬쪽이 가장 대표적
단, 데이터 분석이나 모델링쪽은 그닥;;;
<자료형>
코테에서는 주어진 상황에 대해서 어떠한 Type을 써야 효율적일지 스스로 판단을 해야함
--> 기본적인 기능들에 대한 숙지가 필요함
//자료형 정리해서 기록하자
1) 내가 1개의 값을 대상
---> 값의 종류 : 숫자 (정수,실수, 더 다른 숫자형..)
문자1 (1개: 영어, 한글, 특수 -....)
논리값 : True/:False, 0/1
2) 내가 여러개의 값을 대상
---> 값들을 나열 (값,값,값,..)
---> 리스트 : [값,값,값,...] : 파이썬의 가장 대표적인 자료형
수정이 가능함!!(추가, 제거, 등등)
튜플 : (값,값,값,...) : 한 번 만들면 변경 불가능!!
---> set : {값,값,값,...} : 중복된 값을 1개로 처리!!
: 유니크한 값들에 체크!!
: 유니크값 체크 코드를 작성 안해도 자료형만 잘 변형해도 됨
---> dict : {키:값, 키:값, 키:값 ,...} ==> miniDatabase!!
: hash 알고리즘이 있는데 ,, pass
: 코테에서는 정말로 중요한 역할을 함
- 코드가 간결
- 원하는 값을 찾는데 Fast!!
ex) 100000 백만개의 값이 있는 것이라고 할께요..
--> case1) 리스트 : 홍길동?
--> case2) dict :홍길동에 대한 주민번호/pin번호 알면
==> 바로 호출이 가능함
참고) 리스트에서 원하는 원소를 찾는 시간의 복잡도 : 0(n)
dict ,,, : 0(1)
HashTable 이런 알고리즘!!!
예) 우리반의 3명의 a,b,c 친구들이 수학시험 봄 : 80,70,95점을 받았습니다.
----> 3명의 총점은 얼마?
80+70+95
-------
a=80
b=70
c=95
total = a+b+c
print(total)
Q) 우리반의 학생이 3명이 아니라 100명으로 늘어나면 어쩔??
student_1=90
student_2=80
student_3=70
...
student_100=99
#장점 : 누가 몇 점인지 바로 체크
#단점 : 아 귀찮음..변수도 너무 많음!!
#알고자 하는 것이 : 그냥 반의 전체의 평균/총점/최고점
==> 누구인지는 알 필요X
#필요한 것들은 그냥 점수들
scores = [90,80,78,33,44,11,...] //set는 중복값이 날라가므로 리스트로
#여러개의 값을 모아서 1개의 변수로 심플화
#장점 : 변수가 심플
#단점 : 누가 몇 점인지는 몰라요
# 알고자 하는 것이 : 전체 반의 평균도 알고 싶고
누가 몇 점인지도 알고 싶다!!
+ 우리반의 1등은 누구지??
# 조건: 우리반에 동명이인은 없다!!
# 홍길동_a, 홍길동_b
scores = { "A":90, "B":88, "C":87, ...}
#현실적으로 코테를 보겠다 : 여러 문제들을 풀어야 함
달달달 해야 함
--> 개발자/연구자 코테 : 2일/3일 전에 책 피고 열심히 달달달
==> 많이 하세요!!
<연산자>
산술 연산자
=,+,-,*,/,//(몫),%(나머지),**(제곱) #최적화를 위해 몫과 나머지를 잘 사용하자
나눗셈에 대한 연산자
1) 그냥 계산
print(5/3)
2) 몫만
print(5//3)
3) 나머지만
print(5%3)
# 코테에서는 이 부분을 잘 해야 함!!
# 데이터 수집/ 처리에서도 중요한 역할을 함
# 예) 987건을 100건 단위로 처리할 때 코드화 할 때 사용을 함!!
# ***규칙화!!!
파이썬에서 공식적으로 만든 FM적인 함수
divmod() 함수
#입력 : 무엇을 무엇으로 나눌지에 대한 정보(기준수,나눌 수)
#기능 : 나눗셈을 해서, 몫, 나머지를 던져줌
#출력 : 입력에 대한 몫, 나머지
ex) divmod(5,3) /튜플인 이유: 변경 불가능 Immutable
ex) divmod(5,3)[0] #몫 --> 5//3
ex) divmod(5,3)[1] #나머지 --> 5%3
# 파이썬의 멀티 할당!!!
q, m = divmod(5,3)
print(q,m)
##파이썬의 대표적인 여러개의 값을 다루는 자료형 : 리스트!!
1) 기본 구조 : [값,값,값,...]
2) 기본 기능 : 값을 추가 (append, insert)
--> append : 값을 맨 뒤에 추가!!
--> insert : 중간에 끼어들기!! (어디에, 무엇)
: 값을 제거 (pop, remove)
--> pop : 위치 중심으로 제거!! (기본 : 맨 뒤)
--> remove : 값을 중심으로 제거!!
(중복된 여러개 값이 있을 때, 그 중에서 맨 앞의 1개만 제거)
+++ 파이썬의 잡다한 리스트의 기능!!! 코테를 하려면 파악을 하는게
+++ 파이썬으로 코테를 할 때 : stack /queue 자료형
==> cs 전공에서 전공 1년차 : 자료구조와 알고리즘!! (기본과목 중요!!)
append, pop
+++ 탐색의 알고리즘에 주로 잘 표현!! + 최단거리!!
==> 코테를 준비하는 입장에서는 중요한 것 중심 + 잡다한 것은 하면서 추가
ex)
a_list = [10,20,30,40]
a_list
a_list.append(50)
a_list
# 중요한 부분 : 재할당을 안 했습니다!!!
===> 값의 변경이 발생하면, FM적으로 만든 매서들에서는 자동갱신!!
===> 재할당을 안해도 됨!!
# a_list = a_list.append(50) 이렇게 작성 안해도 됨!!
#여려개의 값을 모아둔다고...
---> 파이썬은 대충..or 탁하게.. 두리뭉실::
#그냥 여러 자료형을 다 합칠 수 있음!!(장점일 수도 단점일 수도!!)
a_list = [1,3,111,11.3,"hello",[1,2,3]] #튕길수도있음
a_list
#자유롭게 핸들링 해보자
a_list.append(100)
a_list
a_list. insert(2,"a")
a_list
#제거
a_list.pop() #맨 뒤의 값 제거
a_list
a_list.pop(0) #맨 앞의 값 제거
a_list
a_list.append(3)
a_list.append(3)
a_list.insert(4,3)
a_list
a_list.remove(3)
a_list
--> remove를 할 때에는 모든 값을 싹 지우는 것은 아님!!
맨 앞의 1개만 지워짐
#코테 풀 때 : 중복된 것이 있는지 없는지에 따라서 remove를 쓸 때 주의!!
#여러개의 값들을 나열 --> 값의 접근
==> 몇 번째 나와!!(위치 정보!!)
순방향 : 0, 양의 정수
역방향 : 음의 정수 -1, -2
==> 정수인덱스!!
# 하나의 값을 가지고 올지 vs 여러개의 값을 규칙!!
==> 인덱스 자리에 : 정수인덱스 vs 슬라이싱
# 제일 중요한 점 : 기준은 0 !!!
a_list
a_list[0]
a_list
a_list[1]
a_list[-1] #맨 뒤의 값
# 예 : 앞의 3개 값들아 나와보세요!!
a_list[0], a_list[1], a_list[2]
**슬라이싱
alist[0:3] #인덱스 자리에 슬라이싱 : 규칙이 여러개!!
# 슬라이싱에 대한 룰 : 정수인덱스 자리에서 사용!!
--> 시작점 : 끝점(빠짐!!) : 간격
==> 여러개의 값들을 규칙적으로 접근할 때 사용
a_list[1:5:2]
# 참고) 슬라이싱을 활용해서 자기 자신을 표현
a_list[::]
# 참고) 순서를 뒤집어서 맨 뒤를 맨 앞으로 불러오려면
a_list[::-1]
# 참고) 여러개인데... 규칙 없이 그냥 나열하는 것은 어떨까?
a_list[[1,3,4]] <-- ERROR!!
----> numpy 패키지의 array 자료형 : 이건 됨!!
# 리스트에 대해서 간단히 정리!!
# 리스트 구조 : [값,값,...]
# 값을 접근한는 방식 : 정수 인덱스(1개) [순방향, 역방향]
# 여러개 규칙 : 슬라이싱!!
# 여러개 규칙이 없을 때 : 우회 방법
# 기본적인 기능 (메서드) : 추가(append, insert)
# 제거 (pop, remove)
+++ 리스트에서 공식적인 변경에 대한 메서드를 활용하면
메모리상에서 바로 변경이 이루어짐
==> 재할당을 안 해도 변경이 적용이 됨
+++ 코테에서는 잡다한 기능을 알아야 편하다
<튜플>
Tuple : 리스트와 아주 유사함
==> 조작이 불가능함!!(추가, 제거 X)
==> 그 외의 값에 대한 접근/ 처리 등은 리스트와 동일함!!
+++ 형을 리스트로 변경!!
a_tuple = (1,2,3,4,"hello",100,100)
a_tuple[0]
a_tuple[-2]
a_tuple[:3]
a_tuple.append(100) <-- ERROR
t = list(a_tuple)
t
t.append(100)
t
*** 자료형들에 대한 특징을 정확하게 인지를 하고
필요에 따라서 왔따 갔다 하면 됨!!
==> 코테를 하실 때에는 유연하게 생각을 해야 함!!
# 값 종류 : 문자/ 문자열
1개 : 문자
여러개 : 문자열
파이썬에 사용하는 표기 양식 : " ", ' ', """ """, ''' '''
==> 왜 굳이 이렇게 다양하게 있을까?? 구별자가 문자열 구별자와 진짜 표시
다양한 상황에 편하게 사용하기 위해서 다양하게 세팅!! 문장부호와 구별!!
"hello"
'hello'
"""hello"""
'''hello'''
--> 긴문장, 책, 도서관 코드화 하면
==> 파이썬의 문자열 구분자와 문장부호와 충돌!!
예)탐은 "나는 집에 가요"라고 말했다.
'탐은 "나는 집에 가요"라고 말했다.' (O)
"""탐은 "나는 집에 가요"라고 말했다."""
"탐은 \"나는 집에 가요\"라고 말했다."
# 나중에 문자열을 좀 더 정확하게 표현하고, 규칙화!!
==> 정규식!!
==> 자연어 처리/ 언어 모델쪽 : 문자열 처리는 피할 수 없음
규칙 기반의 정규식을 사용하면서 해야함
정해진 룰 : gpt 같은 것으로 질의 하는 것도 방법임!!
100퍼센트는 안되요!!
(나중에 코테 기출문제 풀 때 이야기를 다시 하겠습니다!!)
#참고
a=10
b=20
a+b
a="hi"
b="hello"
a+b
a=[1,2,3]
b=[10,20,30]
a+b
"1" + '3'
int("1")+'3' <-- TypeError
==> 요점은 자료형을 정확히 파악을 하고 연산자를 사용해야함!!
++ 여러개의 값을 다루지만 약간 다른 스타일 : Dict
==> 파이썬으로 코테를 할 때 : 유용한 자료형
==> 기본 틀 : 여러개의 값을 모아둠
(키:값) 쌍 중심으로 모아둔다
{키:값, 키:값, 키:값,...}
==> 미니데이터베이스!!
a_list = [1234, 5678]
a_list
a_dict = {"a":1234, "b":5678}
a_dict
a_list[0]
a_dict[0] <-- KeyError
a_dict["a"] # dict은 키값 중심으로!!
a_list
type(a_list)
type(a_dict)
# dict 정보 구성 : 키, 값
==> 키 값들만 보자 : keys
값들만 보자 : values
a_dict.keys()
a_dict.values()
++dict에서 한 번 쌍으로 다 같이 돌리고 싶다!!
dict.item() 메서드 + for
list : enumerate()함수+ for : 정수인덱스 + 값
==> for문 할 때 다시 보도록 하겠습니다!!
참고) set
{1,1,1,1,2,2,2,2,3,3,3,3,2,2}
[ 1,1,1,1,2,2,2,2,3,3,3,3,2,2]
set([ 1,1,1,1,2,2,2,2,3,3,3,3,2,2])
list( set([ 1,1,1,1,2,2,2,2,3,3,3,3,2,2])) #set을 list로
a_set = {1,1,1,1,2,2,2,2,3,3,3,3,2,2}
a_set
a_set[0] <-- TypeError
list(a_set)[0]
#### 여기까지 기본적인 파이썬의 여러가지 자료형을 간단히!!!
==> 1개 vs 여러개 값
: 리스트(정수인덱스, 슬라이싱) ~~~~ 튜플!!
: 문자열
: Dict (키:값)
: set(집합 : 중복을 제거를 함)
---> 코테에서는 여러 자료형을 잘 왔다 갔다 해야함
잡다한 기능도 체크!!
코드 흐름 작성
규칙
**제어문 if
**반복문 for, while
<조건문>
IF문
if, elif, else
조건문 : if
==> 수학에서의 분할의 개념으로 겹치지 않고 & 전체 커버할 수 있는
명료한 조건을 작성을 해야 함
ex) 양수/ 음수 판단
a = 10
if a>0 :
# 위의 조건이 만족할 때 뭐할지를 기술!! : tab 들여쓰기로
print("양수입니다.")
else:
print("0또는 음수입니다.")
a = -10
if a>0 :
# 위의 조건이 만족할 때 뭐할지를 기술!! : tab 들여쓰기로
print("양수입니다.")
elif a<0 :
print("음수입니다.")
else:
print("0입니다.")
a = -10
if a>0 :
# 위의 조건이 만족할 때 뭐할지를 기술!! : tab 들여쓰기로
print("양수입니다.")
elif a<0 :
print("음수입니다.")
elif a==0:
print("0입니다.")
else:
print("이상한 값입니다.")
a = -10
if a>0 :
# 위의 조건이 만족할 때 뭐할지를 기술!! : tab 들여쓰기로
print("양수입니다.")
elif a<0 :
print("음수입니다.")
elif a==0:
print("0입니다.")
else: <-- SyntaxError
a = -10
if a>0 :
# 위의 조건이 만족할 때 뭐할지를 기술!! : tab 들여쓰기로
print("양수입니다.")
elif a<0 :
print("음수입니다.")
elif a==0:
print("0입니다.")
else:
pass #일반적인 코드 작성에서는 else를 쓰시는 것을 추천
#코테에서는 이상한 케이스가 없어요.. 미리 설명하기에 else 안쓰는 경우가 많다
<반복문>
for
파이썬에서 for문!!
===> 여러개의 값들을 롤링해주는 역할!!
# 상황 : 1부터 9까지 출력하세요...
print(1)
print(2)
print(3)
print(4)
print(5)
print(6)
print(7)
print(8)
print(9)
==> ctrl + c/v : 반복이 된다
: 무엇이 고정이 되어있고, 무엇이 가변적으로 바뀌는지!!
print(i) # i값이 1~~~9까지 바뀌면 됨!!
for i in [1,2,3,4,5,6,7,8,9]:
print(i)
a_list = [1,2,3,4,5,6,7,8,9]
for i in a_list:
print(i)
참고) 필요한 여러 개의 값들이 숫자들이다
==> 많이 사용될 것 같으니 파이썬 range(시작점,끝점,간격)
: 연속되거나 규칙있는 여러개의 숫자들이 필요!! range
for i in range(1,10,1): # [1,2,3,3,4,5,6,7,8,9]
print(i)
range(1,10,1)
#range(1,2,3,4,5,6,7,8,9)
for i in range(1,10,2):
print(i)
for i in (1,3,5,6):
print(i)
a_list = ["a","b", "c", "AA", "bb", 10,20,30]
a_list
# a_list에 있는 원소들 하나씩 한 줄에 출력해줘!!
print(a_list[0])
print(a_list[1])
print(a_list[2])
print(a_list[3])
print(a_list[4])
print(a_list[5])
print(a_list[6])
print(a_list[7])
# 수열의 일반항 : n번째 항의 규칙!!
# 일에 대한 일반화 : print(a_list[i]) : i번째 원소를 출력
# 0~7번째까지
# 리스트업 [0,1,2,3,4,5,6,7]
# range(0,7+1,1)
for i in [0,1,2,3,4,5,6,7]:
print(a_list[i])
for i in range(0,8,1):
print(a_list[i])
# len 파이썬의 함수 : 여러개의 갯수를 리턴해주는 함수
len(a_list)
for i in range(0, len(a_list),1):
print(a_list[i])
----> 일반적인 언어들의 접근 방식!!
파이썬 for: 값 자체를 롤링하는 친구!!
a_list
for i in a_list:
print(i)
***중요!!
파이썬으로 for문을 돌릴 때 2가지 방식 모두 다 원할하게 사용해야 함!!
==> 잘 활용하고 연습하고, 적용해야 함
값 자체로 롤링할지 vs 필요한 인덱스 range 이용해서 돌릴지..
참고) dict 돌리면 어쩔??
a_dict = {"a":1234, "b":5678,"c":9999}
a_dict
for i in a_dict:
print(i) #키 값으로 출력됨
for i in a_dict:
print(a_dict[i])
a_dict.keys()
for i in a_dict.keys():
print(i)
a_dict.values ()
for i in a_dict.values():
print(i)
# dict에서 key, values를 한 번에 같이 롤링하면 안될까??
==> dict.tiems()
a_dict.items() <-- [ (), (), () ]
for i in a_dict.items():
print(i)
for i in a_dict.items():
print(i[0]) #keys
for i in a_dict.items():
print(i[1]) #values
for i in a_dict.items():
print("Key:",i[0], "Value:",i[1])
+++ 파이썬의 멀티 할당
===> 워드 카운팅!!!!
for k,v in a_dict.items():
print("Keys:",k,"Values:",v)
잠시) 리스트에서는 .... 정수인덱스/값
: 같이 돌릴려면... enumerate()함수
a_list
enumerate(a_list)
# [ (0,"a"),(1,"b"),(2,"c")....]
for i in enumerate(a_list):
print(i)
for i in enumerate(a_list):
print(i[0], i[1])
for i in enumerate(a_list):
print(i,v)
***** 이러한 부분들은 정확하게 잘 알고 사용해야함
#실습
문제 : 국어 80점, 수학 70점, 영어 55점, 사회 90점
==> 이 학생의 평균을 구하는 코드를 작성해주세요!
# 여러 스타일로 하면서, 문제를 접근해보자!!
1. 문제 상황을 표현: 변수와 자료형!! + 관계
2. 기능적인 부분이 필요하다면 : 직접 만들거나 있는거 가져다 쓰기 ... len
==> 잡다한 기능을 알면 좋겠다!!
방법1) 꾸역꾸역
korean = 80
math = 75
english = 55
social = 90
#--> 주어진 문제에 대한 표현/ 코드화
#할 일 : 4과목의 평균을 구하는 일!!
# : 앞에서 설정한 변수들의 관계/ 기능...
avg_score = (korean + math + english + social) / 4
#관계/ 기능/// 알고리즘을 녹여야 함!!
print(avg_score)
방법2) 과목명은 필요없네;;
zumsu_list = [80,75,55,90]
sum( zumsu_list )
len( zumsu_list )
# --> 여러개의 점수들만 필요하네..
# 파이썬의 여러개의 자료형 : 리스트!!! set은 중복제거 되므로 XXXX
zumsu_list = [80,75,55,90]
# 평균 : 리스트의 모든 원소의 합도 필요하고 리스트의 원소 개수도 필요하다.
avg_score= sum( zumsu_list ) / len( zumsu_list )
print(avg_score)
방법3) sum/len/avg 사용하지 말고 직접 구현하세요
# ==> 누적합!! 카운팅!!
# 필요한 변수 :누적합을 처리할 변수, 카운팅을 할 변수
tot = 0
cnt = 0
# 점수리스트들이 다 돌아가면서,,, 더하고, 카운팅!
for i in zumsu_list :
tot += i
cnt += 1
#tot = tot + i
#cnt = cnt + 1
avg_score = tot/cnt
print(i)
** 다음주 월!!
===> 리뷰
* 퇴실 체크!!