우리FISA 주차별 회고록

[ 우리FISA AI 엔지니어링 2주차 회고 ] Python 마무리, Numpy, Pandas

yujeong0209 2024. 7. 21. 19:03

2주차 회고 썸네일

 

"Success is not final, failure is not fatal: It is the courage to continue that counts."
- Winston Churchill

 

 

2주차가 끝났다. 첫 주보다 많은 친구들과 대화하고, 점점 더 이곳에 적응해가고 있다. 처음에는 낯설고 긴장되었지만, 이제는 얼굴이 익은 사람들과 편안하게 이야기를 나눌 수 있게 되었다. 나의 노력과 용기가 빛을 발하고 있는 것 같아 뿌듯하다. 하지만 이곳에 온 이유를 다시 생각해본다. 교육을 받으러 온 곳이라는 사실을 잊지 말자. 친구들과의 즐거운 시간도 중요하지만, 나의 주된 목표는 배움이다. 이곳에서 얻고자 하는 지식과 경험을 최대한 흡수해야 한다.


 

이번주는 python 기본 개념 마무리와 객체지향프로그래밍, numpy, pandas에 대해 공부해보았습니다.

데이터분석하면 가장 기본으로 사용되는 라이브러리를 배우는 한 주이기 때문에 놓치지 않고 잘 메모하고 습득하려고 노력하였습니다.

 

이번주 배운 내용 요약
요일 내용 난이도
예외처리, 표준입출력, 객체지향 프로그래밍 ★★☆☆☆
클래스(상속, 생성자) ★★★☆☆
Numpy ★☆☆☆☆
Pandas ★★★☆☆
Pandas, 데이터시각화 ★★★☆☆

 


월요일 / 예외처리, 표준입출력, 객체지향 프로그래밍


1. 모듈을 불러오는 방법 4가지

  1. import test_library.test1 <- 전체경로 불러오기 
  2. import test_library.test1 as tlt1 <- 별명 지어주기
  3. from test_library.test1 import * <- 전체 함수 불러오기
  4. from test_library.test1 import add <- 특정 함수 불러오기

모듈을 불러오는 경우 4가지 예시

2. 예외처리 방법

# TypeError: '>=' not supported between instances of 'str' and 'int'
# ValueError: invalid literal for int() with base 10: '가'

try: # 에러가 나는지 감시
    num = input('0 이상의 정수 입력:')

    num = int(num)

    if ininstance(num, int) >= 0:
        print('참')
    else:
        print('다시 입력하세요')

except:
    print('뭔지 모를 에러 발생')

 

에러 유형

에러 유형

하위 에러 -> 상위 에러 순으로 적어야 함. 상위 예외를 먼저 작성하면 하위 예외는 영영 동작하지 않는다.

** 예외를 묶을 수 있음(튜플로 묶어야 함)

 

+ 예외를 모두 외울 수 없으니, 공식 문서의 exception_내장 예외에 들어가면 볼 수 있음

https://docs.python.org/ko/3.11/library/exceptions.html#index-2

 

Built-in Exceptions

In Python, all exceptions must be instances of a class that derives from BaseException. In a try statement with an except clause that mentions a particular class, that clause also handles any excep...

docs.python.org

 

3. 표준입출력

파일을 읽고 쓰는 방법은 2가지가 있음

방법 1 : with 활용, with문이 끝나면 자동으로 파일 닫힘

방법 2 : 파일 만들기, 열기, 닫기 모두 다 수동으로 업데이트가 됨

w :  쓰기모드, r : 읽기모드, a : 추가모드

** w : 파일이 존재하지 않으면 새로 파일 생성 or 파일이 존재하면 덮어쓰는 것

파일 생성, 수정

 

4. 객체지향 프로그래밍

주체 = 개발자

객체 = 개발자 외 나머지

파이썬은 완벽한 객체지향 언어가 아님

 

예전 = 함수 중심 = 절차 지향 = 데이터 따로 함수 따로

현재 = 클래스 안에 함수, 변수 묶어서 저장

 

