{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import awswrangler as wr\n", "import pandas as pd\n", "import numpy as np\n", "import boto3\n", "# from sagemaker import get_execution_role\n", "import datetime\n", "import string\n", "import random\n", "\n", "# role = get_execution_role()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 측정치\n", "1. 총 5가지 측정치가 있음 (Temperature, Humidity, illumination, motiondetect, dooropen)\n", "2. 연구소 회의실의 측정치는 5가지 측정치가 동시에 기록되어 있는 경우가 없으므로 제외\n", "3. 2-3 회의실의 측정치에서 약 20일간 동시에 측정되어 있음 (9월초, 10월말, 11월 초)\n", "4. 2-3 회의의 측정치를 기준으로 훈련데이터 생성 진행\n", "\n", "# Temperature, Humidity, illumination preprocessing\n", "1. 기존 초 단위의 측정 시간을 1분 단위로 변경\n", "2. 동일 시간 인덱스에 여러 값이 있을 경우 Median 값을 취함\n", "3. 결측치가 있을 경우 이전 측정치중 마지막 값으로 채움 (ffill)\n", "4. 이전 측정치가 없을 경우 자신의 값으로 이전 값들을 채움 (bfill)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def preproc_common(fn, id):\n", " tmp = pd.read_csv(fn)\n", " tmp['timestamp'] = pd.to_datetime(tmp.timestamp)\n", " tmp.set_index('timestamp', inplace=True) \n", " return tmp[tmp.device_id == id].copy()\n", "\n", "def preproc_th(fn='temperature_humidity.csv', id='00158d00028d93d8'):\n", " # Temperature, Humidity preprocessing\n", " df_temp_hum = preproc_common(fn, id)\n", " df_temp_hum = df_temp_hum.resample(rule='T').median()\n", " return df_temp_hum[['device_id', 'hum', 'temp']].fillna(method='ffill').fillna(method='bfill')\n", "\n", "def preproc_il(fn='illumination.csv', id='00158d0006c9d5ed'):\n", " # illumination preprocessing\n", " df_illumination = preproc_common(fn, id)\n", " df_illumination.rename(columns={'evt':'illum'}, inplace=True)\n", " df_illumination = df_illumination.resample(rule='T').median()\n", " return df_illumination[['device_id', 'illum']].fillna(method='ffill').fillna(method='bfill')\n", "\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# motion, door preprocessing\n", "1. 기존 초 단위의 측정 시간을 1분 단위로 변경\n", "2. 동일 시간 인덱스에 여러 값이 있을 경우 count 값을 취함\n", "3. 결측치가 있을 경우 0 (zero) 값으로 채움\n", "\n", "# data merge\n", "1. 5가지 측정치를 1개의 테이블로 합침\n", "2. 한번에 5개 측정치를 concat() 할경우 time index 가 중복되기 때문에 순차적으로 1:1 concat 을 실행\n", "\n", "# data label\n", "1. 측정치와 마챦가지로 1개의 컬럼에 기록하여 측정치 테이블과 merge 함\n", "2. ~~결측치의 경우 linear interpolation 으로 복구~~\n", "3. 결측치 처리\n", " 1. 라벨의 not detected(날짜/시간 인식못함) 값은 임의로 날짜를 2000년으로 수정해 놓았음 -> 날짜 필터를 이용하여 제거\n", " 2. 제거된 부분의 값은 0 값으로 채워넣음" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def preproc_motion(fn='motion_door.csv', id='00158d0002d545b4'):\n", " # motion, door preprocessing\n", " df_motion = preproc_common(fn, id)\n", " df_motion.rename(columns={'evt':'motion'}, inplace=True)\n", " df_motion = df_motion.resample(rule='T').count()\n", " return df_motion['device_id', 'motion'].fillna(value=0)\n", " \n", "def preproc_door(fn='motion_door.csv', id='00158d0005bb96f3'):\n", " # motion, door preprocessing\n", " df_door = preproc_common(fn, id)\n", " df_door.rename(columns={'evt':'door'}, inplace=True)\n", " df_door = df_door.resample(rule='T').count()\n", " return df_door['device_id', 'door'].fillna(value=0)\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# def preproc_all():\n", " # # [온습도, 문열림, 모션, 조도] \n", " # rnd_data = {'00158d0006c9d545':'mr_temperature_humidity_0104.csv', \n", " # '00158d0005bb968a':'mr_door_0104.csv', \n", " # '00158d0002cab225':'mr_motion_0104.csv', \n", " # '00158d0005a9998b':'mr_illumination_0104.csv'}\n", " \n", " # m3_data = {'00158d00028d93d8':'m3_temperature_humidity_0104.csv', \n", " # '00158d0005bb96f3':'m3_door_0104.csv', \n", " # '00158d0002d545b4':'m3_motion_0104.csv', \n", " # '00158d0006c9d5ed':'m3_illumination_0104.csv'}\n", " # func = [preporc_il, preproc_th, preproc_motion, preproc_door]\n", " \n", "df = preproc_th('mr_temperature_humidity_0104.csv', '00158d0006c9d545')\n", "df = df.join(preproc_door('mr_door_0104.csv', '00158d0005bb968a'))\n", "df = df.join(preproc_motion('mr_motion_0104.csv', '00158d0002cab225'))\n", "df = df.join(preproc_il('mr_illumination_0104.csv', '00158d0005a9998b'))\n", "df_rnd = df.copy()\n", "df_rnd.to_csv('mr_0104.csv')\n", "\n", "df = preproc_th('m3_temperature_humidity_0104.csv', '00158d00028d93d8')\n", "df = df.join(preproc_door('m3_door_0104.csv', '00158d0005bb96f3'))\n", "df = df.join(preproc_motion('m3_motion_0104.csv', '00158d0002d545b4'))\n", "df = df.join(preproc_il('m3_illumination_0104.csv', '00158d0006c9d5ed'))\n", "df_m3 = df.copy()\n", "df_m3.to_csv('m3_0104.csv')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# # read and merge label\n", "# df_l1 = pd.read_csv('20210830_080618A.csv')\n", "# df_l2 = pd.read_csv('20211025_080015A.csv')\n", "# df_label = pd.concat([df_l1, df_l2], ignore_index=True)\n", "# df_label.rename(columns={df_label.columns[1]:'timestamp', df_label.columns[2]:'label'}, inplace=True)\n", "# df_label['timestamp'] = pd.to_datetime(df_label.timestamp)\n", "# # filtering\n", "# df_label = df_label.loc[ (df_label['timestamp'] > '2021-01-01') ]\n", "# df_label.set_index('timestamp', inplace=True)\n", "# # resampling\n", "# df_label = df_label.resample(rule='T').max()\n", "# df_label = df_label[['label']]\n", "\n", "# df_label = df_merge.join(df_label).resample(rule='T').max()\n", "# df_label_8030_0916 = df_label.loc[ '2021-08-30 08:00': '2021-09-16 18:00'].fillna(value=0)\n", "# df_label_1025_1103 = df_label.loc[ '2021-10-25 08:00': '2021-11-03 18:00'].fillna(value=0)\n", "# df_label.to_csv('df_labeled.csv')\n", "# df_label_1025_1103.to_csv('df_label_1025_1103.csv')\n", "# df_label_8030_0916.to_csv('df_label_8030_0916.csv')\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "20211103_095316A.csv\n", "20211105_193120A.csv\n", "20211109_203305A.csv\n", "20211117_003420A.csv\n", "20211124_001105A.csv\n" ] } ], "source": [ "# read and merge label\n", "# \"20211105_193120A.mp4\" 동영상 부터 Time Sink 조절 필요\n", "# time stamp 가 실제 시간보다 약 12시간 22분 빠름\n", "\n", "import glob\n", "\n", "dfs = []\n", "for elm in glob.glob('202111*.csv'):\n", " print(elm)\n", " dfs.append(pd.read_csv(elm))\n", "df_label = pd.concat(dfs, ignore_index=True)\n", "df_label.rename(columns={df_label.columns[1]:'timestamp', df_label.columns[2]:'label'}, inplace=True)\n", "df_label.to_csv('dfs.csv')" ] } ], "metadata": { "interpreter": { "hash": "5840fe83e8c616ad004d50f60875191cdadb38ef49900913886cd20b10eae981" }, "kernelspec": { "display_name": "Python 3.8.8 64-bit ('base': conda)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }