출처: https://astrocosmos.tistory.com/202 [ASTROCOSMOS:티스토리] '프로젝트, 공모전/프로젝트_공공데이터분석' 카테고리의 글 목록 :: 하나둘셋넷
728x90

주제_실시간_활용_많은_순서

https://www.data.go.kr/tcs/dss/selectDataSetList.do?dType=API&keyword=%EC%8B%A4%EC%8B%9C%EA%B0%84&operator=AND&detailKeyword=&publicDataPk=&recmSe=N&detailText=&relatedKeyword=&commaNotInData=&commaAndData=&commaOrData=&must_not=&tabId=&dataSetCoreTf=&coreDataNm=&sort=reqCo&relRadio=&orgFullName=&orgFilter=&org=&orgSearch=¤tPage=1&perPage=10&brm=&instt=&svcType=&kwrdArray=&extsn=&coreDataNmArray=&pblonsipScopeCode=

 

728x90
728x90

목적

- 실시간 수질 정보 조회 및 생활 용수와 공업 용수의 상태 파악

- 민간 및 기업에 모두 유용한 데이터를 제공하는 것

 

활용 데이터

한국수자원공사_실시간 수도정보 수질(시간) 조회 서비스(GW)

 

 

사용 라이브러리

from datetime import datetime
from datetime import timedelta
import pandas as pd
import requests
import pprint
from os import name
import pandas as pd
import bs4

 

인증키 확인

서비스 URL

http://apis.data.go.kr/B500001/rwis/waterQuality/list 

 

요청 메시지 명세

항목명(영문) 항목명(국문) 항목크기 항목구분 샘플데이터 항목설명
stDt 조회시작일자 10 1 2015-11-18 조회시작일자
stTm 조회시작시간 2 1 00 조회시작시간
edDt 조회종료일자 10 1 2015-11-18 조회종료일자
edTm 조회종료시간 2 1 24 조회종료시간
fcltyMngNo 시설관리번호 10 0 4824012333 시설관리번호
sujCode 사업장코드 3 0 333 사업장코드
liIndDiv 생활공업구분 1 0 1 생활:1, 공업:2
numOfRows 줄수 10 0 10 줄수
pageNo 페이지번호 10 0 1 페이지번호

 

※ 항목구분 : 필수(1), 옵션(0), 1건 이상 복수건(1..n), 0건 또는 복수건(0..n)

오퍼레이션 목록

1) 1시간 수질정보 조회 waterQualityList

2) 정수장 코드 조회 fcltyList

3) 공급지역 정수장 코드 조회 supplyLgldCodeList

 

서비스와 URL 조합

http://apis.data.go.kr/B500001/rwis/waterQuality/list/waterQualityList

http://apis.data.go.kr/B500001/rwis/waterQuality/list/fcltyList

http://apis.data.go.kr/B500001/rwis/waterQuality/list/supplyLgldCodeList

 

파이썬 샘플 코드

 

import requests

url = 'http://apis.data.go.kr/B500001/rwis/waterQuality/list'
params ={'serviceKey' : '서비스키', 'stDt' : '2015-11-18', 'stTm' : '00', 'edDt' : '2015-11-18', 'edTm' : '24', 'fcltyMngNo' : '4824012333', 'sujCode' : '333', 'liIndDiv' : '1', 'numOfRows' : '10', 'pageNo' : '1' }

response = requests.get(url, params=params)
print(response.content)

 

시간 결정

from datetime import datetime
from datetime import timedelta
print(datetime.today())
print(datetime.today().strftime("%Y-%m-%d %H:%M:%S"))
print(datetime.today().strftime("%Y-%m-%d"))

five_years_ago = datetime.today() - timedelta(days = 5*365)
five_years_ago.strftime("%Y-%m-%d")

 

url, params 설정

import pandas as pd
import requests
import pprint

decoding_key = '디코딩_key'

url = 'http://apis.data.go.kr/B500001/rwis/waterQuality/list'
# params ={'serviceKey' : '서비스키', 
#          'stDt' : '2015-11-18', 
#          'stTm' : '00', 
#          'edDt' : '2015-11-18', 
#          'edTm' : '24', 
#          'fcltyMngNo' : '4824012333', 
#          'sujCode' : '333', 
#          'liIndDiv' : '1', 
#          'numOfRows' : '10', 
#          'pageNo' : '1' }