클래스 내의 함수 2가지 종류

클래스 내의 함수 2가지 경우

 

변수

  1. 클래스 변수 : 모든 인스턴스가 인용하는 변수
  2. 인스턴스 변수 : 각각의 인스턴스만 사용하는 변수

클래스 내의 변수(클래스 변수, 인스턴스 변수)

 


화요일 / 클래스(상속, 생성자)


 

1. 생성자 함수(__init__)

생성자 함수 = constructor, 클래스를 통해 생성하는 순간 최초로 한번만 실행되는 함수

def __init__(self, name, age):
	self.name = name
    self.age = age

 

 

 

2. 던더메소드

던더메소드 : 기존에 존재하는 함수와 이름은 같지만 다른 기능을 하는 메소드, 파이썬 클래스에서 특정한 기능을 제공하기 위해 정의되는 특수 메소드들

def __add__(self, other):
	print(self.age + other.age)
    print(f'{self.name}과 {other.name}의 나이를 더하면 {self.age + other.age}')

 

3. 데코레이터

데코레이터 : @함수명, 기존 함수를 확장, 변경할 때 사용함

 

4. 상속에서의 init과 super

__init__ : 객체가 생성될 때 호출되는 초기화 메서드

** 초기화 할 필요가 없는 경우 클래스 변수에 선언한다.

클래스 변수, 초기화하는 인스턴스 변수

 

super() : 변수를 초기화 할 때 부모 클래스의 메서드 호출

super().__init__()을 사용한 예시

 


수요일 / Numpy


1. Numpy란?

  • Numerical Python의 줄임말로 Python에서 벡터, 행렬 등 수치 연산을 수행하는 선형대수 라이브러리. 
  • 내부적으로는 C 기반으로 처리하기 때문에 빠르다.
  • 행렬을 빠르게 구현해줌. 다른 함수 쓰일 때 기본이 되는 함수

2. Numpy 기본 세팅, 선언

import numpy as np
#numpy는 무조건 np를 별칭으로 지정해준다.

test = np.array([1,2,3,4,5])
#이렇게 선언하면, 데이터타입은 ndarray이다.

#원하는 자료형으로 선언할 수도 있다.
test = np.array([1,2,3,4,5], dtype = 'int')

#다른 자료형을 넣으면 모든 걸 포용할 수 있는 자료형으로 바뀐다.
test2 = np.array([1,2,True])
#로 선언하면 str 자료형으로 저장된다.

#np.arange(시작점, 끝점 + 1, 간격)
# **numpy에서는 간격이 소수도 가능하다
test = np.arange(0, 16, 5)
#결과 = array([0, 5, 10, 15])

#axis = 0 : 가로축(행)
#axis = 1 : 세로축(열)
#sum, mean을 할때 2차원 이상의 가로끼리의 계산일지, 세로끼리의 계산일지 정해야 함

np.sum(test,axis = 1)
np.mean(test,axis = 0)

#var - 분산, std - 표준편차, argmax - 가장 큰값, argmin - 가장 작은 값

 

3. 정렬

** python에서는 sorted이지만, numpy에서는 sort이다.

x = np.array([100, 3, 20, 50])
#정렬
#오름차순 정렬이 default다.
np.sort(x)
#하면, array([3, 20, 50, 100])이 된다.

#내림차순 정렬을 하기 위해서는
np.sort(x)[::-1]
np.sort(x, reverse = True)

 

4. flatten(), reshape()

flatten() => 평탄화, reshape() => 재구조화

flatten(), reshape() 예시


목요일 / Pandas


 

1. Pandas 개념, 추천 사이트

  • 패널 데이터는 여러 개체들을 시간을 두고 추적하여 얻는 데이터
  • numpy를 내부적으로 활용 → numpy 특징 그대로 가짐
  • 3차원 데이터
  • C가 기본이라 빠르게 처리됨
  • 데이터 분석에 특화된 데이터 구조 제공

https://dataitgirls2.github.io/10minutes2pandas/

 

판다스 10분 완성 / 10 Minutes to Pandas

Pandas 10분 완성 역자 주 : 본 자료는 10 Minutes to Pandas (하단 원문 링크 참조)의 한글 번역 자료로, 번역은 데잇걸즈2 프로그램 교육생 모두가 함께 진행하였습니다. 데잇걸즈2는 과학기술정보통신

dataitgirls2.github.io

https://www.kaggle.com/kimck924/chassis-aistudy-pandas

 

chassis_AIstudy_pandas

Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources

www.kaggle.com

https://www.kaggle.com/learn/pandas

 

Learn Pandas Tutorials | Kaggle

 

www.kaggle.com

 

2. 판다스 설치 및 기본 속성

import pandas as pd

df = pd.DataFrame(data)

#numpy에서는 ndarray 
#pandas에서는 DataFrame
#data에서 딕셔너리의 키는 열이 됨

#값에 접근하기 위해서는
df['Name']
df.Name

** numpy와 차이점

  • 'Score' : [90., 95., ‘75.’, 80, 70, 85, 90],이러면 넘파이에서는 ‘75’ 떄문에 전체가 다 str로 저장이 됨
  • 하지만, pandas에서는 있는 그대로 저장이 된다.

3. series

  • 열 = 시리즈 = 세로로 묶음
  • 시리즈 별로 같은 자료형이다.
  • 판다스의 모든 데이터에 + 5 못함(브로드캐스팅 불가, 자료형이 모두 다르기 때문)
  • 하지만,시리즈(=열)는 같은 자료형이니까 브로드캐스팅 가능

 

4. dataframe 합치는 함수(concat, join, merge)

(1)concat

두개의 dataframe을 합치는 기능

행 or 열 기준으로 join 할 수 있음

concat 예시

(2)join

how 뒤에는 어떤 조인을 할지 적는 곳

join 예시

 

(3) merge

  • 중복을 알아서 걸러서 join 해주는 함수
  • how에 어떤 좋인을 할지 정해줌(right, left 등)
  • on 파라미터 = 무슨 열을 중심으로 합칠지 내가 지정해줄 수 있음

merge 예시

 

5. Pandas에서 행 단위로 접근하기 위한 방법(loc, iloc)

  • 가로 튜플 탄위로 즉, 행 단위로 접근이 필요할 떄도 있다.
  • 하지만 판다스는 열단위라서 행단위로 접근하기 어려움
  • 따라서 loc, iloc을 활용해야 한다
    • 판다스 방식으로 부르되, 넘파이 방식으로 접근 가능(행)
    • loc은 명
    • iloc은 인덱스
  • 인덱싱으로 값 가져오기(범위 넘으면 오류 생김)

  • 슬라이싱으로 값 가져오기(범위 넘어도 오류 생기지 않음)

  • 조건을 부여하여 원하는 값 출력 + 원하는 열 선택가능(+ 리스트형으로 부를 때와 그냥 부를 때의 출력 차이)

 

 

 

6. 정렬(sort_values)

  • 정렬을 해줌
  • 우리가 정해준 특정 기준으로 전체 데이터 프레임을 재정렬 할 수 있음
  • 그동안은 내용 정렬해도 다시 저장하려면 data0 = data0(바뀐 내용) 이렇게 저장해야 했는데
  • inplace 파라미터 사용하면 바로 적용 가능함
data0.sort_values('Age', inplace = True, ascending = False)
#inplace = 바로 적용할지 지정
#ascending = 오름차순, False 하면 내림차순

#이름순으로 먼저 정렬, 이름이 동률이면 Age 순서로 해야 할떄
#즉, 정렬의 우선순위를 지정할 때
data0.sort_values(['Name', 'Age'], inplace = True, ascending = False)

 

7. replace

#Male -> M
#Female -> F
#로 변경하고 싶을 때
data1.replace('Male', 'M')

#한번에 변경하고 싶을 때
data1.replace(['Female', 'Male'], ['F', 'M'])

