• 데코레이터
  • Django
  • Pandas
  • Numpy(2-3 7:46)
  • 조별 과제
  • 회고

 


 

4-6

데코레이더

함수나 메서드를 변경하지 않고 꾸며주는

->함수에 다른 함수로 감싸버린다. 원래함수에 새로운 기능을 덧 붙여준다.

def decorator_function(original_function):
    def wrapper_function(*args, **kwargs):
        print("추가 기능 실행 전")
        result = original_function(*args, **kwargs)
        print("추가 기능 실행 후")
        return result
    return wrapper_function

작성 후

@decorator_function
def display():
    print('원래 함수') 

decorator_function은 @를 앞에 붙이면 자동으로 사용 된다.

그리고

display()를 호출하면 wrapper_function이 호출 되고 wrapper_function 내부에서 original_function을 호출하기 때문에 앞 뒤로 기능을 추가 할 수있게 되는거다. (시간 로그남기기 등에 코드의 재용성이 좋다)

중복 되는 코드는 제거 된다. => 이해가 안됨(저 코드에서 수를 넣게 하고 싶으면 어떻게 써야하지?)

 

1) 데코레이터 체이닝

여러 데코레이터를 하나의 함수로 적용 시킬 수 있다. (안쪽(원래 함수에 가까운 순서)에서 바깥으로 적용 된다.)

 

2)컨텍스트 매니저

with구문

특정 자원 사용 시 자원을 얻는 것 과 정리를 자동으로 해주는 매커니즘

(파일을 닫지 않거나 할당 받은 자원을 돌려주지 않는다면 정상적인 활동을 하지 않아 파일이 잠기거나 누수가 발생하는데  이를 해결하는 구문)

with open("test.txt", "w") as f:
    f.write("test")

작성 후

f.write("tetest")

를 쓰게 되면 파일이 자동으로 닫힌 상태라서 에러가 뜨게 된다.

 

 


 

5-1

Django

 1) 라이브러리

모듈이나 함수의 집합이다.

개발자가 필요에 따라 호출해서 사용하는 경우를 말한다.

(비유: 라이브러리는 도구상자이다.)

 

2) 프레임워크

이미 기본구조가 짜여져있어 일정 방식에 따라 코드를 작성해야한다.

미리 다른 개발자가 정리한 코드나 미리 제공된 코드들을 결합해서 동작하는 방식 

프레임 워크가 전체흐름을 제어하게 된다 -> 제어의 역전 현상 발생(개발자는 요구하는 것만 코드 작성 하게 되는)

(유지 보수, 많은 기능 제공을 의미), (비유: 프레임 워크는 설계도이다.)

 

3)Django

웹프레임 워크라서 웹에 백엔드 기능을 만들 때 편한다 (데이터베이스도 가능, 작성코드 서빙도 가능)

("batteries-included"= 웹을 만들때 필요한 기능을 모두 가지고있다.)

 

주요 구성요소

1. 모델: 데이터베이스 구조를 정의하고, 데이터와 상호작용하는 역할을 합니다.

2. 뷰: 사용자가 보는 화면을 담당하며, 모델에서 가져온 데이터를 사용해 템플릿에 전달합니다.

(사용자의 요청에 대한 답을 준비해준다.)

3. 템플릿: HTML을 생성하는 역할을 하며, 뷰에서 전달받은 데이터를 표시합니다. (웹페이지의 디자인)

4. URL 컨피그: URL과 뷰를 연결하는 역할을 하며, 사용자가 특정 URL로 접근할 때 어떤 뷰를 호출할지를 결정합니다.

(사용자가 입력한 주소와 본인의 페이지 주소 매칭)

 

동작흐름

URL 요청 => 뷰(view) 호출 => 데이터 처리 및 템플릿 렌더링=> HTML 응답

 


5-2

Django의 핵심개념

MVT(Model-View-Template)

모델(데이터 관련)

모델을 사용하여 데이터를 저장, 조회, 수정, 삭제하는 작업을 수행할 수 있습니다.

ORM(Object-Relational Mapping) = sql이 할수있는 동작을 파이썬 코드로 할 수 있게한다.

뷰(내용과 관련)

비즈니스 로직데이터 처리를 담당하며, 사용자 요청에 따라 어떤 데이터를 보여줄지 결정

템플릿(실제로 보여줌)

템플릿 언어를 사용해 동적 콘텐츠를 렌더링할 수 있습니다.

 

데이터 작업 => 처리 => 사용자에게 보여주기

