SQL 월~목
==> 조금 조정
SQL : select 문 중심으로 필요한 정보 추출 ... ==> 고민을 하고, 다시 공유
파이썬& 데이터 수집 & 핸들링:
==> 일부를 조금 너저 하고, 개인 프로젝트 조금 타색 sql 중간에 넣음
++ 코테 : 최단거리 등 남은 부분은 조금 다른 수업 시간에 오전 1~2시간 정도씩 사용해서 처리
02_code
20241216 클래스
기본적인 목적 : 코드들을 기능 중심으로 구조화!!!
==> 반복 / 예외처리 : for / if ==> 기본 패턴 & 2D 데이터 핸들링 기본!!
==> 함수 : 입력 / 출력 / 기능 : 기능 중심으로 바라보는 것!!
+ 코테 : 재귀함수!!
==> 클래스 : 내가 필요한 대상을 정의를 해서 만드는 것!! (속성, 기능)
: 설계가 중요함!! 여러 스타일 / 방법론 등..
: 다른 사람의 코드를 봐야할 때..
: 최근 DL 다른 사람들의 코드 --> 클래스
==> 패키지 : 필요한 것들 여러가지들을 모아둔 것!!
pandas scikit-learn(ML) + optuna TF/PyTorch
DF(data frame) DF / Array Tensor(Array)4
: 점점 사용하기가 편해짐!!
+ GPT ( 이해하고 사용을 해야 효율성이 높아짐!! )
: 이러한 것들을 바탕으로 본인이 무엇을 할 것인가!!
해결할 것인가!!
==> 기획 & 새로운 부분에 대한 시도가 필요하다.
*** 체계적으로 기능 중심의 구현을 할 때에는
데이터 수집 / 데이터 분석, 머신러닝(ML), DL에 기본적인 모델 : 함수 충분!!
딥러닝 : 최신 모델 ( PyTorch --> 클래스 프로젝트!!)
: 연구시점 & 지금 활용시점이 안 맞아서 에러가 발생한다.
: 에러를 잡아야 뭐를 할 수 있다. --> 클래스!!
# 예) 학생들에 대한 국어, 영어, 수학, 과학 점수들을 처리하고 함!!
1) 주어진 정보들을 파이썬의 특징을 활용해서 꾸역처리!!!
===> 우리반 학생 전체 : 리스트
개별 학생의 과목 정보 : dict
students = [
{"name":"AAA", "korean":98, "math":93, "english":79, "science":95},
{"name":"BBB", "korean":78, "math":87, "english":87, "science":90},
{"name":"CCC", "korean":90, "math":85, "english":89, "science":92},
{"name":"DDD", "korean":80, "math":96, "english":99, "science":93},
{"name":"EEE", "korean":70, "math":80, "english":89, "science":95},
]
students
[{'name': 'AAA', 'korean': 98, 'math': 93, 'english': 79, 'science': 95},
{'name': 'BBB', 'korean': 78, 'math': 87, 'english': 87, 'science': 90},
{'name': 'CCC', 'korean': 90, 'math': 85, 'english': 89, 'science': 92},
{'name': 'DDD', 'korean': 80, 'math': 96, 'english': 99, 'science': 93},
{'name': 'EEE', 'korean': 70, 'math': 80, 'english': 89, 'science': 95}]
# 우리반 학생별로 4과목 성적의 총점/ 평균을 보고자 함!!출력!!!
# 출력 양식 : 학생이름, 4과목 총점, 4과목 평균 출력!!!!
print("이름", "총점","평균", sep="\t")
for student in students:
# 개별 학생에 대해서 무엇을 할지에 대한 규칙 : for/ if etc
score_num = student["korean"] + student["math"]+student["english"] \
+ student["science"]
score_avg = score_num / 4
print(student["name"], score_num, score_avg, sep="\t")
이름 총점 평균
AAA 365 91.25
BBB 342 85.5
CCC 356 89.0
DDD 368 92.0
EEE 334 83.5
students[0]
{'name': 'AAA', 'korean': 98, 'math': 93, 'english': 79, 'science': 95}

