AI Tech Week 1 보충 학습 (numpy, pandas)
0. 개요
주말엔 쉬고 싶지만..😂 아직 부족한 나에겐 그럴 여유는 존재하지 않는다. 시작해보자😎
1. 학습 내용
Python
4-1강: Python Object Oriented Programming
객체지향 프로그래밍 개요
- Object-Oriented Programming, OOP
- 객체: 실생활에서 일종의 물건 - 속성(Attribute)과 행동(Action)을 가진다.
 
- OOP는 이러한 객체 개념을 프로그램으로 표현- 속성은 변수(variable), 행동은 함수(method)로 표현된다.
- 파이썬 역시 객체 지향 프로그램 언어
 
- OOP는 설계도에 해당하는 클래스(class)와 실제 구현체인 인스턴스(instance)로 나눔
Attribute 추가하기
- Attiribute 추가는 __init__, self와 함께
- __init__은 객체 초기화 예약 함수
class SoccerPlayer(object):
    def __init__(self, name, position, back_number):
        self.name = name
        self.position = position
        slef.back_number = back_number파이썬에서 __ 의미
- __는 특수한 예약 함수나 변수 그리고 함수명 변경(맨글링)으로 사용
예) __main__, __add__, __str__, __eq__
class SoccerPlayer(object):
    def __str__(self):
        return "Hello, My name is %s. I play in %s in center " % \
        (self.name, self.position)
jinhyun = SoccerPlayer("Jinhyun", "MF", 10)
print(jinhyun)method 구현하기
- method(Action) 추가는 기존 함수와 같으나, 반드시 self를 추가해야만 class 함수로 인정됨
class SoccerPlayer(object):
    def change_back_number(self, new_number):
        print("선수의 등번호를 변경합니다 :
            From %d to %d % \
            (self.back_number, new_number))
        self.back_number = new_number객체 지향 언어의 특징
- 실제 세상을 모델링
상속 (Inheritance)
- 부모클래스로 부터 속성과 Method를 물려받은 자식 클래스를 생성 하는 것
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
class Korean(Person):
    pass
first_korean = korean("Sungchul", 35)
print(first_korean.name)class Person(object): # 부모 클래스 Person 선언
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def about_me(self): # Method 선언
        print("저의 이름은 ", self.name, "이구요, 제 나이는 ", str(self.age), "살입니다.")
 
class Employee(Person): # 부모 클래스 Person으로 부터 상속
    def __init__(self, name, age, gendef, salary, hire_date):
        super().__init__(name, age, gender)  # 부모객체 사용
        self.salary = salary
        self.hire_date = hire_date # 속성값 추가
    def do_work(self):  # 새로운 메서드 추가
        print("열심히 일을 합니다.")
    def about_me(self): # 부모 클래스 함수 재정의
        super().about_me()  # 부모 클래스 함수 사용
        print("제 급여는 ", self.salary, "원 이구요, 제 입사일은 ", self.hire_date," 입니다.")다형성 (Polymorphism)
- 같은 이름 메소드의 내부 로직을 다르게 작성
- Dynamic Typing 특성으로 인해 파이썬에서는 같은 부모클래스의 상속에서 주로 발생함
class Animal:
    def __init__(self, name): # 클래스 정의
		self.name = name
    def talk(self):
    	raise NotImplementedError("Subclass must implement abstract method")
class Cat(Animal):
    def talk(self):
    	return "Meow!'
class Dog(Animal):
    def talk(self):
        return 'Woof! Woof!'가시성 (Visibility)
- 객체의 정보를 볼 수 있는 레벨을 조절하는 것
- 누구나 객체 안에 모든 변수를 볼 필요가 없음
- 객체를 사용하는 사용자가 임의로 정보 수정
- 필요 없는 정보에는 접근 할 필요가 없음
- 소스의 보호
class Product(object):
    pass