URL을 요청 => 뷰(View) 연결 및 호출 => 데이터 조회 및 처리 => 템플릿 생성 => HTML응답변환 => 데이터 처리 및 조회

 


 

파이썬라이브러리

1-1

Pandas소개

판다스(Pandas)는 Python에서 데이터를 쉽게 다룰 수 있게 해주는 데이터 분석 라이브러리

데이터 처리, 분석, 처리시 수학적 기능을 약간씩 자동

기본: 데이터를 표형식으로 만들어준다.

pandas의 활용 분야 = 데이터 처리가 필요한 모든 분야

 


1-2

jupyetr notebook 설정하기

 

1) 가상환경 설정

conda create --name myenv(이름)

가상환경을 설정해야지 다른 패키지들과 충돌을 막을 수 있다.

 

2) 가상환경 활성화, 비활성화

conda activate myenv

conda deactivate

 

3) 판다스 설치

conda install pandas

 

4) 쥬피터 노트북 설치, 실행

pip install jupyter

jupyter notebook

 

5) 가상환경 쥬피터에서 연결하기

pip install ipykernel

 

6) 가상환경을 Jupyter Notebook에 추가하기

python -m ipykernel install --user --name myenv --display-name "My Env"

 

이렇게 진행하면 쥬피터 노트북에서 가상환경을선택 가능해집니다.

 

※기능

conda evn list 환경 목록 검색

conda list 현재 설치 된 패키지 목록 검색

 

※판다스 넘파이 기능 가져오기

import pandas as pd

import numpy as np

(pd=pandas, np=numpy)

 

※다양한 기능

-Shift+tap 함수의 설명 다양한 기능의 문서 확인

-에러 발생 지점 전까지는 작동하기 때문에 에러 지점을 찾을 때 참고

 

※명령어 찾아보기

주말에 찾아서 정리 예정

 

 


 

 

1-3

판다스의 기본!

 

1) 시리즈란? 

  • 시리즈(Series)는 1차원 배열과 같은 데이터 구조입니다.
  • 엑셀의 한 열(column)을 떠올리면 이해가 쉬워요!
  • 인덱스(Index)와 데이터 값(Value)이 쌍으로 구성됩니다

import pandas as pd

판다스를 가져온다.

# 예시: 시리즈 생성
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print(s)

시리즈의 값을 1차원의 형태(리스트 형태)로 넣어준다.

 

2) 데이터 프레임 이해하기

  • 데이터 프레임(DataFrame)은 2차원의 표 형태 데이터 구조입니다.

데이터 프레임 생성

data = { '이름': ['철수', '영희', '민수'], '나이': [25, 30, 35], '직업': ['학생', '회사원', '프리랜서'] }

 

df = pd.DataFrame(data)

 

df실행하면 표가 만들어진다.

 

컬럼 명으로 접근하기

df['이름'][0]

이름이라는 컬럼으로 접근하고 [0]으로 첫 번째 데이터만 뽑아 올 수 있다.

 

3) index

  • 시리즈나 데이터프레임에 각 값을 고유하게 식별해주는 레이블
  • 필요에따라 사용자가 설정 가능

df.set_index('이름', '나이', '직업')

set_index = 원하는 column들을 리스트 내에 순서대로 넣을수 있다.

 

df.set_index('이름', inplace = True)

inplace = True = 기존 데이터 프레임에 변경된 데이터 프레임을 덮어 씌어 버린다.

 

tip. 데이터 타입을 확인 할 때

     1개의column만 확인하면 시리즈가 나오고

     여러개면 데이터 폼으로 나오거나 numpy.int 등 다르게 나온다.

 


 

2-1

Numpy란?

과학계산 수학계산에 강력한 성능을 제공하는 파이썬 라이브러리이다.

 

import numpy as np

넘파이를 가져온다.

 

arr = np.array([1,2,3,4,5])

array의 배열을 만든다.

 

1) 배열의 연산

복합 대입 연산자: 원래 메로리 위치에서 값을 직접 수정하려고하고 일일이 나눠주는건 새로운 배열을 생성하고

그걸 다시 넣어준다. (적용형태나 내부적인 동작원리에 따라 에러가 발생할 수 있다.)

ex.1)

sample_list = [1,2,3,4,5]

 

for i, v in enumerate(sample_list):
    sample_list[i] = v + 10

 

sample_list #[11,12,13,14,15]

ex.2)

arr += 10

 

arr  #array([11,12,13,14,15])

 

ec.3)

arr /= 2 #error

 

arr = arr / 2   #array([5.5, 6.0, 6.5, 7.0, 7.5])

