안녕하세요 오늘은 데이터 분석을 위한 pandas 사용법에 대해 소개해보겠습니다

 

pandas는 데이터 분석에서 결과도출, EDA, 분석 등에 활용됩니다

 

 

 

1. 설치방법

pip install pandas

 

 

 

 

2. 자료구조

- Series : 1차원 배열

- DataFrame : 2차원 배열

 

 

 

 

3. Series

import pandas as pd

tmp = pd.Series([1,2,3,4,5])

pd.Series() 안에 배열을 넣어서 Series로 만들 수 있으며 이때 인덱스(순서?)가 생성됩니다

 

 

 

4. DataFrame

import pandas as pd

cols = list('ABCD')

indexs = pd.date_r('20240130', periods=7)

출력
DatetimeIndex(['2024-01-30', '2024-01-31', '2024-02-01', '2024-02-02',
               '2024-02-03', '2024-02-04', '2024-02-05'],
              dtype='datetime64[ns]', freq='D')

다음과 같이 선택일자부터 7일동안의 데이터를 임의 생성합니다

 

values = np.random.randn( len( indexs ), len(cols) )
df = pd.DataFrame( values, indexs, cols )
df

이후 indexs와 cols의 개수만큼 7,4 배열에 랜덤값을 만들어준 후 DataFrame으로 만들면 표로 시각화됩니다

 

pandas DataFrame으로 시각화한 표로 데이터 분석에 자주 사용되는 데이터 분석을 위한 확인 방법입니다

 

 

 

5. read_csv

csv_path = '/content/drive/MyDrive/res/data.csv'
df = pd.read_csv( csv_path )

csv 파일을 DataFrame으로 만드는 방법으로 인공지능 학습 데이터의 구조로 사용됩니다

 

 

 

 

6.df.head, df.tail

df.head()
df.tail()

DataFrame의 앞에서 5개의 데이터, 뒤에서 5개의 데이터를 뽑아오는 방법입니다

 

 

 

7. df.info

df.info()

빅데이터서 데이터의 구조를 쉽게 확인하는 방법으로 컬럼명, 데이터의 개수, 타입 확인을 쉽게 할수있습니다

 

 

 

8. sort_values

df.sort_values(by='age', ascending=Faslse)

age 나이를 기준으로 정렬하는 방법으로 내림차순, 오름차순 등으로 정렬 가능합니다

 

 

 

 

9. .columns, .values

df.columns
df.values

columns는 컬럼들을 나열하여 컬럼명을 확인하기 편합니다

values는 해당 값을 확인할 수 있으며 인덱스나 컬럼의 값을 통해 검색하는 방법처럼 사용됩니다

 

 

 

 

 

10. 인덱싱

10-1 컬럼 인덱싱

df.[['age', 'id']]

df의 컬럼이 여러개일때에 age, id 컬럼값만 인덱싱 하는 방법입니다

 

 

10-2 인덱스 인덱싱

df[1:10:2]

numpy를 공부하고 오셧다면 바로 이해할수 있습니다 1번부터 10번까지 2단위로 인덱싱합니다

 

 

10-3 인덱스 교체

data_size = df.shape

cus_indexs = pd.data_range('20240130',periods=data_size)

df.index = cus_indexs

df의 shape을 통해 날짜를 shape만큼 만들어서 index를 날짜로 변경하는 방법입니다

 

 

 

 

 

11 loc

df.loc['2024-05-05':'2024-10-10', 'age']

날짜로 바꾼 인덱스를 통해 loc.[날짜,컬럼] 방식으로 데이터를 추출합니다

 

위 코드는 5월5일부터 10월10일까지의 데이터를 나이만 가져오게 됩니다

 

데이터 분석으로 예시를 들면 5월5일 부터 10월10일 까지 유저들의 나이대를 알수있습니다

 

 

 

 

12 iloc

df.iloc[1:3, 1:3]
df.iloc[[4,5,2,6], [5,1,4,2]]

iloc를 사용한 슬라이싱(?) 방법으로

첫번째는 1번부터 3번전까지의 인덱스를 1번부터 3번전까지의 컬럼만 출력한다 입니다

 