class Inventory(object):
    def __init__(self):
        self.__items = [] # Private 변수로 선언, 타객체가 접근 못함class Inventory(object):
    def __init__(self):
        self.__items = [] # Private 변수로 선언, 타객체가 접근 못함
    @property # property decorator: 숨겨진 변수를 반환하게 해줌
    def items(self):
        return self.__items4-2강: Module and Project
생략
5-1강: Exception / File / Log Handling
파이썬의 예외 처리
- try ~ except 문법
try:
    예외 발생 가능 코드
except <Exception Type>:
    예외 발생시 대응하는 코드- 0으로 숫자를 나눌 때 예외처리 하기
for i in range(10):
    try:
        print(10/i)
    except ZeroDivisionError:
    	print("Not divided by 0")- Built-in Exception: 기본적으로 제공하는 예외
| Exception 이름 | 내용 | 
|---|---|
| IndexError | List의 Index 범위를 넘어갈 때 | 
| NameError | 존재하지 않은 변수를 호출 할 때 | 
| ZeroDivisionError | 0으로 숫자를 나눌 때 | 
| ValueError | 변환할 수 없는 문자/숫자를 변환할 때 | 
| FileNotFoundError | 존재하지 않는 파일을 호출할 때 | 
- 예외 정보 표시하기
for i in range(10):
    try:
        print(10/i)
    except ZeroDivisionError as e:
    	print(e)
    	print("Not divided by 0")- try ~ except ~ else
try:
    예외 발생 가능 코드
except <Exception Type>:
    예외 발생시 동작하는 코드
else:
    예외가 발생하지 않을 때 동작하는 코드for i in range(10):
    try:
        result = 10 / i
    except ZeroDivisionError:
        print("Not divided by 0")
    else:
        print(10 / i)- try ~except ~finally
try:
    예외 발생 가능 코드
except <Exception Type>:
    예외 발생시 동작하는 코드
finally
    예외 발생 여부와 상관없이 실행됨for i in range(10):
    try:
        result = 10 / i
    except ZeroDivisionError:
        print("Not divided by 0")
    finally:
        print("종료되었습니다.")- raise 구문- 필요에 따라 강제로 Exception을 발생
 
while True:
    value = input("변환할 정수 값을 입력해주세요")
    for digit in value:
        if digit not in "0123456789":
            raise ValueError("숫자값을 입력하지 않으셨습니다")
    print("정수값으로 변환된 숫자 -", int(value))- assert 구문- 특정 조건에 만족하지 않을 경우 예외 발생
 
def get_binary_number(decimal_number):
    assert isinstance(decimal_number, int)
    return bin(decimal_number)
print(get_binary_number(10))File Handling
파일의 종류
- 기본적인 파일 종류로 text 파일과 binary 파일로 나눔
- 컴퓨터는 text 파일을 처리하기 위해 binary 파일로 변환시킴 (예: pyc 파일)
- 모든 text 파일도 실제는 binary 파일, ASCII/Unicode 문자열 집합으로 저장되어 사람이 읽을 수 있음
| Binary 파일 | Text 파일 | 
|---|---|
| 컴퓨터만 이해할 수 있는 형태인 이진(법)형식으로 저장된 파일 | 인간도 이해할 수 있는 형태인 문자열 형식으로 저장된 파일 | 
| 일반적으로 메모장으로 열면 내용이 깨져 보임 | 메모장으로 열면 내용 확인 가능 | 
| 엑셀파일, 워드 파일 등등 | 메모장에 저장된 파일, HTML 파일, 파이썬 코드 파일 등 | 
Python File I/O
- 파이썬은 파일 처리를 위해 "open"키워드를 사용함
f = open("<파일이름>", "접근 모드")
f.close()
with open("i_have_a_dream.txt", "r") as f:
    contents = f.read()