#같은 결과이지만, Sex 열만 조회해서 변경하면 속도 많이 줄일 수 있음
data1.Sex.replace(['Female', 'Male'], ['F', 'M'])
#이렇게 하면 출력이 Sex만 되고 이걸 다시 data1 에 저장하면 Sex 만 저장되어 다른 값이 다 지워질 수 있음
#따라서, inplace 파라미터를 써서 sex만 update 해주자

data1.Sex.replace(['Female', 'Male'], ['F', 'M'], inplace = True)
data1

 

 

8. 원하는 행 or 열 읽기

  • 열을 읽기 : 컬럼명으로 부르기 df_jjang[['Name', 'Age']]
  • 행을 읽기 : 인덱싱으로 부르기 df_jjang.loc[3:]

9. summarizing data

#숫자, 모든 통계값을 보여줄 수 있는 값들만 확인
df_jjang.describe()

#모든 컬럼에 대한 결과 값을 확인 할 수 있는 
df_jjang.describe(include = 'all')
#값이 없어도 우선 표현할 수 있는 통게들은 보여줌

#자료형에 대한 정보, 해당 컬럼에 대한 정보, type에 대한 정보등
df_jjang.info()

#head()는 상위 5개를 보여줌, 숫자를 넣으면 넣은 숫자만큼 볼 수 있음
df_jjang.head()
df_jjang.head(10)

#tail()은 하위 5개를 보여줌, 숫자를 넣으면 넣은 숫자만큼 볼 수 있음
df_jjang.tail()
df_jjang.tail(10)

#unique()는 겹치지 않는 유니크 값을 알아내는 방법
df_jjang.unique()

#&, |, ~ 사용해서 원하는 값 찾기
#이름이 중복되지 않는 모둔 사람 출력
df_jjang.Name[df_jjang.Name.duplicated()==False]

#~사용
#반이 중복되지 않는 모든 사람 출력
df_jjang[df_jjang.Class.duplicated()]
df_jjang[~df_jjang.Class.duplicated()]

#&사용
#df_jjang에서 Class C, 나이가 24 초과인 경우 출력
df_jjang[(df_jjang.Class == 'C' )& (df_jjang.Age > 24)]

#|사용
#df_jjang에서 Class C 이거나 나이가 24 초과인 경우 출력
df_jjang[(df_jjang.Class == 'C' ) | (df_jjang.Age > 24)]

 

10. Group by

df.groupby(’묶음의 기준이 되는 컬럼명’)[’적용받는 컬럼’].적용받는 연산()

#df.groupby('묶음의 기준이 되는 컬럼명')['적용받는 컬럼'].적용받는 연산()
#반별로 몇명의 학생이 있는지 df 출력
jjangu_list.groupby('반')[['이름']].count()

#반별로 테스트 점수의 평균이 얼마인지
jjangu_list.groupby('반')[['테스트점수']].mean()

#여러 컬럼에 대한 평균값이 궁금할 때(즉, 뎁스가 2개가 될때)
# df.groupby("묶음의 기준이 되는 컬럼명")["적용받는 컬럼"].적용받는 연산()
jjangu_list.groupby('반')[['담당', '테스트점수']].count() # 숫자자료형에 적용되는 연산

# df.groupby("묶음의 기준이 되는 컬럼명")["적용받는 컬럼"].적용받는 연산()
jjangu_list.groupby(['반', '이름'])[['테스트점수']].mean() # 숫자자료형에 적용되는 연산

groupby 예시

11. Melt

df.melt(id_vars = ['product', 'price'], value_vars = ['quantity'], var_name = '수량', value_name = '개수')

  • groupby 는 가로로 넓은걸 → 가늘고 길게 하는게 그룹바이었음
  • melt는 녹이다.
    • 가늘고 세로로 긴걸 가로로 넓게 만드는 작업
  • groupby의 반대 개념이다.

melt 예시

 

12. pivot

  • pivot은 원래 하고 있던거에서 완전히 새롭게 바꿀 때 사용함
  • product를 store 기준으로 재정렬