두번째는 numpy에서도 비슷하게 사용했던 비연속적인 데이터 추출입니다 4,5,2,6 인덱스에서 5,1,4,2 컬럼을 가져옵니다

 

 

 

 

13.블리언 인덱싱

df2.is_deleted == 0

참, 거짓의 데이터에서 사용되며 0, True인 데이터만을 인덱싱 하는 방법입니다

 

예시로 loc와 함께 사용한다면 구매여부 True, 물건을 구입한 사람 중 5월 ~ 10월 사이의 유저 나이 처럼 응용할수있습니다

 

 

 

 

14. drop

df.drop(['age'], axis=1)

데이터에서 age 컬럼을 제거합니다

컬럼이 많을때에는 인덱싱 하기에 번거로울 수 있어서 사용됩니다

 

 

 

15. groupby

df.groupby(['purchase', 'gender']).count()

purchase 는 1,0 으로 대분류로 구분해주고 gender에 따라 중분류를 진행할 수있습니다

 

구매 여부에따른 여자와 남자의 수 를 확인할수있습니다

 

 

 

 

16. 컬럼추가

df['gender'] = data['gender']

df에 gender 컬럼이 없다는 가정하에 작성하는 코드로 data에 있는 젠더 값을 가져오는 코드입니다 다른방법으로는 Series를 컬럼으로 추가할 수 있습니다

이때 값의 수가 같아야 하며 다를경우 다른 컬럼들이 None으로 추가됩니다

 

 

 

17. merge

left_df  = pd.DataFrame({
    'key':list('1234'),
    'A':list('ABCD'),
    'B':list('EFGH'),
})
right_df = pd.DataFrame({
    'key':list('0123'), 
    'C':list('가나다라'),
    'D':list('WXYZ'),
})

pd.merge( left_df, right_df, on='key' )

차원이 같은 두 데이터를 병합하는 방법으로 key값을 기준으로 병합되며 A,B,C,D 컬럼이 생기게 됩니다

 

pd.merge( left_df, right_df, on='key', how='left' )

(3,4) 배열과 (4,3)의 배열을 merge 하게되면 Nan으로 채우게 됩니다 이는 16. 컬럼추가와 같습니다

Nan이 되면 결측치가 발생하게 되며 이는 제거하거나 값을 추가해서 사용할 수 있습니다

 

 

 

 

18 조건 인덱싱

df = df[df['age'] >= 20]

실무에서 가장 많이 사용되는 인덱싱 방법인데 공부할때는 기본적인 사용법만 학습하다 보니 내용이 따로 없어서 하나 추가해보았습니다 조건에 따른 인덱싱 방법으로

예시는 20살 이상이 데이터만 가져온다입니다

 

결측치를 그래프로 시각화하여 결측치를 제거하거나 필요한 데이터 조건을 설정하는데 많이 사용됩니다

안녕하세요 오늘은 데이터 수집을 위한 numpy에 대해 소개해보겠습니다

 

 

 

 

1. numpy 설치

$ pip install numpy



 

2. numpy 배열 생성

data = [5,6,7,8]

arr = np.array
print(arr)

기본적인 numpy 배열 생성 방법입니다

 

 

 

 

3. asarray()

arr3 = np.asarray( arr2 )
display_arr(arr3)

arr2 를 복사하는 방법이지만 array()와 다른점은 사본 변경 시 같이 변경됩니다

 

 

 

4. arange()

arr = np.arange(1, 5, 2)
arr

출력
array([1, 3])

1 부터 5 전까지의 숫자를 2의 간격으로 출력 python에서 기본적으로 사용되는 range와 사용방법이 같습니다

 

 

 

5. reshape()

np.arange(1, 17).reshape( (4,4) )

1 ~ 16까지의 숫자를 생성 후 4,4의 구조로 바꾸는 방법입니다 

 

reshape은 자주 쓸것같은데 저는 생각보다 쓸일이 많이 없었습니다

 

 

 

 

6. np.zeros((2,3))

arr = np.zeros( (2,3)  ) 
arr

배열 구조안에 값을 0으로 넣는 방법입니다

 