params ={'serviceKey' : decoding_key, 
         'stDt' : five_years_ago.strftime("%Y-%m-%d"), # 조회시작일자
         'stTm' : '00',  # 조회시작시간
         'edDt' : datetime.today().strftime("%Y-%m-%d"), # 조회종료일자
         'edTm' : '24', # 조회종료시간
         'fcltyMngNo' : '4824012333' # 시설관리번호
         # 'sujCode' : '333'  # 사업장코드
         # 'liIndDiv' : '1'  # 생활공업구분
         # 'numOfRows' : '10'  # 줄수
         # 'pageNo' : '1'  # 페이지번호
        }
response = requests.get(url, params=params)

# xml 내용
content = response.text
print('content',content)

# 깔끔한 출력 위한 코드
pp = pprint.PrettyPrinter(indent=4)
print('pp', pp)

### xml을 DataFrame으로 변환하기 ###
from os import name
import pandas as pd
import bs4

#bs4 사용하여 item 태그 분리
xml_obj = bs4.BeautifulSoup(content,'lxml-xml')
print('xml_obj', xml_obj)
rows = xml_obj.findAll('item')
print(rows)

# 각 행의 컬럼, 이름, 값을 가지는 리스트 만들기
row_list = [] # 행값
name_list = [] # 열이름값
value_list = [] #데이터값

# xml 안의 데이터 수집
for i in range(0, len(rows)):
    columns = rows[i].find_all()
    #첫째 행 데이터 수집
    for j in range(0,len(columns)):
        if i ==0:
            # 컬럼 이름 값 저장
            name_list.append(columns[j].name)
        # 컬럼의 각 데이터 값 저장
        value_list.append(columns[j].text)
    # 각 행의 value값 전체 저장
    row_list.append(value_list)
    # 데이터 리스트 값 초기화
    value_list=[]
    
#xml값 DataFrame으로 만들기
water_df = pd.DataFrame(row_list, columns=name_list)
print(water_df.head(19))

#xml값 DataFrame으로 만들기
#Assertion Error가 난 경우
water_df = pd.DataFrame(water_df)
# 이후에 컬럼을 설정해 주세요.
water_df

 

제공 기관과 데이터 설명이 일치하지 않음

- 필수 parameter 정보 불일치

- 예제와 다른 경우의 데이터를 추출하기 어렵다.

 

 

결론

공공데이터 포털에서는 활용 많은 순으로 데이터를 활용할 것

728x90
728x90

집계구별 일별소비지역별 카드소비패턴 분석

집계구별 일별소비지역별 카드소비패턴.csv
0.03MB
원본

 

강남에서 카드이용건수계 비율, 카드이용금액계 비율

강남 소비 분석

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rc('font',family='Malgun Gothic')
plt.rcParams['font.family']
gu = pd.read_csv('집계구별 일별소비지역별 카드소비패턴.csv',encoding='CP949')
gu_seoul = gu.loc[gu['가맹점주소광역시도(SIDO)']=='서울' , ['가맹점주소시군구(SGG)','업종대분류(UPJONG_CLASS1)','카드이용건수계(USECT_CORR)','카드이용금액계(AMT_CORR)']]
# display(gu_seoul[gu_seoul['가맹점주소시군구(SGG)']=='강남구'])
gu_gangnam = gu_seoul[gu_seoul['가맹점주소시군구(SGG)']=='강남구']
gu_gangnam_use = gu_gangnam.groupby(by='업종대분류(UPJONG_CLASS1)', as_index=False)[['카드이용건수계(USECT_CORR)']].sum()
# display(gu_gangnam_use)
# display(gu_gangnam_use.info())
gu_gangnam_money = gu_gangnam.groupby(by='업종대분류(UPJONG_CLASS1)', as_index=False)[['카드이용금액계(AMT_CORR)']].sum()
# display(gu_gangnam_money)
# plt.pie(데이터프레임['컬럼명'].values, labels = 데이터프레임['컬럼명'].index(), autopct='%.2f%%')
plt.figure(figsize = (10,10))
plt.subplot(1,2,1)
plt.pie(gu_gangnam_use['카드이용건수계(USECT_CORR)'].values, labels=gu_gangnam_use['업종대분류(UPJONG_CLASS1)'] )
plt.legend(loc='upper left')
plt.title('강남에서 카드이용건수계 비율')
plt.subplot(1,2,2)
plt.pie(gu_gangnam_money['카드이용금액계(AMT_CORR)'].values, labels= gu_gangnam_money['업종대분류(UPJONG_CLASS1)'])
plt.legend(loc='upper left')
plt.title('강남에서 카드이용금액계 비율')
plt.tight_layout()

 