tip. 복합대입연산자가 안되더라도 일반 연산은 가능할 수 있다.

tip. 복합대입연산자는 메모리 자체에 변경을 가하려 하는데 데이터타입이 맞지않는 경우 문제가 생길 수 있다.

=>데이터 타입을 바꾸는 연산을 진행하는 경우 계산을 한 후에 다시 변수에 집어 주는 형태로 값을 내야한다.

tip. 데이터 타입은 작아지는 형태로 자동변환 되지 않는다. ex) 실수에서 정수로는 바뀌지 않는다.

 

2) 데이터 형태 바꾸기

reshape

넘파이 배열 차원 변경 함수

a.reshape(변환 shape) 혹은 np.reshape(a, 변환 shape)

arr = np.array([1,2,3,4,5,6])

arr_2 = arr.reshape((1, 6)) #차원의 개수는 데이터와 맞아야한다.

데이터 타입을 1차원과 6차원을 갖는 2차원 데이터으로 변환 된거다.

1차원, 2차원의 정의 는 뭐지?

[1,2,3,4,5,6,7,8,9] = 1차원 (1차원은 리스트의 형태라고 생각하면 되는건가?)

[[1,2,3,4],[5,6,7,8]] 이랑 [ [1,2,3],[4,5,6],[7,8,9] ] = 2차원 (띄워쓰기는 알아보기 쉽게 하려고 넣음)

2차원에서 값이 (3, 3)으로 나온다면 3개의 행, 3개의 열이 존재한다고 본다.

[ [ [1, 2], [3, 4] ], [ [5, 6], [7, 8] ] ] = 3차원 (띄워쓰기는 알아보기 쉽게 하려고 넣음)

=>대괄호 안에 어떻게 들어가있는지가 중요해 보이고 

3차원은 어떻게 나타내는거지?

(나타낸다고 하는게 맞나? 2차원은 행과 열이 있어서 표라고 생각하면 쉬운데 3차원은 모르겟다.)

 

arr_2 = arr.reshape((1, 6))

을 조금 더 2차원적인 부분을 확인 한다고 하셨는데 2차원 적이다라는 말이 뭐지?

arr_3 = arr.reshape((2, 3))  #확인을 위해 쓴 코드

 

1, 6과 2, 3을 넣은 이유가 뭐지?

 

 

 


 

 

2-2

numpy 배열 생성하기

1) shape

배열의 형상을 튜플의 형태로 나오게한다.

 

import numpy as np

arr = np.array([1,2,3,4,5])

arr_1 = np.array(1)

arr_1  #array(1) 스칼라, 차원이없는 배열, 단일값 배열 이라 부른다.

arr_1.shape() #() 아무것도 없는 값이 나온다.

 

2) arr.ndim

몇차원인지 확인 시켜준다.

 

3) arr.size

전체 요소의 개수를 확인시켜준다.

 

4) arr.dtype

어레이의 데이터 타입 확인

 

5) arr.nbytes

메모리 크기 확인

 

6) arr.T

    arr.transpose()

- T메소드는 배열의 shape을 역방향으로 바꾸는 것만 할 수

- 배열의 전치를 원하는 방향으로 (transpose 메소드) 

transpose는 예제를 보아도 이해가 어렵고 강의에서도 이런게 있다정도로 넘어가라 했으니 이정도만 하자

 

7) arr_2.ravel()

데이터차원이 몇개든지 1차원으로 바꾼다.

 

8) arr_2.Flaten()

플래튼 = 차원을 평탄화 해주는데 원래 값은 건드리지 않음 

 

9) arr.sum()

더하기 함수랑 같음

arr.sum(axis=0) 축을 지정(열 기준)

arr.sum(axis=1) 축을 지정(행 기준) 

 

10) arr.mean()

평균을 계산한다.

 

11)arr.max()

최댓값 구한다.

 

12) arr.zeros(2,3)

      0으로 채워진 2행3열

      arr.ones(2,3)

     1로 채워진 2행3열

      arr.full((2,3),7)나 arr.full((arr_1.shape), 7)

      7로 채워진 2행 3열 / arr_1형태에 7로채워진 배열

 

13) np.arange(10)

    연속적인 수로 (0부터 9까지) 채워진 배열 tip.10은 안채워짐

 

배열을 만드는 이유는 각종 수학 연산을 쉽게하기 위해서다.

 

★dir()

해당 객체가 가지고있는 매서드와 어트리뷰트를 확인가능!!!!!

 

 

 


2-3

배열연산 및 브로드 캐스팅

 