zeros는 생각보다 자주 사용하게 됩니다

 

 

 

7.astype()

tmp = arr.astype(np.int64)
tmp.dtype

출력 타입을 지정해주는 방법으로 간혹 사용됩니다

 

 

 

 

8. 인덱싱

arr[0], arr[0][-1]

출력
(array([1, 2, 3]), 3)

arr = [1, 2, 3] 배열에서 인덱싱 했을때의 결과로 0은 첫번째 숫자, -1은 뒤에서 첫번째 숫자를 의미하며 [ ]는 배열의 차원을 의미합니다

 

그러므로 [0][-1]은 첫번째 배열의 마지막숫자를 의미합니다

 

 

 

 

9. 슬라이싱

arr = np.arange( 16 ).reshape( (2,8) )

arr[ :-1 , 1:1+3 ]

출력
array([[1, 2, 3]])

슬라이싱은 의미 그대로 자르는 방법으로 사용됩니다

 

':-1' : 1차원 배열에서 마지막 전까지 즉 1차원이 2개이기 때문에 첫번째 배열만 불러옵니다

 

'1:1+3' : 2차원 배열에서 1, 두번째 숫자부터 1+3, 4번째 숫자까지 입니다

 

 

 

 

10.블리언 인덱싱

arr[ arr > 0 ]

arr[ (arr>1) | (arr<0) ]

블리언 인덱싱은 조건에 따라 나누는 방법으로 사용됩니다

 

arr > 0 이면 이라는 뜻으로 조건에 해당할 시 0이나 제거하여 결측치를 제거하는 방식으로 사용됩니다

 

두번째 또한 조건으로 1보다 크거나 0보다 작을 시 제거하거나 =0, 값을 0으로 만드는 방식으로 사용됩니다

 

 

 

 

 

11. 팬시 익덱싱

arr = np.arange(32).reshape(8,4)


----

arr[ [3,1, 0, 4] ]
출력
array([[12, 13, 14, 15],
       [ 4,  5,  6,  7],
       [ 0,  1,  2,  3],
       [16, 17, 18, 19]])
       
----

arr[ [3,1, 0, 4], [2,1,3,0]]
출력
array([14,  5,  3, 16])

----

arr[ [3,1, 0, 4] ][ : , [2,1,3,0] ] 
출력
array([[14, 13, 15, 12],
       [ 6,  5,  7,  4],
       [ 2,  1,  3,  0],
       [18, 17, 19, 16]])
       
----

arr[ [3,1, 0, 4] ][ : , [2,1,3] ]
출력
array([[14, 13, 15],
       [ 6,  5,  7],
       [ 2,  1,  3],
       [18, 17, 19]])

팬시 익덱싱은 비연속적인 데이터를 추출할때 사용됩니다

 

일명 마구잡이 순서로 있을때 필요한 데이터만 수집하도록 사용됩니다

 

arr는 2차원의 배열일때를 가정했습니다

 

arr[[3,1,0,4]] 1차원에서 인덱스를 기준으로 순서를 재배치 합니다

 

arr[[3,1,0,4], [2,1,3,0]] 값을 지정해서 가져옵니다

 

arr[[3,1,0,4]][:, [2,1,3,0]] 2차원 데이터는 모두, 그 순서들은 [2,1,3,0]

1차원 배열의 순서는 [3,1,0,4]의 구조로 변경됩니다

 

한번에 작성하고 설명을 작성하니 그리 보기 좋지가 않네요,,

 

 

 

12. 축변경 .T

arr.T

사실상 데이터 수집, 데이터 분석까지 생각해보면 가장 많이 사용하게 되는 기능입니다 축을 변경하는 방법으로

(2,8)의 구조를 (8,2) 처럼 바꾸는 방법입니다

 

가장 많이 사용되는게 의외인 기능이지만 데이터를 확인할때 많이 사용됩니다

 

 

 

 

 

13. 축이동

arr = np.arange(24).reshape( (2,3,4) )

arr.transpose( (2,0,1) ).shape,  arr.transpose( (2,0,1) )

