28. 여러 개의 데이터 프레임을 합치는 방법
concat
- 여러 개의 데이터프레임을 하나의 데이터프레임으로 합치는 함수
- 열 이름을 기준으로 합침
- 행 기준으로 합치기 위해서는
axis=1
를 추가해주면 된다
axis
행 이름 바꾸기
열 이름 바꾸기
29. 스마트하게 데이터 프레임을 합치는 방법
merge
- 특정 열을 기준으로 데이터 프레임을 합치는 방법
1
2
| df1.merge(df2, left_on=df1의기준열, right_on=df2의 기준열)
# 기준열의 이름이 서로 같은 경우 on으로 대체 가능
|
30. 누락값을 처리하는 방법
누락값이란?
- 비어있는 값을 말함
- 하나라도 있다면 데이터분석 및 연산이 원활하지 못할 수 있음
- 누락값은 비교할 수 없음(단, pd.isnull()함수로 누락값인지 판단 가능)
from numpy import NAN, NaN, nan
널값 비교 불가
- null값은 비교불가기 떄문에,
if i==np.nan
과 같은 비교연산이 불가능하다 pd.isnull()
와 같은 함수로 판단 가능
누락값 판단 함수
1
2
| pd.isnull() # 누락값이면 True
pd.notnull() # 누락값이 아니면 True
|
누락값 개수 구하기
1
2
3
4
| df.count() # 전체 개수
np.count_nonzero(데이터.isnull)
df['Cases_guinea'].value_counts(dropna=False)
|
누락값 채우기
1
2
3
4
5
| fillna(값) # 값으로 결측값을 채운다
fillna(method='ffill') # 앞에 값으로 채운다
fillna(method='bfill') # 뒤 값으로 채운다
df.interpolate() # 흐름에 따라: 컴퓨터가 스스로 선형 흐름으로 판단함
df.interpolate(method=)
|
pandas.DataFrame.interpolate
DataFrame.interpolate(method=’linear’, *, axis=0, limit=None, inplace=False, limit_direction=None, limit_area=None, downcast=None, **kwargs)
Fill NaN values using an interpolation method.
Please note that only method='linear'
is supported for DataFrame/Series with a MultiIndex.
Parameters
methodstr, default ‘linear’
Interpolation technique to use. One of:
- ‘linear’: Ignore the index and treat the values as equally spaced. This is the only method supported on MultiIndexes.
- ‘time’: Works on daily and higher resolution data to interpolate given length of interval.
- ‘index’, ‘values’: use the actual numerical values of the index.
- ‘pad’: Fill in NaNs using existing values.
- ‘nearest’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘barycentric’, ‘polynomial’: Passed to scipy.interpolate.interp1d, whereas ‘spline’ is passed to scipy.interpolate.UnivariateSpline. These methods use the numerical values of the index. Both ‘polynomial’ and ‘spline’ require that you also specify an order (int), e.g.
df.interpolate(method='polynomial', order=5)
. Note that, slinear method in Pandas refers to the Scipy first order spline instead of Pandas first order spline. - ‘krogh’, ‘piecewise_polynomial’, ‘spline’, ‘pchip’, ‘akima’, ‘cubicspline’: Wrappers around the SciPy interpolation methods of similar names. See Notes.
- ‘from_derivatives’: Refers to scipy.interpolate.BPoly.from_derivatives which replaces ‘piecewise_polynomial’ interpolation method in scipy 0.18.
31. 열에 있는 값을 행으로 내리는 방법
melt
- 지정한 열의 데이터를 모두 행으로 내려주는 기능
1
2
3
4
5
6
| pd.melt(
df,
id_vars = 고정할열,
var_name = 위치를 변경할 열의 이름,
value_name = 위치를 변경한 열의 데이터를 저장한 열의 이름
)
|
- id_vars: 고정할 열
- var_name: 위치를 변경할 열의 이름
- value_name: 위치를 변경한 열의 데이터를 저장한 열의이름
손실되는 데이터가 없는지 확인해 보아야 할 것 같다
열 분할하기
- 분할: 시리즈.str.split(기준)
- 수집: 시리즈.str[인덱스]
32. 행에 있는 값을 열로 올리는 방법
pivot_table
- melt와는 반대로 행에 있는 값을 열로 올려서 새로운 열을 만드는 기능
1
2
3
4
5
6
| pf.pivot_table(
index=고정하고 싶은 열,
columns=열로 올리고싶은 열,
values=새로 올라간 열이 가지게 될 값.
dropna=True/False
)
|
33. 데이터에 순위를 매기는 방법
rank
1
| df[열].rank(method=... ascending=True/False)
|
method
- average: 동점 관측치 간의 그룹 내 평균 순위 부여
- min: 동점 관측치 그룹 내 최소 순위 부여
- max: 동점 관측치 그룹 내 최대 순위 부여
- first: 동점 관측치 중 데이터 상에서 먼저 나타나는 관측치부터 순위부여
- dense: 최소값과 같으나 그룹간 순위가 1씩 증가
34. 상관분석
- 두 변수 간에 어떤 선형적 관계를 가지는지 분석하는 기법으로 상관계수를 이용하여 측정
피어슨 상관계스
$r_{XY} = \frac{\displaystyle \sum_{i}^{n}(X_{i} - \bar{X})(Y_{i} - \bar{Y})}{\sqrt{\displaystyle \sum_{i}^{n}(X_{i} - \bar{X})^{2}}\sqrt{\displaystyle \sum_{i}^{n}(Y_{i} - \bar{Y})^{2}}}$
1
2
3
4
| import scipy.stats as stats
stats.pearsonr(X,Y)
# [상관계수, p-value]
|
p-value: 상관관계가 없다에 대한 검정 결과를 확률로 표현
seaborn의 heatmap 함수를 통한 상관계수 그래프 그리기
1
2
3
| imoprt seaborn as sns
data = df.corr()
sns.hearmap(data)
|
35. 정규표현식
- 어떤 문자열에서 내가 원하는 패턴을 찾는 기능
메타문자
- +, (), [], / 등 문자가 특별한 용도로 사용되는 문자
[]
- [ ] 사이의 문자들과 매치
- ex)
- [abc]라면 a,b,c중 한 개의 문자와 매치, [a-c]로 표현 가능
- [0-9]: 숫자
- [a-zA-Z]: 영어
- [가-힣: 한글
문자 클래스
- \d: 숫자
- \D: 숫자가 아닌 것
- \s: 공백
- \S: 공백이 아닌 것
- \w: 문자+숫자
- \W: 문자+숫자가 아닌 것
점(.)
- \n을 제외한 모든 문자와 매치
- ex) a.b : aab, a0b등 모두 가능
반복(*)
- 0부터 무한대로 분복될 수 있다는뜻
- ex) ca*t: ct, cat, caat등
반복(+)
- 1부터 무한대로 반복될 수 았따는 뜻
- ex) ca+t: cat, caat 등
반복{}
- {n}: 반드시 n회 반복
- {m,n}: m~n번 반복
?
- 있어도, 없어도 된다는 뜻
- ex) ab?c: ac, abc
re
- 정규표현식 라이브러리
import re
re.findall(패턴, 문자열)
36. 인터넷에 있는 데이터를 수집하는 방법
데이터 크롤링
- 인터넷은 HTML로 구성되어있음
- 따라서 파이썬으로 HTML을 다루어야 함
라이브러리
- requsts: 페이지 요청 라이브러리
- bs4의 BeautifulSoup: Python으로 HTML을 다루는 라이브러리
- time: 안전하게 수집하는 방법
- pandas: 수집한 데이터 엑셀화
requests 활용
BueatifulSoup 활용
BeautifulSoup(url.text)
: 수집한 데이터를 HTML로 변환할 수 있음find
: 해당 HTML을 차아서 HTML로 반환find_all
: 해당 HTML을 모두 찾아서 리스트로 반환
37. 인터넷에 있는 표를 데이터프레임으로 만드는 방법
표 주집
- 수집한 표 정보를 바로 표(데이터프레임)으로 변환할 수 있다
pd.read_html(str(HTML))
네이버 증권 표 가져오기
- url: https://finance.naver.com/sise/sise_market_sum.naver?sosok=1&page=1
1
2
3
4
5
6
7
8
9
10
11
| import requests
from bs4 import BeautifulSoup
import time
import pandas as pd
url = requests.get('https://finance.naver.com/sise/sise_market_sum.naver?sosok=1&page=1')
html = BeautifulSoup(url.text)
table = html.find('table', class_ = 'type_2')
table = pd.read_html(str(table))[0]
table = table[table['종목명'].notnull()]
|
모든 코스피 페이지 가져오기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| import requests
from bs4 import BeautifulSoup
import time
import pandas as pd
url = requests.get('https://finance.naver.com/sise/sise_market_sum.naver?sosok=1&page=1')
html = BeautifulSoup(url.text)
kospi_page = int(html.find('td', class_='pgRR').find('a')['href'].split('=')[-1])
total = []
for n in range(1, kospi_page+1):
url = requests.get(f'https://finance.naver.com/sise/sise_market_sum.naver?sosok=1&page={n}')
html = BeautifulSoup(url.text)
table = html.find('table', class_ = 'type_2')
table = pd.read_html(str(table))[0]
table = table[table['종목명'].notnull()]
del table['N']
del table['토론실']
total.append(table)
time.sleep(1)
print(f'{len(total)}페이지 저장 완료')
total
|
38. 인터넷 뉴스 기사 가져오는 방법
- 크롤링은 항상 같은 것을 가져와야 한다
- 가져오고자 하는 정보의 구조가 기사마다 다른지 확인 필요
39. 수집한 뉴스 기사로 빈도분석하고 워드 클라우드 그리기
빈도 분석
- 문장이나 대화 속에서 각각의 문자의 빈출 경향의 정도를 분석
1
2
3
4
| from wordcloud import WordCloud
wc = WordCloud(font_path="...", background_color="...", mask='...')
wc.generate_from_frequencies(dic)
|
41. 네트워크 반응 이용 데이터 크롤링
JSON
- JavaScript OBject Notation이라는 의미의 축약어
- 데이터를 저장하거나 전송할 때 ㅁ낳이 사용되는 경량의 Data 교환 방식
- 형태는 Python의 딕셔너리와 유사
1
2
3
4
| import json
import requests
import pandas as pd
from bs4 import BeautifulSoup
|
42. [핵심정리] 데이터분석
Pandas
- 파이썬에서의 가장 대표적인 데이터분석 도구
- 표 형태의 데이터를 다루는 다양한 함수를 제공하고 있음
열 접근
- loc: 이름으로 행과 열에 접근
- iloc: 순서로 행과 열에 접근
to_datetime
- pd.to_datetime() 함수를 통해서 문자열로 된 날짜 데이터를 날짜 데이터로 변환 가능
groupby
- groupby 함수를 통해 데이터프레임 내에 있는 데이터를 내가 원하는 대로 집단화할 수 있음
concat
- 여러개의 dataframe을 하나의 dataframe으로 합치는 기능
- 매개벼누 axis는 축을 의미함(1: 열방향, 0: 행방향)
merge
- 두개의 데이터프레임에서 각각 기준열을 정하고, 기준열에 있는 데이터에 맞게 dataframe을 합쳐주는 역할을 함
df1.merge(df2, left_on=df1의 기준열, right_on=df2의 기준열)
- 만약 두 dataframe의 기준열의 이름이 같다면 on으로 대체 가능
누락값
- if문으로 누락값 확인 불가
pd.issnull()
함수로 확인 가능from numpy import NaN, nan, NAN
에서 누락값을 제공하기 때문에 누락값을 생성할 수도 있다df.fillna()
함수를 통해 누락값을 채울 수 있다
melt
- 넓은 데이터에서 같은 의미를 가진 여러개의 열들을 하나의 열로 통합해준다
pivot_table
- melt함수와는 반대로 행에 있는 값을 열로 올릴 떄 사용한다
rank
- rank 함수는 특정 열을 기준으로 값에 순위를 매길 떄 사용한다
- 다양한 method(average, mnin, max, first, dense등) 함수로 내가 원하는 대로 순위를 조절하기가 편하다
상관분석
- 두 변수 사이에 선형관계를 가지는지 분석하는 방법
- 상관계수는 -₩~1 사이의 값을 가지며 -1 또는 1에 가까울수록 높은 상관관계를 가진다
- scipy패키지의 stats함수를 사용하면 쉽게 상관계수를 구할 수 있다
시각화 라이브러리
- matplotib, seaborn, pandas의 시각화 함수를 통해서 데이터프레임의 데이터를 쉽게 시각화
- matplotlib: 커스터마이징 옵션이 많아 원하는 형태로 그림 그리기가 원활함
- seaborn: 자동으로 예쁜 그림을 그려주나, 커스터마이징이 자유롭지 않음
- padas: 가시화 함수로 쉽게 간단한 그래프를 그릴 수 있음
정규 표현식과 re 라이브러리
- 어떤 문장에서 내가 원하는 패턴만 찾는 기술
- re 라이브러리를 활용하면 정규표현식 기능을 손쉽게 사용할 수 있다
데이터 크롤링
- 인터넷에서 데이터를 수집하는 기술을 말한다
- requests 라이브러리를 통해 헤이지를 요청할 수 있따
- bs4 라이브러리의 BeautifulSoup 클래스를 사용하여 Python을 통해 HTML을 다룰 수 있다
- time 라이브러리를 사용해서 트래픽에 문제를 안 일으키는 것이 좋다
pd.read_html
함수를 통해서 인터넷이 있는 표 데이터를 한번에 데이터프레임으로 만들 수 있다