selenium
webdriver-manager
numpy
pandas
scikit-learn
matplotlib
seaborn
plotly
jupyterlab
requests
beautifulsoup4
lxml
scrapy
scipy
statsmodels
0. 준비하기
- 이번 Pandas 실습은 jupyter lab 환경에서 이루어졌으며, 해당 가상환경에는 위와 같이 라이브러리가 설치되어있다.
1. 파일 입/출력
1- 1 현재 위치 찾기
- 아래 코드로 현재 폴더 위치 경로를 알아낼 수 있으며,
import os
os.getcwd()
1-2 파일 저장
- 아래 코드로 데이터프레임을 만들어 원하는 경로에 test.csv 파일로 저장할 수 있다.
import pandas as pd
sample_df = pd.DataFrame({"col1" : [1,2], "col2" : [3,4]})
sample_df.to_csv("output\\sample\\test.csv",index=False, encoding='utf-8')
1-3 파일 불러오기
- 아래 코드로 저장한 csv 파일을 불러올 수도 있다.
df = pd.read_csv('./output/sample/test.csv')
df
2. 열 및 행 선택 (출처 : https://github.com/pandas-dev)
- 다음과 같은 코드로 원하는 열만 데이터프레임으로 가져올 수도 있고,
- 조건에 맞는 데이터만을 추출할 수도 있으며,
* reset_index는 기존 데이터프레임의 인덱스 번호를 초기화하고 새로 지정한다는 코드
- 여러 조건을 지정하여 가져오는 것도 가능하다.
3. iloc 와 loc 문법
iloc[]: 이 방법은 주로 숫자 위치(인덱스)를 기반으로 한다. 즉, 행과 열을 0부터 시작하는 정수 위치로 선택
.loc[]: 이 방법은 주로 라벨(인덱스 또는 컬럼 이름)을 기반으로 한다. 이 방법은 주로 라벨을 사용하기 때문에 행 또는 열의 이름을 알고 있을 때 유용함.
- 코드 문법은 다음과 같으며, 둘의 큰 차이 중 하나가 iloc는 미만/ loc는 이하인 속성을 가지고 있다는 점이다.
- 또한, loc는 조건을 이용할 수 있지만, iloc는 조건을 직접 적용하는 것은 불가능하다는 차이도 있다.
4. 결측치
4-1. 결측치를 가진 데이터프레임 만들기
- 먼저 random.seed 메서드를 이요하여 랜덤 array를 생성해주고, 적당한 조건을 적용하여 결측치를 가진 array를 만들어준다.
- 다음으로 해당 array를 DataFrame 으로 만들어 다음의 코드를 통해 아래와 같은 정보를 살펴보도록 하자.
4-2 평균으로 결측치 대치해보기
- 바로 위에서 column 별 mean 값이 보일 것이다. 다음의 코드를 통해 column 의 결측치들을 mean값으로 대치해보자.
5. 데이터프레임 행추가
- 다음과 같은 데이터프레임을 만들어 실습해보자.
- 다음과 같이 특정 행을 지정하여 새로운 행에 value들을 집어넣어 행추가를 할 수 있다.
5.5 데이터프레임에 기존 데이터들을 이용하여 조건을 만들고, 그 조건에 따른 결과값을 새로운 열(시리즈)로 추가해보자.
- 바로 위의 데이터프레임을 활용해보겠다. # 국어점수 90점 이상 A, 80~89 B, 70~79 C, 나머지 F인 조건이다.
* np.where(조건식, 참, np.where(조건식, 참, (np.where(조건식, 참))))
* np.select(다중조건식, 다중결괏값, default ==> else 조건)
6. 날짜 데이터 핸들링(시계열 데이터)
6-1 데이터 가져오기
- 먼저 다음과 같이 datesold 데이터를 datetime type으로 변환해주어야 한다.
* pd.to_datetime은 판다스(Pandas) 라이브러리에서 제공하는 함수로, 날짜와 시간 데이터를 파싱하여 Datetime 형식으로 변환하는 데 사용한다. 이 함수는 문자열 형식의 날짜와 시간 데이터를 판다스의 Datetime 형식으로 변환하여 데이터프레임의 열에 저장하거나 시계열 데이터를 다룰 때 유용하게 활용된다.
6-2 시계열 데이터 활용
- 이전에서 datetime type으로 바꿔준 덕분에 dt의 메서드를 사용할 수 있게 되었고, dt.year/month/day는 각 시계열 데이터에서 연/월/일을 추출하는 dt의 메서드이다.
7. shift 기능(전일 대비 비교 등 비교를 위한 행 맞춤 과정)
- 먼저 기존 sales 데이터프레임 복사본을 만들고 실습을 준비하자.
* .copy() 메서드는 파이썬의 판다스 라이브러리에서 사용되는 메서드로, 데이터 구조를 복사하는 데 사용함.
이 메서드를 사용하면 원본 데이터를 변경하지 않고 복사본을 만들 수 있어서, 주로 데이터프레임이나 시리즈를 복사하거나 조작할 때 활용함.
- .shift() 메서드는 판다스 라이브러리에서 사용되는 메서드로, 데이터를 주어진 개수만큼 이동시키는 데 사용된다. 이 메서드를 활용하면 시계열 데이터에서 이전 또는 다음 값과의 비교를 통해 변화를 계산하거나 데이터를 시간 단위로 이동시킬 수 있는 것이다.
* .astype(int) : data type을 지정함.
- 아래 경우 처럼 두 칸씩 이동도 가능하며, fill_value 옵션은 빈 칸을 무엇으로 채울지에 대한 옵션이다.
- 또한, 음수를 입력하여 다음과 같이 데이터를 위로 올리는 것도 가능하다.
8. 한국식 날짜 표현 칼럼 추가하기
- 다음의 코드를 이용하여 한글 날짜 형식에 맞게 칼럼을 추가할 수 있으며, Y/M/D의 대소문자에 따라 표현이 달라지며, 다양한 날짜형식으로의 표현이 가능하다.
* 다음 형식 구분표를 참고하기를 바란다(출처 : https://docs.python.org/3.9/library/datetime.html#strftime-and-strptime-format-codes)
%a | Weekday as locale’s abbreviated name. |
Sun, Mon, …, Sat (en_US);
So, Mo, …, Sa (de_DE)
|
%A | Weekday as locale’s full name. |
Sunday, Monday, …, Saturday (en_US);
Sonntag, Montag, …, Samstag (de_DE)
|
%w | Weekday as a decimal number, where 0 is Sunday and 6 is Saturday. | 0, 1, …, 6 |
%d | Day of the month as a zero-padded decimal number. | 01, 02, …, 31 |
%b | Month as locale’s abbreviated name. |
Jan, Feb, …, Dec (en_US);
Jan, Feb, …, Dez (de_DE)
|
%B | Month as locale’s full name. |
January, February, …, December (en_US);
Januar, Februar, …, Dezember (de_DE)
|
%m | Month as a zero-padded decimal number. | 01, 02, …, 12 |
%y | Year without century as a zero-padded decimal number. | 00, 01, …, 99 |
%Y | Year with century as a decimal number. | 0001, 0002, …, 2013, 2014, …, 9998, 9999 |
%H | Hour (24-hour clock) as a zero-padded decimal number. | 00, 01, …, 23 |
%I | Hour (12-hour clock) as a zero-padded decimal number. | 01, 02, …, 12 |
%p | Locale’s equivalent of either AM or PM. |
AM, PM (en_US);
am, pm (de_DE)
|
%M | Minute as a zero-padded decimal number. | 00, 01, …, 59 |
%S | Second as a zero-padded decimal number. | 00, 01, …, 59 |
%f | Microsecond as a decimal number, zero-padded to 6 digits. | 000000, 000001, …, 999999 |
%z | UTC offset in the form ±HHMM[SS[.ffffff]] (empty string if the object is naive). | (empty), +0000, -0400, +1030, +063415, -030712.345216 |
%Z | Time zone name (empty string if the object is naive). | (empty), UTC, GMT |
%j | Day of the year as a zero-padded decimal number. | 001, 002, …, 366 |
%U | Week number of the year (Sunday as the first day of the week) as a zero-padded decimal number. All days in a new year preceding the first Sunday are considered to be in week 0. | 00, 01, …, 53 |
%W | Week number of the year (Monday as the first day of the week) as a zero-padded decimal number. All days in a new year preceding the first Monday are considered to be in week 0. | 00, 01, …, 53 |
%c | Locale’s appropriate date and time representation. |
Tue Aug 16 21:30:00 1988 (en_US);
Di 16 Aug 21:30:00 1988 (de_DE)
|
%x | Locale’s appropriate date representation. |
08/16/88 (None);
08/16/1988 (en_US);
16.08.1988 (de_DE)
|
%X | Locale’s appropriate time representation. |
21:30:00 (en_US);
21:30:00 (de_DE)
|
%% | A literal '%' character. | % |
★ 9. 실전과 비슷한 데이터를 활용하여 결측치 처리해보기 ★
-0 다음과 같이 새로운 data.csv 파일을 가져오자.
- 조금 더 보기 좋게 데이터프레임을 가공해보자.
pd.set_option('display.width', 80): 출력되는 데이터프레임의 텍스트 너비를 80으로 설정합니다. 이는 텍스트가 한 줄에 표시될 최대 문자 수를 나타냅니다. pd.set_option('display.max_columns', 20): 최대로 표시될 열의 수를 20으로 설정합니다. 이는 데이터프레임의 열이 표시되는 최대 수를 조정합니다. pd.set_option('display.max_rows', 20): 최대로 표시될 행의 수를 20으로 설정합니다. 이는 데이터프레임의 행이 표시되는 최대 수를 조정합니다. pd.options.display.float_format = '{:,.2f}'.format: 부동 소수점 숫자를 출력할 때 소수점 이하 2자리까지만 표시하도록 포맷을 설정합니다. 예를 들어, 10.12345는 10.12로 표시됩니다. |
챗 지피티야 늘 고맙다..!
-1 결측치 확인하기
- 먼저 두 번째 코드를 이용해서, 컬럼 방향으로 결측치의 개수를 파악할 수 있으며,
- 행 방향으로 결측치의 개수가 N 개인 행이 N개 별 몇 행이 있는지도 알 수 있다.
-2 조건을 만족하는 결측치 추출하기
- 다음 코드처럼 결측치가 3개 이상인 데이터들을 추출하여 볼 수도 있다(5개 단위로 빨간 선으로 구분하였으니, 실제 18개가 잘 추출되고 있는 것을 확인해보자).
* 판다스의 Index Alignment 원칙여기서 covidtotals는 데이터프레임이고, demovars_misscnt는 어떤 조건을 만족하는 불리언(boolean) 시리즈이다. 이 코드는 covidtotals 데이터프레임에서 demovars_misscnt 시리즈의 조건을 만족하는 행들을 선택하는데, 이 때 Index Alignment 원칙이 작용한다.Index Alignment 원칙에 따라서 demovars_misscnt 시리즈의 인덱스와 covidtotals DF의 인덱스가 일치하게 되어 정확한 행들이 선택되고 정렬되는 것이다. 이렇게 함으로써 원하는 조건을 만족하는 데이터를 선택하고 다룰 때, 데이터 일관성과 누락을 방지할 수 있다. |
- 결측치 부분은 중요하므로 한 번더 실습을 해보려고 한다. 이번에는 칼럼을 바꾸어 코로나 관련 변수로만 진행해보겠다. 먼저 결측치가 있는지를 행을 기준으로 .value_counts()로 확인해본다. 그러면 다음과 같이 결측치가 두 개 있는 행이 있다고 나온다.
- 그러면 다음으로 해당 코드를 사용해서 어떤 행인지를 찾아서 보여줄 수 있다.
10. 이상치 개념 맛보기
- 먼저 다음의 코드를 통해 데이터프레임에 대해 'total_cases' 열의 값을 기준으로 분위수(quantile:q) 구간을 만들고, 그에 따라 새로운 열을 추가한다.
* precision=0으로 설정하면 분위수 계산 시 소수점 이하를 버리고 정수만을 고려
- 다음으로는 아래와 같이 crosstable 을 만들어보도록 하자.
- 이상치에 대한 정의는 다양하지만, 여기서는 매우낮음-매우낮음 ~ 매우높음-매우높음 이어지는 우하향선을 기준으로 두 칸 이상 떨어진 값들을 이상치로 정하여 조사를 해보고자 한다.
- 그중에서도 발생 건수는 낮음인데, 사망자 수가 높음으로 나온 나라를 추출했고, 예멘이 나오게 되었다.
'IT & 개발공부 > 파이썬(Python)' 카테고리의 다른 글
API 인증키를 활용한 웹 크롤링 실습 -1 (한국도로공사 데이터) (0) | 2023.08.11 |
---|---|
scrapy를 이용한 웹 크롤링 실습 (0) | 2023.08.10 |
셀레니움(selenium)을 이용한 웹 크롤링 실습 (0) | 2023.08.08 |
파이썬(beautifulsoup) 크롤링 기초 공부 및 예제를 통해 실습하기 -2 (0) | 2023.08.07 |
파이썬(beautifulsoup) 크롤링 기초 공부 및 예제를 통해 실습하기 -1 (0) | 2023.08.06 |