출력
((4, 2, 3)

array([[[ 0,  4,  8],
         [12, 16, 20]],
 
        [[ 1,  5,  9],
         [13, 17, 21]],
 
        [[ 2,  6, 10],
         [14, 18, 22]],
 
        [[ 3,  7, 11],
         [15, 19, 23]]]))

3차원 배열의 축이동으로 2번축을 맨앞으로, 0번축을 그다음, 1번축을 마지막에 배치 하는 방법입니다

 

데이터 수집의 종류별 공부 중 API 형태의 데이터 수집으로 네이버 검색 API 수집을 완료했다 이후 웹 스크래핑 형식의 데이터 수집을 진행해보려 한다

웹 스크래핑은 웹 구조를 이용한 데이터 수집 방법으로 흔히 사이트를 긁어온다 라고 표현하며 사이트 별로 구조가 모두 다르기에 웹 페이즈에 대한 구조와 웹 스크래핑을 위한 BS4_BeautifulSoup 라이브러리 사용 경험치가 중요한 작업이다

간단 웹 페이지 구조

1. html5 : 데이터, 뼈대, 구조

2. css : 디자인, 레이아웃, 애니메이션, 반응형 (모바일<->PC)

  • bootstrap, 머터리얼 등의 디자인 템플릿도 가능

3. javascript, Ajax : 사용자 상호작용, 이벤트, 화면조작

웹 스크래핑 방법

  1. html 문자열
  2. BeautifulSoup 파싱
  3. html 구조로 메모리에 적재
  4. 탐색/검색
  5. 정보 추출

6. 데이터화

데이터 수집 타겟 사이트 선정

네이버 증권 환율 지표 데이터로 선정 'F12' 키 검사로 들어가서 확인해보면 네이버 환율 사이트는 친절이 document 사이트를 제공해 주어 손쉽게 데이터 수집이 가능 할 것으로 예상되며 최근 엔화의 하락이 있어서 엔화 변동성을 확인하여

엔화 ETF 매수 시점을 잡아보려고 시도중으로 네이버 환율 사이트를 타겟 사이트로 선정

 

 

친절히 환율 리스트만 따로 제공해주는 네이버 매매기준율을 기준으로 데이터 수집을 진행해보겠습니다

 

데이터 수집 코드 실습

  1. 모듈 가져오기
from urllib.request import urlopen from bs4 import BeautifulSoup

파싱을 위한 BeautifulSoup와 사이트 적솝을 위한 urlopen 모듈을 가져옵니다

2. 사이트 접속

target_site = 'https://finance.naver.com/marketindex/exchangeList.naver' res = urlopen( target_site )

타겟사이트인 네이버 증권 시장지표 환율정보이며 네이버에서는 따로 환율 리스트 정보만을 가지고있는 사이트를 제공해주기에 타겟사이트에 입력

3. 파싱

soup = BeautifulSoup( res , 'html5lib' )

BeautifulSoup로 html5lib을 사용한 파싱

4. 데이터 추출

사이트에서 데이터 수집 타겟인 매매기준율의 class 이름을 확인 'sale' 클래스로 확인

바로 옆의 통화명은 tit 입니다 사이트도 제공해주더니 데이터 수집도 간단하게 만들어 둔 사이트의 예시네요

for td_sale in soup.select('.sale'): print( td.text.strip() , end=" , " ) for td_tit in soup.select('.tit'): print( td.text.strip() , end=" , " )

클래스 값은 이름앞에 .을 붙혀서 .sale 의 형식으로 사용이 가능합니다

이제 soup를 사용해 통화명과 매매기준율 데이터 가져올 수 있습니다

 

네이버 증권 환율 정보를 가져오는 간단한 웹 스크래핑 방법 이였습니다

웹 스크래핑은 간단한 사이트에서 주로 사용하는 경우가 많아서 사이트도 간단한 사이트로 선정해서 진행해보았습니다

다음에는 조금더 고급(?) 스킬인 셀레니움을 통한 데이터 수집을 진행해보겠습니다

selenium을 사용해서는 데이터 수집이 조금은 더 까다로운 웹 페이지도 가능하니 세세하게 공부해두면 더 좋을것같습니다

+ Recent posts