# with 사용시 따로 close안해줘도 된다.| 파일열기모드 | 설명 | 
|---|---|
| r | 읽기모드 - 파일을 읽기만 할 때 사용 | 
| w | 쓰기모드 - 파일에 내용을 쓸 때 사용 | 
| a | 추가모드 - 파일의 마지막에 새로운 내용을 추가 시킬 때 사용 | 
파이썬의 directory 다루기
- os 모듈을 사용하여 Directory 다루기
import os
os.mkdir("log")- 디렉토리가 있는지 확인하기
if not os.path.isdir("log"):
    os.mkdir("log")- 파일 복사하기
import shutil
source = "i_have_a_dream.txt"
dest = os.path.join("abc", "yg.txt")
shutil.copy(source, dext- 최근에는 pathlib 모듈을 사용하여 path를 객체로 다룸
Pickle
- 파이썬의 객체를 영속화하는 built-in 객체
- 데이터, object 등 실행중 정보를 저장 -> 불러와서 사용
- 저장해야하는 정보, 계산 결과(모델) 등 활용이 많음
import pickle
f = open("list.pickle", "wb")
test = [1,2,3,4,5]
pickle.dump(test, f)
f.close()
del test
f = open("list.pikle", "rb")
test_pickle = pickle.load(f)
test_pickle
f.close()로그 남기기 - Logging
특징
- 프로그램이 실행되는 동안 일어나는 정보를 기록을 남기기
- 유저의 접근, 프로그램의 Exception, 특정 ㅎ마수의 사용
- Console 화면에 출력, 파일에 남기기, DB에 남기기 등등
- 기록된 로그를 분석하여 의미있는 결과를 도출 할 수 있음
- 실행시점에서 남겨야 하는 기록, 개발시점에서 남겨야하는 기록
print vs logging
- 기록을 print로 남기는 것도 가능하지만 Console 창에만 남기는 기록은 분석시 사용불가
- 때로는 레벨별, 모듈별로 별도의 logging을 남길 필요가 있음
- Python의 기본 Log 관리 모듈
import logging
logging.debug("틀렸잖아!)
logging.info("확인해")
logging.warning("조심해!")
logging.error("에러났어!!!")
logging.critical("망했다...")| Level | 개요 | 예시 | 
|---|---|---|
| debug | 개발시 처리 기록을 남겨야하는 로그 정보를 남김 | - 다음 함수로 A를 호출함 - 변수 A를 무엇으로 변경함 | 
| info | 처리가 진행되는 동안의 정보를 알림 | - 서버가 시작되었음 - 서버가 종료됨 - 사용자 A가 프로그램에 접속함 | 
| warning | 사용자가 잘못 입력한 정보나 처리는 가능하나 원래 개발시 의도치 않는 정보가 들어왔을 때 알림 | - str입력을 기대했으나, int가 입력됨 -> str casting으로 처리함 - 함수에 argument로 이차원 리스트를 기대했으나 일차원 리스트가 들어옴 -> 이차원으로 변환 후 처리 | 
| error | 잘못된 처리로 인해 에러가 났으나, 프로그램은 동작할 수 있음을 알림 | - 파일에 기록을 해야하는데 파일이 없음 -> exeption 처리 후 사용자에게 알림 - 외부서비스와 연결 불가 | 
| critical | 잘못된 처리로 데이터 손실이나 더이상 프로그램이 동작할 수 없음을 알림 | - 잘못된 접근으로 해당 파일이 삭제됨 - 사용자의 의한 강제 종료 | 
실제 프로그램 설정
configparser
- 프로그램의 실행 설정을 file에 저장함
- section, key, value값의 형태로 설정된 설정 파일을 사용
- 설정파일을 dict type으로 호출 후 사용
import configparser
config = configparser.ConfigParser()
config.read('example.cfg')
print(config.sections())
for key in config['SectionTwo']:
    value = config['SectionsTwo'][key]
    print("{0} : {1}".format(key, value))argparser
- Console 창에서 프로그램 실행시 Setting 정보를 저장함
- 거의 모든 Console 기반 Pythonb 프로그램 기본으로 제공
- 특수 모듈도 많이 존재하지만(TF), 일반적으로 ARGPARSE를 사용
- Command-Line Option 이라고 부름
import argparse
parse = argparse.ArgumentParser(
    description='Sum two integers.')
    
parser.add_argument(
    '-a', "--a_value",
    dest="a", help="A integers", type=int,
    required=True)
    
parser.add_argument(
    '-b', "--b_value",
    dest="b", help="B integers", type=int,
    required=True)   
args = parser.parse_args()
print(args)
print(args.a)
print(args.b)
print(arags.a + args.b)5-2강: Python data handling
CSV (Comma Separate Value)
- CSV, 필드를 쉼표(,)로 구분한 텍스트 파일
- 엑셀 양식의 데이터를 프로그램에 상관없이 쓰기 위한 데이터 형식
CSV 객체로 CSV처리
- Text파일 형태로 데이터 처리시 문장 내에 들어가 있는 "," 대해 전처리 과정이 필요
- 파이썬에서는 간단히 CSV파일을 처리하기 위해 csv 객체를 제공함
import csv
reader = csv.reader(f,
        delemiter=',', quotechar'"',
        quoting=csv.QUOTE_ALL)| Attribute | Default | Meaning | 
|---|---|---|
| delimiter | , | 글자를 나누는 기준 | 
| lineterminator | \r\n | 줄 바꿈 기준 | 
| quotechar | " | 문자열을 둘러싸는 신호 문자 | 
| quoting | QUOTE_MINIMAL | 데이터 나누는 기준이 quotechar에 의해 둘러싸인 레벨 | 
Web
Web 동작 과정
1. 요청: 웹주소, Form, Header 등
2. 처리: Database 처리 등 요청 대응
3. 응답: HTML, XML 등 으로 결과 반환
4. 렌더링: HTML, XML 표시
HTML(Hyper Text Markup Language)
- 웹 상의 정보를 구조적으로 표현하기 위한 언어
- 제목, 단락, 링크 등 요소 표시를 위해 tag를 사용
- 모든 HTML은 트리 모양의 포함 관계를 가짐
웹을 왜 알아야 하는가?
- 많은 데이터들이 웹을 통해 공유됨
- HTML도 일종의 프로그램, 페이지 생성 규칙이 있음
- 규칙을 분석하여 데이터의 추출이 가능
- 추출된 데이터를 바탕으로 하여 다양한 분석이 가능
정규식 (regular expression)
- 정규 표현식
- 복잡한 문자열 패턴을 정의하는 문자 표현 공식
- 특정한 규칙을 가진 문자열의 집합을 추출
정규식 기본 문법
1) 문자 클래스 [ ]: [ 와 ] 사이의 문자들과 매치라는 의미
예) [abc] <- 해당 글자가 a,b,c중 하나가 있다. ("a", "before", "deep", >"dud", "sunset")2) "-"를 사용 : 범위를 지정할 수 있음
예) [a-zA-Z] - 알파벳 전체, [0-9] - 숫자 전체3) 메타 문자: 정규식 표현을 위해 원래 의미 X, 다른 용도로 사용되는 문자
. ^ $ * + ? { } [ ] \ | ( )
import re
import urllib.request
url = "http://www.google.com/googlebooks/uspto-patents-grants-text.html" 
#url 값 입력
html = urllib.request.urlopen(url) # url 열기
html_contents = str(html.read().decode("utf8")) 
# html 파일 읽고, 문자열로 변환
url_list = re.findall(r"(http)(.+)(zip)", html_contents)
for url in url_list:
    print("".join(url)) # 출력된 Tuple 형태 데이터 str으로 join
XML (extensible markup language)
- 데이터의 구조와 의미를 설명하는 TAG(MarkUp)를 사용하여 표시하는 언어
?xml version="1.0"?> 
<고양이> 
  <이름>나비</이름> 
  <품종>샴</품종> 
  <나이>6</나이> 
  <중성화>예</중성화> 
  <발톱 제거>아니요</발톱 제거>
  <등록 번호>Izz138bod</등록 번호>
  <소유자>이강주</소유자>
</고양이>- XML도 HTML과 같이 구조적 markup 언어
- 정규표현식으로 Parsing이 가능함
- 그러나 좀 더 손쉬운 도구들이 개발되어 있음
- 가장 많이 쓰이는 parser인 beautifulsoup으로 파싱
BeautifulSoup
- HTML, XML 등 Markup 언어 Scraping을 위한 대표적인 도구
JSON (JavaScript Object Notation)
- 원래 웹 언어인 Java Script의 데이터 객체 표현 방식
- 간결성으로 기계/인간이 모두 이해하기 편함
- 데이터 용량이 적고, Code로의 전환이 쉬움
- 이로 인해 XML의 대체제로 많이 활용되고 있음
- Python의 Dict Type과 유사, key:value 쌍으로 데이터 표시
import json
# read 
with open("json_example.json", "r", encoding="utf8") as f:
    contents = f.read()
    json_data = json.loads(contents)
print(type(json_data))
for employee in json_data["employee]:
    print(employee)
    
# write
dict_data = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
with open("data.json", "w") as f:
    json.dump(dict_data, f)6강: numpy
Numpy의 특징
- 일반 list에 비해 빠르고, 메모리 효율적
- 반복문 없이 데이터 배열에 대한 처리를 지원함
- 선형대수와 관련된 다양한 기능을 제공함
- C, C++, 포트란 등의 언어와 통합 가능
import
import numpy as nparray creation
test_array = np.array([1, 4, 5, 8], float)
print(test_array)
type(test_array[3])- numpy는 하나의 데이터 type만 배열에 넣을 수 있음
- shape: numpy array의 dimension 구성을 반환함 (type: tuple)
- dtype: numpy array의 데이터 type을 반환함
- ndim: number of dimensions (rank)
- size: data의 개수 (element의 개수)
- nbytes: ndarray object의 메모리 크기를 반환함
Handling Shape
- reshape: Array의 shape의 크기를 변경함, elment의 갯수는 동일
  
- flatten: 다차원 array를 1차원 array로 변환
Indexing & Slicing
Indexiing
- list와 달리 이차원 배열에서 [0,0] 표기법을 제공함
- matrix일 경우 앞은 row 뒤는 column을 의미함
Slicing
- list와 달리 행과 열 부분을 나눠서 slicing이 가능함
- matrix의 부분 집합을 추출할 때 유용함
a = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]], int)
a[:,2:] # 전체 row의 2열 이상
a[1,1:3] # 1 row의 1열 ~ 2열
a[1:3] # 1row ~ 2row의 전체
a[:,::2] # 2칸씩 띄어가면서..creation function
arange
- array의 범위를 지정하여, 값의 list를 생성하는 명령어
import numpy as np
np.arange(30)
np.arange(0, 10, 0.5)
np.arange(30).reshape(5, 6)ones, zeros and empty
- zeros: 0으로 가득찬 ndarray 생성
- ones: 1로만 가득찬 ndarray 생성
- empty: shape만 주어지고 비어있는 ndarray 생성 (memory initialization이 되지 않음)
something_like
- 기존 ndarray의 shape 크기 만큼 1, 0 또는 empty array를 반환
test_matrix = np.arange(30).reshape(5,6)
np.ones_like(test_matrix)identity
- 단위 행렬(i 행렬)을 생성함
np.identity(n=3, dtype=np.int8)eye
- 대각선인 1인 행렬, k값의 시작 index의 변경이 가능
np.eye(3)
np.eye(3,5,k=2)
np.eye(N-3, M=5, dtype=np.int8)diag
- 대각 행렬의 값을 추출함
matrix = np.arange(12).reshape(3, 4)
np.diag(matrix, k=2)
np.diag(matrix, k=1)random sampling
- 데이터 분포에 따른 sampling으로 array를 생성
# 균등분포
np.random.uniform(0,1,10).reshape(2,5)
# 정규분포
np.random.normal(0,1,10).reshape(2,5)operation functions
- sum, mean, std
- 그 외에도 sqrt, exp 등 많음
axis
- 모든 operation function을 실행할 때 기준이 되는 dimension 축
- axis = 0 (column 단위)
- axis = 1 (row 단위)
concatenate
- numpy array를 합치는(붙이는) 함수
# vstack
a = np.array([1, 2, 3])
b = np.array([2, 3, 4])
np.vstack((a, b))
# hstack
a = np.array([ [1], [2], [3]])
b = np.array([ [2], [3], [4]])
np.hstack((a, b))
# concatenate
a = np.array([1, 2, 3])
b = np.array([2, 3, 4])
np.concatenate((a,b), axis=0)
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate(a, b.T), axis=1)축 추가
- 1차원 -> 2차원으로 차원 늘릴 때
b = b[np.newaxis, :]
array operation
- numpy는 array간의 기본적인 사칙 연산을 지원함
element-wise operation
- array간 shape가 같을 때 일어나는 연산
- +,-,*,/ 등
Dot product
- Matrix간의 기본 연산
test_a = np.arange(1, 7).reshape(2, 3)
test_b = np.arange(7, 13).reshape(3, 2)
test_a.dot(test_b)transpose
- transpose 또는 T attribute 사용
test_a.transpose()
test_a.Tbroadcasting
- Shape이 다른 배열 간 연산을 지원하는 기능
test_matrix = np.arange(1,13).reshape(4,3) test_vector = np.arange(10,40,10) test_matrix+test_vector
numpy performance
- timeit: jupyter 환경에서 코드의 퍼포먼스를 체크하는 함수
comparisons
All & Any
- array의 데이터 전부(and) 또는 일부(or)가 조건에 만족 여부 반환
import numpy as np
a = np.arange(10)
a < 4
a < 1
a < 10
np.any(a > 5) # 하나라도 조건에 만족한다면 true (or)
np.all(a < 10) # 전부 조건에 만족한다면 true (and)- numpy는 배열의 크기가 동일할 때 element간 비교의 결과를 Boolean type으로 반환
a = np.array([1, 3, 0], float)
b = np.array([True,False,True], bool)
np.logical_and(a > 0, a < 3)
np.logical_or(b, c)
np.logical_not(b)np.where
# true면 3, false면 2로 치환
np.where(a > 0, 3, 2)
# index 값 반환
a = np.arange(10)
np.where(a>5)
# Not a number
a = np.array([1, np.NaN, np.Inf], float)
np.isnan(a)
# isfinite
np.isfinite(a)argmax & argmin
- array내 최대값 또는 최소값의 index를 반환함
a = np.array([1,2,3,4,8,78,23,3])
# 작은 값부터 index
a.argsort()
# 큰값, 작은값 index
np.argmax(a), np.argmin(a)
# 2-dimension
a = np.array([[1,2,4,7], [9,88,6,45], [9,76,3,4]])
np.argmax(a, axis=1), np.argmin(a, axis=0)boolean & fancy index
boolean index
- 특정 조건에 따른 값을 배열 형태로 추출
- Comparison iperation함수들도 모두 사용가능
test_array = np.array([1, 4, 0, 2, 3, 8, 9, 7], float)
test_array > 3
test_array.shape
condition = test_array < 3
test_array[condition]fancy index
- numpy는 array를 index value로 사용해서 값 추출
- matrix 형태의 데이터도 가능
a = np.array([2, 4, 6, 8], float)
b = np.array([0, 0, 1, 3, 2, 1], int)
a[b]
a.take(b)numpy data i/o
loadtxt & savetxt
- test type의 데이터를 읽고, 저장하는 기능
import numpy as np
a = np.loadtxt("./populations.txt", delimiter="\t")
a_int = a.astype(int)
a_int[:3]
np.savetxt("int_data_2.csv", a_int, fmt="%.2e", delimiter=",")
np.save("npy_test", arr=a_int)
a_test = np.load(file="npy_test.npy")
a_test7-1강: pandas 1
- 구조화된 데이터의 처리를 지원하는 Python 라이브러리
- panel data -> pandas
- 고성능 array 계산 라이브러리인 numpy와 통합하여, 강력한 "스프레드시트"처리 기능을 제공
- 인덱싱, 연산용 함수, 전처리 함수 등을 제공함
- 데이터 처리 및 통계 분석을 위해 사용
데이터 로딩
import pandas as pd
data_url = 'https://archive~~"
df_data = pd.read_csv(data_url, sep='\s+', header = None) 
#csv 타임 데이터 로드, sparate는 빈공간으로 지정하고, Column은 없음
df_data.head()
df_data.columns = ["abc", "def", "ghi"]series
- pandas의 구성은 Series와 DataFrame으로 나뉜다.
series
- DataFrame 중 하나의 Column에 해당하는 데이터의 모음 Object
- column vector를 표현하는 object
- index를 수자 또는 문자로 가능, data type도 정해져있다.
  
