Commit 09749db2 authored by KangMin An's avatar KangMin An
Browse files

Create & Update : 온도 예측 과정을 위한 생성 및 갱신 1차.

parent 2fd418a2
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
| Auth | POST | /login | 로그인 요청 | | Auth | POST | /login | 로그인 요청 |
| Auth | POST | /:id/edit-profile | 회원 정보 수정 요청 | | Auth | POST | /:id/edit-profile | 회원 정보 수정 요청 |
--- <br><br>
## API 명세 기록 ## API 명세 기록
......
...@@ -162,3 +162,9 @@ EUE가 제일 중요하게 수행해야할 부분입니다. 데이터에 대해 ...@@ -162,3 +162,9 @@ EUE가 제일 중요하게 수행해야할 부분입니다. 데이터에 대해
5. 가공된 데이터들을 바탕으로 학습률이 0.05이며, 비용 함수는 평균제곱 오차(MSE)인 선형회귀 분석을 진행합니다.<br><br> 5. 가공된 데이터들을 바탕으로 학습률이 0.05이며, 비용 함수는 평균제곱 오차(MSE)인 선형회귀 분석을 진행합니다.<br><br>
6. 선형 회귀 분석이 후 생긴 가중치와 편향을 **analysis_parameters.csv**로 저장합니다.<br><br> 6. 선형 회귀 분석이 후 생긴 가중치와 편향을 **analysis_parameters.csv**로 저장합니다.<br><br>
# 4. Prediction
사용자 화면에 현재까지의 기록과 함께 단위 시간 뒤의 온도 예측 결과를 보이는 것을 목표로 합니다.
---- 진행중 입니다. ----
...@@ -128,8 +128,7 @@ const storeData = (type, time, loc, fdir, data) => { ...@@ -128,8 +128,7 @@ const storeData = (type, time, loc, fdir, data) => {
// 외부 수집기로 부터 들어온 정보 처리 // 외부 수집기로 부터 들어온 정보 처리
const handleOutData = async (locCode, lat, lng) => { const handleOutData = async (locCode, lat, lng) => {
// OpenWeatherAPI로 부터 지역의 날씨 정보획득 // OpenWeatherAPI로 부터 지역의 날씨 정보획득을 위해 지역의 경도와 위도, API Key, 단위 기준 metric 전달
// 지역의 경도와 위도, API KEy, 단위 기준 metric 전달
const response = await fetch( const response = await fetch(
`https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lng}&appid=${process.env.OPENWEATHERMAP_API_KEY}&units=metric` `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lng}&appid=${process.env.OPENWEATHERMAP_API_KEY}&units=metric`
); );
...@@ -187,3 +186,12 @@ export const getDataInput = (req, res) => { ...@@ -187,3 +186,12 @@ export const getDataInput = (req, res) => {
res.status(statusCode.err).send(serverMSG.server_err); res.status(statusCode.err).send(serverMSG.server_err);
} }
}; };
// 사용자의 데이터 가져오기 및 예측 값 전송
export const getUserData = (req, res) => {
const {
params: { id },
} = req;
res.status(statusCode.ok).send(serverMSG.server_ok);
};
...@@ -9,7 +9,6 @@ import datetime ...@@ -9,7 +9,6 @@ import datetime
from os import getcwd, path, makedirs from os import getcwd, path, makedirs
import sys import sys
import pymysql import pymysql
import numpy as np
from preprocessing import preprocessingData from preprocessing import preprocessingData
from linear_regression import LinearRegression from linear_regression import LinearRegression
......
'''
# predict.py의 역할
- 마지막으로 입력된 데이터 가져오기
- 최근 데이터들을 통해 단위 시간 후의 기온 예측
#### 수정 사항(5/29)
1. loadRawData에서 time_dir을 생성하는 부분을 오늘 날짜 경로와 어제 날짜 경로로 구분합니다.
2. data의 경로를 보내며, 오늘 날짜인지 어제 날짜인지를 결정합니다.
3. csv 파일을 읽어 온 뒤의 후처리 함수를 생성합니다.
'''
import numpy as np
import pymysql
import sys
from preprocessing import combineXdata, handleLearningParams, handleOutRawData, handleStatsParams, handleUserRawData, loadRawData
# DB를 이용하기 위한 정보
dbconfig = {"host": sys.argv[1], "user": sys.argv[2],
"password": sys.argv[3], "database": sys.argv[4]}
# 사용자 ID
user_name = sys.argv[5]
# DB Connect
eue_db = pymysql.connect(
user=dbconfig["user"], password=dbconfig["password"], host=dbconfig["host"], db=dbconfig["database"], charset="utf8")
cursor = eue_db.cursor(pymysql.cursors.DictCursor)
# Get User and Outside data directory
query = "SELECT DATALINK FROM USER WHERE ID='{0}';".format(user_name)
cursor.execute(query)
result = cursor.fetchall()
user_link = result[0]["DATALINK"]
link_ls = user_link.split("/")
outside_link = ('/').join(link_ls[:-2]) + "/Outside"
# File names.
weather_data_file = "weather.csv"
analy_params_file = "analysis_parameters.csv"
predict_params_file = "prediction_parameters.csv"
# Get parameters and Data.
weather_out, weatehr_user = [], []
# - Get weights and bias.
raw_wb_data = loadRawData(user_link, "today", analy_params_file)
weights, bias = handleLearningParams(raw_wb_data)
# - Get mean and standard deviation.
raw_ms_data = loadRawData(user_link, "today", predict_params_file)
mean, std, temp_mean, temp_std = handleStatsParams(raw_ms_data)
# - Get weather data and modify.
raw_weather_out = loadRawData(outside_link, "today", weather_data_file)
raw_weather_user = loadRawData(user_link, "today", weather_data_file)
out_dict = handleOutRawData(raw_weather_out)
user_x, _ = handleUserRawData(raw_weather_user)
input_data = combineXdata(user_x, out_dict)
input_data = input_data[-1]
# Pedict
pass
...@@ -10,24 +10,45 @@ import csv ...@@ -10,24 +10,45 @@ import csv
import numpy as np import numpy as np
def loadRawData(link, file_name): def makeTimeDIR():
''' '''
### CSV 파일의 내용을 반환하는 함수 ### 날짜를 이용한 경로를 생생하는 함수
- 제공 받은 링크를 통해 파일을 읽고 반환합니다. - 오늘 날짜를 이용한 경로와 어제 날짜를 이용한 경로를 생성합니다.
- 생성된 경로는 dictionary 형태로 반환합니다.
''' '''
raw_data = [] # 오늘 날짜로 된 경로 생성
today = datetime.datetime.today() today = datetime.datetime.today()
tYear = str(today.year)
tMonth = str(today.month) if today.month >= 10 else '0' + str(today.month)
tDay = str(today.day) if today.day >= 10 else '0' + str(today.day)
today_dir = '/' + tYear + '/' + tYear + tMonth + '/' + tYear + tMonth + tDay
# 오늘을 기준 하루 전 날짜로 된 경로 생성
yesterday = today - datetime.timedelta(days=1) yesterday = today - datetime.timedelta(days=1)
yMonth = yesterday.month if yesterday.month >= 10 else "0" + \ yYear = str(yesterday.year)
yMonth = str(yesterday.month) if yesterday.month >= 10 else "0" + \
str(yesterday.month) str(yesterday.month)
yDay = yesterday.day if yesterday.day >= 10 else "0"+str(yesterday.day) yDay = str(yesterday.day) if yesterday.day >= 10 else "0" + \
str(yesterday.day)
time_dir = "/" + str(yesterday.year) + "/" + \ yesterday_dir = "/" + yYear + "/" + yYear + yMonth + "/" + yYear + yMonth + yDay
str(yesterday.year) + str(yMonth) + "/" + \
str(yesterday.year) + str(yMonth) + str(yDay) time_dir = {"today": today_dir, "yesterday": yesterday_dir}
return time_dir
def loadRawData(link, time_domain, file_name):
'''
### CSV 파일의 내용을 반환하는 함수
- 제공 받은 링크를 통해 파일을 읽고 반환합니다.
'''
raw_data = []
time_dir = makeTimeDIR()
file_dir = os.getcwd() + link + time_dir + file_name file_dir = os.getcwd() + link + time_dir[time_domain] + file_name
if not os.path.isfile(file_dir): if not os.path.isfile(file_dir):
print("File doesn't exist on {0}".format(file_dir)) print("File doesn't exist on {0}".format(file_dir))
...@@ -112,7 +133,7 @@ def handleOutRawData(out_data): ...@@ -112,7 +133,7 @@ def handleOutRawData(out_data):
return out_dict return out_dict
def handleParameters(raw_w): def handleLearningParams(raw_w=None):
''' '''
### Weights & Bias를 처리하는 함수 ### Weights & Bias를 처리하는 함수
- raw 데이터는 weights와 bias가 합쳐진 상태입니다. - raw 데이터는 weights와 bias가 합쳐진 상태입니다.
...@@ -133,6 +154,27 @@ def handleParameters(raw_w): ...@@ -133,6 +154,27 @@ def handleParameters(raw_w):
return weights, bias return weights, bias
def handleStatsParams(raw_ms=None):
'''
### 평균과 표준편차를 다루는 함수
- csv 파일로 부터 읽어온 자료를 전체 범주의 평균, 표준편차 그리고 내부 온도에 대한 평균, 표준편차로 나누는 함수 입니다.
'''
mean, std = [], []
raw_mean = raw_ms[0]
raw_std = raw_ms[1]
for fig in raw_mean:
mean.append(float(fig))
for fig in raw_std:
std.append(float(fig))
temp_mean = mean[7]
temp_std = std[7]
return mean, std, temp_mean, temp_std
def combineXdata(user_x, out_dict): def combineXdata(user_x, out_dict):
''' '''
### 분리된 입력 데이터를 합치는 함수 ### 분리된 입력 데이터를 합치는 함수
...@@ -228,13 +270,14 @@ def preprocessingData(user_link, out_link): ...@@ -228,13 +270,14 @@ def preprocessingData(user_link, out_link):
5. 데이터 넘파이 형식 배열로 변환 5. 데이터 넘파이 형식 배열로 변환
6. 반환 6. 반환
''' '''
raw_user_data = loadRawData(user_link, "/weather.csv") raw_user_data = loadRawData(user_link, "yesterday", "/weather.csv")
raw_out_data = loadRawData(out_link, "/weather.csv") raw_out_data = loadRawData(out_link, "yesterday", "/weather.csv")
raw_parameters = loadRawData(user_link, "/analysis_parameters.csv") raw_parameters = loadRawData(
user_link, "yesterday", "/analysis_parameters.csv")
user_x, train_t = handleUserRawData(raw_user_data) user_x, train_t = handleUserRawData(raw_user_data)
out_dict = handleOutRawData(raw_out_data) out_dict = handleOutRawData(raw_out_data)
weights, bias = handleParameters(raw_parameters) weights, bias = handleLearningParams(raw_parameters)
train_x = combineXdata(user_x, out_dict) train_x = combineXdata(user_x, out_dict)
......
import routes from "./routes"; import routes from "./routes";
/*
# localmiddleware
1. Pug Template에서 routes.js에 선언된 경로들을 사용하기 위함.
*/
export const localmiddleware = (req, res, next) => { export const localmiddleware = (req, res, next) => {
res.locals.routes = routes; res.locals.routes = routes;
next(); next();
}; };
/*
# onlyPrivate
- 인증된 사용자만 사용할 수 있는 데이터에 접근하기 위한 중간 과정.
- Front-end 개발과 함께 진행 예정
*/
export const onlyPrivate = (req, res, next) => {
next();
};
import express from "express"; import express from "express";
import routes from "../routes"; import routes from "../routes";
import { getDataInput } from "../controllers/dataController"; import { getDataInput, getUserData } from "../controllers/dataController";
import { onlyPrivate } from "../middlewares";
const dataRouter = express.Router(); const dataRouter = express.Router();
dataRouter.get(routes.dataInput, getDataInput); dataRouter.get(routes.dataInput, getDataInput);
dataRouter.get(routes.dataUser, onlyPrivate, getUserData);
export default dataRouter; export default dataRouter;
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment