- [ Project ] 2021 Weather Tour Application ์ค๋ ์ฌํํ๊ธฐ ๋ฑ ์ข์ ๊ตญ๋ด ๊ด๊ด์ง ์ถ์ฒ ์ฑ ๋ง๋ค๊ธฐ
- โก๏ธ ย ํ๋ก์ ํธ๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ฉฐ..
- ์ด๋ฏธ์ง ๋ฐ ์๋ฃ ์ถ์ฒ
[ Project ] 2021 Weather Tour Application ์ค๋ ์ฌํํ๊ธฐ ๋ฑ ์ข์ ๊ตญ๋ด ๊ด๊ด์ง ์ถ์ฒ ์ฑ ๋ง๋ค๊ธฐ
Project
2021-1 ์ ๊ณต์ฌํํ๋ก์ ํธ
๐ฟ Background
(2021 4์ ๊ธฐ์ค) COVID 19๋ก ์ธํด ๊ตญ๋ด ์ฌํ์ ๋ ๋๋ ค๋ ์ฌ๋์ด ๋์ด๋๊ณ ์๋ค. ์์ ๊ทธ๋ฆผ์ ํ๊ตญ๋ฌธํ๊ด๊ด์ฐ๊ตฌ์์์ ์ค์ํ 2020๋ 2~4์์ ๋ํ ์๋ต๊ณผ 2021๋ 1~3์์ ์๋ต์ ๋ํ ํต๊ณ์๋ฃ๋ก, ์ฝ๋ก๋19 ์ดํ 2021 1๋ถ๊ธฐ์ ๊ตญ๋ด์ฌํ ๋น์จ์ด 51.8%๋ก ์ฆ๊ฐํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋๋ถ๋ถ์ ์ฌ๋๋ค์ ํ์ ๋๋ ์ง์ฅ์ธ์ ์ ๋ถ์ผ๋ก ์๊ฐ/๊ณต๊ฐ ์์์ ์์ ๋กญ์ง ๋ชปํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด๋ค์ ์ฌํ์ ๋ ๋ ์ ์๋ ๋ ์ด ํ์ ์ ์ด๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๊ตญ๋ด ๊ด๊ด์ง์ ๋ ์จ๋ฅผ ๋ฏธ๋ฆฌ ์์๋ด์ด ์ํ๋ ๋ ์ง์ ๊ฐ์ฅ ์ฌํํ๊ธฐ ์๋ง์ ๊ด๊ด์ง๋ฅผ ์ถ์ฒํด์ฃผ๋ ์ฑ์ ๊ตฌ์ํ์๋ค.
๐ About Project
- ๊ธฐ๊ฐ : 2021.04.26 ~ 2021.06.11
- ์ ๊ณต์ฌํ๊ณต๋์ฒด๋ฅผ ์ด๋ฃจ์ด ์ ๊ณต์์ ๋ฐฐ์ด ์ง์์ ์ฌํํ์ฌ ํ๋ก์ ํธ ์งํ
- ์ ๊ณต์ฌํ๊ณต๋์ฒด : ์ ๊ณต ๊ด๋ จ ๊ต๋ด์ธ ๊ณต๋ชจ์ ๋ฐ ๋ํ ์ค๋น, ์ ๊ณต ๊ด๋ จ ์๊ฒฉ์ฆ ์ทจ๋, ์ ๊ณต ์ง์ ์ค๋ฌด ์ฐ๊ตฌ ๋ฐ ๊ฐ๋ฐ, ์๋ ผ๋ฌธ ์์ฑ ๋ฑ์ ์ํ ๋์ผ ์ ๊ณต์์ผ๋ก ๊ตฌ์ฑ๋ ํ์ต๊ณต๋์ฒด
์ ํ ์ ๊ณต๊ณผ๋ชฉ
๐ค ๋จธ์ ๋ฌ๋ (๊ต๊ณผ๋ชฉ : ๊ธฐ๊ณํ์ต) + ๐ก Socket programming (๊ต๊ณผ๋ชฉ : ์ปดํจํฐ ๋คํธ์ํฌ)
๋ฐ์ดํฐ์
-
๊ธฐ์์ฒญ ์ง์(์ข ๊ด, ASOS) ๋ฐ์ดํฐ
-
๊ณต๊ณต๋ฐ์ดํฐ ๊ธฐ์์ ๋ณด API (๊ธฐ์จ, ํ์, ํ๋์ํ, ์ต๋, ๊ฐ์ํ๋ฅ )
- ๊ด๊ด์ฝ์ค๋ณ ๊ด๊ด์ง ์์ธ ๋ ์จ ์กฐํ์๋น์ค
โก๏ธ ๊ณ์ ๋ง๋ค ์กฐ๊ฑด ์ธ๋ถํ ํ ์ ์ ์ฑ ์
๐ ํ๋ก์ ํธ ๊ฒฐ๊ณผ
์ต์ฐ์์
๋งก์ ์ญํ
- ์ธ๊ณต์ง๋ฅ ์ฝ๋
- ํ์ด์ฌ ์์ผ ํต์
- ์๋๋ก์ด๋ ์คํ๋์ค ์ฝ๋ ๊ตฌํ
๐ Reference
Q-learning์ ๊ตฌํํ ๋๋ Open Source๋ฅผ ์ด์ฉํ์๋ค.
๐ง ๊ฐ๋
์ค๋ช
๐ป ๊ตฌํ ย ย Implementation
1. ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
import io
import pandas as pd
data_spring = pd.read_csv('spring.csv',encoding='CP949')
data_summer = pd.read_csv('summer.csv',encoding='CP949')
data_fall = pd.read_csv('fall.csv',encoding='CP949')
data_winter = pd.read_csv('winter.csv',encoding='CP949')
2. ๊ฒฐ์ธก์น ์ ๊ฑฐ
df_spring = df_spring.fillna(0)
df_summer = df_summer.fillna(0)
df_fall = df_fall.fillna(0)
df_winter = df_winter.fillna(0)
df_spring_test = df_spring_test.fillna(0)
df_sp=df_spring.drop(['์ง์ ','์ผ์'],axis=1)
df_su=df_summer.drop(['์ง์ ','์ผ์'],axis=1)
df_fa=df_fall.drop(['์ง์ ','์ผ์'],axis=1)
df_wi=df_winter.drop(['์ง์ ','์ผ์'],axis=1)
df_spring_test=df_spring_test.drop(['์ง์ ','์ผ์'],axis=1)
train_spring = df_sp.drop('์ง์ ๋ช
', axis=1)
train_summer = df_su.drop('์ง์ ๋ช
', axis=1)
train_fall = df_fa.drop('์ง์ ๋ช
', axis=1)
train_winter = df_wi.drop('์ง์ ๋ช
', axis=1)
test_spring = df_spring_test.drop('์ง์ ๋ช
',axis=1)
3. ๊ณ์ ๋ณ ๊ธฐ์ ๊ด์ธก ๋ฐ์ดํฐ์ ๋ฐ๋ผ ์ ์ ๋งค๊ธฐ๊ธฐ
๋ชจ๋ ๊ณ์ ์ ๋ํด ๊ฐ์, ํ๊ท ๊ธฐ์จ, ์๋์ต๋, ํ๊ท ํ์๋ฅผ ๊ณ ๋ คํ์ฌ ์ ์๋ฅผ ๋งค๊ฒจ์ฃผ์๋ค. ์ด ๊ด์ธก์น๋ค์ ๊ณ์ ๋ง๋ค ์์ดํ๊ฒ ๋ํ๋๋ฏ๋ก ๊ณ์ ๋ณ๋ก ํ๊ท ๊ธฐ์จ์ ๊ตฌํ๊ณ ์ธ์ถํ๊ธฐ ์ข์ ๊ธฐ์ ์ ๋ณด๋ฅผ ๊ฐ๊ฐ ๊ตฌํด์ ๊ธฐ์ค์ ์ ํด์ฃผ์๋ค.
4. ๋ชจ๋ธ ํ์ต ๋ฐ ์ฑ๋ฅ ๋น๊ต
์ด๋ ๊ฒ ์ ์๋ฅผ ๋งค๊ฒจ์ค ๋ฐ์ดํฐ๋ฅผ ํตํฉํด์ 7:3์ ๋น์จ๋ก ๋ชจ๋ธ์ ํ์ตํ ํ์ต๋ฐ์ดํฐ์ ํ๊ฐ ๋ฐ์ดํฐ๋ก ๋๋์ด์ฃผ์๋ค.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(train_spring, y_label_spring, test_size=0.3, random_state=42)
์ด๋ sklearn์ KNeighbors, SVM, Random Forest ๋ชจ๋ธ๋ก ํ์ตํด๋ณด๊ณ R2 score์ ๊ธฐ์ค์ผ๋ก ์ฑ๋ฅ์ ๋น๊ตํ์๋ค.
ย | KNeighbors | SVM | Forest |
---|---|---|---|
R2 score | 0.6986 | 0.6318 | 0.9558 |
โ Random Forest Regressor๊ฐ ๊ฐ์ฅ ์ฑ๋ฅ์ด ๋์
5. ์์ผ ํ๋ก๊ทธ๋๋ฐ
์๋ ํ๋ก์ ํธ์ ์ด๊ธฐ ๋ชฉํ๋ 4๋ฒ๊น์ง์๋ค. ํ์๋ค๊ณผ ํจ๊ป ์ฐ๋ฆฌ ์ํ์ ๋์์ด ๋ ์ ์๋ ์ฃผ์ ๋ฅผ ๊ณจ๋ผ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ์ ์ฒ๋ฆฌ ํ, ๊ทธ๊ฒ์ ์ฑ๊ณต์ ์ผ๋ก ์์ธกํด์ ๊ด๊ด์ง๋ฅผ ์ถ์ฒํด์ฃผ๋ ๊ฒ๊น์ง๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์งํ์ด ๋๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ๋ฉ์ถ์ง ์๊ณ ํ ๋ฒ ๋ ์๊ฐํ๊ธฐ๋ก ํ์๋ค.
ํด๋น ํ๊ธฐ์ ์ปดํจํฐ ๋คํธ์ํฌ ๊ณผ๋ชฉ์์ Socket Programming์ ๊ฐ๋ ์ ๋ฐฐ์ ๋ค. ๋ ๋ฐฑ์๋๋ฅผ ๋ฐฐ์๋ณธ ์ ์ ์์ง๋ง ํด๋น ํต์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ฑ์ผ๋ก ๋ํ๋ผ ์ ์์ ๊ฒ์ด๋ผ ์๊ฐํ๊ณ , ์ด๋ฅผ ๊ตฌํํด๋ด์๋ค.
์๋์ ์ผ๋ถ ์ฝ๋๋ฅผ ์ฌ๋ ค๋๊ฒ ๋ค.
[ Server ]
from socket import *
from datetime import datetime, timedelta
import numpy as np
HOST = ""
PORT = 12000
s = socket(AF_INET, SOCK_STREAM)
print ('Socket created')
s.bind((HOST, PORT))
print ('Socket bind complete')
s.listen(1)
print ('Socket now listening')
#์ ์ ์น์ธ
conn, addr = s.accept()
print("Connected by ", addr)
#๋ฐ์ดํฐ ์์
rc = conn.recv(1024)
rc = rc.decode("utf8").strip()
if not rc: break
print("Received: " + rc)
date=rc[0:8]
time=rc[8:]
print('date:',date)
print('time:',time)
#ํ์ฌ ๋ ์ง ์ ๋ณด
time1 = datetime.now()
#์ํ๋ ๋ ์ง ์ ๋ณด
want_day_s = datetime(int(rc[0:4]),int(rc[4:6]),int(rc[6:8]),int(rc[8:10]),0,0)
# ์ค๋๊ณผ ์ํ๋ ๋ ์ง์ ์ฐจ์ด
# 2๋ฉด ๋ชจ๋ , 1์ด๋ฉด ๋ด์ผ, 0์ด๋ฉด ์ค๋ ๋ ์จ ์ ํํ ๊ฒ
interval = (want_day_s - time1).days
#๋ชจ๋ ๋ฅผ ์ ํํ๋๋ฐ ํ์ฌ ์๊ฐ์ด ์๋ฒฝ ์ฌ์ฏ์ ์ ์ด๋ฉด ์ค๋ฅ ๋ฉ์์ง ๋ณด๋ด๊ธฐ
if(interval == 2) and (int(time1[12:14]) <= int(6)):
res = "์๋ฒฝ 6์ ์ดํ ๋ชจ๋ ๋ ์จ ์ ๋ณด๊ฐ ์
๋ฐ์ดํธ ๋ฉ๋๋ค!"
conn.sendall(res.encode("utf-8"))
conn.close()
s.close()
exit()
#์ค๋, ๋ด์ผ, ๋ชจ๋ ์ด์ธ์ ์ ํ์ ํ์ ์ ์ค๋ฅ ๋ฉ์์ง ๋ณด๋ด๊ธฐ
if(interval != 1) and (interval != 0) and (interval != 2):
res = "์ค๋, ๋ด์ผ, ๋ชจ๋ ์ ์๋ณด๋ง์ ์ง์ํฉ๋๋ค!"
conn.sendall(res.encode("utf-8"))
conn.close()
s.close()
exit()
#ํ๋ฃจ ์ ๋ ๋ ์ง ์ ๋ณด ๋ฐ๊ธฐ
pre_day_s = want_day_s + timedelta(days=-1)
pre_day_s=str(pre_day_s)
pre_day_s=pre_day_s[:11]
pre_day_s=pre_day_s.replace('-','')
want_day_s=str(want_day_s)
#์ํ๋ pre_day์ ํํ๋ก ๋ณํ
pre_day = pre_day_s + "00"
print('pre_day_s',pre_day_s)
#์ํ๋ want_day ํํ๋ก ๋ณํ
want_day = want_day_s[:16]
print('want_day', want_day)
๋ค์์ ๊ธฐ์์๋ฃ๊ฐ๋ฐฉํฌํธ์์ Open API๋ฅผ ์ฌ์ฉํ์ฌ
import pandas as pd
from pandas import json_normalize
import json
import requests
from bs4 import BeautifulSoup
url = 'http://apis.data.go.kr/1360000/TourStnInfoService/getTourStnVilageFcst'
x_test = pd.DataFrame(columns=['tm','spotName','th3','wd','ws','sky','rhm','pop'])
๋ฐ๊ธ๋ฐ์ API ํค๋ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋ณํํ์ฌ ์ ๋ก๋ํ์๋ค.
for ID in range(1,439):
No = [29, 248, 249, 250]
if ID in No:
continue
course_id = str(ID)
queryString = "?" + \
"ServiceKey=" + "0000000000000000" + \
"&pageNo=" + "1"+ \
"&numOfRows=" + "140" + \
"&dataType=" + "JSON" + \
"&CURRENT_DATE=" + pre_day + \
"&HOUR=" + "24" + \
"&COURSE_ID=" + course_id
queryURL = url + queryString
response = requests.get(queryURL)
r_dict = json.loads(response.content)
data = json_normalize(r_dict['response']['body']['items']['item'])
li = ['tm','spotName','th3','wd','ws','sky','rhm','pop']
#tm : ์ ํํ ์๊ฐ์ผ๋ก ๋ถํฐ 3์๊ฐ ๊ธฐ์จ (์ : 09๋ฉด 09-12)
#wd : ํํฅ
#ws : ํ์
#sky: ํ๋ ์ํ
# 1: ๋ง์, 2: ๊ตฌ๋ฆ ์กฐ๊ธ, 3: ๊ตฌ๋ฆ๋ง์ด, 4:ํ๋ฆผ, 5: ๋น, 6:๋น๋, 7:๋๋น, 8:๋
#rhm: ์ต๋
#pop: ๊ฐ์ํ๋ฅ
#ํ์ํ column๋ง data์ ์ ์ฅ
data = data.loc[:,li]
#์ค์ ์คํ ์ ๋
์๊ฐ์ ํ์ ๋ง๋ ๋ฐ์ดํฐ๋ง ์ถ์ถ
List = []
for i in range(0,len(data['tm'])):
if want_day not in data.loc[i,'tm']:
List.append(i)
data = data.drop(List,axis = 0)
x_test = x_test.append(data,ignore_index=True)
x_test = x_test.drop_duplicates(['spotName'], keep='first')
[ Client ]
์ด์ ๋ฉํ์ ์๋ ์ฝ๋๋ ์ถํ ์์ฑํ์ฌ ์ ๋ก๋ํ๋๋ก ํ๊ฒ ๋ค.
์ต์ข ๊ฒฐ๊ณผ๋ฌผ
โก๏ธ ย ํ๋ก์ ํธ๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ฉฐ..
ํด๋น ํ๋ก์ ํธ๋ ๊ธฐ๊ณํ์ต๊ณผ ์ปดํจํฐ๋คํธ์ํฌ ์์ ์ ์๊ฐํ๋ฉด์ ํ์๋ค๊ณผ ์ค์ค๋ก ์ฌํํด๋ณธ ํ๋ก์ ํธ์๊ธฐ ๋๋ฌธ์ ๋ ์๋ฏธ๊ฐ ์๋ ๊ฒ ๊ฐ๋ค.
์ด๋ฏธ์ง ๋ฐ ์๋ฃ ์ถ์ฒ
[์ค์๊ฐ ์ ๊ตญ ๋ ์จ] ์คํ 5์ ํ์ฌ ๋์ฒด๋ก ํ๋ฆฌ๊ณ ๊ณณ์ ๋ฐ๋ผ ๋น
Related Posts
๐ You need to log in to GitHub to write comments. ๐
If you can't see comments, please refresh page(F5).