#product를 store 기준으로 재정렬하고 싶음
df.pivot(index = 'store', columns = 'product')

#product를 store 기준으로 재정렬하고 싶음
# + 원하는 값만 추릴 수 있음 values값에 넣으면 된다
df.pivot(index = 'store', columns = 'product', values = 'price')

#product를 store 기준으로 재정렬하고 싶음
# + 원하는 값만 추릴 수 있음 values값에 넣으면 된다
df.pivot(index = 'store', columns = 'product', values = ['quantity', 'price'])

pivot 예시


금요일 / Pandas 마무리, 데이터 시각화


1. Function Apply

  • 원래는 브로드캐스팅이 안되는 작업을 찢어서 필요한 부분에 적용시키는 메소드
  • 행, 열, 특정 시리즈 등 원하는 부분을 특정할수있음.
#전체에 간단한 Apply 함수 적용
def func(x):
    print(f'x : {x}')
    return '완료'
    
jjangu_list.apply(func)
jjangu_list.apply(func, axis = 0)
jjangu_list.apply(func, axis = 1)

#특정 열에만 apply 함수 적용
jjangu_list.반.apply(func)

#미나리 → 강서구, 개나리 → 강동구,  장미 → 광명시 센터로 변경
def center(x):
    if x == '미나리':
        return '강서구'

    elif x == '개나리':
        return '강동구'
    
    elif x == '장미':
        return '광명시'

    else:
        return '기타'

jjangu_list.반 = jjangu_list.반.apply(center)

 

 

2. 원하는 값 찾는 방법(filter, contains, startswith, endswith)

(1) filter : 정확히 일치하면

#컬럼명에서 원하는 문자/문자열을 쉽게 찾을 수 있다.
#기본형
filter(items = ['원하는 컬럼명'], axis = )
filter(like = '원하는 컬럼명', axis = )

#열 중심 / 행 중심으로 조회
# filter - 컬럼명에서 원하는 문자/문자열을 쉽게 검색할 수 있습니다
jjangu_list.filter(items = ['이름', '담당']) #열 중심

# filter - 컬럼명에서 원하는 문자/문자열을 쉽게 검색할 수 있습니다
jjangu_list.filter(items = [1, 8], axis = 0) #행 중심

#컬럼명에 특정 문자 포함된 경우 찾음
jjangu_list.filter(like = '스트')

#isin  검색한 문자열이 들어가 있어야 함(값 안에) “대신 딱 일치해야 함”

 

(2) contains : 일부라도 일치하면, 정규식도 활용 가능

  • ^ : ~ 시작하는, $ : ~끝나는 . : 임의의 한 문자
  • : 0개 이상의 문자 (직전 문자가 0번 이상 반복)
  • : 1개 이상의 문자 (직전 문자가 1번 이상 반복) ? : 0개 또는 1개의 문자 (직전 문자가 0번 또는 1번 반복) {n} : 정확히 n개의 문자 (직전 문자가 n번 반복) {n,} : n개 이상의 문자 (직전 문자가 n번 이상 반복) {n,m} : n개에서 m개의 문자 (직전 문자가 n번 이상 m번 이하 반복)

contains에서 정규식을 활용한 예시

(3) startswith : 시작글자가 일치하면

(4) endswith : 끝글자가 일치하면

 

 

3. Matplotib 초기세팅

# 코랩에서 한글 폰트 깨지는 현상 해결을 위해 한국어 폰트들을 설치합니다
!sudo apt-get install -y fonts-nanum # 매직메소드
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
# 이후 런타임 재시작해주세요

# %matplotlib inline  # 버전이 낮은 노트북에서 그래프가 바로 뜨지 않을 때 사용 % 쉘메소드

import matplotlib as mpl  # 기본 설정 만지는 용도
import matplotlib.pyplot as plt  # 그래프 그리는 용도
import matplotlib.font_manager as fm # 폰트 관련 용도

# 현재 설치된 폰트 확인해보기
sys_font=fm.findSystemFonts()
print(f"sys_font number: {len(sys_font)}")
print(sys_font)

