신호생성 repo (24. 1. 5 ~).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

144 lines
5.0 KiB

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os, random, sumolib\n",
"import sumolib\n",
"import pandas as pd\n",
"import numpy as np\n",
"from datetime import datetime"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"path_root = os.path.dirname(os.path.dirname(os.path.abspath('.')))\n",
"path_dayplan = os.path.join(path_root, 'data', 'tables', '20240729', 'TC_IF_TOD_DAY_PLAN.csv')\n",
"path_sigl_cycl = os.path.join(path_root, 'test_0729', 'data', 'tables', 'TL_IF_SIGL_CYCL.csv')\n",
"dayplan = pd.read_csv(path_dayplan)\n",
"CRSRD_IDs = [436, 437, 438, 442, 443, 455, 456, 457, 458]\n",
"dayplan = dayplan[dayplan.CRSRD_ID.isin(CRSRD_IDs)]\n",
"\n",
"dayplan = dayplan.drop(columns=['LAST_MDFCN_DT'])"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"midnight = int(datetime(2024, 7, 29).timestamp())\n",
"next_day = int(datetime(2024, 7, 30).timestamp())\n",
"\n",
"histories = []\n",
"\n",
"for CRSRD_ID in CRSRD_IDs:\n",
" dplan = dayplan[dayplan.CRSRD_ID==CRSRD_ID]\n",
" if ((dplan.HOUR==0) & (dplan.MIN==0)).any():\n",
" pass\n",
" else:\n",
" dplan_temp = dplan[-1:]\n",
" dplan_temp['HOUR'] = 0\n",
" dplan_temp['MIN'] = 0\n",
" dplan = pd.concat([dplan, dplan_temp])\n",
" dplan = dplan.sort_values(by=['HOUR', 'MIN']).reset_index(drop=True)\n",
" dplan.loc[:, 'end_unix'] = dplan['HOUR'].astype(int) * 3600 + dplan['MIN'].astype(int) * 60 + midnight\n",
" history = []\n",
" current_time = midnight\n",
" for i in range(len(dplan)):\n",
" row = dplan.iloc[i]\n",
" cycle = row.CYCL\n",
" offset = row.OFFSET\n",
" unix_end = dplan.iloc[i+1]['end_unix'] if i < len(dplan) - 1 else next_day\n",
" r = 0\n",
" while current_time <= unix_end:\n",
" remainder = current_time % 10\n",
" if remainder != 0: # 현재시각의 일의자리가 0이 아니면 다음 현재시각의 일의자리가 0이 되도록 맞춰준다.\n",
" r = (5 - remainder) % 10 - 5 # 1>-1, 2>-2, 3>-3, 4>-4, 5>-5, 6>4, 7>3, 8>2, 9>1\n",
" else:\n",
" r = random.choices([0, -1, 1], weights=[10, 1, 1])[0] # 측정오차\n",
" # 0.001의 확률로 결측 발생\n",
" if random.random() < 0.001: # 주기의 배수만큼 결측\n",
" n = random.randint(0,100)\n",
" current_time += n * cycle + r\n",
" # 0.01의 확률로 이상치 발생\n",
" elif random.random() > 0.99: # 카이제곱분포값 * 주기만큼의 이상치 발생. 카이제곱분포값은 항상 양수이고 평균이 1\n",
" current_time += int(np.random.chisquare(df=1) * cycle) + r\n",
" else:\n",
" current_time += cycle + r # 결측/이상 없음\n",
" new_row = row.copy()\n",
" new_row['PHASE_DT'] = current_time\n",
" new_row['CYCL'] = cycle\n",
" new_row['OFFSET'] = offset\n",
" history.append(new_row)\n",
" history = pd.concat(history, axis=1).transpose()\n",
" history = history[['PHASE_DT', 'CRSRD_ID']\n",
" + [f'RING{alph}_PHASE{i}' for alph in ['A', 'B'] for i in range(1,9)]]\n",
" history = history[history.PHASE_DT <= next_day]\n",
" history = history.rename(columns={'PHASE_DT':'OCRN_DT'})\n",
" histories.append(history)\n",
"histories = pd.concat(histories)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"histories = histories.sort_values(by=['OCRN_DT', 'CRSRD_ID'])\n",
"histories = histories.reset_index(drop=True)\n",
"histories['FRST_REG_DT'] = ''\n",
"histories['OCRN_DT'] = pd.to_datetime(histories['OCRN_DT'], unit='s')\n",
"histories['OCRN_DT'] = histories['OCRN_DT'].dt.strftime('%Y-%m-%d %H:%M:%S.%f').str[:-3]\n",
"histories.to_csv(path_sigl_cycl, index=False)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"c:\\github\\siggen\\test_0729\\data\\tables\\TL_IF_SIGL_CYCL.csv\n"
]
}
],
"source": [
"print(path_sigl_cycl)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "siggen_env",
"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.12.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}