preprocessing.py 3.02 KB
Newer Older
1
"""
2
    # preprocessing.py
3

4
    데이터 전처리를 위한 파일입니다.
5
    DB에 저장된 값들을 불러와 사용자 등록 장소의 날씨 데이터와 외부 날씨 데이터를 결합해 CSV 파일을 생성합니다.
6

7
"""
8

박예은's avatar
박예은 committed
9
10
11
import pandas as pd
import datetime
import numpy as np
12
13
import os

박예은's avatar
박예은 committed
14

15
def preprocess(cursor, host):
16
17
18
19
20
21
    """
        ### preprocess(cursor, host)

        - cursor : psycopg2의 SQL 실행을 위한 cursor.
        - host : 사용자 정보.

22
23
        사용자 정보를 바탕으로 외부 날씨와 내부 날씨를 검색해 CSV 파일로 작성합니다.
        CSV 파일 생성 후 pandas를 이용해 dataframe으로 만든 뒤, 정규화를 진행합니다.
24
25
    """

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
    # # 데이터 수집기 오류로 인해 보류
    # cursor.execute(
    #     "SELECT t2.collected_at as \"date\", temp_out, humi_out, press, wind_speed, temp_in, humi_in, lights FROM"
    #     + " (SELECT collected_at, temp as temp_out, humi as humi_out,press, wind_speed FROM Weather_Outs WHERE loc_code = %s) t1"
    #     + " JOIN "
    #     + " (SELECT collected_at, temp as temp_in, humi as humi_in, lights FROM Weather_Ins WHERE host = %s) t2"
    #     + " ON t1.collected_at = t2.collected_at", (host["loc_code"], host["email"],))

    # results = cursor.fetchall()

    # file = open("/src/dataprocessing/temp.csv", 'w')

    # # header
    # file.write("date,temp_out,humi_out,press,wind_speed,temp_in,humi_in,lights\n")

    # for result in results:
    #     file.write("{0},{1},{2},{3},{4},{5},{6},{7}\n".format(
    #         result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7]))

    # file.close()

    # 사용자의 거주 지역의 실외 데이터 검색
48
    cursor.execute(
49
50
51
52
53
        "SELECT collected_at as \"date\", temp as temp_out, humi as humi_out, press, wind_speed "
        + "From \"Weather_Outs\" "
        + "WHERE loc_code = %s", (host["loc_code"],)
    )

54
55
    results = cursor.fetchall()

56
    file = open(os.getcwd() + "/src/data_processing/temp.csv", 'w')
57
58

    # header
59
    file.write("date,temp_out,humi_out,press,wind_speed\n")
60
61

    for result in results:
62
63
        file.write("{0},{1},{2},{3},{4}\n".format(
            result[0], result[1], result[2], result[3], result[4]))
64
65

    file.close()
박예은's avatar
박예은 committed
66

67
    df = pd.read_csv(os.getcwd() + "/src/data_processing/temp.csv")
박예은's avatar
박예은 committed
68
69
70
    date_time = pd.to_datetime(df['date'], format='%Y-%m-%d %H:%M')
    timestamp_s = date_time.map(datetime.datetime.timestamp)

71
    df = df[['temp_out', 'humi_out', 'press', 'wind_speed']]
박예은's avatar
박예은 committed
72
73
74
75
76
77
78
79
80
81
82
    day = 24*60*60
    year = (365.2425)*day

    df['Day sin'] = np.sin(timestamp_s * (2 * np.pi / day))
    df['Day cos'] = np.cos(timestamp_s * (2 * np.pi / day))
    df['Year sin'] = np.sin(timestamp_s * (2 * np.pi / year))
    df['Year cos'] = np.cos(timestamp_s * (2 * np.pi / year))

    def standard(dataframe):
        mean = dataframe.mean()
        std = dataframe.std()
83
        zscore = (dataframe - mean) / std
박예은's avatar
박예은 committed
84
85
        return zscore, mean, std

86
87
88
    standard_df, mean_df, std_df = standard(df)

    return standard_df, mean_df, std_df