nanum_font = [f for f in sys_font if 'Nanum' in f]
print(f"nanum_font number: {len(nanum_font)}")

# 시각화도 결국...
#numpy를 기반으로 돌아간다.
import numpy as np

# 한글 폰트 설정
plt.rc('font', family='NanumGothic')
# - 기호 깨짐 현상 방지를 위한 설정
plt.rc('axes', unicode_minus=False)

 

4. 도화지 위에 그래프 그리기

#1) 도화지를 그린다.
plt.figure()#도화지

#2) 축을 얹습니다.
plt.axes()

#3) 값을 넣는다.
x = [0, 2, 4, 6, 8]
y = [1, 2, 3, 4, 5]

#4) 그래프를 출력한다.
plt.plot(x,y)
plt.plot(x,y); #메모리 주소 출력 안됨

#5) 좌표에 점을 찍는다.
plt.plot(x, y, marker = 'x')

#6) 그래프의 선을 바꾼다.
plt.plot(x, y, marker = 'x', linestyle = '--')

#7) 그래프의 색을 바꾼다.
plt.plot(x, y, marker = 'x', linestyle = '--', color = 'g')

#8) 파라미터에 마음대로 순서해도 상관없음
plt.plot(x, y,  '-.xg');
plt.plot(x, y,  'gx-.');

#타이트하게 딱 맞게 그래프를 출력하는 방법
plt.plot(np.random.randn(30).cumsum(), 'g-.x')
plt.axis('tight') # 좌 우 하 상 - 축의 범위를 고정할 때

#레이블 Label(x축/y축 이름, 범례, 제목 등)
plt.plot(np.random.randn(30).cumsum(), 'g-.x', label = '2022년')
plt.plot(np.random.randn(30).cumsum(), 'b--^', label = '2023년')
plt.axis('equal') #시각화된 그래프를 중앙에 그릴때
plt.legend() #범례
plt.title('연도별 분기별 매출 차이') #제목
plt.xlabel('분기')
plt.ylabel('매출(단위 : 억원)')
plt.legend(loc = 'upper right', frameon=False) #범례 loc = 범례 위치 고정, frameon = False 범례 뒤 그림자 제거

 

5. 폰트

#사용할 수 있는 폰트 리스트 확인
set([f.name for f in mpl.font_manager.fontManager.ttflist])

#계속 쓰고 싶은 폰트 규격이 있는 경우
#미리 자주쓸 폰트를 지정해둘 수 있음
# 계속 쓰고 싶은 폰트 규격이 있을 때
# 파리미터 = 아규먼트   **kwags
font1 = {'family': 'NanumSquareRound', 'size':20, 'color':'red'}
font2 = {'family': 'NanumMyeongjo', 'size':14, 'color':'green'}

#미리 선언한 폰트 적용 방법, 1회성 폰트 적용 방법
# 계속 쓰고 싶은 폰트 규격이 있을 때
# 파리미터 = 아규먼트   **kwags
font1 = {'family': 'NanumSquareRound', 'size':20, 'color':'red'}
font2 = {'family': 'NanumMyeongjo', 'size':14, 'color':'green'}

plt.plot(np.random.randn(30).cumsum(), 'g-.x', label='2022년')
plt.plot(np.random.randn(30).cumsum(), 'b--^', label='2023년')

#제목에 이미 지정해놓은 폰트 유형을 적용하고 싶은 경우 fontdict
plt.title('연도별 분기별 매출 차이', fontdict=font1) # 제목

#계속 쓸게 아니라 한번만 쓸 경우 여기에 선언
#rotation은 회전 각도 수
plt.xlabel('분기', family='NanumMyeongjo', size=14, color='blue', rotation=130) # x축 제목

#이미 선언해놓은 글꼴을 적용하기 위해서 fontdict 사용
plt.ylabel('매출(단위: 억원)', fontdict=font2) # y축 제목
plt.axis('equal') # 시각화된 그래프를 중앙에 그릴 때
plt.legend(loc='upper right', frameon=False) # 범례 loc=범례 위치 고정, frameon=False 범례 뒤 음영 제거

 

6. 여러 형태의 그래프 생성

#Bar plots
plt.bar(x1, y1, label="Blue Bar", color='b')
plt.bar(x2, y2, label="Green Bar", color='g')
plt.plot()

#ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

#히스토그램
# Use numpy to generate a bunch of random data in a bell curve around 5.
n = 5 + np.random.randn(1000)

m = [m for m in range(len(n))]
plt.bar(m, n)
plt.title("Raw Data")
plt.show()

#ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

#Scatter plots(산점도)
plt.scatter(x1, y1)
plt.scatter(x2, y2, marker='v', color='r')
plt.scatter(x2, y3, marker='^', color='m')
plt.title('Scatter Plot Example')
plt.show()

#ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

#stack plots
plt.stackplot(idxes, arr1, arr2, arr3, colors= ['r', 'g', 'b'])
plt.title('Stack Plot Example')
plt.legend()
plt.show()

#ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

# Pie Charts
plt.pie(sections, labels=labels, colors=colors,
        startangle=120,
        explode = (0, 0.1, 0), # 틈새
        autopct = '%1.2f%%' # autopercent - 소수점 둘째짜리까지 비율을 계산해 출력해다오
        )

plt.axis('equal') # Try commenting this out.
plt.title('Pie Chart Example')
plt.show()

 

1. 클래스 변수를 생성자 함수에서 언급할 경우

class Person:
	nation = 'Korea'
    
    def __init__(self, name, age):
    	self.name = name
        self.age = age
        self.nation = Person.nation #class 변수를 넘겨줌. 앞에 클래스명 필수

 

2. super().__init__()

궁금했던 내용 : 상속받을 때 이미 부모 클래스에서 __init__ 메서드를 선언해두었기 때문에 굳이 child에서 또 초기화해야 하나?

(1). 자식 클래스에서 새롭게 추가되는 변수가 없는 경우 부모 클래스의 __init__ 메서드 활용 가능

상속 받을 때 __init__ 재정의 안해도 부모 __init__ 활용 가능

(2). 새롭게 추가된 변수가 있어서 __init__에 정의한 경우 __init__가 재정의 되기 때문에 부모 __init__ 활용 불가능

자식 클래스 __init__ 재정의시 부모 __init__ 메서드 활용안됨

(3). 자식 클래스에서 __init__ 를 오버라이딩 하는 경우 부모 클래스의 __init__을 super().__init__()으로 불러와야함

super().__init__()로 부모 __init__ 메서드 불러오기

 

-> 자식 클래스에서 __init__ 메서드를 정의할 때 부모 클래스의 __init__ 메서드가 자동으로 호출되지 않는다. 따라서, 명시적으로 호출해줘야 한다.

** 결론 = 부모 클래스의 __init__ 를 그대로 상속해서 사용해도 상관없음. 근데 매개변수, 조건 등 수정이 필요한 경우 기존 부모 클래스에서 물려받을 내용은 super().__init__(물려받을 변수)로 받고, 추가할 건 추가하는 것이다.

 

4. numpy는 행, 열 순서 / Pandas는 열, 행 순서


요일 식사 특이사항

초복이라서 닭갈비 먹음
닭갈비 먹으러 가는길에 컵빙수 받았음
kgit에서 전주 낙지 볶음밥 먹었음
진짜 짱 맛있었움
수업 끝나고 술 마셨음
명동 칼국수에서 알탕 먹었음
진짜 짱 맛있었음
집와서 바로 진짜 바로 잠들었음
속이 안좋아서 명동 칼국수에서 성게 미역국 먹었음
진짜 짱 맛있었음
수업때 한번도 안졸고 들은 첫날(어제 빨리 자길 잘했다고 생각함)

지하에서 지코바 시켜먹었음
진짜 너무너무너무너무 맛있었음
쓰레기 처리가 힘들뻔 했지만 다시 먹고 싶음
금요일이라서 수업 끝에 집중을 아예 못했음

 

 


