Data processing 실습¶
- 모든 학습 내용은 inflearn, 처음하는 파이썬 데이터 분석(잔재미코딩)에 기초하고 있습니다.
- reference : https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-%EC%A0%84%EC%B2%98%EB%A6%AC-%ED%8C%90%EB%8B%A4%EC%8A%A4-%EC%8B%9C%EA%B0%81%ED%99%94/dashboard
COVID-19 확진자 추이 그래프를 만들기 위한 Data Format
In [ ]:
raw data의 형태를 확인해보자¶
In [5]:
import pandas as pd
path = './COVID-19-master\csse_covid_19_data\csse_covid_19_daily_reports/'
doc = pd.read_csv(path + '01-22-2020.csv', encoding = 'utf-8-sig')
doc.head()
Out[5]:
Province/State | Country/Region | Last Update | Confirmed | Deaths | Recovered | |
---|---|---|---|---|---|---|
0 | Anhui | Mainland China | 1/22/2020 17:00 | 1.0 | NaN | NaN |
1 | Beijing | Mainland China | 1/22/2020 17:00 | 14.0 | NaN | NaN |
2 | Chongqing | Mainland China | 1/22/2020 17:00 | 6.0 | NaN | NaN |
3 | Fujian | Mainland China | 1/22/2020 17:00 | 1.0 | NaN | NaN |
4 | Gansu | Mainland China | 1/22/2020 17:00 | NaN | NaN | NaN |
In [10]:
doc = pd.read_csv(path + '04-22-2020.csv', encoding = 'utf-8-sig')
doc.head()
Out[10]:
FIPS | Admin2 | Province_State | Country_Region | Last_Update | Lat | Long_ | Confirmed | Deaths | Recovered | Active | Combined_Key | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 45001.0 | Abbeville | South Carolina | US | 2020-04-22 23:30:53 | 34.223334 | -82.461707 | 22 | 0 | 0 | 22 | Abbeville, South Carolina, US |
1 | 22001.0 | Acadia | Louisiana | US | 2020-04-22 23:30:53 | 30.295065 | -92.414197 | 117 | 7 | 0 | 110 | Acadia, Louisiana, US |
2 | 51001.0 | Accomack | Virginia | US | 2020-04-22 23:30:53 | 37.767072 | -75.632346 | 59 | 1 | 0 | 58 | Accomack, Virginia, US |
3 | 16001.0 | Ada | Idaho | US | 2020-04-22 23:30:53 | 43.452658 | -116.241552 | 622 | 12 | 0 | 610 | Ada, Idaho, US |
4 | 19001.0 | Adair | Iowa | US | 2020-04-22 23:30:53 | 41.330756 | -94.471059 | 1 | 0 | 0 | 1 | Adair, Iowa, US |
Raw Data를 확인하니 시각화를 위한 Data Format으로 변환시키려면 우선 아래 내용을 만족시켜야한다¶
- csv 파일 읽기
- 'Country_Region', 'Confirmed' 두 개의 컬럼만 가져오기
- 'Confirmed' 에 데이터가 없는 행 삭제하기
- 'Country_Region'의 국가명을 여러 파일에 일관되게 변경하기
- 'Confirmed' 데이터 타입을 int64(정수) 로 변경
- 'Country_Region' 를 기준으로 중복된 데이터를 합치기
- 파일명을 기반으로 날짜 문자열 변환하고, 'Confirmed' 컬럼명 변경하기
Tip : apply 함수를 이용해 표준 국가명으로 변환시키자¶
- df.apply(func, axis = 0 or 1)
- axis = 0 이면, 데이터 프레임의 열 Data가 차례로 func에 input으로 들어감
- axis = 1 이면, 데이터 프레임의 행 Data가 차례로 func에 input으 로 들어감
In [47]:
# 1. csv 파일 읽기
# 2. 'Country_Region', 'Confirmed' 두 개의 컬럼만 가져오기
# 3. 'Confirmed' 에 데이터가 없는 행 삭제하기
# 4. 'Country_Region'의 국가명을 여러 파일에 일관되게 변경하기
# 5. 'Confirmed' 데이터 타입을 int64(정수) 로 변경
# 6. 'Country_Region' 를 기준으로 중복된 데이터를 합치기
# 7. 파일명을 기반으로 날짜 문자열 변환하고, 'Confirmed' 컬럼명 변경하기
import pandas as pd
path = './COVID-19-master\csse_covid_19_data\csse_covid_19_daily_reports/'
doc = pd.read_csv(path + '01-22-2020.csv', encoding = 'utf-8-sig')
# doc.head()
# Country_Region의 국가명 표준국가명으로 변환
import json
with open('COVID-19-master/csse_covid_19_data/country_convert.json', 'r', encoding = 'utf-8-sig') as json_file:
json_data = json.load(json_file)
def change_country_name(row):
if row['Country_Region'] in json_data:
row['Country_Region'] = json_data[row['Country_Region']]
return row['Country_Region']
# csv 파일 가져오기
def create_dataframe(filename):
doc = pd.read_csv(path + filename, encoding = 'utf-8-sig')
try:
doc = doc[['Country_Region', 'Confirmed']]
except:
doc = doc[['Country/Region', 'Confirmed']]
doc.columns = ['Country_Region', 'Confirmed']
doc = doc.dropna(subset = ['Country_Region'])
doc['Country_Region'] = doc.apply(change_country_name, axis = 1)
# doc = doc.fillna(0) # 결측치 0으로 대치
doc = doc.groupby('Country_Region').sum() # Country Region Column을 기준으로 값 더해서 정리
# 파일명 기반으로 Confimred 컬럼명 변환
n_date = filename.split('.')[0].lstrip('0').replace('_','/')
doc.columns = [n_date]
return doc
In [48]:
# 함수 Test
doc_1 = create_dataframe('02-22-2020.csv')
doc_2 = create_dataframe('04-22-2020.csv')
print(doc_1.head())
print(doc_2.head())
2-22-2020 Country_Region Australia 22 Belgium 1 Cambodia 1 Canada 9 China 77001 4-22-2020 Country_Region Afghanistan 1176 Albania 634 Algeria 2910 Andorra 723 Angola 25
완성된 함수로 여러개의 파일을 불러와서 Merge하자¶
- 경로내 모든 파일 list up
- csv 파일만 추출해서 csv_list에 추가
- create_dataframe 함수 통해, csv 파일 데이터프레임으로 만들기
- 데이터 프레임 모두 합치기
In [63]:
import os
def generate_dataframe_by_path(path):
file_list, csv_list = os.listdir(path), list()
first_file = True
for file in file_list:
if file.split('.')[-1] == 'csv':
csv_list.append(file)
for file in csv_list:
doc = create_dataframe(file)
if first_file:
final_file = doc
first_file = False
else:
# left_index, right_index = True 해줘서 merge하더라도 index 유지?
# final_file = pd.merge(final_file, doc, how = 'outer', left_index = True, right_index = True)
final_file = pd.merge(final_file, doc, how = 'outer', left_index = True, right_index = True)
final_file = final_file.fillna(0)
return final_file
In [64]:
PATH = 'COVID-19-master/csse_covid_19_data/csse_covid_19_daily_reports/'
doc = generate_dataframe_by_path(PATH)
doc = doc.astype('int64')
doc
Out[64]:
1-22-2020 | 1-23-2020 | 1-24-2020 | 1-25-2020 | 1-26-2020 | 1-27-2020 | 1-28-2020 | 1-29-2020 | 1-30-2020 | 1-31-2020 | ... | 6-08-2020 | 6-09-2020 | 6-10-2020 | 6-11-2020 | 6-12-2020 | 6-13-2020 | 6-14-2020 | 6-15-2020 | 6-16-2020 | 6-17-2020 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Country_Region | |||||||||||||||||||||
Afghanistan | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 20917 | 21459 | 22142 | 22890 | 23546 | 24102 | 24766 | 25527 | 26310 | 26874 |
Albania | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 1263 | 1299 | 1341 | 1385 | 1416 | 1464 | 1521 | 1590 | 1672 | 1722 |
Algeria | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 10265 | 10382 | 10484 | 10589 | 10698 | 10810 | 10919 | 11031 | 11147 | 11268 |
Andorra | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 852 | 852 | 852 | 852 | 853 | 853 | 853 | 853 | 854 | 854 |
Angola | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 92 | 96 | 113 | 118 | 130 | 138 | 140 | 142 | 148 | 155 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
Vietnam | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | ... | 332 | 332 | 332 | 332 | 333 | 334 | 334 | 334 | 334 | 335 |
West Bank and Gaza | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 473 | 481 | 485 | 487 | 489 | 489 | 492 | 505 | 514 | 555 |
Yemen | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 496 | 524 | 560 | 591 | 632 | 705 | 728 | 844 | 885 | 902 |
Zambia | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 1200 | 1200 | 1200 | 1200 | 1321 | 1357 | 1358 | 1382 | 1405 | 1412 |
Zimbabwe | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 287 | 314 | 320 | 332 | 343 | 356 | 383 | 387 | 391 | 401 |
187 rows × 148 columns
결과 파일 추출 pd.to_csv¶
In [65]:
doc.to_csv("COVID-19-master/final_df.csv")
In [ ]:
In [ ]:
In [ ]:
'데이터분석 > Pandas' 카테고리의 다른 글
[Pandas] 데이터 처리 연습2 결과물 시각화 (0) | 2021.07.17 |
---|---|
[Pandas] 데이터 처리 연습 2 (0) | 2021.07.17 |
[Pandas] DataFrame Join (concat, merge) (0) | 2021.07.12 |
[Pandas] 데이터 처리 연습 (0) | 2021.07.12 |
[Pandas] EDA 기초 이해 (0) | 2021.07.08 |