dataframe
- series를 모아서 만든 Data Table = 기본 2차원
  
- 각각 column은 다른 type을 가질 수 있다.
indexing
- loc은 index 이름, iloc은 index number
df.loc[:3]
df.loc[:, ["first_name", "seconde_name"]]
df["age"].iloc[1:]selection & drop
# basic (Column과 index number)
df["name","street"]][:2]
# loc (Column과 index name)
df.loc[[211829,320563],["name", "street"]
# iloc (Column number와 index number)
df.iloc[:2, :2]index 재설정
df.reset_index(inplace=True, drop=True)data drop
df.drop([0, 1, 2, 3])
df.drop("city", axis=1)dataframe operations
series operation
- index를 기준으로 연산수행
- 겹치는 index가 없을 경우 NaN
dataframe operation
- df는 column과 ihndex를 모두 고려
- add operation을 쓰면 NaN값 0으로 변환
- Operation types: add, sub, div, mul
- NaN 보완하려고 fill_value를 쓴다.
**series + dataframe
- axis를 기준으로 row broadcasting 실행
df.add(s2, axis=0)lambda, map, apply
- pandas의 series type의 데이터에도 map 함수 사용가능
- function 대신 dict, sequence형 자료등으로 대체 가능
s1 = Series(np.arange(10))
s1.head(5)
s1.map(lambda x: x**2).head(5)df = pd.read_csv("wages.csv")
df.head()
df.sex.unique()
df["sex_code"] = df.sex.map({"male":0, "female":1})
df.head(5)
# replace로도 가능
df.sex.replace(
    {"male":0, "female":1}
).head()
df.sex.replace(
    ["male", "female"],
    [0, 1], inplace=True)
df.head(5)apply for dataframe
- map과 달리, series 전체에 해당 함수를 적용
- 입력 값이 series 데이터로 입력 받아 handling 가능
- 내장 연산 함수를 사용할 때도 똑같은 효과를 거둘 수 있음
- mean, std 등 사용가능
applymap for dataframe
- 모든 값에 적용
pandas built-in functions
- describe: Numeric type 데이터의 요약 정보를 보여줌
- unique: series data의 유일한 값을 list로 반환함
- sum: 기본적인 column 또는 row 값의 연산을 지원
- sub, mean, min, max, count, median, mad, var 등
- isnull: column 또는 row값은 NaN (null) 값의 index를 반환함
df.isnull().sum()
- sort_values: column 값을 기준으로 데이터를 sorting
- Correlation & Covariance: 상관계수와 공분산을 구하는 함수
- corr, cov, corrwith
7-2강: pandas 2
Groupby
- SQL groupby 명령어와 같음
- split -> apply -> combine
- 과정을 거쳐 연산함
df.groupby("Team")["Points"].sum()
df.groupby("Team")["Points"].std()
df.groupby("Team")["Points"].mean()
h_index = df.groupby(["Team", "Year"])["Points"].sum()
# 데이터를 매트릭스 형태로 풀어준다.
h_index.unstack()
h_index.reset_index()
# 인덱스 레벨도 바꿀 수 있다.
h_index.swaplevel()
# sort
h_index.sort_index(level=0)
h_index.sort_values()
# index 2개있어도 series 데이터
type(h_index)
# 시리즈이므로 레벨만 정해주면 시리즈 연산 가능
h_index.std(level=1)- Groupby에 의해 Split된 상태를 추출 가능함- Tuple 형태로 그룹의 key 값 Value값이 추출됨
 
gruoped = df.groupby("Team")
for name, group in grouped:
    print(name, group)- 특정 key값을 가진 정보만 추출 가능
grouped.get_group("Devils")
- 추출된 group 정보에는 세 가지 유형의 apply가 가능함
- Aggregation: 요약된 통계정보를 추출해 줌
- Transformation: 해당 정보를 변환해줌
- Filtration: 특정 정보를 제거 하여 보여주는 필터링 기능
# aggregation
grouped.agg(max)
grapued.agg(np.mean)
df.describe().T
# transformation
score = lambda x: (x.max())
grouped.transform(score)
score = lambda x: (x - x.mean()) / x.std()
grouped.transform(score)
# filter
df.groupby('Team').filter(lambda x: x["Rank"].sum() > 2)pivot table
df_phone.pivot_table(
    values=["duration"],
    index=[df_phone.month, df_phone.item],
    columns=df_phone.network,
    aggfunc="sum",
    fill_value=0,
)
# pivot table을 groupby로도 가능
df_phone.groupby("month", "item", "network"])["duration"].sum().unstack()Crosstab
pd.crosstab(
    index=df_movie.critic,
    columns=df_movie.title,
    values=df_movie.rating,
    aggfunc="first",
).fillna(0)Merge & Concat
merge
- SQL에서 많이 사용하는 Merge와 같은 기능
- 두 개의 데이터를 하나로 합침
pd.merge(df_a, df_b, on="subject_id")INNER JOIN: 양쪽 다 subject id에 같은 값있을 때
LEFT JOIN: 왼쪽 기준
Right JOIN: 오른쪽 기준
FULL JOIN: 같은 건 붙이고 아닌건 따로 정리
pd.merge(df_a, df_b, on="subject_id", how="left")
pd.merge(df_a, df_b, on="subject_id", how="right")
pd.merge(df_a, df_b, on="subject_id", how="outer")
pd.merge(df_a, df_b, on="subject_id", how="inner")
pd.maerge(df_a, df_b, reight_index=True, left_index=True)Concat
- 같은 형태의 데이터를 붙이는 연산작업
df_new = pd.concat(df_a, df_b])
df_new.reset_index()(drop=True)
df_a.append(df_b)
df_new = pd.concat(df_a, df_b], axis=1)
df_new.reset_index(drop=False)persistence
Database connections
- Data loading시 db connection 기능을 제공함
import sqlite3 #pymysql <- 설치
conn = sqlite3.connect("./data/flights.db")
cur = conn.cursor()
cur.execute("select * from airlines limit 5;")
results = cur.fetchall()
results- Xls 엔진으로 openpyxls 또는 XlsxWrite 사용
2. 과제 수행 과정
- 월요일 선택 과제 리뷰를 위해 선택 과제 1~3 풀이 및 솔루션보고 이해
3. 회고
- 주말에 쉬고 싶으면 평일에 열심히 하자!
Author And Source
                            
                            이 문제에 관하여(AI Tech Week 1 보충 학습 (numpy, pandas)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://velog.io/@f2f42012/AI-Tech-Week-1-보충-학습-numpy-pandas
                            
                            
                            
                                저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
- 주말에 쉬고 싶으면 평일에 열심히 하자!
Author And Source
이 문제에 관하여(AI Tech Week 1 보충 학습 (numpy, pandas)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@f2f42012/AI-Tech-Week-1-보충-학습-numpy-pandas저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)