f = lambda x : x+10 ''' :를 기준으로 왼쪽에는 매개변수를 정의하고, 오른쪽에는 함수를 작성한다. f(1)
# x값이 한 개 일 때, (lambda x : x+10)(1) ''' 람다 표현식을 괄호 안에 정의하고, 뒤에 x값을 넣으면 바로 f(1) 출력이 나온다.
# x값이 여러 개 일 때, a = [1,2,3,4,5,,,,] list(map(lambda x : x+10, a))
# 매개변수가 여러 종류 일 때, a=[1,2,3,4,5,,,,] b=[2,4,6,8,10,,,,] list(map(lambda x,y : x * y, a,b))
람다 표현식의 활용 방법
#1. 조건식 적용하기 list(map(lambda x: str(x) if x%3 == 0 else x ,a )) ''' 뜻: if 식이 맞다면 str(x), 틀리다면 x로 적용하겠다.
#2. 필터 처리하기 a= [8,4,2,6,4,9,2,10] list(filter(lambda x : x>5 and x<10, a)) >>> [8, 6, 9]
#3. 누적되어 연산하기 from functools import reduce a = [1,2,3,4,5] reduce(lambda x,y : x+y, a)
변수의 사용 범위
▷ def foo(): 밖의 변수는 전역 변수(1), 안의 변수는 지역 변수(2)임.
▷ 다음과 같이 전역 변수, 지역 변수가 함께 쓰일 수 있음.
또한, 함수 안에 global x를 정의함으로써 전역 변수의 갱신이 가능함
▷ 함수 안에 함수가 있는 경우, 각 함수에 지역 변수가 존재함.
함수 밖의 지역 변수에 대해 값을 변경하고자 하면 nonlocal을 사용해야 됨.
첫 번째의 경우에는 A의 지역 변수에 20을 할당함. 즉, x = 10→ 20 으로 갱신됨.
두 번째의 경우에는 x = 10 → 20 → 20+30, y = 100→ 100→ 100+300 으로 갱신됨.
클로저 사용하기
클로저 : 프로그램의 흐름을 특정 변수에 저장하고 싶을 때 사용함
아래 식에서는 c가 클로저가 됨.
파일의 입출력
파일 처리의 3단계
파일 열기 → 파일 읽기 및 쓰기 → 파일 닫기
1. 파일 열기
a(변수명) = open( '파일 위치', 'r' / 'w' / 'a' )
2. 파일 읽기 및 쓰기
# 코드 여러 번 반복해서 쓰기 b = a.readline() print(b)
# While문으로 한 번 쓰기 (간단화) b = " " while True: b = a.readline() if b == ' ': break print(b, end ='')
# readline과 readlines의 차이 readline : 한 줄만 나옴 / readlines : 몇 줄이든 있는 문장 다 나옴
# readlines (원래 결과: aa\n bb\n)으로 한 줄씩 띄어 나오도록 (aa bb ) inFP = None inList = [] inStr = '' inFP = open('C:/data/data1.txt','r',encoding='utf-8') inList = inFP.readlines() for inStr in inList: print(inStr, end ='')
3. 파일 닫기
a.close()
Tkinter 라이브러리
1.
2.
3. 이벤트
버튼을 눌렀을 때 'Pushed' 출력됨.
4. 이벤트
label.config → 버튼을 눌렀을 때 라벨명이 Push Button에서 Pushed로 변함.
5. 이벤트
전역변수 활용하여 Apple / Orange 번갈아가면서 라벨명 변경
첫 클릭: Apple → 두 번째 클릭: Orange → 세 번째 클릭: Apple → ...
6. 이벤트
마우스 커서가 버튼을 벗어 났을 때 라벨명 변경 → btn.bind 안에 '<Leave>' 쓰면 이벤트 적용
마우스 커서가 버튼 안에 들어갈 때 라벨명 변경 → btn.bind 안에 '<Enter>' 쓰면 이벤트 적용
왼: 커서가 밖으로 나갔을 때
7. radiobutton 만들기
rbvar로 같은 문자열 지정하면 rb1, rb2가 세트로 쌍을 이룰 수 있다.
indicatoron: radiobutton의 옵션
8. Scale 만들기
머리,,아프다,,,머리머리,,,,
너무나 많은 정보가 쏟아져버렸다,,,,,,ㅠ
0713 실강 부분
Numpy
list : 속도 느림
-> Numpy : 다차원의 배열 구조 사용 ∴ 속도 빨라짐 ( 수치해석용 파이썬 패키지 )
임포트 import numpy as np
벡터화 연산
data = [0,1,2,3,4,5,6,7,8,9] #1. list answer = [] for i in data: answer.append(2 * i) answer >>> [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] ''' 값으로 빼내서 사칙연산해야 됨
numpy x = np.array(data) x*2 >>> array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]) ''' 배열에서 사칙연산 가능 (빠르다) --------------------------------------------------------------------------------------------------------------- #2. list list_a=[1,2,3] list_b=[10,20,30] 2*list_a+list_b >>> [1, 2, 3, 1, 2, 3, 10, 20, 30] ''' 단순히 list a 두 번, list b 한 번
(Numpy와 차이:) 데이터의 의미를 표시하는 인덱스 붙일 수 있음 (미지정시 0,1,2,,로 됨)
DataFrame
임포트 import pandas as pd
1. 시리즈
s=pd.Series([9904312,3448737,2890451,2466052], index = ['서울','부산','인천','대구']) s.name = '인구' s.index.name = '도시' '''시리즈 및 인덱스에 이름 지정
# 시리즈 연산 s/1000000 >>> 서울 9.904312 부산 3.448737 인천 2.890451 대구 2.466052
# 시리즈 인덱싱 s[1], s['부산'] >>> 3448737 s[3], s['대구'] >>> 2466052 s[[0,2,1]] >>> 서울 9904312 인천 2890451 부산 3448737 (시리즈 전체 출력됨) s[(250e4 < s) & (s < 500e4)] >>> 부산 3448737 인천 2890451 (조건문 참인 부분의 시리즈 출력)
# 시리즈 슬라이싱 s[1:3] >>> 부산 3448737 인천 2890451 (숫자: 1~2행) s['부산':'대구'] >>> 부산 3448737 인천 2890451 대구 2466052 (문자: '부산'~'대구' 까지)
# 라벨 값이 영문 문자열일 경우 → 점으로 접근 가능 (.a) s0 = pd.Series(range(3), index = ['a', 'b', 'c']) s0.a >>> 0
# .items() for i,j in s.items(): print('%s = %d' % (i,j)) >>> 서울 = 9904312 부산 = 3448737 인천 = 2890451 대구 = 2466052
# 딕셔너리형 시리즈 s2 = pd.Series({'서울':8804312, '부산': 9948737, '인천':6690451,'대전':1166052}, index =['부산','서울', '인천','대전',])
# 인덱스 기반 연산 ds = s-s2 >>> 대구 NaN 대전 NaN 부산 -6500000.0 서울 1100000.0 인천 -3800000.0 (대구,대전 안겹쳐서 NaN, 나머지는 s 값 - s2 값)
* 인구 증가율(%) 구하기 rs = (s-s2) / s2 * 100 rs = rs[rs.notnull()] >>> 부산 -65.334926 서울 12.493878 인천 -56.797367
# 데이터의 갱신, 추가, 삭제 갱신: rs['부산'] = 1.63 >>> 부산 1.630000 서울 12.493878 인천 -56.797367 추가: rs['대구'] = 1.41 >>> 부산 1.630000 서울 12.493878 인천 -56.797367 대구 1.410000 삭제: del rs['서울'] >>> 부산 1.630000 인천 -56.797367 대구 1.410000
>>> 상관관계 알 수 있음 (그래프 : 진할수록 / 테이블 : -1,1 가까울수록 → 상관관계 높음)
5. 예측 정확도 높이기 위해 시도해보기
웹 크롤링
웹 페이지 긁어와서 데이터 추출
# 기본 설정 import requests from bs4 import BeautifulSoup
# 웹페이지에서 text 추출 r=requests.get('https://wikidocs.net') html = r.text print(html)
# 웹페이지에서 제목 추출 res = requests.get('http://v.media.daum.net/v/20170615203441266') soup = BeautifulSoup(res.content,'html.parser') ''' res의 모든 content(매개변수)를 'html.parser'로 분석(html로 parsing) 후 soup에 넣음 title = soup.find('title') ''' soup의 html에서 title 찾음 print(title.get_text()) ''' 그 중 text 읽음 >>> 잔금대출에도 DTI 규제 적용 검토
영화 링크 분석하기
import requests response = requests.get('https://movie.daum.net/ranking/reservation') html = response.text print(html) # html 코드 보기
from bs4 import BeautifulSoup # beautiful soup 활용 크롤링 soup = BeautifulSoup(html, 'html.parser') Title_html = soup.select('a[class=link_txt]') for tag in soup.select('a[class=link_txt]'): print(tag)
for tag in soup.select('a[class=link_txt]'): print(tag.text) # 제목만 가져오기
데이터 분석을 위한 핵심 Tool, Python(온라인 강의)
초격차 패키지 : 직장인을 위한 파이썬 데이터 분석
Pandas
Pandas 라이브러리 사용하기 위해 : import pandas as pd (임포트 코드 삽입)
#1. csv 파일 # 불러오기 csv_path = ' 파일의 경로 ' df = pd.read_csv(csv_path) ''' df.head() 로 잘 불러왔는지 확인 가능, ( )사이 n 써서 n개 값만 가져옴 # 저장하기 csv_path = ' 저장할 경로 ' df.to_csv(csv_path)
#1. int -> str 타입 변환 df['Height'] = df['Height'].astype('str')
#2. str -> int 타입 변환 df['Height'] = df['Height'].astype('int')
#3-1. str -> datetime 타입 변환 df['Date of Birth'] = pd.to_datetime(df['Date of Birth'])
#3-2. datetime 타입 으로 날짜 슬라이싱 (월, 일, 요일 등 날짜/시간 정보를 추출) - 연도 추출: df['Date of Birth'].dt.year - 월 추출: df['Date of Birth'].dt.month - 일 추출: df['Date of Birth'].dt.day - 요일 추출: df['Date of Birth'].dt.dayofweek - 데이터 프레임에 추가: df['Year of Birth'] = df['Date of Birth'].dt.year
# pd.Timedelta 자료형으로 변환 df['Day of Birth'] = pd.to_timedelta(df['Day of Birth'], unit="day")
# 데이트타임 연산 df['Date of Birth'] + df['Day of Birth']
3. 통계 연산
합계(sum()), 평균(mean()), 최소/최대값(min(),max())
행 계산 (axis = 0), 열 계산 (axis = 1)
# 행 합계: df.sum(axis=0) # 행 평균: df.mean(axis=0) # 열 합계: df.sum(axis=1) # 열 평균: df.mean(axis=1)
결측값 / 중복 처리 ( Ch 2 - 11 )
1. 결측값 처리
입력이 누락된 값 (현실의거의 모든 데이터에는 결측값이 존재 가능)
결측값을 어떤 방식으로 처리하느냐에 따라데이터 분석 결과가 달라짐
NaN, N/A, NULL, 0값등 다양한 방식
순서 #1. 데이터 탐색 df = df.replace(0, np.NaN) ''' 0값을 NaN 형으로 변환
#2. 결측 데이터 확인 (isnull(), notnull()) df.isnull().sum() ''' 결측인 값은 (True) 1로 처리
#3. 결측 데이터 제거 (dropna()) df.dropna(subset=['Group', 'Height']) ''' subset=['컬럼명'] 옵션 → 해당 컬럼만 검사
#4-1. 결측 데이터를 지정 값으로 대체 (fillna('대체값')) df['Height'] = df['Height'].fillna(160) #4-2. 평균 값으로 대체 (fillna('평균값')) mean_value = df['Weight'].mean() df['Weight'] = df['Weight'].fillna(mean_value) #4-3. 최빈 값으로 대체 (fillna('최빈값')) df['Birthplace'].value_counts().index[0] ''' 값을 세어주는 함수 value_counts() 를 활용 →최빈값 구함 df['Birthplace'] = df['Birthplace'].fillna( df['Birthplace'].value_counts().index[0] )
#5. reset_index() 로 인덱스 재정렬 (전처리 중 df의 인덱스가 바뀌며 이 부분 정렬) df = df.reset_index(drop=True) ''' 'drop=True' 옵션은 이전의 인덱스를 버린다는 의미
2. 중복값 처리
중복으로 입력된 값 (전체 행/열이 중복된 경우, 혹은값이 중복된 경우)
중복값을 어떤 방식으로 처리하느냐에 따라데이터 분석 결과가 달라짐
순서 #1. 중복 데이터 탐색 (duplicated()) df[df.duplicated()] ''' 중복된 행 찾기 df['Group'].duplicated() ''' 특정 열에 중복 값 찾기
#2. 중복 데이터 제거 (drop_duplicates()) df.drop_duplicates() ''' 기본적으로 완벽히 중복된 행 제거 df.drop_duplicates(subset= ['Group']) ''' 특정 열을 기준으로 제거 (default: 첫 값 남기기) df.drop_duplicates(subset= ['Group'], keep='last') ''' 특정 열을 기준으로 제거 (마지막 값 남기기)
고급 기능 ( Ch 2 - 12 )
1. apply 함수
데이터에구체적인 로직을 적용하고 싶을 경우 사용
로직이 정의된 함수를 만들고,apply()함수에 대입
#1. 구체적인 로직이 정의된 함수 만들기 def replace_zero(x): if x==0: x=165 # 값이 0일 경우 원하는 값으로 대체 return x