1. 모듈.path : 모듈이 어디서 불러와지고 있는지 경로를 알고 싶을 때 사용

2. if __name__ == "__main__": 스크립트가 직접 실행될 때와 모듈로 임포트될 때를 구분하기 위해 사용

 

  • 스크립트가 직접 실행될 때: __name__ 변수는 "__main__" 값이 된다.
  • 모듈로 임포트될 때: __name__ 변수는 해당 모듈의 이름이 된다.

3. flush = True : flush는 물을 내리다 = 바로 바로 내리고 반영된다. 파일 입출력할 때 close 안해도 자동으로 바로 반영되게 하는 파라미터

 

4. _와 __의 차이

  • _ : 단일밑줄
    • ‘비공개’임을 나타내는 관례, 실제로 접근을 막는 것은 아니지만, 해당 속성이 클래스 외부에서 사용되지 않도록 하는 신호
  • __ : 이중 밑줄
    • 맹글링 : 이름 앞에 이중을 붙이면 파이썬 인터프리터가 변수 이름을 클래스 이름과 결합하여 고유한 이름으로 변환함. 이를 통해 서브클래스에서 이름이 충돌하지 않음

_ / __ 차이, 맹글링

5. 맹글링 : 속성(변수)의 이름을 변경하는 기능, 충돌을 방지하고자 나온 기능

6. pydantic : 예외와 class 상속을 가지고 아주 편하게 파이썬에서 불가능한 자료형 강제를 가능케하는 라이브러리

pydantic 예시

7. np.nan : 의미는 없지만 0대신 쓸 수 있는 값

8. 행 -> axis = 0 / 열 -> axis = 1

9. inplace : inplace = True 파라미터를 사용하면 바로 행렬에 적용시켜줌

10. 값을 저장 or 읽어올 때 열번호를 없애는 방법

#del을 통해 지우기
del new_jjanggu['Unnamed: 0']

#읽어 올 때 열번호를 빼고 들어오는 방법
new_jjanggu = pd.read_excel('jjanggu.xlsx', index_col = 0) #0번 열을 인덱스로 쓰겠음

#애초에 저장할 때부터 인덱스 번호는 저장하지 않는 경우
df_jjang.to_excel('new)jjanggu.xlsx', index = False) #인덱스 번호는 없이 파일에 저장한다는 의미

이번주는 그래도 졸지 않고 간식도 많이 안먹고 나름 잘 지냈던 것 같다. 나름 적응을 한 것 같아서 뿌듯했다.

 

모르는 내용을 잘 메모해두었고 집에와서 chatgpt랑 주변 전문가들한테 많이 물어보고 끝까지 이해하려고 노력했다. 

수업은 들은게 끝이 아니라 듣고 복습해서 내것으로 만드는게 제일 중요하다고 생각한다.

 

하루종일 수업을 빠르고 많이 듣기 때문에 집에와서 or 아침에 복습하는 것이 정말 중요하다고 생각한다.

 

어제(7/20, 토)에 이사를 했다. 

더 좋은 환경에 왔기 때문에 수면의 질이 높아질 것 같고 그럼 수업때도 더 집중 할 수 있을 것 같아서 기대가 되고 새로운 출발을 하는 거라 설레고 떨리기도 하다.

 

깨끗하게 집을 잘 쓰고 정리도 잘하고 잘 자고 잘 먹고 건강한 생활 습관, 식습관을 유지해서 체력을 길러야 겠다.

이제 차주부터는 아침에 헬스장을 다닐거다! 몸과 마음이 건강한 생활을 해야징 :)

 

+ 회고록 쓸 때 배운 내용이 너무 길고 공유를 하는 의미가 없는 것 같다. 가독성도 떨어져보인다.

다음주부터는 배운 내용은 그냥 키워드 형식으로만 정리하고, "어려웠던 내용", "새롭게 알게 된 내용", "느낀점" 등에 집중해서 작성해보려고 한다.