년도별 카드이용금액계의 변화

년도별 소비금액 변동

 

import numpy as np
import pandas as pd
pd.set_option('display.float_format', lambda x:'%.3f'%x) # 지수 표현 없애기
import matplotlib.pyplot as plt
plt.rc('font',family = 'Malgun Gothic')
plt.rcParams['font.family']
import seaborn as sns
import scipy.stats as spst
sobi = pd.read_csv( '집계구별 일별소비지역별 카드소비패턴.csv', encoding ='CP949')
sobi_year = sobi.loc[:,['기준일자(YMD)','카드이용금액계(AMT_CORR)']]
sobi_year['기준일자(YMD)'] = sobi_year['기준일자(YMD)'].astype('str')
sobi_year['기준일자(YMD)'] = sobi_year['기준일자(YMD)'].str[:4]
A= sobi_year.loc[sobi_year['기준일자(YMD)']=='2016','카드이용금액계(AMT_CORR)']
B= sobi_year.loc[sobi_year['기준일자(YMD)']=='2017','카드이용금액계(AMT_CORR)']
C= sobi_year.loc[sobi_year['기준일자(YMD)']=='2018','카드이용금액계(AMT_CORR)']
D= sobi_year.loc[sobi_year['기준일자(YMD)']=='2019','카드이용금액계(AMT_CORR)']
E= sobi_year.loc[sobi_year['기준일자(YMD)']=='2020','카드이용금액계(AMT_CORR)']
display(spst.ttest_ind(D,E))
# print('\n','='*100,'\n21년도의 마지막 값은 7월에서 끝나므로 21년도는 뺀다',sep='')
# < 특정 행 삭제 >
sobi_year.drop( sobi_year[ sobi_year['기준일자(YMD)'].str.contains('2021')].index, inplace = True  )
feature = '기준일자(YMD)'
target = '카드이용금액계(AMT_CORR)'
# sns.barplot(x='컬럼명', y='컬럼명', data=데이터프레임)
sobi_year[feature] = sobi_year[feature].astype('int')
sns.barplot(x=feature, y= target, data=sobi_year )

 

도별 카드이용금액의 관계

도별 카드이용금액 비교

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rc('font',family='Malgun Gothic')
plt.rcParams['font.family']
import scipy.stats as spst
import seaborn as sns
spend = pd.read_csv('집계구별 일별소비지역별 카드소비패턴.csv', encoding = 'CP949')
spend_area = spend.loc[:,['가맹점주소광역시도(SIDO)','카드이용금액계(AMT_CORR)']]
print('\n','='*100,'\n큰 단위로 나누기',sep='')
spend_area['가맹점주소광역시도(SIDO)'] = spend_area['가맹점주소광역시도(SIDO)'].replace({
                                        '서울':'수도권',
                                        '경기':'수도권',
                                        '인천':'수도권',
                                                                      
                                        '대전':'충청도',                              
                                        '충남':'충청도',
                                        '충북':'충청도',
                                        '세종':'충청도',
                                                                      
                                        '광주':'전라도',
                                        '전남':'전라도',
                                        '전북':'전라도',
                                                                      
                                        '부산':'경상도',
                                        '경북':'경상도',
                                        '경남':'경상도',
                                        '대구':'경상도'
                                      
                                      })
feature = '가맹점주소광역시도(SIDO)'
target = '카드이용금액계(AMT_CORR)'
plt.title('도별와 카드이용금액의 관계 < 범주 & 숫자 >')
sns.barplot(x=feature, y=target, data=spend_area)
728x90

+ Recent posts