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

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

parent 2fd418a2
......@@ -14,7 +14,7 @@
| Auth | POST | /login | 로그인 요청 |
| Auth | POST | /:id/edit-profile | 회원 정보 수정 요청 |
---
<br><br>
## API 명세 기록
......
......@@ -162,3 +162,9 @@ EUE가 제일 중요하게 수행해야할 부분입니다. 데이터에 대해
5. 가공된 데이터들을 바탕으로 학습률이 0.05이며, 비용 함수는 평균제곱 오차(MSE)인 선형회귀 분석을 진행합니다.<br><br>
6. 선형 회귀 분석이 후 생긴 가중치와 편향을 **analysis_parameters.csv**로 저장합니다.<br><br>
# 4. Prediction
사용자 화면에 현재까지의 기록과 함께 단위 시간 뒤의 온도 예측 결과를 보이는 것을 목표로 합니다.
---- 진행중 입니다. ----
......@@ -128,8 +128,7 @@ const storeData = (type, time, loc, fdir, data) => {
// 외부 수집기로 부터 들어온 정보 처리
const handleOutData = async (locCode, lat, lng) => {
// OpenWeatherAPI로 부터 지역의 날씨 정보획득
// 지역의 경도와 위도, API KEy, 단위 기준 metric 전달
// OpenWeatherAPI로 부터 지역의 날씨 정보획득을 위해 지역의 경도와 위도, API Key, 단위 기준 metric 전달
const response = await fetch(
`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) => {
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
from os import getcwd, path, makedirs
import sys
import pymysql
import numpy as np
from preprocessing import preprocessingData
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
import numpy as np
def loadRawData(link, file_name):
def makeTimeDIR():
'''
### CSV 파일의 내용을 반환하는 함수
- 제공 받은 링크를 통해 파일을 읽고 반환합니다.
### 날짜를 이용한 경로를 생생하는 함수
- 오늘 날짜를 이용한 경로와 어제 날짜를 이용한 경로를 생성합니다.
- 생성된 경로는 dictionary 형태로 반환합니다.
'''
raw_data = []
# 오늘 날짜로 된 경로 생성
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)
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)
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) + "/" + \
str(yesterday.year) + str(yMonth) + "/" + \
str(yesterday.year) + str(yMonth) + str(yDay)
yesterday_dir = "/" + yYear + "/" + yYear + yMonth + "/" + yYear + yMonth + 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):
print("File doesn't exist on {0}".format(file_dir))
......@@ -112,7 +133,7 @@ def handleOutRawData(out_data):
return out_dict
def handleParameters(raw_w):
def handleLearningParams(raw_w=None):
'''
### Weights & Bias를 처리하는 함수
- raw 데이터는 weights와 bias가 합쳐진 상태입니다.
......@@ -133,6 +154,27 @@ def handleParameters(raw_w):
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):
'''
### 분리된 입력 데이터를 합치는 함수
......@@ -228,13 +270,14 @@ def preprocessingData(user_link, out_link):
5. 데이터 넘파이 형식 배열로 변환
6. 반환
'''
raw_user_data = loadRawData(user_link, "/weather.csv")
raw_out_data = loadRawData(out_link, "/weather.csv")
raw_parameters = loadRawData(user_link, "/analysis_parameters.csv")
raw_user_data = loadRawData(user_link, "yesterday", "/weather.csv")
raw_out_data = loadRawData(out_link, "yesterday", "/weather.csv")
raw_parameters = loadRawData(
user_link, "yesterday", "/analysis_parameters.csv")
user_x, train_t = handleUserRawData(raw_user_data)
out_dict = handleOutRawData(raw_out_data)
weights, bias = handleParameters(raw_parameters)
weights, bias = handleLearningParams(raw_parameters)
train_x = combineXdata(user_x, out_dict)
......
import routes from "./routes";
/*
# localmiddleware
1. Pug Template에서 routes.js에 선언된 경로들을 사용하기 위함.
*/
export const localmiddleware = (req, res, next) => {
res.locals.routes = routes;
next();
};
/*
# onlyPrivate
- 인증된 사용자만 사용할 수 있는 데이터에 접근하기 위한 중간 과정.
- Front-end 개발과 함께 진행 예정
*/
export const onlyPrivate = (req, res, next) => {
next();
};
import express from "express";
import routes from "../routes";
import { getDataInput } from "../controllers/dataController";
import { getDataInput, getUserData } from "../controllers/dataController";
import { onlyPrivate } from "../middlewares";
const dataRouter = express.Router();
dataRouter.get(routes.dataInput, getDataInput);
dataRouter.get(routes.dataUser, onlyPrivate, getUserData);
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