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

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

7
"""
8

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

박예은's avatar
박예은 committed
15

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

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

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

27
28
    data_dir = os.getcwd() + "/src/data_processing/temp.csv"

29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
    # # 데이터 수집기 오류로 인해 보류
    # 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()

50
51
52
53
54
    today = datetime.date.today()
    five_m_ago = today - relativedelta(months=5)
    f_five_m_ago = "{0}-{1}-{2}".format(five_m_ago.year,
                                        five_m_ago.month, five_m_ago.day)

55
    # 사용자의 거주 지역의 실외 데이터 검색
56
    cursor.execute(
57
58
        "SELECT collected_at as \"date\", temp as temp_out, humi as humi_out, press, wind_speed "
        + "From \"Weather_Outs\" "
59
        + "WHERE loc_code = %s AND collected_at >= %s", (host["loc_code"], f_five_m_ago,)
60
61
    )

62
63
    results = cursor.fetchall()

64
    file = open(data_dir, 'w')
65
66

    # header
67
    file.write("date,temp_out,humi_out,press,wind_speed\n")
68
69

    for result in results:
70
71
        file.write("{0},{1},{2},{3},{4}\n".format(
            result[0], result[1], result[2], result[3], result[4]))
72
73

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

75
    df = pd.read_csv(data_dir)
박예은's avatar
박예은 committed
76
77
78
    date_time = pd.to_datetime(df['date'], format='%Y-%m-%d %H:%M')
    timestamp_s = date_time.map(datetime.datetime.timestamp)

79
    df = df[['temp_out', 'humi_out', 'press', 'wind_speed']]
박예은's avatar
박예은 committed
80
81
82
83
84
85
86
87
88
89
90
    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()
91
        zscore = (dataframe - mean) / std
박예은's avatar
박예은 committed
92
93
        return zscore, mean, std

94
95
96
    standard_df, mean_df, std_df = standard(df)

    return standard_df, mean_df, std_df