해당 글은 캡스톤 디자인 1장에 이어 작성됐습니다.
캡스톤디자인 프로젝트를 구성하기 위해 먼저 주기적인 회의 및 소통을 통해 팀 프로젝트의 진행방향을 잡아갔습니다. 먼저 캡스톤 디자인주제를 선정하기에 있어 상당히 많은 노력과 리서치를 진행하였습니다. 이때 저희는 서울시 실시간 도시데이터를 발견하여 이를 활용해 어떠한 서비스를 제공할 수 있을지 초점을 두기 시작하였습니다.
https://data.seoul.go.kr/SeoulRtd/list
해당 데이터의 특징은 서울 약 50개의 지역에 대해 인구 밀도와 교통 정보량, 인구 성비, 나이대 분포 등 다양한 데이터를 지속적으로 갱신하여 데이터를 주는것이 제일 큰 특징이였습니다. kaggle과 공공데이터 포털과 같이 데이터를 한번만 제공하는 것이 아닌 실제로 사용되고 있는 데이터를 바탕으로 이를 활용한 어플리케이션을 제작하는 것이 제일 큰 목표였습니다. 이를 이루고자 서울시 실시간 도시데이터 API를 활용하여 데이터를 적재를 하여 시계열 데이터를 만들기로 하였습니다.
import csv
import time
# needs "pip install xmltodict"
import xmltodict
import requests
import schedule
import boto3
import os
import datetime
s3 = boto3.client('s3', aws_access_key_id="AKIA###", aws_secret_access_key="/ZMZI7EN4###")
def find_dict(res, search):
for key, value in res.items():
if search == key:
return {key: value}
def response_maker(res):
out = {}
out.update(find_dict(res["SeoulRtd.citydata"]["CITYDATA"], "AREA_NM"))
out.update(res["SeoulRtd.citydata"]["CITYDATA"]["LIVE_PPLTN_STTS"]["LIVE_PPLTN_STTS"])
out.pop("AREA_CONGEST_MSG", None)
# out.update(res["SeoulRtd.citydata"]["CITYDATA"]["ROAD_TRAFFIC_STTS"]["AVG_ROAD_DATA"])
tmp = out["PPLTN_TIME"]
print("tmp:")
out.update({"PPLTN_TIME": tmp})
# try:
# accident_status = res["SeoulRtd.citydata"]["CITYDATA"]["ACDNT_CNTRL_STTS"]["ACDNT_CNTRL_STTS"]
# except TypeError:
# out.update({"ACDNT_CNTRL_CNT": 0})
# else:
# # # If you need the accident information, use this code (but this is not good for statistics)
# # if type(accident_status) is list:
# # out.update({"ACDNT_CNTRL_CNT": len(accident_status)})
# # for i in range(len(accident_status)):
# # tmp = dict(("ACDNT" + str(i) + "_" + key, value) for (key, value) in accident_status[i].items())
# # out.update(tmp)
# # else:
# # out.update(accident_status)
# out.update({"ACDNT_CNTRL_CNT": len(accident_status)})
# weather_status = dict_response["SeoulRtd.citydata"]["CITYDATA"]["WEATHER_STTS"]["WEATHER_STTS"]
# weather_status.pop("FCST24HOURS", None)
# out.update(weather_status)
return out
# if __name__ == "__main__":
def job():
print(("-" * 20) + "Program Start" + ("-" * 20))
start = time.time()
url_base = "http://openapi.seoul.go.kr:8088/"
url_authentication_key = "6f414b4f416a###"
url_datasource = "/xml/citydata"
url_page = "/1/5/"
url_places = ["경복궁·서촌마을", "광화문·덕수궁", "창덕궁·종묘",
"강남 MICE 관광특구", "동대문 관광특구", "명동 관광특구", "이태원 관광특구", "잠실 관광특구", "종로·청계 관광특구", "홍대 관광특구",
"가로수길", "낙산공원·이화마을", "노량진", "북촌한옥마을", "성수카페거리", "수유리 먹자골목", "쌍문동 맛집거리", "압구정로데오거리", "여의도", "영등포 타임스퀘어", "인사동·익선동", "창동 신경제 중심지", "DMC(디지털미디어시티)",
"가산디지털단지역", "강남역", "건대입구역", "고속터미널역", "교대역", "구로디지털단지역", "서울역", "선릉역", "신도림역", "신림역", "신촌·이대역", "왕십리역", "역삼역", "연신내역", "용산역"]
output_filename = time.strftime("%Y") + ".csv"
check_availability = []
for places in range(len(url_places)):
url = url_base + url_authentication_key + url_datasource + url_page + url_places[places]
print("now connecting...: " + url)
response = requests.get(url)
dict_response = xmltodict.parse(response.content)
# # to debug response file
# with open("test.json", "w", encoding="UTF-8") as file:
# file.write(str(dict_response))
if dict_response["SeoulRtd.citydata"]["RESULT"]["RESULT.CODE"] == "INFO-000":
response_output = response_maker(dict_response)
with open(output_filename, "a" , encoding="UTF-8") as file:
writer_object = csv.writer(file)
writer_object.writerow(response_output.values())
file.close()
check_availability.append(0)
else:
check_availability.append(1)
time.sleep(2)
file_path = os.path.realpath(output_filename)
file_name = output_filename
# # S3 버킷 이름과 업로드할 객체 키를 지정합니다.
bucket_name = 'mlops-api-output'
object_key = time.strftime("%Y")+"/" + file_name
# 로컬 파일을 S3에 업로드합니다.
s3.upload_file(file_path, bucket_name, object_key)
end = time.time()
print(("-" * 22) + "Program End" + ("-" * 22))
print("result: ", check_availability)
print("elapsed time: ", end - start, "sec")
# schedule.every(30).seconds.do(job)
schedule.every().hour.at(":00").do(job)
while True:
schedule.run_pending()
time.sleep(1)
서울시 공공데이터 인증키를 발급받은 후, 서울시 공공데이터 포털과 API 통신을 통해 데이터를 적재하기 시작하였습니다. 이후 데이터를 S3 bucket에 적재하기 위해 boto3를 통해, AWS에서 발급받은 access key와 secret access key를 통해 데이터를 s3 bucket에 적재하였습니다. 이때 한시간 단위로 데이터를 적재하려고 schedule module을 사용하여 50개의 지역별 데이터를 한시간 단위로 한 2달동안 데이터를 적재하였습니다. 해당 코드는 EC2에서 background file로 지정하기 위해 nohup를 사용하여 프로그램이 종료되지 않도록 하였습니다.
이러한 과정을 통해 아래의 예시 데이터를 확보 할 수 있었습니다. 아래의 데이터는 임시의 데이터일뿐 실제로 적재한 데이터는 약 10MB정도의 데이터를 확보할 수 있었습니다.
'캡스톤디자인프로젝트' 카테고리의 다른 글
캡스톤디자인 회고 및 프로젝트 정리 5장 - 마무리 - (2) | 2023.11.09 |
---|---|
캡스톤디자인 회고 및 프로젝트 정리 4장 (2) | 2023.11.09 |
캡스톤디자인 회고 및 프로젝트 정리 3장 (3) | 2023.11.09 |
캡스톤디자인 회고 및 프로젝트 정리 1장 (2) | 2023.07.31 |