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

3387 lines
130 KiB

{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"from datetime import datetime\n",
"import os\n",
"import random\n",
"from tqdm import tqdm"
]
},
{
"cell_type": "code",
"execution_count": 4,
"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>inter_name</th>\n",
" <th>inter_lat</th>\n",
" <th>inter_lon</th>\n",
" <th>group_no</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>175</td>\n",
" <td>한솔삼거리(한솔마을3거리)</td>\n",
" <td>37.36857</td>\n",
" <td>127.11478</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>176</td>\n",
" <td>느티마을4단지</td>\n",
" <td>37.36724</td>\n",
" <td>127.11480</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>177</td>\n",
" <td>한솔6단지(정자동사무소)</td>\n",
" <td>37.36619</td>\n",
" <td>127.11480</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>178</td>\n",
" <td>신기4거리</td>\n",
" <td>37.36346</td>\n",
" <td>127.11480</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>201</td>\n",
" <td>느티마을4거리</td>\n",
" <td>37.36854</td>\n",
" <td>127.10984</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>202</td>\n",
" <td>느티마을 안촌유치원</td>\n",
" <td>37.36855</td>\n",
" <td>127.11241</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>206</td>\n",
" <td>상록마을 321동</td>\n",
" <td>37.36483</td>\n",
" <td>127.10981</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>210</td>\n",
" <td>상록4거리(상록마을입구4거리)</td>\n",
" <td>37.36347</td>\n",
" <td>127.10982</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>211</td>\n",
" <td>상록마을단일로</td>\n",
" <td>37.36346</td>\n",
" <td>127.11237</td>\n",
" <td>3</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no inter_name inter_lat inter_lon group_no\n",
"0 175 한솔삼거리(한솔마을3거리) 37.36857 127.11478 3\n",
"1 176 느티마을4단지 37.36724 127.11480 3\n",
"2 177 한솔6단지(정자동사무소) 37.36619 127.11480 3\n",
"3 178 신기4거리 37.36346 127.11480 3\n",
"4 201 느티마을4거리 37.36854 127.10984 3\n",
"5 202 느티마을 안촌유치원 37.36855 127.11241 3\n",
"6 206 상록마을 321동 37.36483 127.10981 3\n",
"7 210 상록4거리(상록마을입구4거리) 37.36347 127.10982 3\n",
"8 211 상록마을단일로 37.36346 127.11237 3"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 교차로정보\n",
"inter_info = pd.read_csv(\"inter_info.csv\")\n",
"inter_info['group_no'] = 3\n",
"display(inter_info)\n",
"inter_info.to_csv('../inter_info.csv')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"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>main_phase</th>\n",
" <th>mg1A</th>\n",
" <th>mg1B</th>\n",
" <th>mg2A</th>\n",
" <th>mg2B</th>\n",
" <th>mg3A</th>\n",
" <th>mg3B</th>\n",
" <th>mg4A</th>\n",
" <th>mg4B</th>\n",
" <th>mg5A</th>\n",
" <th>mg5B</th>\n",
" <th>mg6A</th>\n",
" <th>mg6B</th>\n",
" <th>mg7A</th>\n",
" <th>mg7B</th>\n",
" <th>mg8A</th>\n",
" <th>mg8B</th>\n",
" <th>r1A</th>\n",
" <th>r1B</th>\n",
" <th>r2A</th>\n",
" <th>r2B</th>\n",
" <th>r3A</th>\n",
" <th>r3B</th>\n",
" <th>r4A</th>\n",
" <th>r4B</th>\n",
" <th>r5A</th>\n",
" <th>r5B</th>\n",
" <th>r6A</th>\n",
" <th>r6B</th>\n",
" <th>r7A</th>\n",
" <th>r7B</th>\n",
" <th>r8A</th>\n",
" <th>r8B</th>\n",
" <th>y1A</th>\n",
" <th>y1B</th>\n",
" <th>y2A</th>\n",
" <th>y2B</th>\n",
" <th>y3A</th>\n",
" <th>y3B</th>\n",
" <th>y4A</th>\n",
" <th>y4B</th>\n",
" <th>y5A</th>\n",
" <th>y5B</th>\n",
" <th>y6A</th>\n",
" <th>y6B</th>\n",
" <th>y7A</th>\n",
" <th>y7B</th>\n",
" <th>y8A</th>\n",
" <th>y8B</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>175</td>\n",
" <td>2</td>\n",
" <td>24</td>\n",
" <td>27</td>\n",
" <td>33</td>\n",
" <td>12</td>\n",
" <td>15</td>\n",
" <td>39</td>\n",
" <td>15</td>\n",
" <td>19</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>176</td>\n",
" <td>2</td>\n",
" <td>21</td>\n",
" <td>31</td>\n",
" <td>33</td>\n",
" <td>30</td>\n",
" <td>16</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>177</td>\n",
" <td>2</td>\n",
" <td>35</td>\n",
" <td>18</td>\n",
" <td>36</td>\n",
" <td>36</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>38</td>\n",
" <td>13</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>178</td>\n",
" <td>2</td>\n",
" <td>18</td>\n",
" <td>19</td>\n",
" <td>35</td>\n",
" <td>26</td>\n",
" <td>36</td>\n",
" <td>29</td>\n",
" <td>17</td>\n",
" <td>37</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>201</td>\n",
" <td>2</td>\n",
" <td>25</td>\n",
" <td>20</td>\n",
" <td>21</td>\n",
" <td>32</td>\n",
" <td>31</td>\n",
" <td>28</td>\n",
" <td>31</td>\n",
" <td>17</td>\n",
" <td>27</td>\n",
" <td>27</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>202</td>\n",
" <td>2</td>\n",
" <td>12</td>\n",
" <td>30</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>206</td>\n",
" <td>2</td>\n",
" <td>36</td>\n",
" <td>29</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>31</td>\n",
" <td>31</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>210</td>\n",
" <td>2</td>\n",
" <td>19</td>\n",
" <td>0</td>\n",
" <td>12</td>\n",
" <td>13</td>\n",
" <td>21</td>\n",
" <td>37</td>\n",
" <td>12</td>\n",
" <td>22</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>211</td>\n",
" <td>2</td>\n",
" <td>32</td>\n",
" <td>35</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no main_phase mg1A mg1B mg2A mg2B mg3A mg3B mg4A mg4B mg5A \\\n",
"0 175 2 24 27 33 12 15 39 15 19 0 \n",
"1 176 2 21 31 33 30 16 0 0 0 0 \n",
"2 177 2 35 18 36 36 0 0 38 13 0 \n",
"3 178 2 18 19 35 26 36 29 17 37 0 \n",
"4 201 2 25 20 21 32 31 28 31 17 27 \n",
"5 202 2 12 30 0 0 0 0 0 0 0 \n",
"6 206 2 36 29 0 0 31 31 0 0 0 \n",
"7 210 2 19 0 12 13 21 37 12 22 0 \n",
"8 211 2 32 35 0 0 0 0 0 0 0 \n",
"\n",
" mg5B mg6A mg6B mg7A mg7B mg8A mg8B r1A r1B r2A r2B r3A r3B \\\n",
"0 0 0 0 0 0 0 0 1 1 1 1 1 1 \n",
"1 0 0 0 0 0 0 0 1 1 1 1 1 0 \n",
"2 0 0 0 0 0 0 0 1 1 1 1 1 0 \n",
"3 0 0 0 0 0 0 0 1 1 1 1 1 1 \n",
"4 27 0 0 0 0 0 0 1 1 1 1 1 1 \n",
"5 0 0 0 0 0 0 0 1 1 1 0 0 0 \n",
"6 0 0 0 0 0 0 0 1 1 1 0 1 1 \n",
"7 0 0 0 0 0 0 0 1 0 1 1 1 1 \n",
"8 0 0 0 0 0 0 0 1 1 1 0 0 0 \n",
"\n",
" r4A r4B r5A r5B r6A r6B r7A r7B r8A r8B y1A y1B y2A y2B y3A \\\n",
"0 1 1 0 0 0 0 0 0 0 0 4 4 4 4 4 \n",
"1 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 \n",
"2 1 1 0 0 0 0 0 0 0 0 4 4 4 4 0 \n",
"3 1 1 0 0 0 0 0 0 0 0 4 4 4 4 4 \n",
"4 1 1 1 1 0 0 0 0 0 0 4 4 4 4 4 \n",
"5 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 \n",
"6 1 0 0 0 0 0 0 0 0 0 4 4 0 0 4 \n",
"7 1 1 0 0 0 0 0 0 0 0 4 0 4 4 4 \n",
"8 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 \n",
"\n",
" y3B y4A y4B y5A y5B y6A y6B y7A y7B y8A y8B \n",
"0 4 4 4 0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 0 0 0 0 \n",
"2 0 4 4 0 0 0 0 0 0 0 0 \n",
"3 4 4 4 0 0 0 0 0 0 0 0 \n",
"4 4 4 4 4 4 0 0 0 0 0 0 \n",
"5 0 0 0 0 0 0 0 0 0 0 0 \n",
"6 4 0 0 0 0 0 0 0 0 0 0 \n",
"7 4 4 4 0 0 0 0 0 0 0 0 \n",
"8 0 0 0 0 0 0 0 0 0 0 0 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 현시구성\n",
"phase_info = pd.read_csv(\"phase_info.csv\")\n",
"phase_info.drop('flow_no', axis=1, inplace=True)\n",
"# display(phase_info)\n",
"mg = phase_info.pivot_table(index='inter_no', columns=['phase_no', 'ring_type'], values='min_green_dur').fillna(0).astype(int)\n",
"y = phase_info.pivot_table(index='inter_no', columns=['phase_no', 'ring_type'], values='yellow_dur').fillna(0).astype(int)\n",
"r = phase_info.pivot_table(index='inter_no', columns=['phase_no', 'ring_type'], values='red_dur').fillna(0).astype(int)\n",
"max_phase_no = phase_info['phase_no'].max()\n",
"new_columns = [f'{col}{phase}{ring}' for col in ['mg', 'y', 'r'] for phase in range(1, max_phase_no + 1) for ring in ['A', 'B']]\n",
"phase_info = pd.concat([mg, y, r], axis=1)\n",
"phase_info.columns = new_columns\n",
"phase_info['main_phase'] = 2\n",
"phase_info['mg6A'] = phase_info['mg6B'] = phase_info['mg7A'] = phase_info['mg7B'] = phase_info['mg8A'] = phase_info['mg8B']= 0\n",
"phase_info['y6A'] = phase_info['y6B'] = phase_info['y7A'] = phase_info['y7B'] = phase_info['y8A'] = phase_info['y8B']= 0\n",
"phase_info['r6A'] = phase_info['r6B'] = phase_info['r7A'] = phase_info['r7B'] = phase_info['r8A'] = phase_info['r8B']= 0\n",
"phase_info = phase_info[sorted(phase_info.columns)]\n",
"phase_info.reset_index(inplace=True)\n",
"with pd.option_context('display.max_rows', None, 'display.max_columns', None): \n",
" display(phase_info)\n",
"phase_info.to_csv('../phase_info.csv')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"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>angle_A1</th>\n",
" <th>angle_A2</th>\n",
" <th>angle_A3</th>\n",
" <th>angle_A4</th>\n",
" <th>angle_A5</th>\n",
" <th>angle_A6</th>\n",
" <th>angle_A7</th>\n",
" <th>angle_A8</th>\n",
" <th>angle_B1</th>\n",
" <th>angle_B2</th>\n",
" <th>angle_B3</th>\n",
" <th>angle_B4</th>\n",
" <th>angle_B5</th>\n",
" <th>angle_B6</th>\n",
" <th>angle_B7</th>\n",
" <th>angle_B8</th>\n",
" </tr>\n",
" <tr>\n",
" <th>inter_no</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>175</th>\n",
" <td>179004</td>\n",
" <td>1095</td>\n",
" <td>90270</td>\n",
" <td>268000</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>3176</td>\n",
" <td>179270</td>\n",
" <td>90180</td>\n",
" <td>270090</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>176</th>\n",
" <td>180000</td>\n",
" <td>180000</td>\n",
" <td>270356</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>359180</td>\n",
" <td>180270</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>177</th>\n",
" <td>180000</td>\n",
" <td>90</td>\n",
" <td>stop</td>\n",
" <td>268000</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>1176</td>\n",
" <td>179270</td>\n",
" <td>NaN</td>\n",
" <td>90180</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>178</th>\n",
" <td>180000</td>\n",
" <td>90</td>\n",
" <td>270000</td>\n",
" <td>90270</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>180</td>\n",
" <td>180270</td>\n",
" <td>270090</td>\n",
" <td>90180</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>201</th>\n",
" <td>180000</td>\n",
" <td>270000</td>\n",
" <td>90270</td>\n",
" <td>90270</td>\n",
" <td>90</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>180270</td>\n",
" <td>270090</td>\n",
" <td>270090</td>\n",
" <td>90180</td>\n",
" <td>180</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>202</th>\n",
" <td>90270</td>\n",
" <td>stop</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>270090</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>206</th>\n",
" <td>180000</td>\n",
" <td>stop</td>\n",
" <td>180000</td>\n",
" <td>stop</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>180</td>\n",
" <td>NaN</td>\n",
" <td>180</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>210</th>\n",
" <td>90270</td>\n",
" <td>268000</td>\n",
" <td>359090</td>\n",
" <td>180000</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>270090</td>\n",
" <td>180</td>\n",
" <td>180270</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>211</th>\n",
" <td>90270</td>\n",
" <td>stop</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>270090</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" angle_A1 angle_A2 angle_A3 angle_A4 angle_A5 angle_A6 angle_A7 \\\n",
"inter_no \n",
"175 179004 1095 90270 268000 NaN NaN NaN \n",
"176 180000 180000 270356 NaN NaN NaN NaN \n",
"177 180000 90 stop 268000 NaN NaN NaN \n",
"178 180000 90 270000 90270 NaN NaN NaN \n",
"201 180000 270000 90270 90270 90 NaN NaN \n",
"202 90270 stop NaN NaN NaN NaN NaN \n",
"206 180000 stop 180000 stop NaN NaN NaN \n",
"210 90270 268000 359090 180000 NaN NaN NaN \n",
"211 90270 stop NaN NaN NaN NaN NaN \n",
"\n",
" angle_A8 angle_B1 angle_B2 angle_B3 angle_B4 angle_B5 angle_B6 \\\n",
"inter_no \n",
"175 NaN 3176 179270 90180 270090 NaN NaN \n",
"176 NaN 359180 180270 NaN NaN NaN NaN \n",
"177 NaN 1176 179270 NaN 90180 NaN NaN \n",
"178 NaN 180 180270 270090 90180 NaN NaN \n",
"201 NaN 180270 270090 270090 90180 180 NaN \n",
"202 NaN 270090 NaN NaN NaN NaN NaN \n",
"206 NaN 180 NaN 180 NaN NaN NaN \n",
"210 NaN NaN 270090 180 180270 NaN NaN \n",
"211 NaN 270090 NaN NaN NaN NaN NaN \n",
"\n",
" angle_B7 angle_B8 \n",
"inter_no \n",
"175 NaN NaN \n",
"176 NaN NaN \n",
"177 NaN NaN \n",
"178 NaN NaN \n",
"201 NaN NaN \n",
"202 NaN NaN \n",
"206 NaN NaN \n",
"210 NaN NaN \n",
"211 NaN NaN "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 방위각정보\n",
"flow_angle = pd.read_csv(\"flow_angle.csv\")\n",
"angle = flow_angle.pivot_table(index='inter_no', columns=['phase_no', 'ring_type'], values='angle_code', aggfunc='first').fillna('NaN')\n",
"new_columns = [f'angle_{ring}{phase}' for phase in range(1, 6) for ring in ['A', 'B']]\n",
"angle.columns = new_columns\n",
"angle['angle_A6'] = angle['angle_A7'] = angle['angle_A8'] = np.nan\n",
"angle['angle_B6'] = angle['angle_B7'] = angle['angle_B8'] = np.nan\n",
"angle = angle[sorted(angle.columns)]\n",
"display(angle)\n",
"flow_angle.to_csv('../angle.csv')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# # 이동류번호\n",
"# plan = pd.read_csv(\"time_plan.csv\")\n",
"# phase = pd.read_csv('phase_info.csv')\n",
"# plan = plan[plan.ID.isin([1, 5, 8, 11])]\n",
"# ID2starttime = {1:\"00:00\", 5:\"07:00\", 8:\"09:00\", 11:\"18:30\"}\n",
"# plan['start_hour'] = plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[0])\n",
"# plan['start_minute']=plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[1])\n",
"# plan = plan[['inter_no', 'start_hour', 'start_minute', 'phase_no', 'ring_type', 'duration', 'cycle']]\n",
"# plan_ = pd.merge(plan, phase[['inter_no', 'phase_no', 'ring_type', 'flow_no']], on=['inter_no', 'phase_no', 'ring_type'], how='left')\n",
"# plan_['flow_no'] = plan_['flow_no'].fillna(18).astype(int)\n",
"# plan_['start_second'] = plan_.start_hour.astype(int)*3600 + plan_.start_minute.astype(int)*60\n",
"# plan_ = plan_[['inter_no', 'start_second', 'phase_no', 'ring_type', 'duration', 'flow_no', 'cycle']]\n",
"# cycle_dict = dict(zip(zip(plan_['inter_no'], plan_['start_second']), plan_['cycle']))\n",
"# df = plan_[['inter_no','start_second','cycle']].drop_duplicates()\n",
"# df = df.reset_index(drop=True)\n",
"# df['start_second_exact'] = 0\n",
"# for i in range(1, len(df)):\n",
"# if i % 4 != 0:\n",
"# prev = df.loc[i-1, 'start_second_exact']\n",
"# start_second = df.loc[i, 'start_second']\n",
"# cycle = df.loc[i-1, 'cycle']\n",
"# df.loc[i, 'start_second_exact'] = (start_second - prev) % cycle + start_second\n",
"# inter2start = {inter_no:list(df[df.inter_no==inter_no]['start_second_exact']) for inter_no in df.inter_no}\n",
"# plan_ = plan_.pivot_table(index=['inter_no', 'start_second', 'phase_no'],\n",
"# columns='ring_type',\n",
"# values=['duration', 'flow_no'],\n",
"# aggfunc='first').reset_index()\n",
"# plan_.columns = ['inter_no', 'start_second', 'phase_no', 'dura_A', 'dura_B', 'move_A', 'move_B']\n",
"# inter2no_phase = {inter_no:group.phase_no.unique().max() for (inter_no, group) in plan.groupby('inter_no')}\n",
"\n",
"# midnight = int(datetime(2024, 1, 5, 0, 0, 0).timestamp())\n",
"# present = int(datetime(2024, 1, 5, 3, 3, 10).timestamp()) # <===== 현재시각\n",
"# sec = present - midnight\n",
"# the_start_second = np.max(df.start_second[df.start_second <= sec])\n",
"# move = []\n",
"# for inter_no in plan_.inter_no.unique():\n",
"# cycle = cycle_dict[(inter_no, the_start_second)]\n",
"# df = plan_[(plan_.inter_no==inter_no)&(plan_.start_second==the_start_second)].reset_index(drop=True)\n",
"# remainder = sec % cycle\n",
"# df['cums_A'] = df.copy().dura_A.cumsum()\n",
"# df['cums_B'] = df.copy().dura_B.cumsum()\n",
"# ind_A = len(df.cums_A[df.cums_A <= remainder])%inter2no_phase[inter_no]\n",
"# ind_B = len(df.cums_B[df.cums_B <= remainder])%inter2no_phase[inter_no]\n",
"# dura_A = df.loc[ind_A,'dura_A']\n",
"# dura_B = df.loc[ind_B,'dura_B']\n",
"# phas_A = df.loc[ind_A,'phase_no']\n",
"# phas_B = df.loc[ind_B,'phase_no']\n",
"# move_A = df.loc[ind_A,'move_A']\n",
"# move_B = df.loc[ind_B,'move_B']\n",
"# move.append(pd.DataFrame({'inter_no':[inter_no],'phas_A':[phas_A], 'phas_B':[phas_B],'move_A':[move_A], 'move_B':[move_B]}))\n",
"# move = pd.concat(move)\n",
"# display(move)\n",
"# move.to_csv('../movement.csv')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
" 2%|▏ | 293/17280 [00:04<04:14, 66.80it/s]\n"
]
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"Cell \u001b[1;32mIn[3], line 52\u001b[0m\n\u001b[0;32m 50\u001b[0m move_B \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mloc[ind_B,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmove_B\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m 51\u001b[0m move\u001b[38;5;241m.\u001b[39mappend(pd\u001b[38;5;241m.\u001b[39mDataFrame({\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minter_no\u001b[39m\u001b[38;5;124m'\u001b[39m:[inter_no],\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mphas_A\u001b[39m\u001b[38;5;124m'\u001b[39m:[phas_A], \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mphas_B\u001b[39m\u001b[38;5;124m'\u001b[39m:[phas_B],\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmove_A\u001b[39m\u001b[38;5;124m'\u001b[39m:[move_A], \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmove_B\u001b[39m\u001b[38;5;124m'\u001b[39m:[move_B]}))\n\u001b[1;32m---> 52\u001b[0m move \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconcat\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmove\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 53\u001b[0m move\u001b[38;5;241m.\u001b[39mto_csv(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m../moves/move_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mcurrent_time\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.csv\u001b[39m\u001b[38;5;124m'\u001b[39m)\n",
"File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\core\\reshape\\concat.py:385\u001b[0m, in \u001b[0;36mconcat\u001b[1;34m(objs, axis, join, ignore_index, keys, levels, names, verify_integrity, sort, copy)\u001b[0m\n\u001b[0;32m 370\u001b[0m copy \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m 372\u001b[0m op \u001b[38;5;241m=\u001b[39m _Concatenator(\n\u001b[0;32m 373\u001b[0m objs,\n\u001b[0;32m 374\u001b[0m axis\u001b[38;5;241m=\u001b[39maxis,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 382\u001b[0m sort\u001b[38;5;241m=\u001b[39msort,\n\u001b[0;32m 383\u001b[0m )\n\u001b[1;32m--> 385\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mop\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_result\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\core\\reshape\\concat.py:616\u001b[0m, in \u001b[0;36m_Concatenator.get_result\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 612\u001b[0m indexers[ax] \u001b[38;5;241m=\u001b[39m obj_labels\u001b[38;5;241m.\u001b[39mget_indexer(new_labels)\n\u001b[0;32m 614\u001b[0m mgrs_indexers\u001b[38;5;241m.\u001b[39mappend((obj\u001b[38;5;241m.\u001b[39m_mgr, indexers))\n\u001b[1;32m--> 616\u001b[0m new_data \u001b[38;5;241m=\u001b[39m \u001b[43mconcatenate_managers\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 617\u001b[0m \u001b[43m \u001b[49m\u001b[43mmgrs_indexers\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnew_axes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconcat_axis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbm_axis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcopy\u001b[49m\n\u001b[0;32m 618\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 619\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcopy \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m using_copy_on_write():\n\u001b[0;32m 620\u001b[0m new_data\u001b[38;5;241m.\u001b[39m_consolidate_inplace()\n",
"File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\core\\internals\\concat.py:225\u001b[0m, in \u001b[0;36mconcatenate_managers\u001b[1;34m(mgrs_indexers, axes, concat_axis, copy)\u001b[0m\n\u001b[0;32m 223\u001b[0m values \u001b[38;5;241m=\u001b[39m values\u001b[38;5;241m.\u001b[39mview()\n\u001b[0;32m 224\u001b[0m fastpath \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[1;32m--> 225\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[43m_is_uniform_join_units\u001b[49m\u001b[43m(\u001b[49m\u001b[43mjoin_units\u001b[49m\u001b[43m)\u001b[49m:\n\u001b[0;32m 226\u001b[0m vals \u001b[38;5;241m=\u001b[39m [ju\u001b[38;5;241m.\u001b[39mblock\u001b[38;5;241m.\u001b[39mvalues \u001b[38;5;28;01mfor\u001b[39;00m ju \u001b[38;5;129;01min\u001b[39;00m join_units]\n\u001b[0;32m 228\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m blk\u001b[38;5;241m.\u001b[39mis_extension:\n\u001b[0;32m 229\u001b[0m \u001b[38;5;66;03m# _is_uniform_join_units ensures a single dtype, so\u001b[39;00m\n\u001b[0;32m 230\u001b[0m \u001b[38;5;66;03m# we can use np.concatenate, which is more performant\u001b[39;00m\n\u001b[0;32m 231\u001b[0m \u001b[38;5;66;03m# than concat_compat\u001b[39;00m\n",
"File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\core\\internals\\concat.py:696\u001b[0m, in \u001b[0;36m_is_uniform_join_units\u001b[1;34m(join_units)\u001b[0m\n\u001b[0;32m 679\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m first\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mkind \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mV\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m 680\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m 681\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m (\n\u001b[0;32m 682\u001b[0m \u001b[38;5;66;03m# exclude cases where a) ju.block is None or b) we have e.g. Int64+int64\u001b[39;00m\n\u001b[0;32m 683\u001b[0m \u001b[38;5;28mall\u001b[39m(\u001b[38;5;28mtype\u001b[39m(ju\u001b[38;5;241m.\u001b[39mblock) \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28mtype\u001b[39m(first) \u001b[38;5;28;01mfor\u001b[39;00m ju \u001b[38;5;129;01min\u001b[39;00m join_units)\n\u001b[0;32m 684\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m 685\u001b[0m \u001b[38;5;66;03m# e.g. DatetimeLikeBlock can be dt64 or td64, but these are not uniform\u001b[39;00m\n\u001b[0;32m 686\u001b[0m \u001b[38;5;28mall\u001b[39m(\n\u001b[0;32m 687\u001b[0m is_dtype_equal(ju\u001b[38;5;241m.\u001b[39mblock\u001b[38;5;241m.\u001b[39mdtype, first\u001b[38;5;241m.\u001b[39mdtype)\n\u001b[0;32m 688\u001b[0m \u001b[38;5;66;03m# GH#42092 we only want the dtype_equal check for non-numeric blocks\u001b[39;00m\n\u001b[0;32m 689\u001b[0m \u001b[38;5;66;03m# (for now, may change but that would need a deprecation)\u001b[39;00m\n\u001b[0;32m 690\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m ju\u001b[38;5;241m.\u001b[39mblock\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mkind \u001b[38;5;129;01min\u001b[39;00m [\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mi\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mu\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 691\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m ju \u001b[38;5;129;01min\u001b[39;00m join_units\n\u001b[0;32m 692\u001b[0m )\n\u001b[0;32m 693\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m 694\u001b[0m \u001b[38;5;66;03m# no blocks that would get missing values (can lead to type upcasts)\u001b[39;00m\n\u001b[0;32m 695\u001b[0m \u001b[38;5;66;03m# unless we're an extension dtype.\u001b[39;00m\n\u001b[1;32m--> 696\u001b[0m \u001b[38;5;28;43mall\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mju\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mis_na\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mju\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mblock\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mis_extension\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mju\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mjoin_units\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 697\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m 698\u001b[0m \u001b[38;5;66;03m# no blocks with indexers (as then the dimensions do not fit)\u001b[39;00m\n\u001b[0;32m 699\u001b[0m \u001b[38;5;28mall\u001b[39m(\u001b[38;5;129;01mnot\u001b[39;00m ju\u001b[38;5;241m.\u001b[39mindexers \u001b[38;5;28;01mfor\u001b[39;00m ju \u001b[38;5;129;01min\u001b[39;00m join_units)\n\u001b[0;32m 700\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m 701\u001b[0m \u001b[38;5;66;03m# only use this path when there is something to concatenate\u001b[39;00m\n\u001b[0;32m 702\u001b[0m \u001b[38;5;28mlen\u001b[39m(join_units) \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[0;32m 703\u001b[0m )\n",
"File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\core\\internals\\concat.py:696\u001b[0m, in \u001b[0;36m<genexpr>\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 679\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m first\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mkind \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mV\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m 680\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m 681\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m (\n\u001b[0;32m 682\u001b[0m \u001b[38;5;66;03m# exclude cases where a) ju.block is None or b) we have e.g. Int64+int64\u001b[39;00m\n\u001b[0;32m 683\u001b[0m \u001b[38;5;28mall\u001b[39m(\u001b[38;5;28mtype\u001b[39m(ju\u001b[38;5;241m.\u001b[39mblock) \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28mtype\u001b[39m(first) \u001b[38;5;28;01mfor\u001b[39;00m ju \u001b[38;5;129;01min\u001b[39;00m join_units)\n\u001b[0;32m 684\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m 685\u001b[0m \u001b[38;5;66;03m# e.g. DatetimeLikeBlock can be dt64 or td64, but these are not uniform\u001b[39;00m\n\u001b[0;32m 686\u001b[0m \u001b[38;5;28mall\u001b[39m(\n\u001b[0;32m 687\u001b[0m is_dtype_equal(ju\u001b[38;5;241m.\u001b[39mblock\u001b[38;5;241m.\u001b[39mdtype, first\u001b[38;5;241m.\u001b[39mdtype)\n\u001b[0;32m 688\u001b[0m \u001b[38;5;66;03m# GH#42092 we only want the dtype_equal check for non-numeric blocks\u001b[39;00m\n\u001b[0;32m 689\u001b[0m \u001b[38;5;66;03m# (for now, may change but that would need a deprecation)\u001b[39;00m\n\u001b[0;32m 690\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m ju\u001b[38;5;241m.\u001b[39mblock\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mkind \u001b[38;5;129;01min\u001b[39;00m [\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mi\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mu\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 691\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m ju \u001b[38;5;129;01min\u001b[39;00m join_units\n\u001b[0;32m 692\u001b[0m )\n\u001b[0;32m 693\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m 694\u001b[0m \u001b[38;5;66;03m# no blocks that would get missing values (can lead to type upcasts)\u001b[39;00m\n\u001b[0;32m 695\u001b[0m \u001b[38;5;66;03m# unless we're an extension dtype.\u001b[39;00m\n\u001b[1;32m--> 696\u001b[0m \u001b[38;5;28mall\u001b[39m(\u001b[38;5;129;01mnot\u001b[39;00m \u001b[43mju\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mis_na\u001b[49m \u001b[38;5;129;01mor\u001b[39;00m ju\u001b[38;5;241m.\u001b[39mblock\u001b[38;5;241m.\u001b[39mis_extension \u001b[38;5;28;01mfor\u001b[39;00m ju \u001b[38;5;129;01min\u001b[39;00m join_units)\n\u001b[0;32m 697\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m 698\u001b[0m \u001b[38;5;66;03m# no blocks with indexers (as then the dimensions do not fit)\u001b[39;00m\n\u001b[0;32m 699\u001b[0m \u001b[38;5;28mall\u001b[39m(\u001b[38;5;129;01mnot\u001b[39;00m ju\u001b[38;5;241m.\u001b[39mindexers \u001b[38;5;28;01mfor\u001b[39;00m ju \u001b[38;5;129;01min\u001b[39;00m join_units)\n\u001b[0;32m 700\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m 701\u001b[0m \u001b[38;5;66;03m# only use this path when there is something to concatenate\u001b[39;00m\n\u001b[0;32m 702\u001b[0m \u001b[38;5;28mlen\u001b[39m(join_units) \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[0;32m 703\u001b[0m )\n",
"File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\_libs\\properties.pyx:36\u001b[0m, in \u001b[0;36mpandas._libs.properties.CachedProperty.__get__\u001b[1;34m()\u001b[0m\n",
"File \u001b[1;32mc:\\Github\\SNITS_RealTimeSignals\\rts\\lib\\site-packages\\pandas\\core\\internals\\concat.py:462\u001b[0m, in \u001b[0;36mJoinUnit.is_na\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 460\u001b[0m \u001b[38;5;129m@cache_readonly\u001b[39m\n\u001b[0;32m 461\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mis_na\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28mbool\u001b[39m:\n\u001b[1;32m--> 462\u001b[0m blk \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mblock\u001b[49m\n\u001b[0;32m 463\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m blk\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mkind \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mV\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m 464\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m\n",
"\u001b[1;31mKeyboardInterrupt\u001b[0m: "
]
}
],
"source": [
"# 이동류번호\n",
"plan = pd.read_csv(\"time_plan.csv\")\n",
"phase = pd.read_csv('phase_info.csv')\n",
"plan = plan[plan.ID.isin([1, 5, 8, 11])]\n",
"ID2starttime = {1:\"00:00\", 5:\"07:00\", 8:\"09:00\", 11:\"18:30\"}\n",
"plan['start_hour'] = plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[0])\n",
"plan['start_minute']=plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[1])\n",
"plan = plan[['inter_no', 'start_hour', 'start_minute', 'phase_no', 'ring_type', 'duration', 'cycle']]\n",
"plan_ = pd.merge(plan, phase[['inter_no', 'phase_no', 'ring_type', 'flow_no']], on=['inter_no', 'phase_no', 'ring_type'], how='left')\n",
"plan_['flow_no'] = plan_['flow_no'].fillna(18).astype(int)\n",
"plan_['start_second'] = plan_.start_hour.astype(int)*3600 + plan_.start_minute.astype(int)*60\n",
"plan_ = plan_[['inter_no', 'start_second', 'phase_no', 'ring_type', 'duration', 'flow_no', 'cycle']]\n",
"cycle_dict = dict(zip(zip(plan_['inter_no'], plan_['start_second']), plan_['cycle']))\n",
"df = plan_[['inter_no','start_second','cycle']].drop_duplicates()\n",
"df = df.reset_index(drop=True)\n",
"df['start_second_exact'] = 0\n",
"for i in range(1, len(df)):\n",
" if i % 4 != 0:\n",
" prev = df.loc[i-1, 'start_second_exact']\n",
" start_second = df.loc[i, 'start_second']\n",
" cycle = df.loc[i-1, 'cycle']\n",
" df.loc[i, 'start_second_exact'] = (start_second - prev) % cycle + start_second\n",
"inter2start = {inter_no:list(df[df.inter_no==inter_no]['start_second_exact']) for inter_no in df.inter_no}\n",
"plan_ = plan_.pivot_table(index=['inter_no', 'start_second', 'phase_no'],\n",
" columns='ring_type',\n",
" values=['duration', 'flow_no'],\n",
" aggfunc='first').reset_index()\n",
"plan_.columns = ['inter_no', 'start_second', 'phase_no', 'dura_A', 'dura_B', 'move_A', 'move_B']\n",
"inter2no_phase = {inter_no:group.phase_no.unique().max() for (inter_no, group) in plan.groupby('inter_no')}\n",
"\n",
"midnight = int(datetime(2024, 1, 5, 0, 0, 0).timestamp())\n",
"next_day = int(datetime(2024, 1, 6, 0, 0, 0).timestamp())\n",
"for current_time in tqdm(range(midnight, next_day, 5)):\n",
" sec = current_time - midnight\n",
" the_start_second = np.max(df.start_second[df.start_second <= sec])\n",
" move = []\n",
" for inter_no in plan_.inter_no.unique():\n",
" cycle = cycle_dict[(inter_no, the_start_second)]\n",
" df = plan_[(plan_.inter_no==inter_no)&(plan_.start_second==the_start_second)].reset_index(drop=True)\n",
" remainder = sec % cycle\n",
" df['cums_A'] = df.copy().dura_A.cumsum()\n",
" df['cums_B'] = df.copy().dura_B.cumsum()\n",
" ind_A = len(df.cums_A[df.cums_A <= remainder])%inter2no_phase[inter_no]\n",
" ind_B = len(df.cums_B[df.cums_B <= remainder])%inter2no_phase[inter_no]\n",
" dura_A = df.loc[ind_A,'dura_A']\n",
" dura_B = df.loc[ind_B,'dura_B']\n",
" phas_A = df.loc[ind_A,'phase_no']\n",
" phas_B = df.loc[ind_B,'phase_no']\n",
" move_A = df.loc[ind_A,'move_A']\n",
" move_B = df.loc[ind_B,'move_B']\n",
" move.append(pd.DataFrame({'inter_no':[inter_no],'phas_A':[phas_A], 'phas_B':[phas_B],'move_A':[move_A], 'move_B':[move_B]}))\n",
" move = pd.concat(move)\n",
" move.to_csv(f'../moves/move_{current_time}.csv')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# 신호계획\n",
"plan = pd.read_csv(\"time_plan.csv\")\n",
"plan = plan[plan.ID.isin([1, 5, 8, 11])]\n",
"ID2starttime = {1:\"00:00\", 5:\"07:00\", 8:\"09:00\", 11:\"18:30\"}\n",
"plan['start_hour'] = plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[0])\n",
"plan['start_minute']=plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[1])\n",
"plan = plan[['inter_no', 'start_hour', 'start_minute', 'phase_no', 'ring_type', 'duration', 'cycle', 'offset']]\n",
"plan = plan.pivot_table(index=['inter_no', 'start_hour', 'start_minute', 'cycle', 'offset'], columns=['phase_no','ring_type'], values='duration', aggfunc='first').fillna(0).astype(int)\n",
"new_columns = [f'dura_{ring}{phase}' for phase in range(1, 6) for ring in ['A', 'B']]\n",
"plan.columns = new_columns\n",
"new_columns = [f'dura_{ring}{phase}' for phase in range(1, 9) for ring in ['A', 'B']]\n",
"for col in new_columns:\n",
" if col not in plan.columns:\n",
" plan[col] = 0\n",
"plan.reset_index(inplace=True)\n",
"plan = plan[list(plan.columns)[:3] + sorted(plan.columns)[1:-4] + list(plan.columns)[3:5]]\n",
"plan.to_csv('../plan.csv')\n",
"# with pd.option_context('display.max_rows', None, 'display.max_columns', None):\n",
"# display(plan)\n",
"pland = plan.copy()\n",
"cums_A = np.array(pland[[f'dura_A{j}' for j in range(1,9)]].cumsum(axis=1))\n",
"cums_B = np.array(pland[[f'dura_B{j}' for j in range(1,9)]].cumsum(axis=1))\n",
"detailed_cums = []\n",
"i = 0\n",
"for row_A, row_B in zip(cums_A, cums_B):\n",
" combined_row = np.unique(np.concatenate((row_A, row_B)))\n",
" ddur = np.concatenate(([combined_row[0]], np.diff(combined_row)))\n",
" ddur = np.pad(ddur, (0, 8 - len(ddur)), constant_values=(0))\n",
" detailed_cums.append(ddur)\n",
" for j in range(8):\n",
" pland.at[i, f'ddur_{j+1}'] = ddur[j]\n",
" i+=1\n",
"pland = pland[['inter_no', 'start_hour', 'start_minute'] + [f'ddur_{j}' for j in range(1,9)] + ['cycle', 'offset']] # plan, detailed\n",
"pland[[f'ddur_{j}' for j in range(1,9)]] = pland[[f'ddur_{j}' for j in range(1,9)]].astype(int)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{(1, 1): 1, (2, 2): 2, (3, 3): 3, (3, 4): 4, (4, 4): 5}"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pland = plan.copy()\n",
"row = plan.iloc[0]\n",
"cycle = row.cycle\n",
"cums_A = row[[f'dura_A{j}' for j in range(1,9)]].cumsum()\n",
"cums_B = row[[f'dura_B{j}' for j in range(1,9)]].cumsum()\n",
"split = {}\n",
"k = 0\n",
"for t in range(cycle):\n",
" new_phas_A = len(cums_A[cums_A < t]) + 1\n",
" new_phas_B = len(cums_B[cums_B < t]) + 1\n",
" if k == 0 or ((new_phas_A, new_phas_B) != (phas_A, phas_B)):\n",
" k += 1\n",
" phas_A = new_phas_A\n",
" phas_B = new_phas_B\n",
" split[(phas_A, phas_B)] = k\n",
"split"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{0: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (3, 4): 4, (4, 4): 5},\n",
" 1: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (3, 4): 4, (4, 4): 5},\n",
" 2: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (3, 4): 4, (4, 4): 5},\n",
" 3: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (3, 4): 4, (4, 4): 5},\n",
" 4: {(1, 1): 1, (2, 2): 2, (3, 3): 3},\n",
" 5: {(1, 1): 1, (2, 2): 2, (3, 3): 3},\n",
" 6: {(1, 1): 1, (2, 2): 2, (3, 3): 3},\n",
" 7: {(1, 1): 1, (2, 2): 2, (3, 3): 3},\n",
" 8: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n",
" 9: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n",
" 10: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n",
" 11: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n",
" 12: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n",
" 13: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 3): 4, (4, 4): 5},\n",
" 14: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 3): 4, (4, 4): 5},\n",
" 15: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 3): 4, (4, 4): 5},\n",
" 16: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4, (5, 5): 5},\n",
" 17: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4, (5, 5): 5},\n",
" 18: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4, (5, 5): 5},\n",
" 19: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4, (5, 5): 5},\n",
" 20: {(1, 1): 1, (2, 2): 2},\n",
" 21: {(1, 1): 1, (2, 2): 2},\n",
" 22: {(1, 1): 1, (2, 2): 2},\n",
" 23: {(1, 1): 1, (2, 2): 2},\n",
" 24: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n",
" 25: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n",
" 26: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n",
" 27: {(1, 1): 1, (2, 2): 2, (3, 3): 3, (4, 4): 4},\n",
" 28: {(1, 1): 1, (1, 2): 2, (2, 2): 3, (3, 3): 4, (4, 4): 5},\n",
" 29: {(1, 1): 1, (1, 2): 2, (2, 2): 3, (3, 3): 4, (4, 4): 5},\n",
" 30: {(1, 1): 1, (1, 2): 2, (2, 2): 3, (3, 3): 4, (4, 4): 5},\n",
" 31: {(1, 1): 1, (1, 2): 2, (2, 2): 3, (3, 3): 4, (4, 4): 5},\n",
" 32: {(1, 1): 1, (2, 2): 2},\n",
" 33: {(1, 1): 1, (2, 2): 2},\n",
" 34: {(1, 1): 1, (2, 2): 2},\n",
" 35: {(1, 1): 1, (2, 2): 2}}"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pland = plan.copy()\n",
"splits = {}\n",
"for i, row in pland.iterrows():\n",
" splits[i] = {}\n",
" cycle = row.cycle\n",
" cums_A = row[[f'dura_A{j}' for j in range(1,9)]].cumsum()\n",
" cums_B = row[[f'dura_B{j}' for j in range(1,9)]].cumsum()\n",
" split = {}\n",
" k = 0\n",
" for t in range(cycle):\n",
" new_phas_A = len(cums_A[cums_A < t]) + 1\n",
" new_phas_B = len(cums_B[cums_B < t]) + 1\n",
" if k == 0 or ((new_phas_A, new_phas_B) != (phas_A, phas_B)):\n",
" k += 1\n",
" phas_A = new_phas_A\n",
" phas_B = new_phas_B\n",
" splits[i][(phas_A, phas_B)] = k\n",
"splits"
]
},
{
"cell_type": "code",
"execution_count": 10,
"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>start_hour</th>\n",
" <th>start_minute</th>\n",
" <th>dura_A1</th>\n",
" <th>dura_A2</th>\n",
" <th>dura_A3</th>\n",
" <th>dura_A4</th>\n",
" <th>dura_A5</th>\n",
" <th>dura_A6</th>\n",
" <th>dura_A7</th>\n",
" <th>...</th>\n",
" <th>dura_B1</th>\n",
" <th>dura_B2</th>\n",
" <th>dura_B3</th>\n",
" <th>dura_B4</th>\n",
" <th>dura_B5</th>\n",
" <th>dura_B6</th>\n",
" <th>dura_B7</th>\n",
" <th>dura_B8</th>\n",
" <th>cycle</th>\n",
" <th>offset</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>175</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>37</td>\n",
" <td>39</td>\n",
" <td>55</td>\n",
" <td>29</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>37</td>\n",
" <td>39</td>\n",
" <td>25</td>\n",
" <td>59</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>160</td>\n",
" <td>57</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>175</td>\n",
" <td>07</td>\n",
" <td>00</td>\n",
" <td>40</td>\n",
" <td>42</td>\n",
" <td>55</td>\n",
" <td>33</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>40</td>\n",
" <td>42</td>\n",
" <td>29</td>\n",
" <td>59</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>170</td>\n",
" <td>40</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>175</td>\n",
" <td>09</td>\n",
" <td>00</td>\n",
" <td>43</td>\n",
" <td>45</td>\n",
" <td>55</td>\n",
" <td>37</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>43</td>\n",
" <td>45</td>\n",
" <td>33</td>\n",
" <td>59</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>175</td>\n",
" <td>18</td>\n",
" <td>30</td>\n",
" <td>46</td>\n",
" <td>48</td>\n",
" <td>55</td>\n",
" <td>41</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>46</td>\n",
" <td>48</td>\n",
" <td>37</td>\n",
" <td>59</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>190</td>\n",
" <td>18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>176</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>131</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>176</td>\n",
" <td>07</td>\n",
" <td>00</td>\n",
" <td>37</td>\n",
" <td>93</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>37</td>\n",
" <td>93</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>170</td>\n",
" <td>153</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>176</td>\n",
" <td>09</td>\n",
" <td>00</td>\n",
" <td>37</td>\n",
" <td>103</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>37</td>\n",
" <td>103</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>169</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>176</td>\n",
" <td>18</td>\n",
" <td>30</td>\n",
" <td>37</td>\n",
" <td>113</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>37</td>\n",
" <td>113</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>190</td>\n",
" <td>185</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>177</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>36</td>\n",
" <td>20</td>\n",
" <td>68</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>36</td>\n",
" <td>20</td>\n",
" <td>68</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>35</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>177</td>\n",
" <td>07</td>\n",
" <td>00</td>\n",
" <td>40</td>\n",
" <td>25</td>\n",
" <td>71</td>\n",
" <td>34</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>40</td>\n",
" <td>25</td>\n",
" <td>71</td>\n",
" <td>34</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>170</td>\n",
" <td>33</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>177</td>\n",
" <td>09</td>\n",
" <td>00</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>43</td>\n",
" <td>27</td>\n",
" <td>70</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>41</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>177</td>\n",
" <td>18</td>\n",
" <td>30</td>\n",
" <td>45</td>\n",
" <td>32</td>\n",
" <td>77</td>\n",
" <td>36</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>45</td>\n",
" <td>32</td>\n",
" <td>77</td>\n",
" <td>36</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>190</td>\n",
" <td>49</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>178</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>38</td>\n",
" <td>39</td>\n",
" <td>40</td>\n",
" <td>23</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>38</td>\n",
" <td>39</td>\n",
" <td>40</td>\n",
" <td>23</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>140</td>\n",
" <td>50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>178</td>\n",
" <td>07</td>\n",
" <td>00</td>\n",
" <td>38</td>\n",
" <td>39</td>\n",
" <td>42</td>\n",
" <td>41</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>38</td>\n",
" <td>39</td>\n",
" <td>62</td>\n",
" <td>21</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>160</td>\n",
" <td>90</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>178</td>\n",
" <td>09</td>\n",
" <td>00</td>\n",
" <td>38</td>\n",
" <td>39</td>\n",
" <td>43</td>\n",
" <td>50</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>38</td>\n",
" <td>39</td>\n",
" <td>71</td>\n",
" <td>22</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>170</td>\n",
" <td>80</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>178</td>\n",
" <td>18</td>\n",
" <td>30</td>\n",
" <td>38</td>\n",
" <td>39</td>\n",
" <td>44</td>\n",
" <td>59</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>38</td>\n",
" <td>39</td>\n",
" <td>80</td>\n",
" <td>23</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>75</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>201</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>24</td>\n",
" <td>24</td>\n",
" <td>17</td>\n",
" <td>58</td>\n",
" <td>17</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>24</td>\n",
" <td>24</td>\n",
" <td>17</td>\n",
" <td>58</td>\n",
" <td>17</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>140</td>\n",
" <td>133</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>201</td>\n",
" <td>07</td>\n",
" <td>00</td>\n",
" <td>30</td>\n",
" <td>36</td>\n",
" <td>18</td>\n",
" <td>58</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>30</td>\n",
" <td>36</td>\n",
" <td>18</td>\n",
" <td>58</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>160</td>\n",
" <td>132</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>201</td>\n",
" <td>09</td>\n",
" <td>00</td>\n",
" <td>33</td>\n",
" <td>36</td>\n",
" <td>25</td>\n",
" <td>58</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>33</td>\n",
" <td>36</td>\n",
" <td>25</td>\n",
" <td>58</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>170</td>\n",
" <td>134</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>201</td>\n",
" <td>18</td>\n",
" <td>30</td>\n",
" <td>36</td>\n",
" <td>50</td>\n",
" <td>18</td>\n",
" <td>58</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>36</td>\n",
" <td>50</td>\n",
" <td>18</td>\n",
" <td>58</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>137</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>202</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>39</td>\n",
" <td>101</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>39</td>\n",
" <td>101</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>140</td>\n",
" <td>103</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>202</td>\n",
" <td>07</td>\n",
" <td>00</td>\n",
" <td>46</td>\n",
" <td>114</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>46</td>\n",
" <td>114</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>160</td>\n",
" <td>103</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>202</td>\n",
" <td>09</td>\n",
" <td>00</td>\n",
" <td>46</td>\n",
" <td>114</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>46</td>\n",
" <td>114</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>160</td>\n",
" <td>103</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>202</td>\n",
" <td>18</td>\n",
" <td>30</td>\n",
" <td>48</td>\n",
" <td>122</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>48</td>\n",
" <td>122</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>170</td>\n",
" <td>103</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>206</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>33</td>\n",
" <td>35</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>33</td>\n",
" <td>35</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>206</td>\n",
" <td>07</td>\n",
" <td>00</td>\n",
" <td>44</td>\n",
" <td>44</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>44</td>\n",
" <td>44</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>140</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>206</td>\n",
" <td>09</td>\n",
" <td>00</td>\n",
" <td>45</td>\n",
" <td>53</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>45</td>\n",
" <td>53</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>17</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>206</td>\n",
" <td>18</td>\n",
" <td>30</td>\n",
" <td>46</td>\n",
" <td>62</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>46</td>\n",
" <td>62</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>160</td>\n",
" <td>10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>210</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>43</td>\n",
" <td>29</td>\n",
" <td>56</td>\n",
" <td>22</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>24</td>\n",
" <td>48</td>\n",
" <td>56</td>\n",
" <td>22</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>115</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>210</td>\n",
" <td>07</td>\n",
" <td>00</td>\n",
" <td>43</td>\n",
" <td>39</td>\n",
" <td>65</td>\n",
" <td>23</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>24</td>\n",
" <td>58</td>\n",
" <td>65</td>\n",
" <td>23</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>170</td>\n",
" <td>131</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <td>210</td>\n",
" <td>09</td>\n",
" <td>00</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>70</td>\n",
" <td>24</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>28</td>\n",
" <td>58</td>\n",
" <td>70</td>\n",
" <td>24</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>180</td>\n",
" <td>137</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31</th>\n",
" <td>210</td>\n",
" <td>18</td>\n",
" <td>30</td>\n",
" <td>43</td>\n",
" <td>47</td>\n",
" <td>75</td>\n",
" <td>25</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>24</td>\n",
" <td>66</td>\n",
" <td>75</td>\n",
" <td>25</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>190</td>\n",
" <td>143</td>\n",
" </tr>\n",
" <tr>\n",
" <th>32</th>\n",
" <td>211</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>28</td>\n",
" <td>97</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>28</td>\n",
" <td>97</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>125</td>\n",
" <td>45</td>\n",
" </tr>\n",
" <tr>\n",
" <th>33</th>\n",
" <td>211</td>\n",
" <td>07</td>\n",
" <td>00</td>\n",
" <td>28</td>\n",
" <td>107</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>28</td>\n",
" <td>107</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>135</td>\n",
" <td>45</td>\n",
" </tr>\n",
" <tr>\n",
" <th>34</th>\n",
" <td>211</td>\n",
" <td>09</td>\n",
" <td>00</td>\n",
" <td>28</td>\n",
" <td>112</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>28</td>\n",
" <td>112</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>140</td>\n",
" <td>55</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35</th>\n",
" <td>211</td>\n",
" <td>18</td>\n",
" <td>30</td>\n",
" <td>28</td>\n",
" <td>117</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>28</td>\n",
" <td>117</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>145</td>\n",
" <td>55</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>36 rows × 21 columns</p>\n",
"</div>"
],
"text/plain": [
" inter_no start_hour start_minute dura_A1 dura_A2 dura_A3 dura_A4 \\\n",
"0 175 00 00 37 39 55 29 \n",
"1 175 07 00 40 42 55 33 \n",
"2 175 09 00 43 45 55 37 \n",
"3 175 18 30 46 48 55 41 \n",
"4 176 00 00 37 73 40 0 \n",
"5 176 07 00 37 93 40 0 \n",
"6 176 09 00 37 103 40 0 \n",
"7 176 18 30 37 113 40 0 \n",
"8 177 00 00 36 20 68 26 \n",
"9 177 07 00 40 25 71 34 \n",
"10 177 09 00 43 27 70 40 \n",
"11 177 18 30 45 32 77 36 \n",
"12 178 00 00 38 39 40 23 \n",
"13 178 07 00 38 39 42 41 \n",
"14 178 09 00 38 39 43 50 \n",
"15 178 18 30 38 39 44 59 \n",
"16 201 00 00 24 24 17 58 \n",
"17 201 07 00 30 36 18 58 \n",
"18 201 09 00 33 36 25 58 \n",
"19 201 18 30 36 50 18 58 \n",
"20 202 00 00 39 101 0 0 \n",
"21 202 07 00 46 114 0 0 \n",
"22 202 09 00 46 114 0 0 \n",
"23 202 18 30 48 122 0 0 \n",
"24 206 00 00 33 35 26 26 \n",
"25 206 07 00 44 44 26 26 \n",
"26 206 09 00 45 53 26 26 \n",
"27 206 18 30 46 62 26 26 \n",
"28 210 00 00 43 29 56 22 \n",
"29 210 07 00 43 39 65 23 \n",
"30 210 09 00 43 43 70 24 \n",
"31 210 18 30 43 47 75 25 \n",
"32 211 00 00 28 97 0 0 \n",
"33 211 07 00 28 107 0 0 \n",
"34 211 09 00 28 112 0 0 \n",
"35 211 18 30 28 117 0 0 \n",
"\n",
" dura_A5 dura_A6 dura_A7 ... dura_B1 dura_B2 dura_B3 dura_B4 \\\n",
"0 0 0 0 ... 37 39 25 59 \n",
"1 0 0 0 ... 40 42 29 59 \n",
"2 0 0 0 ... 43 45 33 59 \n",
"3 0 0 0 ... 46 48 37 59 \n",
"4 0 0 0 ... 37 73 40 0 \n",
"5 0 0 0 ... 37 93 40 0 \n",
"6 0 0 0 ... 37 103 40 0 \n",
"7 0 0 0 ... 37 113 40 0 \n",
"8 0 0 0 ... 36 20 68 26 \n",
"9 0 0 0 ... 40 25 71 34 \n",
"10 0 0 0 ... 43 27 70 40 \n",
"11 0 0 0 ... 45 32 77 36 \n",
"12 0 0 0 ... 38 39 40 23 \n",
"13 0 0 0 ... 38 39 62 21 \n",
"14 0 0 0 ... 38 39 71 22 \n",
"15 0 0 0 ... 38 39 80 23 \n",
"16 17 0 0 ... 24 24 17 58 \n",
"17 18 0 0 ... 30 36 18 58 \n",
"18 18 0 0 ... 33 36 25 58 \n",
"19 18 0 0 ... 36 50 18 58 \n",
"20 0 0 0 ... 39 101 0 0 \n",
"21 0 0 0 ... 46 114 0 0 \n",
"22 0 0 0 ... 46 114 0 0 \n",
"23 0 0 0 ... 48 122 0 0 \n",
"24 0 0 0 ... 33 35 26 26 \n",
"25 0 0 0 ... 44 44 26 26 \n",
"26 0 0 0 ... 45 53 26 26 \n",
"27 0 0 0 ... 46 62 26 26 \n",
"28 0 0 0 ... 24 48 56 22 \n",
"29 0 0 0 ... 24 58 65 23 \n",
"30 0 0 0 ... 28 58 70 24 \n",
"31 0 0 0 ... 24 66 75 25 \n",
"32 0 0 0 ... 28 97 0 0 \n",
"33 0 0 0 ... 28 107 0 0 \n",
"34 0 0 0 ... 28 112 0 0 \n",
"35 0 0 0 ... 28 117 0 0 \n",
"\n",
" dura_B5 dura_B6 dura_B7 dura_B8 cycle offset \n",
"0 0 0 0 0 160 57 \n",
"1 0 0 0 0 170 40 \n",
"2 0 0 0 0 180 28 \n",
"3 0 0 0 0 190 18 \n",
"4 0 0 0 0 150 131 \n",
"5 0 0 0 0 170 153 \n",
"6 0 0 0 0 180 169 \n",
"7 0 0 0 0 190 185 \n",
"8 0 0 0 0 150 35 \n",
"9 0 0 0 0 170 33 \n",
"10 0 0 0 0 180 41 \n",
"11 0 0 0 0 190 49 \n",
"12 0 0 0 0 140 50 \n",
"13 0 0 0 0 160 90 \n",
"14 0 0 0 0 170 80 \n",
"15 0 0 0 0 180 75 \n",
"16 17 0 0 0 140 133 \n",
"17 18 0 0 0 160 132 \n",
"18 18 0 0 0 170 134 \n",
"19 18 0 0 0 180 137 \n",
"20 0 0 0 0 140 103 \n",
"21 0 0 0 0 160 103 \n",
"22 0 0 0 0 160 103 \n",
"23 0 0 0 0 170 103 \n",
"24 0 0 0 0 120 10 \n",
"25 0 0 0 0 140 7 \n",
"26 0 0 0 0 150 17 \n",
"27 0 0 0 0 160 10 \n",
"28 0 0 0 0 150 115 \n",
"29 0 0 0 0 170 131 \n",
"30 0 0 0 0 180 137 \n",
"31 0 0 0 0 190 143 \n",
"32 0 0 0 0 125 45 \n",
"33 0 0 0 0 135 45 \n",
"34 0 0 0 0 140 55 \n",
"35 0 0 0 0 145 55 \n",
"\n",
"[36 rows x 21 columns]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pland"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2 2\n"
]
}
],
"source": [
"cums_A = np.array(cums_A)\n",
"t = 40\n",
"phas_A = len(cums_A[cums_A < t]) + 1\n",
"phas_B = len(cums_B[cums_B < t]) + 1\n",
"print(phas_A, phas_B)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0\n",
"inter_no 175\n",
"start_hour 00\n",
"start_minute 00\n",
"dura_A1 37\n",
"dura_A2 39\n",
"dura_A3 55\n",
"dura_A4 29\n",
"dura_A5 0\n",
"dura_A6 0\n",
"dura_A7 0\n",
"dura_A8 0\n",
"dura_B1 37\n",
"dura_B2 39\n",
"dura_B3 25\n",
"dura_B4 59\n",
"dura_B5 0\n",
"dura_B6 0\n",
"dura_B7 0\n",
"dura_B8 0\n",
"cycle 160\n",
"offset 57\n",
"Name: 0, dtype: object\n"
]
}
],
"source": [
"# 신호계획\n",
"plan = pd.read_csv(\"time_plan.csv\")\n",
"plan = plan[plan.ID.isin([1, 5, 8, 11])]\n",
"ID2starttime = {1:\"00:00\", 5:\"07:00\", 8:\"09:00\", 11:\"18:30\"}\n",
"plan['start_hour'] = plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[0])\n",
"plan['start_minute']=plan.ID.apply(lambda id:ID2starttime[id].split(\":\")[1])\n",
"plan = plan[['inter_no', 'start_hour', 'start_minute', 'phase_no', 'ring_type', 'duration', 'cycle', 'offset']]\n",
"plan = plan.pivot_table(index=['inter_no', 'start_hour', 'start_minute', 'cycle', 'offset'], columns=['phase_no','ring_type'], values='duration', aggfunc='first').fillna(0).astype(int)\n",
"new_columns = [f'dura_{ring}{phase}' for phase in range(1, 6) for ring in ['A', 'B']]\n",
"plan.columns = new_columns\n",
"new_columns = [f'dura_{ring}{phase}' for phase in range(1, 9) for ring in ['A', 'B']]\n",
"for col in new_columns:\n",
" if col not in plan.columns:\n",
" plan[col] = 0\n",
"plan.reset_index(inplace=True)\n",
"plan = plan[list(plan.columns)[:3] + sorted(plan.columns)[1:-4] + list(plan.columns)[3:5]]\n",
"\n",
"i, row = [(i, row) for (i, row) in plan.iterrows()][0]\n",
"print(i)\n",
"print(row)\n",
"dura_A1 = row['dura_A1']\n",
"dura_A2 = row['dura_A2']\n",
"dura_A3 = row['dura_A3']\n",
"dura_A4 = row['dura_A4']\n",
"dura_A5 = row['dura_A5']\n",
"dura_A6 = row['dura_A6']\n",
"dura_A7 = row['dura_A7']\n",
"dura_A8 = row['dura_A8']\n",
"dura_B1 = row['dura_B1']\n",
"dura_B2 = row['dura_B2']\n",
"dura_B3 = row['dura_B3']\n",
"dura_B4 = row['dura_B4']\n",
"dura_B5 = row['dura_B5']\n",
"dura_B6 = row['dura_B6']\n",
"dura_B7 = row['dura_B7']\n",
"dura_B8 = row['dura_B8']\n",
"cums_A = np.array(pland[[f'dura_A{k}' for k in range(1,9)]].cumsum(axis=1))\n",
"# for i, row in plan.iterrows():\n",
"# k = 1\n",
"# for j in range(1, 9):\n",
"# if row[f'dura_A{j}'] == row[f'dura_B{j}']:\n",
"# rowd = {'inter_no':row['inter_no'], 'start_hour':row['start_hour'], 'start_minute':row['start_minute'],\n",
"# 'cycle':row['cycle'], 'offset':row['offset']}\n",
"# # pland.at[i, f'ddur_{k}'] = ddur[j]"
]
},
{
"cell_type": "code",
"execution_count": 6,
"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>start_hour</th>\n",
" <th>start_minute</th>\n",
" <th>ddur_1</th>\n",
" <th>ddur_2</th>\n",
" <th>ddur_3</th>\n",
" <th>ddur_4</th>\n",
" <th>ddur_5</th>\n",
" <th>ddur_6</th>\n",
" <th>ddur_7</th>\n",
" <th>ddur_8</th>\n",
" <th>cycle</th>\n",
" <th>offset</th>\n",
" <th>end_unix</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>206</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>33</td>\n",
" <td>35</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>10</td>\n",
" <td>1704380520</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>211</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>28</td>\n",
" <td>97</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>125</td>\n",
" <td>45</td>\n",
" <td>1704380525</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>178</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>38</td>\n",
" <td>39</td>\n",
" <td>40</td>\n",
" <td>23</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>140</td>\n",
" <td>50</td>\n",
" <td>1704380540</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>201</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>24</td>\n",
" <td>24</td>\n",
" <td>17</td>\n",
" <td>58</td>\n",
" <td>17</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>140</td>\n",
" <td>133</td>\n",
" <td>1704380540</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>202</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>39</td>\n",
" <td>101</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>140</td>\n",
" <td>103</td>\n",
" <td>1704380540</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>177</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>36</td>\n",
" <td>20</td>\n",
" <td>68</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>35</td>\n",
" <td>1704380550</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>210</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>24</td>\n",
" <td>19</td>\n",
" <td>29</td>\n",
" <td>56</td>\n",
" <td>22</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>115</td>\n",
" <td>1704380550</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>176</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>131</td>\n",
" <td>1704380551</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>175</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>37</td>\n",
" <td>39</td>\n",
" <td>25</td>\n",
" <td>30</td>\n",
" <td>29</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>160</td>\n",
" <td>57</td>\n",
" <td>1704380559</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>206</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>33</td>\n",
" <td>35</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>10</td>\n",
" <td>1704380640</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>211</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>28</td>\n",
" <td>97</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>125</td>\n",
" <td>45</td>\n",
" <td>1704380645</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>202</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>39</td>\n",
" <td>101</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>140</td>\n",
" <td>103</td>\n",
" <td>1704380680</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>178</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>38</td>\n",
" <td>39</td>\n",
" <td>40</td>\n",
" <td>23</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>140</td>\n",
" <td>50</td>\n",
" <td>1704380680</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>201</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>24</td>\n",
" <td>24</td>\n",
" <td>17</td>\n",
" <td>58</td>\n",
" <td>17</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>140</td>\n",
" <td>133</td>\n",
" <td>1704380680</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>176</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>131</td>\n",
" <td>1704380700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>210</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>24</td>\n",
" <td>19</td>\n",
" <td>29</td>\n",
" <td>56</td>\n",
" <td>22</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>115</td>\n",
" <td>1704380700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>177</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>36</td>\n",
" <td>20</td>\n",
" <td>68</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>35</td>\n",
" <td>1704380700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>175</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>37</td>\n",
" <td>39</td>\n",
" <td>25</td>\n",
" <td>30</td>\n",
" <td>29</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>160</td>\n",
" <td>57</td>\n",
" <td>1704380720</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>206</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>33</td>\n",
" <td>35</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>10</td>\n",
" <td>1704380760</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>211</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>28</td>\n",
" <td>97</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>125</td>\n",
" <td>45</td>\n",
" <td>1704380765</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>178</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>38</td>\n",
" <td>39</td>\n",
" <td>40</td>\n",
" <td>23</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>140</td>\n",
" <td>50</td>\n",
" <td>1704380820</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>202</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>39</td>\n",
" <td>101</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>140</td>\n",
" <td>103</td>\n",
" <td>1704380820</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>201</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>24</td>\n",
" <td>24</td>\n",
" <td>17</td>\n",
" <td>58</td>\n",
" <td>17</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>140</td>\n",
" <td>133</td>\n",
" <td>1704380820</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>210</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>24</td>\n",
" <td>19</td>\n",
" <td>29</td>\n",
" <td>56</td>\n",
" <td>22</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>115</td>\n",
" <td>1704380850</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>176</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>37</td>\n",
" <td>73</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>131</td>\n",
" <td>1704380850</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>177</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>36</td>\n",
" <td>20</td>\n",
" <td>68</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>150</td>\n",
" <td>35</td>\n",
" <td>1704380851</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>175</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>37</td>\n",
" <td>39</td>\n",
" <td>25</td>\n",
" <td>30</td>\n",
" <td>29</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>160</td>\n",
" <td>57</td>\n",
" <td>1704380880</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>206</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>33</td>\n",
" <td>35</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>120</td>\n",
" <td>10</td>\n",
" <td>1704380880</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>211</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>28</td>\n",
" <td>97</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>125</td>\n",
" <td>45</td>\n",
" <td>1704380885</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>201</td>\n",
" <td>00</td>\n",
" <td>00</td>\n",
" <td>24</td>\n",
" <td>24</td>\n",
" <td>17</td>\n",
" <td>58</td>\n",
" <td>17</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>140</td>\n",
" <td>133</td>\n",
" <td>1704380960</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no start_hour start_minute ddur_1 ddur_2 ddur_3 ddur_4 ddur_5 ddur_6 \\\n",
"0 206 00 00 33 35 26 26 0 0 \n",
"1 211 00 00 28 97 0 0 0 0 \n",
"2 178 00 00 38 39 40 23 0 0 \n",
"3 201 00 00 24 24 17 58 17 0 \n",
"4 202 00 00 39 101 0 0 0 0 \n",
"5 177 00 00 36 20 68 26 0 0 \n",
"6 210 00 00 24 19 29 56 22 0 \n",
"7 176 00 00 37 73 40 0 0 0 \n",
"8 175 00 00 37 39 25 30 29 0 \n",
"9 206 00 00 33 35 26 26 0 0 \n",
"10 211 00 00 28 97 0 0 0 0 \n",
"11 202 00 00 39 101 0 0 0 0 \n",
"12 178 00 00 38 39 40 23 0 0 \n",
"13 201 00 00 24 24 17 58 17 0 \n",
"14 176 00 00 37 73 40 0 0 0 \n",
"15 210 00 00 24 19 29 56 22 0 \n",
"16 177 00 00 36 20 68 26 0 0 \n",
"17 175 00 00 37 39 25 30 29 0 \n",
"18 206 00 00 33 35 26 26 0 0 \n",
"19 211 00 00 28 97 0 0 0 0 \n",
"20 178 00 00 38 39 40 23 0 0 \n",
"21 202 00 00 39 101 0 0 0 0 \n",
"22 201 00 00 24 24 17 58 17 0 \n",
"23 210 00 00 24 19 29 56 22 0 \n",
"24 176 00 00 37 73 40 0 0 0 \n",
"25 177 00 00 36 20 68 26 0 0 \n",
"26 175 00 00 37 39 25 30 29 0 \n",
"27 206 00 00 33 35 26 26 0 0 \n",
"28 211 00 00 28 97 0 0 0 0 \n",
"29 201 00 00 24 24 17 58 17 0 \n",
"\n",
" ddur_7 ddur_8 cycle offset end_unix \n",
"0 0 0 120 10 1704380520 \n",
"1 0 0 125 45 1704380525 \n",
"2 0 0 140 50 1704380540 \n",
"3 0 0 140 133 1704380540 \n",
"4 0 0 140 103 1704380540 \n",
"5 0 0 150 35 1704380550 \n",
"6 0 0 150 115 1704380550 \n",
"7 0 0 150 131 1704380551 \n",
"8 0 0 160 57 1704380559 \n",
"9 0 0 120 10 1704380640 \n",
"10 0 0 125 45 1704380645 \n",
"11 0 0 140 103 1704380680 \n",
"12 0 0 140 50 1704380680 \n",
"13 0 0 140 133 1704380680 \n",
"14 0 0 150 131 1704380700 \n",
"15 0 0 150 115 1704380700 \n",
"16 0 0 150 35 1704380700 \n",
"17 0 0 160 57 1704380720 \n",
"18 0 0 120 10 1704380760 \n",
"19 0 0 125 45 1704380765 \n",
"20 0 0 140 50 1704380820 \n",
"21 0 0 140 103 1704380820 \n",
"22 0 0 140 133 1704380820 \n",
"23 0 0 150 115 1704380850 \n",
"24 0 0 150 131 1704380850 \n",
"25 0 0 150 35 1704380851 \n",
"26 0 0 160 57 1704380880 \n",
"27 0 0 120 10 1704380880 \n",
"28 0 0 125 45 1704380885 \n",
"29 0 0 140 133 1704380960 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 신호이력\n",
"midnight = int(datetime(2024, 1, 5, 0, 0, 0).timestamp())\n",
"next_day = int(datetime(2024, 1, 6, 0, 0, 0).timestamp())\n",
"pland['end_unix'] = pland['start_hour'].astype(int)*3600 + plan['start_minute'].astype(int)*60 + midnight\n",
"history = []\n",
"for inter_no in pland.inter_no.unique():\n",
" aplan = pland[pland.inter_no == inter_no]\n",
" rows = []\n",
" current_time = midnight\n",
" for i in range(len(aplan)):\n",
" first_row = aplan.iloc[i]\n",
" cycle = first_row['cycle']\n",
" unix_end = aplan.iloc[i+1]['end_unix'] if i < len(aplan) - 1 else next_day\n",
" r = 0\n",
" while current_time <= unix_end:\n",
" remainder = current_time % 10\n",
" if remainder != 0:\n",
" r = (5 - remainder) % 10 - 5\n",
" else:\n",
" r = random.choices([0, -1, 1], weights=[10, 1, 1])[0]\n",
" if random.random() < 0.005:\n",
" n = random.randint(0,100)\n",
" current_time += n * cycle + r\n",
" elif random.random() > 0.995:\n",
" n = random.randint(0,100)\n",
" current_time += n * cycle + int(random.random() * cycle) + r\n",
" else:\n",
" current_time += cycle + r\n",
" new_row = first_row.copy()\n",
" new_row['end_unix'] = current_time\n",
" rows.append(new_row)\n",
" ahistory = pd.concat(rows, axis=1).transpose().reset_index(drop=True)\n",
" history.append(ahistory)\n",
"history = pd.concat(history)\n",
"history = history[history.end_unix <= next_day]\n",
"history = history.sort_values(by='end_unix').reset_index(drop=True)\n",
"history.to_csv('../history.csv')\n",
"display(history[:30])"
]
},
{
"cell_type": "code",
"execution_count": null,
"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>inter_type</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>175</td>\n",
" <td>i0</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>175</td>\n",
" <td>u00</td>\n",
" <td>child</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>176</td>\n",
" <td>i1</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>177</td>\n",
" <td>i2</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>177</td>\n",
" <td>u20</td>\n",
" <td>child</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>178</td>\n",
" <td>i3</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>178</td>\n",
" <td>u30</td>\n",
" <td>child</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>178</td>\n",
" <td>u31</td>\n",
" <td>child</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>178</td>\n",
" <td>u32</td>\n",
" <td>child</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>201</td>\n",
" <td>i8</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>202</td>\n",
" <td>i9</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>206</td>\n",
" <td>i7</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>210</td>\n",
" <td>i6</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>210</td>\n",
" <td>u60</td>\n",
" <td>child</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>211</td>\n",
" <td>c30</td>\n",
" <td>parent</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no node_id inter_type\n",
"0 175 i0 parent\n",
"1 175 u00 child\n",
"2 176 i1 parent\n",
"3 177 i2 parent\n",
"4 177 u20 child\n",
"5 178 i3 parent\n",
"6 178 u30 child\n",
"7 178 u31 child\n",
"8 178 u32 child\n",
"9 201 i8 parent\n",
"10 202 i9 parent\n",
"11 206 i7 parent\n",
"12 210 i6 parent\n",
"13 210 u60 child\n",
"14 211 c30 parent"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 교차로-노드 매칭\n",
"uturn = pd.read_csv('U_TURN.csv')\n",
"inter_node = pd.read_csv('inter.csv')\n",
"inter_node = inter_node[['INT_NO', 'node_id', 'P/C']]\n",
"# inter_node.drop(index=len(inter_node) - 1, inplace=True)\n",
"inter_node.columns = ['inter_no', 'node_id', 'inter_type'] # parent : 주교차로, child : 부교차로\n",
"inter_node['inter_no'] = inter_node['inter_no'].astype(int) # i : intersection, u : u-turn intersection, c : coupling intersection\n",
"inter_node.iloc[-1] = pd.Series([211, 'c30', 'parent'])\n",
"inter_node.to_csv('../inter_node.csv')\n",
"display(inter_node)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 부교차로 정보\n",
"# 지금은 생략 (23. 1. 9. 09:32)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "rts",
"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.10"
}
},
"nbformat": 4,
"nbformat_minor": 2
}