1) 브로드캐스팅

배열의 크기가 다른 연산을 가능하게 만들어준다.

전부 가능한건 아님

=> 규칙: 두배열의 차원이 같다, 작은 배열의 차원이 1이여야한다,

               배열의 각 차원에서 크기가 동일하다, 한 배열에서 해당 차원의 크기가 1이여야한다.

ex)

arr3 = np.array([[1,2,3],[4,5,6]])

arr4 = np.array([10,11,12])

arr3 + arr4

array([[11, 13, 15],
       [14, 16, 18]])

 

여기서 한배열의 차원의 크기가 1이다라는건 이해가는데 각 배열의 차원에서 크기가 동일하다는 이해가 안감 

 

 

2) 함수를 이용해서도 연산이 가능하다.

ex)

np.add(arr1, arr2) 

#array([5,6,7,8])

 

3) out = result(result는 결과를 받을 이름)

결과를 저장할 수 있다.

np.add(arr1,arr2, out = result)

result # array([5,6,7,8])

 


 

조별mission

1조 변수 타입힌트

2조 리스트 버블sort, selection sort, insertion sort, binary insertion sort, heap sort, tim sort

3조 튜플 리스트 보단 덜 사용 된다. 변화면 안되는 값이 변해 오류가 낫을때 사용
4조 딕셔너리 효율적인 검색 성능(키값이 벨류의 주소 역할), dict()는 딕셔너리 생성 함수, 딕셔너리 메서드 keys(), valnues(), items(), pop(), get() (공부)

5조 set union(), 대칭차집합, set은 정렬이 되지않아 사용 후에 정리 필요(공부)

6조 연산자 연산자가 어떻게 어떤 순서로 쓰이는지 알아봐야할 것 같다.

7조  제어문-조건문 split(), map()

9조 함수

10조 class class는 각각 독립 된 것, class와 관련 된 '속성'(공부)

11조 객체지향 상속받을 클래스 뒤에(상속해주는 클래스) 오버라이딩 오버로딩 차이(공부)

12조 예외처리 에러정리 try, except정의 

13조 모듈과 패키지 pip 어떤 모듈이 있는지 알아보는게 좋다. 추가 나중에 쓰면 좋은 것virtualenv, pipenv, poetry

14조 파일 입출력 Decorator 설명이 너무 좋은듯 나는 아직 아무것도 모르는데 보면 좋을듯

 

 

 


 

 

회고

 

궁금했고 알아낸 것들

 

1. 데코레이터 조별과제 발표에서 발표하신 내용 찾아보고 정리해봐야겟음

중복 되는 코드는 제거 된다. => 이해가 안됨(저 코드에서 수를 넣게 하고 싶으면 어떻게 써야하지?)

 

2. pandas indexe와 시리즈 개념 다시 잡을 필요있어 보임

※명령어 찾아보기

주말에 찾아서 정리 예정

 

3. numpy 정의 자체를 모르겟어서 어려웠음

1차원, 2차원의 정의 는 뭐지?

[1,2,3,4,5,6,7,8,9] = 1차원 (1차원은 리스트의 형태라고 생각하면 되는건가?)

[[1,2,3,4],[5,6,7,8]] 이랑 [ [1,2,3],[4,5,6],[7,8,9] ] = 2차원 (띄워쓰기는 알아보기 쉽게 하려고 넣음)

2차원에서 값이 (3, 3)으로 나온다면 3개의 행, 3개의 열이 존재한다고 본다.

[ [ [1, 2], [3, 4] ], [ [5, 6], [7, 8] ] ] = 3차원 (띄워쓰기는 알아보기 쉽게 하려고 넣음)

=>대괄호 안에 어떻게 들어가있는지가 중요해 보이고 

 

3차원은 어떻게 나타내는거지?

(나타낸다고 하는게 맞나? 2차원은 행과 열이 있어서 표라고 생각하면 쉬운데 3차원은 모르겟다.)

 

arr_2 = arr.reshape((1, 6))

을 조금 더 2차원적인 부분을 확인 한다고 하셨는데 2차원 적이다라는 말이 뭐지?

arr_3 = arr.reshape((2, 3))  #확인을 위해 쓴 코드

1, 6과 2, 3을 넣은 이유가 뭐지?

 

arr3 = np.array([[1,2,3],[4,5,6]])

arr4 = np.array([10,11,12])

arr3 + arr4

한배열의 차원의 크기가 1이다라는건 이해가는데 각 배열의 차원에서 크기가 동일하다는 이해가 안감 

 

+ Recent posts