신호생성 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.
 
 

1527 lines
52 KiB

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"os.listdir('../../scripts')\n",
"import sys\n",
"sys.path.append('../../Scripts')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from generate_signals import SignalGenerator\n",
"from preprocess_daily import DailyPreprocessor"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"inter_no = 175\n",
"Node_id = 'i0'"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1. 데이터를 준비합니다.\n",
"1-1. 네트워크가 로드되었습니다.\n",
"1-2. 테이블들이 로드되었습니다.\n",
"2. 신호이력 테이블을 변환합니다.\n",
"3. 이동류정보 테이블을 변환합니다.\n",
"4. 통합 테이블을 생성합니다.\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>node_id</th>\n",
" <th>start_unix</th>\n",
" <th>phas_A</th>\n",
" <th>phas_B</th>\n",
" <th>move_A</th>\n",
" <th>move_B</th>\n",
" <th>duration</th>\n",
" <th>state</th>\n",
" <th>phase_sumo</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1704418730</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>33</td>\n",
" <td>gggggg</td>\n",
" <td>0_g</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1704418730</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>gggggg</td>\n",
" <td>0_y</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1704418730</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>gggggg</td>\n",
" <td>1__r</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1704418730</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>34</td>\n",
" <td>GGGGGG</td>\n",
" <td>1_g</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1704418730</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>GGGGGG</td>\n",
" <td>1_y</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>210</td>\n",
" <td>u60</td>\n",
" <td>1704419299</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>7</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>ggggggggr</td>\n",
" <td>3__r</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>210</td>\n",
" <td>u60</td>\n",
" <td>1704419299</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>7</td>\n",
" <td>4</td>\n",
" <td>65</td>\n",
" <td>ggggggggr</td>\n",
" <td>3_g</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>210</td>\n",
" <td>u60</td>\n",
" <td>1704419299</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>7</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>ggggggggr</td>\n",
" <td>3_y</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>210</td>\n",
" <td>u60</td>\n",
" <td>1704419299</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>8</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>ggggggggr</td>\n",
" <td>4__r</td>\n",
" </tr>\n",
" <tr>\n",
" <th>237</th>\n",
" <td>210</td>\n",
" <td>u60</td>\n",
" <td>1704419299</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>8</td>\n",
" <td>3</td>\n",
" <td>19</td>\n",
" <td>ggggggggr</td>\n",
" <td>4_g</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>684 rows × 10 columns</p>\n",
"</div>"
],
"text/plain": [
" inter_no node_id start_unix phas_A phas_B move_A move_B duration \\\n",
"0 178 c30 1704418730 1 1 8 4 33 \n",
"1 178 c30 1704418730 1 1 8 4 4 \n",
"2 178 c30 1704418730 2 2 7 3 1 \n",
"0 178 c30 1704418730 2 2 7 3 34 \n",
"1 178 c30 1704418730 2 2 7 3 4 \n",
".. ... ... ... ... ... ... ... ... \n",
"2 210 u60 1704419299 3 3 7 4 1 \n",
"0 210 u60 1704419299 3 3 7 4 65 \n",
"1 210 u60 1704419299 3 3 7 4 4 \n",
"2 210 u60 1704419299 4 4 8 3 1 \n",
"237 210 u60 1704419299 4 4 8 3 19 \n",
"\n",
" state phase_sumo \n",
"0 gggggg 0_g \n",
"1 gggggg 0_y \n",
"2 gggggg 1__r \n",
"0 GGGGGG 1_g \n",
"1 GGGGGG 1_y \n",
".. ... ... \n",
"2 ggggggggr 3__r \n",
"0 ggggggggr 3_g \n",
"1 ggggggggr 3_y \n",
"2 ggggggggr 4__r \n",
"237 ggggggggr 4_g \n",
"\n",
"[684 rows x 10 columns]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# desired result\n",
"self = SignalGenerator()\n",
"self.prepare_data()\n",
"self.process_history()\n",
"self.process_movement()\n",
"self.make_histids()\n",
"self.set_timepoints()\n",
"self.assign_red_yellow()\n",
"self.self.self.self.self.self.self.self.self.self.self.self.self.self.SIGTABLETABLETABLETABLETABLETABLETABLETABLETABLETABLETABLETABLETABLETABLE"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1. 데이터를 준비합니다.\n",
"1-1. 네트워크가 로드되었습니다.\n",
"1-2. 테이블들이 로드되었습니다.\n",
"2. 신호이력 테이블을 변환합니다.\n",
"3. 이동류정보 테이블을 변환합니다.\n"
]
}
],
"source": [
"self = SignalGenerator()\n",
"self.prepare_data()\n",
"self.process_history()\n",
"self.process_movement()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"self.merge_dfs()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# 4-2. histid\n",
"self.histid = self.movedur.copy()\n",
"self.histid['node_id'] = self.histid['inter_no'].map(self.inter2node)\n",
"histid_start = self.present_time - 600\n",
"self.histid = self.histid[self.histid.start_unix > histid_start]\n",
"\n",
"mapping_dict = self.matching.set_index(['node_id', 'move_no'])['state'].to_dict()\n",
"\n",
"for i, row in self.histid.iterrows():\n",
" node_id = row.node_id\n",
" move_A = row.move_A\n",
" move_B = row.move_B\n",
" \n",
" # A링의 state 지정\n",
" if (node_id, move_A) in mapping_dict:\n",
" state_A = mapping_dict[(node_id, move_A)]\n",
" else:\n",
" state_A = ''.join(self.node2init[node_id])\n",
" self.histid.at[i, 'state_A'] = state_A\n",
"\n",
" # B링의 state 지정\n",
" if (node_id, move_B) in mapping_dict:\n",
" state_B = mapping_dict[(node_id, move_B)]\n",
" else:\n",
" state_B = ''.join(self.node2init[node_id])\n",
" self.histid.at[i, 'state_B'] = state_B "
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>node_id</th>\n",
" <th>start_unix</th>\n",
" <th>phas_A</th>\n",
" <th>phas_B</th>\n",
" <th>move_A</th>\n",
" <th>move_B</th>\n",
" <th>duration</th>\n",
" <th>state_A</th>\n",
" <th>state_B</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704418520</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>43</td>\n",
" <td>grrrgrrrgGGGGrgrr</td>\n",
" <td>gGGrgrrrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704418520</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>45</td>\n",
" <td>grrGgrrrgrrrrrgrr</td>\n",
" <td>grrrgrrrgrrrrGgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704418520</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>33</td>\n",
" <td>grrrgGGrgrrrrrgrr</td>\n",
" <td>grrrgrrGgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704418520</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>2</td>\n",
" <td>22</td>\n",
" <td>grrrgGGrgrrrrrgrr</td>\n",
" <td>grrrgrrrgrrrrrgGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704418520</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>37</td>\n",
" <td>grrrgrrrgrrrrrgrG</td>\n",
" <td>grrrgrrrgrrrrrgGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>62</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704418699</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>43</td>\n",
" <td>grrrgrrrgGGGGrgrr</td>\n",
" <td>gGGrgrrrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>63</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704418699</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>45</td>\n",
" <td>grrGgrrrgrrrrrgrr</td>\n",
" <td>grrrgrrrgrrrrGgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>64</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704418699</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>33</td>\n",
" <td>grrrgGGrgrrrrrgrr</td>\n",
" <td>grrrgrrGgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>65</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704418699</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>2</td>\n",
" <td>22</td>\n",
" <td>grrrgGGrgrrrrrgrr</td>\n",
" <td>grrrgrrrgrrrrrgGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>66</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704418699</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>37</td>\n",
" <td>grrrgrrrgrrrrrgrG</td>\n",
" <td>grrrgrrrgrrrrrgGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>131</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704418880</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>43</td>\n",
" <td>grrrgrrrgGGGGrgrr</td>\n",
" <td>gGGrgrrrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>132</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704418880</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>45</td>\n",
" <td>grrGgrrrgrrrrrgrr</td>\n",
" <td>grrrgrrrgrrrrGgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>133</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704418880</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>33</td>\n",
" <td>grrrgGGrgrrrrrgrr</td>\n",
" <td>grrrgrrGgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>134</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704418880</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>2</td>\n",
" <td>22</td>\n",
" <td>grrrgGGrgrrrrrgrr</td>\n",
" <td>grrrgrrrgrrrrrgGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>135</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704418880</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>37</td>\n",
" <td>grrrgrrrgrrrrrgrG</td>\n",
" <td>grrrgrrrgrrrrrgGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>193</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419060</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>43</td>\n",
" <td>grrrgrrrgGGGGrgrr</td>\n",
" <td>gGGrgrrrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>194</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419060</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>45</td>\n",
" <td>grrGgrrrgrrrrrgrr</td>\n",
" <td>grrrgrrrgrrrrGgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>195</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419060</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>33</td>\n",
" <td>grrrgGGrgrrrrrgrr</td>\n",
" <td>grrrgrrGgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>196</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419060</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>2</td>\n",
" <td>22</td>\n",
" <td>grrrgGGrgrrrrrgrr</td>\n",
" <td>grrrgrrrgrrrrrgGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>197</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419060</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>37</td>\n",
" <td>grrrgrrrgrrrrrgrG</td>\n",
" <td>grrrgrrrgrrrrrgGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>259</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419240</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>43</td>\n",
" <td>grrrgrrrgGGGGrgrr</td>\n",
" <td>gGGrgrrrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>260</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419240</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>45</td>\n",
" <td>grrGgrrrgrrrrrgrr</td>\n",
" <td>grrrgrrrgrrrrGgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>261</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419240</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>33</td>\n",
" <td>grrrgGGrgrrrrrgrr</td>\n",
" <td>grrrgrrGgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>262</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419240</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>2</td>\n",
" <td>22</td>\n",
" <td>grrrgGGrgrrrrrgrr</td>\n",
" <td>grrrgrrrgrrrrrgGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>263</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419240</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>37</td>\n",
" <td>grrrgrrrgrrrrrgrG</td>\n",
" <td>grrrgrrrgrrrrrgGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>337</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419420</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>43</td>\n",
" <td>grrrgrrrgGGGGrgrr</td>\n",
" <td>gGGrgrrrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>338</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419420</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>45</td>\n",
" <td>grrGgrrrgrrrrrgrr</td>\n",
" <td>grrrgrrrgrrrrGgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>339</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419420</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>33</td>\n",
" <td>grrrgGGrgrrrrrgrr</td>\n",
" <td>grrrgrrGgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>340</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419420</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>2</td>\n",
" <td>22</td>\n",
" <td>grrrgGGrgrrrrrgrr</td>\n",
" <td>grrrgrrrgrrrrrgGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>341</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419420</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>37</td>\n",
" <td>grrrgrrrgrrrrrgrG</td>\n",
" <td>grrrgrrrgrrrrrgGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>380</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419520</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>24</td>\n",
" <td>grrrgrrrgGGGGrgrr</td>\n",
" <td>gGGrgrrrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>381</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419520</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>25</td>\n",
" <td>grrGgrrrgrrrrrgrr</td>\n",
" <td>grrrgrrrgrrrrGgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>382</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419520</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>18</td>\n",
" <td>grrrgGGrgrrrrrgrr</td>\n",
" <td>grrrgrrGgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>383</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419520</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>2</td>\n",
" <td>13</td>\n",
" <td>grrrgGGrgrrrrrgrr</td>\n",
" <td>grrrgrrrgrrrrrgGr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>384</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>1704419520</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>20</td>\n",
" <td>grrrgrrrgrrrrrgrG</td>\n",
" <td>grrrgrrrgrrrrrgGr</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no node_id start_unix phas_A phas_B move_A move_B duration \\\n",
"0 175 i0 1704418520 1 1 8 4 43 \n",
"1 175 i0 1704418520 2 2 7 3 45 \n",
"2 175 i0 1704418520 3 3 6 1 33 \n",
"3 175 i0 1704418520 3 4 6 2 22 \n",
"4 175 i0 1704418520 4 4 5 2 37 \n",
"62 175 i0 1704418699 1 1 8 4 43 \n",
"63 175 i0 1704418699 2 2 7 3 45 \n",
"64 175 i0 1704418699 3 3 6 1 33 \n",
"65 175 i0 1704418699 3 4 6 2 22 \n",
"66 175 i0 1704418699 4 4 5 2 37 \n",
"131 175 i0 1704418880 1 1 8 4 43 \n",
"132 175 i0 1704418880 2 2 7 3 45 \n",
"133 175 i0 1704418880 3 3 6 1 33 \n",
"134 175 i0 1704418880 3 4 6 2 22 \n",
"135 175 i0 1704418880 4 4 5 2 37 \n",
"193 175 i0 1704419060 1 1 8 4 43 \n",
"194 175 i0 1704419060 2 2 7 3 45 \n",
"195 175 i0 1704419060 3 3 6 1 33 \n",
"196 175 i0 1704419060 3 4 6 2 22 \n",
"197 175 i0 1704419060 4 4 5 2 37 \n",
"259 175 i0 1704419240 1 1 8 4 43 \n",
"260 175 i0 1704419240 2 2 7 3 45 \n",
"261 175 i0 1704419240 3 3 6 1 33 \n",
"262 175 i0 1704419240 3 4 6 2 22 \n",
"263 175 i0 1704419240 4 4 5 2 37 \n",
"337 175 i0 1704419420 1 1 8 4 43 \n",
"338 175 i0 1704419420 2 2 7 3 45 \n",
"339 175 i0 1704419420 3 3 6 1 33 \n",
"340 175 i0 1704419420 3 4 6 2 22 \n",
"341 175 i0 1704419420 4 4 5 2 37 \n",
"380 175 i0 1704419520 1 1 8 4 24 \n",
"381 175 i0 1704419520 2 2 7 3 25 \n",
"382 175 i0 1704419520 3 3 6 1 18 \n",
"383 175 i0 1704419520 3 4 6 2 13 \n",
"384 175 i0 1704419520 4 4 5 2 20 \n",
"\n",
" state_A state_B \n",
"0 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
"1 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
"2 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
"3 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
"4 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
"62 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
"63 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
"64 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
"65 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
"66 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
"131 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
"132 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
"133 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
"134 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
"135 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
"193 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
"194 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
"195 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
"196 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
"197 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
"259 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
"260 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
"261 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
"262 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
"263 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
"337 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
"338 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
"339 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
"340 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
"341 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
"380 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
"381 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
"382 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
"383 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
"384 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 4-3. histids\n",
"new_histids = []\n",
"for parent_id in self.parent_ids:\n",
" for child_id in self.pa2ch[parent_id]:\n",
" new_histid = self.histid.copy()[self.histid.node_id==parent_id].drop(columns=['state_A', 'state_B'])\n",
" # new_histid[['inc_edge_A', 'out_edge_A', 'inc_edge_B', 'out_edge_B']] = np.nan\n",
" for i, row in new_histid.iterrows():\n",
" phas_A = row.phas_A\n",
" phas_B = row.phas_B\n",
" new_match = self.match6[self.match6.node_id==child_id]\n",
" Arow = new_match[(new_match.phase_no==phas_A) & (new_match.ring_type=='A')]\n",
"\n",
" # A링의 state 지정\n",
" state_A = Arow.iloc[0].state\n",
" new_histid.at[i, 'state_A'] = state_A\n",
"\n",
" # B링의 state 지정\n",
" Brow = new_match[(new_match.phase_no==phas_B) & (new_match.ring_type=='B')]\n",
" state_B = Brow.iloc[0].state\n",
" new_histid.at[i, 'state_B'] = state_B\n",
"\n",
" new_histid.at[i, 'node_id'] = child_id\n",
" new_histids.append(new_histid)\n",
"import pandas as pd\n",
"new_histids = pd.concat(new_histids)\n",
"self.histids = pd.concat([self.histid.copy(), new_histids])\n",
"self.histids = self.histids.sort_values(by=['start_unix', 'node_id', 'phas_A', 'phas_B']).reset_index(drop=True)\n",
"self.histids = self.histids[['inter_no', 'node_id', 'start_unix', 'phas_A', 'phas_B', 'move_A', 'move_B', 'duration', 'state_A', 'state_B']]\n",
"self.histids.query('node_id==@Node_id')"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"self.set_timepoints()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>node_id</th>\n",
" <th>start_unix</th>\n",
" <th>phas_A</th>\n",
" <th>phas_B</th>\n",
" <th>move_A</th>\n",
" <th>move_B</th>\n",
" <th>duration</th>\n",
" <th>state_A</th>\n",
" <th>state_B</th>\n",
" <th>phase_sumo</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1704418730</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>38</td>\n",
" <td>gggggg</td>\n",
" <td>gggggg</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1704418730</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>39</td>\n",
" <td>GGGggg</td>\n",
" <td>gggGGG</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1704418730</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>43</td>\n",
" <td>GGGggg</td>\n",
" <td>gggGGG</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1704418730</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>22</td>\n",
" <td>GGGggg</td>\n",
" <td>gggGGG</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>178</td>\n",
" <td>c30</td>\n",
" <td>1704418900</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>4</td>\n",
" <td>38</td>\n",
" <td>gggggg</td>\n",
" <td>gggggg</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>233</th>\n",
" <td>210</td>\n",
" <td>u60</td>\n",
" <td>1704419299</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>6</td>\n",
" <td>18</td>\n",
" <td>28</td>\n",
" <td>ggggggggr</td>\n",
" <td>ggggggggr</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>234</th>\n",
" <td>210</td>\n",
" <td>u60</td>\n",
" <td>1704419299</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>6</td>\n",
" <td>2</td>\n",
" <td>15</td>\n",
" <td>ggggggggr</td>\n",
" <td>ggggggggr</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>235</th>\n",
" <td>210</td>\n",
" <td>u60</td>\n",
" <td>1704419299</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>43</td>\n",
" <td>ggggggggG</td>\n",
" <td>ggggggggr</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>236</th>\n",
" <td>210</td>\n",
" <td>u60</td>\n",
" <td>1704419299</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>7</td>\n",
" <td>4</td>\n",
" <td>70</td>\n",
" <td>ggggggggr</td>\n",
" <td>ggggggggr</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>237</th>\n",
" <td>210</td>\n",
" <td>u60</td>\n",
" <td>1704419299</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>8</td>\n",
" <td>3</td>\n",
" <td>24</td>\n",
" <td>ggggggggr</td>\n",
" <td>ggggggggr</td>\n",
" <td>4</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>238 rows × 11 columns</p>\n",
"</div>"
],
"text/plain": [
" inter_no node_id start_unix phas_A phas_B move_A move_B duration \\\n",
"0 178 c30 1704418730 1 1 8 4 38 \n",
"1 178 c30 1704418730 2 2 7 3 39 \n",
"2 178 c30 1704418730 3 3 5 2 43 \n",
"3 178 c30 1704418730 4 4 6 1 22 \n",
"4 178 c30 1704418900 1 1 8 4 38 \n",
".. ... ... ... ... ... ... ... ... \n",
"233 210 u60 1704419299 1 1 6 18 28 \n",
"234 210 u60 1704419299 1 2 6 2 15 \n",
"235 210 u60 1704419299 2 2 5 2 43 \n",
"236 210 u60 1704419299 3 3 7 4 70 \n",
"237 210 u60 1704419299 4 4 8 3 24 \n",
"\n",
" state_A state_B phase_sumo \n",
"0 gggggg gggggg 0 \n",
"1 GGGggg gggGGG 1 \n",
"2 GGGggg gggGGG 2 \n",
"3 GGGggg gggGGG 3 \n",
"4 gggggg gggggg 0 \n",
".. ... ... ... \n",
"233 ggggggggr ggggggggr 0 \n",
"234 ggggggggr ggggggggr 1 \n",
"235 ggggggggG ggggggggr 2 \n",
"236 ggggggggr ggggggggr 3 \n",
"237 ggggggggr ggggggggr 4 \n",
"\n",
"[238 rows x 11 columns]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"self.sigtable"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [],
"source": [
"def get_red(pre_state:str, cur_state:str):\n",
" assert len(pre_state) == len(cur_state), \"cur_state, nex_state의 길이가 서로 다릅니다.\"\n",
" state_r = ''\n",
" for c, n in zip(pre_state, cur_state):\n",
" if c == n:\n",
" state_r += c\n",
" elif (c == 'r') and (n == 'G'):\n",
" state_r += 'r'\n",
" elif (c == 'G') and (n == 'r'):\n",
" state_r += 'r'\n",
" else:\n",
" raise ValueError(f\"예상치 못한 신호조합: current={c}, next={n}\")\n",
" return state_r\n",
"\n",
"def get_yellow(cur_state:str, nex_state:str):\n",
" assert len(cur_state) == len(nex_state), \"cur_state, nex_state의 길이가 서로 다릅니다.\"\n",
" state_y = ''\n",
" for c, n in zip(cur_state, nex_state):\n",
" if c == n:\n",
" state_y += c\n",
" elif (c == 'r') and (n == 'G'):\n",
" state_y += 'r'\n",
" elif (c == 'G') and (n == 'r'):\n",
" state_y += 'y'\n",
" else:\n",
" raise ValueError(f\"예상치 못한 신호조합: current={c}, next={n}\")\n",
" return state_y\n",
"\n",
"def cumulate(sig, alph):\n",
" csig = [] # cumulated sig\n",
" pre = pd.Series({f'phas_{alph}':None})\n",
"\n",
" start_time = 0\n",
" elapsed = 0\n",
" for i, cur in sig.iterrows():\n",
" start_unix = cur.start_unix\n",
" \n",
" # pre, nex\n",
" if i != 0:\n",
" pre = sig.iloc[i-1]\n",
" \n",
" if i != len(sig) - 1:\n",
" nex = sig.iloc[i+1]\n",
" \n",
" # duration\n",
" if cur[f'phas_{alph}'] == nex[f'phas_{alph}']:\n",
" continue\n",
" if cur[f'phas_{alph}'] == pre[f'phas_{alph}']:\n",
" duration = cur.duration + pre.duration\n",
" else:\n",
" duration = cur.duration\n",
" start_times = []\n",
" states = []\n",
" phases = []\n",
"\n",
" # red\n",
" if i != 0:\n",
" start_time += elapsed\n",
" start_times.append(start_time)\n",
" states.append(get_red(pre[f'state_{alph}'], cur[f'state_{alph}']))\n",
" phases.append(f'{cur[f\"phas_{alph}\"]}r')\n",
"\n",
" elapsed = cur[f'red_{alph}']\n",
"\n",
" # green\n",
" if i == 0:\n",
" start_time = 0\n",
" else:\n",
" start_time += elapsed\n",
" start_times.append(start_time)\n",
" states.append(cur[f'state_{alph}'])\n",
" phases.append(f'{cur[f\"phas_{alph}\"]}g')\n",
" if i == 0:\n",
" elapsed = duration - cur[f'yellow_{alph}']\n",
" else:\n",
" elapsed = duration - cur[f'yellow_{alph}'] - cur[f'red_{alph}']\n",
"\n",
" # yellow\n",
" if i != len(sig) - 1:\n",
" start_time += elapsed\n",
" start_times.append(start_time)\n",
" states.append(get_yellow(cur[f'state_{alph}'], nex[f'state_{alph}']))\n",
" phases.append(f'{cur[f\"phas_{alph}\"]}y')\n",
" elapsed = cur[f'yellow_{alph}']\n",
" sig_ = pd.DataFrame({'start_time':start_times, f'phas_{alph}':phases, f'state_{alph}':states})\n",
" sig_['start_unix'] = start_unix\n",
" csig.append(sig_)\n",
" csig = pd.concat(csig).reset_index(drop=True)\n",
" return csig"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>node_id</th>\n",
" <th>start_unix</th>\n",
" <th>phase</th>\n",
" <th>duration</th>\n",
" <th>state</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>c30</td>\n",
" <td>1704418699</td>\n",
" <td>1g_1g</td>\n",
" <td>39</td>\n",
" <td>gGGrgrrrgGGGGrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>c30</td>\n",
" <td>1704418699</td>\n",
" <td>1y_1y</td>\n",
" <td>4</td>\n",
" <td>gyyrgrrrgyyyyrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>c30</td>\n",
" <td>1704418699</td>\n",
" <td>2r_2r</td>\n",
" <td>1</td>\n",
" <td>grrrgrrrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>c30</td>\n",
" <td>1704418699</td>\n",
" <td>2g_2g</td>\n",
" <td>40</td>\n",
" <td>grrGgrrrgrrrrGgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>c30</td>\n",
" <td>1704418699</td>\n",
" <td>2y_2y</td>\n",
" <td>4</td>\n",
" <td>grrygrrrgrrrrygrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>33</th>\n",
" <td>u60</td>\n",
" <td>1704419060</td>\n",
" <td>2g_2g</td>\n",
" <td>40</td>\n",
" <td>grrGgrrrgrrrrGgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>34</th>\n",
" <td>u60</td>\n",
" <td>1704419060</td>\n",
" <td>2y_2y</td>\n",
" <td>4</td>\n",
" <td>grrygrrrgrrrrygrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35</th>\n",
" <td>u60</td>\n",
" <td>1704419060</td>\n",
" <td>3r_3r</td>\n",
" <td>1</td>\n",
" <td>grrrgGGrgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>36</th>\n",
" <td>u60</td>\n",
" <td>1704419060</td>\n",
" <td>3g_3g</td>\n",
" <td>28</td>\n",
" <td>grrrgGGGgrrrrrgrr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>37</th>\n",
" <td>u60</td>\n",
" <td>1704419060</td>\n",
" <td>3g_3y</td>\n",
" <td>22</td>\n",
" <td>grrrgGGygrrrrrgrr</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>570 rows × 5 columns</p>\n",
"</div>"
],
"text/plain": [
" node_id start_unix phase duration state\n",
"0 c30 1704418699 1g_1g 39 gGGrgrrrgGGGGrgrr\n",
"1 c30 1704418699 1y_1y 4 gyyrgrrrgyyyyrgrr\n",
"2 c30 1704418699 2r_2r 1 grrrgrrrgrrrrrgrr\n",
"3 c30 1704418699 2g_2g 40 grrGgrrrgrrrrGgrr\n",
"4 c30 1704418699 2y_2y 4 grrygrrrgrrrrygrr\n",
".. ... ... ... ... ...\n",
"33 u60 1704419060 2g_2g 40 grrGgrrrgrrrrGgrr\n",
"34 u60 1704419060 2y_2y 4 grrygrrrgrrrrygrr\n",
"35 u60 1704419060 3r_3r 1 grrrgGGrgrrrrrgrr\n",
"36 u60 1704419060 3g_3g 28 grrrgGGGgrrrrrgrr\n",
"37 u60 1704419060 3g_3y 22 grrrgGGygrrrrrgrr\n",
"\n",
"[570 rows x 5 columns]"
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"self.SIGTABLE = []\n",
"for node_id in self.sigtable.node_id.unique():\n",
" sig = self.sigtable.query('node_id==@Node_id')\n",
" for i, row in sig.iterrows():\n",
" inter_no = row.inter_no\n",
" phas_A = row.phas_A\n",
" phas_B = row.phas_B\n",
" start_unix = row.start_unix\n",
" prow = self.load_prow(inter_no, start_unix)[1].iloc[0]\n",
" red_A = prow[f'red_A{phas_A}']\n",
" yellow_A = prow[f'yellow_A{phas_A}']\n",
" red_B = prow[f'red_B{phas_B}']\n",
" yellow_B = prow[f'yellow_B{phas_B}']\n",
" sig.loc[i, ['red_A', 'red_B', 'yellow_A', 'yellow_B']] = red_A, red_B, yellow_A, yellow_B\n",
" sig = sig.astype({'red_A': int, 'red_B': int, 'yellow_A': int, 'yellow_B': int,\n",
" 'phas_A':str, 'phas_B':str})\n",
" sig = sig.drop(['move_A','move_B'], axis=1)\n",
"\n",
" sig_A = sig[['start_unix', 'phas_A', 'duration', 'state_A', 'red_A', 'yellow_A']].reset_index(drop=True)\n",
" sig_B = sig[['start_unix', 'phas_B', 'duration', 'state_B', 'red_B', 'yellow_B']].reset_index(drop=True)\n",
"\n",
" csig_A = cumulate(sig_A, 'A')\n",
" csig_B = cumulate(sig_B, 'B')\n",
"\n",
" SIG = pd.merge(csig_A, csig_B, on=['start_time', 'start_unix'], how='outer')\n",
" SIG = SIG.sort_values(by='start_time').reset_index(drop=True)\n",
" SIG[['phas_A', 'state_A']] = SIG[['phas_A', 'state_A']].fillna(method='ffill')\n",
" SIG[['phas_B', 'state_B']] = SIG[['phas_B', 'state_B']].fillna(method='ffill')\n",
" SIG['phase'] = SIG['phas_A'] + \"_\" + SIG['phas_B']\n",
" SIG['node_id'] = node_id\n",
" SIG = SIG[['node_id', 'start_unix', 'start_time', 'phase', 'state_A', 'state_B']]\n",
" SIG['duration'] = SIG['start_time'].shift(-1) - SIG['start_time']\n",
" SIG = SIG[:-1]\n",
" SIG['duration'] = SIG['duration'].astype(int)\n",
" for row in SIG.itertuples():\n",
" state = ''\n",
" for a, b, in zip(row.state_A, row.state_B):\n",
" if a == 'r':\n",
" state += b\n",
" elif b == 'r':\n",
" state += a\n",
" elif a == b:\n",
" state += a\n",
" else:\n",
" raise ValueError(f\"예상되지 않은 조합 발생: a={a}, b={b}\")\n",
" SIG.at[row.Index, 'state'] = state\n",
" SIG = SIG.drop(columns=['start_time', 'state_A', 'state_B'])\n",
" self.SIGTABLE.append(SIG)\n",
"self.SIGTABLE = pd.concat(self.SIGTABLE)\n",
"self.SIGTABLE"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "sts",
"language": "python",
"name": "sts"
},
"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.10"
}
},
"nbformat": 4,
"nbformat_minor": 2
}