2024. 12. 16. 09:29 ASAC 빅데이터 분석가 7기/ASAC 일일 기록

ASAC 빅데이터 분석가 7기/ASAC 일일 기록

ASAC 빅데이터 분석가 과정 9일차 - 1 (24.12.16)

junslee 2024. 12. 16. 09:29

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)

 

==> 내가 필요한 패키지들이 있다면,,누가 이미 만들어 뒀다면
     잘 가져다가 사용을 하면 됨!!!!!!!
===> 코드가 훨씬 간결하게 볼 수/ 작성할 수 있음!!!!!
*** 객체지향!!!!

*** 이렇게 설계된 것들을 잘 가져다가 사용하면 됨!!!
===> 메뉴얼을 잘 봐야 함!!!!!

 

//여기까지 클래스

반응형