WEB

[pandas] csv 데이터 api 연동, 처리

쥬쥬코드 2024. 11. 3. 16:18

환경 지수 출력 프로젝트 개발 중에, 환경 지수에 대한 공공데이터를 처리해야했다

 

[ 공공 데이터의 api를 받아와 연동한 후, 데이터 가공 ]

필요 데이터 : 온실가스 데이터, 대기질 데이터, 음식물 쓰레기 데이터

 

step1. 데이터의 api를 받아와 필요한 데이터를 분리한 후, csv 형태로 저장해준다. (파이선 pandas 이용)

import pandas as pd
from io import StringIO
import requests
import pprint
import json

#음식물 쓰레기
url_f = "https://openapi.gg.go.kr/Fodndrkwstoccur?KEY=7f21e9c535d044b8aeb51c90b1c8dff3&Type=json&pIndex=1&pSize=100"
response_f = requests.get(url_f)
contents_f = response_f.text
json_ob_f = json.loads(contents_f)
print(json_ob_f)
	body_f = json_ob_f['Fodndrkwstoccur'][1]['row'] #데이터 분리
dataframe_f = pd.json_normalize(body_f)
print(dataframe_f)
dataframe_f.to_csv('data\data_waste.csv',index=False) # 해당 경로에 csv파일로 저장


#대기질
url_d = "https://openapi.gg.go.kr/Sidoatmospolutnmesure?KEY=544c8a0f0d7d4183afaf35a35dbec704&Type=json&pIndex=1&pSize=100"
response_d = requests.get(url_d)
contents_d = response_d.text
json_ob_d = json.loads(contents_d)
body_d = json_ob_d['Sidoatmospolutnmesure'][1]['row']
dataframe_d = pd.json_normalize(body_d)
#print(dataframe_d)
dataframe_d.to_csv('data\data_air.csv',index=False)

# 온실가스
url_o = "https://openapi.gg.go.kr/GGSIGUNGREENGASEMSTM?KEY=f492b61fa9f3461a822ccbaa1de3a8b2&Type=json&pIndex=1&pSize=100"
response_o = requests.get(url_o)
contents_o = response_o.text
json_ob_o = json.loads(contents_o)
body_o = json_ob_o['GGSIGUNGREENGASEMSTM'][1]['row']
dataframe_o = pd.json_normalize(body_o)
#print(dataframe_o)
dataframe_o.to_csv('data\data_emission.csv',index=False)

 

 

그리고 실행하면 이렇게 저장이 된다

 

 

step2. 이제 파이썬에서 csv로 저장한 데이터를 불러와 각 지역별 환경 지수를 계산한다.

환경지수 계산 방법

1. 데이터 불러오기

data_emission = pd.read_csv('data\data_emission.csv', na_values=['']) # 기준배출량 등의 데이터 
data_waste = pd.read_csv('data\data_waste.csv', na_values=['']) # 음식물류폐기물발생량 등의 데이터
data_air = pd.read_csv('data\data_air.csv', na_values=['']) # 대기오염물질 농도값 등의 데이터

 

2. 각 데이터 정규화

# 온실가스 발생량 데이터 정규화
min_gas_emission = data_emission['GAS_EMISN_AMNT'].min()
max_gas_emission = data_emission['GAS_EMISN_AMNT'].max()
data_emission['Normalized_Gas_Emission'] = (data_emission['GAS_EMISN_AMNT'] - min_gas_emission) / (max_gas_emission - min_gas_emission)

# 음식물류폐기물 발생량 데이터 정규화
min_waste = data_waste['FODNDRK_WST_OCCUR_QTY'].min()
max_waste = data_waste['FODNDRK_WST_OCCUR_QTY'].max()
data_waste['Normalized_Waste'] = (data_waste['FODNDRK_WST_OCCUR_QTY'] - min_waste) / (max_waste - min_waste)

# 대기오염물질 데이터 정규화
cols_air = ['SUA_GAS_DNST_VL', 'COMNXD_DNST_VL', 'NO2_DNST_VL', 'OZONE_DNST_VL', 'FINEDUST_PM10_DNST_VL', 'FINEDUST_PM2_5_DNST_VL']
for col in cols_air:
    min_value = data_air[col].min()
    max_value = data_air[col].max()
    data_air[f'Normalized_{col}'] = (data_air[col] - min_value) / (max_value - min_value)

 

3. 가중치 설정

    weight_emission = 0.4
    weight_waste = 0.3
    weight_air = 0.3

 

4. 각 환경 지표 계산

# 각 환경 지표 계산
data_emission['Emission_Score'] = weight_emission * data_emission['Normalized_Gas_Emission']
data_emission['Waste_Score'] = weight_waste * data_waste['Normalized_Waste']
data_emission['Air_Score'] = weight_air * data_air[[f'Normalized_{col}' for col in cols_air]].mean(axis=1)

 

5. 종합 점수 계산

 # 종합 점수 계산
    data_emission['Total_Score'] = (data_emission['Emission_Score'] +
                                     data_emission['Waste_Score'] +
                                     data_emission['Air_Score']) / \
                                    (weight_emission + weight_waste + weight_air)

 

 

nan 값 설정 코드 추가

# NaN 값을 적절한 값으로 대체
data_emission.fillna(data_emission.mean(), inplace=True)
data_waste.fillna(data_waste.mean(), inplace=True)
data_air.fillna(data_air.mean(), inplace=True)

 

 

 


 

수정

스캐줄링 구현을 위해 재실행했을 경우 아래와 같은 오류가 발생하였다.

오류 : Pandas에서 발생하는 경고 메시지 중 하나로, 현재의 코드에서는 사용 중인 DataFrame reductions(예: sum(), mean() 등)에서 'numeric_only' 매개변수를 명시적으로 설정하지 않을 경우 발생. 미래 버전에서는 TypeError를 발생시킬 것임

이라는 경고가 있어서 오류 처리가 필요했다.

# NaN 값을 적절한 값으로 대체
data_emission.fillna(data_emission.mean(numeric_only=True), inplace=True)
data_waste.fillna(data_waste.mean(numeric_only=True), inplace=True)
data_air.fillna(data_air.mean(numeric_only=True), inplace=True)

 

mean() 값에 numeric_only= True로 설정해줌으로써 오류를 해결할 수 있었다.

 

'WEB' 카테고리의 다른 글

스프링 객체지향과 다형성  (0) 2024.11.25
서블릿(Servlet)  (0) 2024.11.15
[Tomcat] Web Server와 WAS, Apache Tomcat  (8) 2024.11.10
[JWT]쿠키/세션/JWT 비교, jwt 구현 (nodejs)  (0) 2024.10.29
스프링 의존성 주입에 관하여  (2) 2024.10.27