2) 학생들의 정보를 생성하는 함수!!!!
==> 학생들마다 정보를 생성할 때 키값이 동일하지만 계속 반복해서 타이핑!!
과목에 대한 이름도 계속 키값을 동일하지만 반복 타이핑!!
def create_studnet( name, kor, math, eng, sci):
return { "name":name, "korean":kor,
"math":math,"english":eng, "science":sci }
# test : AAA, 98, 93, 79, 95
create_studnet( "AAA", 98, 93, 79, 95)
{'name': 'AAA', 'korean': 98, 'math': 93, 'english': 79, 'science': 95}
{"name":"AAA", "korean":98, "math":93, "english":79, "science":95},
{"name":"BBB", "korean":78, "math":87, "english":87, "science":90},
{"name":"CCC", "korean":90, "math":85, "english":89, "science":92},
{"name":"DDD", "korean":80, "math":96, "english":99, "science":93},
{"name":"EEE", "korean":70, "math":80, "english":89, "science":95},
# 위의 students 변수를 함수를 이용해서 조금 더 효율적으로 만들어보자!!
students =[
create_studnet( "AAA", 98, 93, 79, 95),
create_studnet( "BBB", 78, 87, 87, 90),
create_studnet( "CCC", 90, 85, 89, 92),
create_studnet( "DDD", 80, 96, 99, 93),
create_studnet( "EEE", 70, 80, 89, 95),
]
students
[{'name': 'AAA', 'korean': 98, 'math': 93, 'english': 79, 'science': 95},
{'name': 'BBB', 'korean': 78, 'math': 87, 'english': 87, 'science': 90},
{'name': 'CCC', 'korean': 90, 'math': 85, 'english': 89, 'science': 92},
{'name': 'DDD', 'korean': 80, 'math': 96, 'english': 99, 'science': 93},
{'name': 'EEE', 'korean': 70, 'math': 80, 'english': 89, 'science': 95}]
# 우리반 학생별로 4과목 성적의 총점/ 평균을 보고자 함!!출력!!!
출력 양식 : 학생이름, 4과목 총점, 4과목 평균 출력!!!!
print("이름", "총점","평균", sep="\t")
for studnet in students:
# 개별 학생에 대해서 무엇을 할지에 대한 규칙 : for/ if etc
score_num = studnet["korean"] + studnet["math"]+studnet["english"] \
+ studnet["science"]
score_avg = score_num / 4
print(studnet["name"], score_num, score_avg, sep="\t")
이름 총점 평균
AAA 365 91.25
BBB 342 85.5
CCC 356 89.0
DDD 368 92.0
EEE 334 83.5
3) 필요한 기능들에 대해서 다 함수화를 최대한 하려고 함!!!
- 1명 학생에 대한 정보를 생성하는 함수!!!!
+ 1명 학생에 대한 정보를 바탕으로 총점을 구하는 함수!!!
+ 1명 학생에 대한 정보를 바탕으로 평균을 구하는 함수!!!
+ 1명 학생에 대한 정보를 바탕으로 이름/총점/평균 출력하는 함수!!
# - 1명 학생 정보 생성 함수
# 입력 : 이름, 국어, 수학, 영어, 과학
# 기능 : 학생 정보에 대한 dict 생성
# 출력 : 1명 학생에 대한 dict 춢력
def create_studnet( name, kor, math, eng, sci):
return { "name":name, "korean":kor,
"math":math,"english":eng, "science":sci }
# + 1명 학생 총점 계산 함수
# 입력 : 1명 학생의 정보
# 기능 : 1명 학생의 총점을 계산
# 출력 : 1명 학생의 계산된 총점..1명
def studnet_get_sum( studnet): # studnet = {"name":"aaa","korean":98,,,}
score_num = studnet["korean"] + studnet["math"]+studnet["english"] \
+ studnet["science"]
return score_num
# + 1명 학생 평군 계산 함수
# 입력 : 학생 1명 정보
# 기능 : 4과목 평균 계산
# 출력 : 4과목 평균값
def studnet_get_avg( studnet):
score_avg = studnet_get_sum( studnet) / 4
return score_avg
# + 1명 학생의 대한 정보를 출력함수
# 입력 : 학생1명의 정보
# 기능 : 정보 출력 : 문자열 생성 --> 이름, 총점, 평균
# 출력 : 출력할 문자열
def student_to_string( studnet):
temp = "{0}\t{1}\t{2}".format(studnet["name"], studnet_get_sum( studnet),
studnet_get_avg( studnet) )
return temp
# 참고) 파이썬의 문자열을 표현하는 3가지 큰 방식!!!!
- %연산자를 활용해서 표현....
- format() 메서드/함수를 활용,,
- f-string 표현,..,,
==> 본인 편하신 방법을 사용하시면 좋을 듯 함!!!
a = 365
print("나의 총점 :", a) # --> 출력을 그냥 하고자하는 것들 나열,,,,,
나의 총점 : 365
print("나의 총점1 :", a,"나의 총점2 :", a,"나의 총점3 :", a)
나의 총점1 : 365 나의 총점2 : 365 나의 총점3 : 365
a= 365
print("나의 총점:{}".format(a))
나의 총점:365
a= 365
b = 99
print("나의 총점:{}, 평균:{}".format(a))
==> Index Error
a= 365
b = 99
print("나의 총점:{}, 평균:{}".format(a,b))
나의 총점:365, 평균:99
a= 365
b = 99
print("나의 총점:{}, 평균:{:.2f}".format(a,b))
# ---> 출력할 대상 & 출력할 양식도 지정!!!
나의 총점:365, 평균:99.00
a= 365
b = 99
print("나의 총점:{0}, 평균:{1}".format(a,b))
나의 총점:365, 평균:99
a= 365
b = 99
print("나의 총점:{1}, 평균:{0}".format(a,b))
나의 총점:99, 평균:365
a= 365
b = 99
print("나의 총점:{1}, 평균:{0}, 반의평균:{1}".format(a,b))
# ==> 한 번에 정의한 순서를 중심으로 반복해서 사용이 가능하다!!!
나의 총점:99, 평균:365, 반의평균:99
# 파이썬 : 3.x 버전 이후부터 f-string
a = 365
b= 99
print( f"나의 총점:{a}, 평균:{b}")
나의 총점:365, 평균:99
# 학생에 대한 정보 생성 & 필요한 일 : 함수화!!!!
students =[
create_student( "AAA", 98, 93, 79, 95),
create_student( "BBB", 78, 87, 87, 90),
create_student( "CCC", 90, 85, 89, 92),
create_student( "DDD", 80, 96, 99, 93),
create_student( "EEE", 70, 80, 89, 95),
]
#students
print("이름","총점","평균", sep="\t")
for student in students:
print( st)
이름 총점 평균
AAA 365 91.25
BBB 342 85.5
CCC 356 89.0
DDD 368 92.0
EEE 334 83.5
==> 하려는 것들에 대해서
뭔가 반복이 되거나,,,
규칙적인 일들이 있다면,,,
: 이러한 부분에서 구체적인 코드를 신경쓰지 않고, 결과 중심으로,,
기능 중심으로 잘 가져다 쓰겠다!!! 배표하겠다!!!
==> 필요한 기능들을 다 하나하나 함수화!!!!!!!
### 일반적인 프로그램의 코드를 작성해서 배포하는 입장에서는 주로
==> 객체지향 설계 : class --> object
: 필요한 기능 중심으로, 설계 ./ 조립을 하건, 기능 연결 etcv
: 많은 시행착오,,, 경험,,,노하우,,,,트랜드....중요한 부분!!!!!
참고) 데이터 분석/ 모델링 : 아주 심하게는 다루지 않음!!!!
==> 기본적인 부분 + 약간의 스타일들이 전문 개발쪽과는 조금 다름!!!
참고) kaggle 오픈 사이트 : 올려둔 샘플코드( 클래스를 사용한느 코드가 많음!!)
==> 이해하기 위해서라도 알기는 해야함!!내가 안 써도!!!!!
참고) dl에 최신의 코드들은 거의다 class를 기반으로 합니다!!!
클래스 : 속성 + 기능(뭔가의 필요한 하나의 틀!!!! :class)
: 평균 구해주세요, 총점 계산해주세요.. :기능 --> method!!
: 점수, 이름 : 속성까지 --> property
===> 속성(property) + 함수적인 기능(method)
객체 : 클래스를 기반으로 생성된 구체적인 대상!!!!!
붕어빵틀 : 클래스 ---> 구체적으로 만들어진 붕어빵1개 : 객체
self : 자기 자신에 대한 부분을 언급/ 사용할 때!!!
==> 기존에 이런 함수로 학생의 정보를 생성을 하였습니다;;
def create_student( name, kor, math, eng, sci):
return { "name":name, "korean":kor,
"math":math,"english":eng, "science":sci }
class Student: # 일반적인 함수와 구별하기 위해서 작명을 1글자 대문자시작!!
# 생성자 : 필요한 초기 속성들을 세팅!!!!
# ==> 파이썬의 클래스 생성시 초기화 미리 만든 함수 특별함수 : __(양옆2개)
def __init__(self, name, kor, math, english, science):
self.name = name
self.korean = kor
self.math = math
self.english = english
self.science = science
students =[
Student( "AAA", 98, 93, 79, 95),
Student( "BBB", 78, 87, 87, 90),
Student( "CCC", 90, 85, 89, 92),
Student( "DDD", 80, 96, 99, 93),
Student( "EEE", 70, 80, 89, 95),
]
students
[<__main__.Student object at 0x000001A112B2BB50>,
<__main__.Student object at 0x000001A112B29F30>,
<__main__.Student object at 0x000001A112B29D80>,
<__main__.Student object at 0x000001A112B2BBB0>,
<__main__.Student object at 0x000001A112AE4D90>]
students[0]
<__main__.Student object at 0x000001A112B2BB50
students[0].name()
'AAA'
students[0].korean
98
students[0].name
'DDD'
students[3].science
93
==> 학생들에 대한 정보를 생성을 하는데,,필요한 속성값만 지정!!!!
==> 개별 객체(학생 1명에)대한 속성/정보 : property
클래스의 내부에서는 크게 필요한 속성값 & 기능!!!!!
==> 너의 총점 얼마야?
속성 + 기능 : propert & method(function)
class 클래스명:
def __init__(self,~~~~~~~):
self.설정한속성값 = 속성값 초기화
......
def 메소드/내가 원하는 기능/내가 원하는 함수(self ,,,,,):
.....
class Student: # 일반적인 함수와 구별하기 위해서 작명을 1글자 대문자시작!!
# 생성자 : 필요한 초기 속성들을 세팅!!!!
# ==> 파이썬의 클래스 생성시 초기화 미리 만든 함수 특별함수 : __(양옆2개)
def __init__(self, name, kor, math, english, science):
self.name = name
self.korean = kor
self.math = math
self.english = english
self.science = science
# ---> 필요한 기능 추가 : 총점계산, 평균계산, 출력(이름,총점, 평균)
def get_sum(self):
score_sum = self.korean + self.math + self.english + self.science
return score_sum
def get_avg(self):
scroe_avg = self.get_sum() /4
return scroe_avg
def to_string(self):
temp ="{0}\t{1}\t".format(self.name,self.get_sum(),self.get_avg() )
return temp
students =[
Student( "AAA", 98, 93, 79, 95),
Student( "BBB", 78, 87, 87, 90),
Student( "CCC", 90, 85, 89, 92),
Student( "DDD", 80, 96, 99, 93),
Student( "EEE", 70, 80, 89, 95),
]
students
[<__main__.Student object at 0x000001A112B2BB50>,
<__main__.Student object at 0x000001A112B29F30>,
<__main__.Student object at 0x000001A112B29D80>,
<__main__.Student object at 0x000001A112B2BBB0>,
<__main__.Student object at 0x000001A112AE4D90>]
students[0].name
'AAA'
students[0].korean
98
students[0].math
93
students[0].english
79
students[0].science
95
students[0].get_sum()
365
students[0].get_avg()
91.25
print(students[0].to_string())
AAA 365 91.25
students[3].get_sum()
368
print("이름","총점","평균", sep="\t")
for student in students:
print(student.to_string())
이름 총점 평균
AAA 365 91.25
BBB 342 85.5
CCC 356 89.0
DDD 368 92.0
EEE 334 83.5
===> 클래스의 기능은 내가 직접 조작/설계를 할 수 있음!! def
1개 기능이 아니라 여러개 기능을 구조적으로 작성할 수 있음!!!!
===> 속성값과 기능들을 가진 종합체를 만들어서 편히 쓰자!!!!!!
cf) 특별메소드 : 기본연산자들을 내가 설계한 클래스에 적용할 수 있도록
특별한 기능을 부여하는게 특별메소드
1 + 2
3
"1" + "2"
"12"
[1,2,3] + [4,5,6]
[1,2,3,4,5,6]
[1.2.3] - [4,5,6]
TypeError
===> 선생님이 할 일을 최대한 학생들이 할 수 있는 것은
최대한 학생들한테 일을 넘겨주는 역할!!!!!
students[0].get_sum()
365
students[3].get_sum()
368
--> 0번학생과 3번 학생을 가지고 총점을 기준을 비교!!!!!
기존에는 내가 직접 0번 학생 총점 정보 가지고 오고
직접 3번 학생 총점 정보 가지고 오고
직접 0번과 3번을 비교!!!!
==> 학생들한테 니들이 알아서 비교하고 알려줘라1!!!
std1 > std3
==> 일반적인 +,-,*,/, >, < <=,>= 연산자들과 내가 만든 클래스와 연결
: 특별메서드!!!!!
students[0].get_sum() > students[3].get_sum()
# std1 > std3
False
class Studnet: # 일반적인 함수와 구별하기 위해서 작명을 1글자 대문자시작!!
# 생성자 : 필요한 초기 속성들을 세팅!!!!
# ==> 파이썬의 클래스 생성시 초기화 미리 만든 함수 특별함수 : __(양옆2개)
def __init__(self, name, kor, math, english, science):
self.name = name
self.korean = kor
self.math = math
self.english = english
self.science = science
# ---> 필요한 기능 추가 : 총점계산, 평균계산, 출력(이름,총점, 평균)
def get_sum(self):
score_sum = self.korean + self.math + self.english + self.science
return score_sum
def get_avg(self):
scroe_avg = self.get_sum() /4
return scroe_avg
def to_string(self):
temp ="{0}\t{1}\t{2}".format(self.name,self.get_sum(),self.get_avg() )
return temp
# ++++ 비교 관련 특별 메서드 : ==(eq), !=(ne), >:gt, >=:ge, <:lt, <=:le
# ==> 2명 학생 객체들의 "저는 총점을 기준으로" 비교하고 싶다1!!
def __eq__(self, value): # std1 == std2 , get_sum
return self.get_sum() == value.get_sum()
# 참고) 국어점수가 기준 : self.korean == value.korean
def __ne__(self, value): # std1 != std2, get_sum
return self.get_sum() != value.get_sum()
def __gt__(self, value): # std1 > std2, get_sum
return self.get_sum() > value.get_sum()
def __ge__(self, value): # std1 >= std2, get_sum
return self.get_sum() >= value.get_sum()
def __lt__(self, value): # std1 < std2, get_sum
return self.get_sum() < value.get_sum()
def __le__(self, value): # std1 <= std2, get_sum
return self.get_sum() <= value.get_sum()
students =[
Student( "AAA", 98, 93, 79, 95),
Student( "BBB", 78, 87, 87, 90),
Student( "CCC", 90, 85, 89, 92),
Student( "DDD", 80, 96, 99, 93),
Student( "EEE", 70, 80, 89, 95),
]
students
[<__main__.Student at 0x7ef0e45f5e40>,
<__main__.Student at 0x7ef0e45f56c0>,
<__main__.Student at 0x7ef0e45f6980>,
<__main__.Student at 0x7ef0e45f6da0>,
<__main__.Student at 0x7ef0e45f61d0>]
students[0].get_sum()
365
students[3].get_sum()
368
students[0].get_sum() == students[3].get_sum()
# ==> 기존에 == 기능이 정의되지 않았으면,,,내가 직접 총점 가지고 비교!!
False
# 비교관련 특별메서드를 설계했으니..
# 비교를 내가 아니라 학생이 직접해서 나한테는 결과만 알려줘!!!!!
students[0] == students[3]
False
# 0번 학생아..너의 총점이 3번보다 높니?
students[0] > students[3]
False
# 3번 학생아,,,너의 총점이 0번보다 높니?
students[3] > students[0]
True
# 참고) 외부에서 내부의 property값을 접근에 대한!!
# 정사각형 관련 클래스
class Square:
def __init__(self, size):
self.size = size
def get_area(self):
return self.size * self.size
s1 = Square(10)
s1
10
s1.size
10
s1.get_area()
100
s2 = Square(20)
s2
<__main__.Square at 0x7ef0e45f55a0>
s2.size
20
s2.get_area()
400
s1.size
10
s1.size = 20
s1.get_area()
400
==> 클래스 내부의 속성값에 대한 외부접근을 막기 위해서는
속성값을 __을 지정해서 외부 접근을 방지할 수도 있음!!
: 외부 접근이 필요할 수도 있고, 꼭 방지해야하는 경우도 있으니 취사선택!!
class Square:
def __init__(self, size):
self.__size = size
def get_area(self):
return self.__size * self.__size
s1 = Square(10)
s1
<__main__.Square at 0x7ef0e43aac50>
s1.get_area()
100
s1.size
AttributeError
s1.__size
AttributeError
# 내부 속성에 대한 접근을 또 하나의 기능으로 생각해서 만들어 둠!! :
# ==> FM적으로 공식 통로를 통해서 접근하세요1!!!!
# 1. 속성값이 뭔지를 알려줘: get~~~
# 2. 속성값을 변경할 때 : set~~~
class Square:
def __init__(self, size):
self.__size = size
def get_area(self):
return self.__size * self.__size
## +++ 공식 루트 설계!!!
def get_size(self):
return self.__size
def set_size(self, value):
self.__size = value
s1 = Square(10)
s1
<__main__.Square at 0x7ef0e45f6d40>
s1.get_area()
100
s1.__size
AttributeError
s1.get_size()
10
s1.set_size(20)
s1.get_area()
400
# ref : https://scikit-learn.org/1.5/modules/generated/sklearn.ensemble.RandomForestClassifier.html
RandomForestClassifier
Gallery examples: Release Highlights for scikit-learn 1.4 Release Highlights for scikit-learn 0.24 Release Highlights for scikit-learn 0.22 Comparison of Calibration of Classifiers Probability Cali...
scikit-learn.org
model = RandomForestClassifier(~~~~~~~)
model.fit( X_train, y_train)
model.predict(X_test)
==> 내가 필요한 패키지들이 있다면,,누가 이미 만들어 뒀다면
잘 가져다가 사용을 하면 됨!!!!!!!
===> 코드가 훨씬 간결하게 볼 수/ 작성할 수 있음!!!!!
*** 객체지향!!!!
*** 이렇게 설계된 것들을 잘 가져다가 사용하면 됨!!!
===> 메뉴얼을 잘 봐야 함!!!!!
//여기까지 클래스
'ASAC 빅데이터 분석가 7기 > ASAC 일일 기록' 카테고리의 다른 글
| ASAC 빅데이터 분석가 과정 10일차 - 1 (24.12.17) (1) | 2024.12.17 |
|---|---|
| ASAC 빅데이터 분석가 과정 9일차 - 2 (24.12.16) (0) | 2024.12.16 |
| ASAC 빅데이터 분석가 과정 8일차 - 2 (24.12.13) (6) | 2024.12.13 |
| ASAC 빅데이터 분석가 과정 8일차 - 1 (24.12.13) (3) | 2024.12.13 |
| ASAC 빅데이터 분석가 과정 7일차 - 2 (24.12.12) (0) | 2024.12.12 |