From d65e9287e177f50b5cab93481b91d7417a2e451a Mon Sep 17 00:00:00 2001 From: govin08 Date: Thu, 25 Jan 2024 17:41:57 +0900 Subject: [PATCH] je pense que c'est fait, peut-etre --- .../0109_preprocess/0122_preprocess_9.ipynb | 4383 ++++------------- Analysis/0109_preprocess/0125/hrhists.csv | 773 +++ Analysis/0109_preprocess/0125/movement.csv | 814 +++ .../0125/movements_wo_start_unix.csv | 33 + .../table_definition_v0.8.4.xlsx | Bin 75728 -> 75718 bytes 5 files changed, 2485 insertions(+), 3518 deletions(-) create mode 100644 Analysis/0109_preprocess/0125/hrhists.csv create mode 100644 Analysis/0109_preprocess/0125/movement.csv create mode 100644 Analysis/0109_preprocess/0125/movements_wo_start_unix.csv diff --git a/Analysis/0109_preprocess/0122_preprocess_9.ipynb b/Analysis/0109_preprocess/0122_preprocess_9.ipynb index 347c4df3e..f965c317a 100644 --- a/Analysis/0109_preprocess/0122_preprocess_9.ipynb +++ b/Analysis/0109_preprocess/0122_preprocess_9.ipynb @@ -31,14 +31,14 @@ "name": "stderr", "output_type": "stream", "text": [ - " 0%| | 15/17280 [00:00<01:56, 148.29it/s]" + " 0%| | 0/17280 [00:00=10 : 현시시간 합의 차\n", - " else:\n", - " pass\n", - " rhistory.loc[i, 'start_unix'] = start_unix \n", - "rhistory[rhistory.isna()] = 0\n", - "rhistory['start_unix'] = rhistory['start_unix'].astype(int)\n", - "rhistory[['inter_no', 'start_unix', 'cycle']][rhistory.inter_no==175]\n", - "rhistory = rhistory[['inter_no', 'start_unix'] + [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)] + ['cycle']]\n", - "inter_no = 201" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "def calculate_DS(rhist, curr_unix):\n", - " ghour_lt_curr_unix = hours[hours <= curr_unix].max() # the greatest hour less than (or equal to) curr_unix\n", - " start_unixes = rhist.start_unix.unique()\n", - " start_unixes_lt_ghour = np.sort(start_unixes[start_unixes < ghour_lt_curr_unix]) # start unixes less than ghour_lt_curr_unix\n", - " # 기준유닉스(base_unix) : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 start_unix\n", - " if list(start_unixes_lt_ghour):\n", - " base_unix = start_unixes_lt_ghour[-5]\n", - " # start_unixes_lt_ghour가 비었을 경우에는 맨 앞 start_unix로 base_unix를 지정\n", - " else:\n", - " base_unix = rhist.start_unix.min()\n", - " D_n = curr_unix - base_unix\n", - " S_n_durs = rhist[(rhist.start_unix > base_unix) & (rhist.start_unix <= curr_unix)] \\\n", - " [[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n", - " S_n = S_n_durs.values.sum() // 2\n", - " return D_n, S_n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ + }, { "data": { "text/html": [ @@ -5012,273 +4949,501 @@ " \n", " inter_no\n", " start_unix\n", + " dura_A1\n", + " dura_A2\n", + " dura_A3\n", + " dura_A4\n", + " dura_A5\n", + " dura_A6\n", + " dura_A7\n", + " dura_A8\n", + " dura_B1\n", + " dura_B2\n", + " dura_B3\n", + " dura_B4\n", + " dura_B5\n", + " dura_B6\n", + " dura_B7\n", + " dura_B8\n", " cycle\n", - " D_n\n", - " S_n\n", - " diff\n", " \n", " \n", " \n", " \n", - " 65\n", - " 202\n", - " 1704389500\n", + " 60\n", + " 178\n", + " 1704388800\n", + " 38\n", + " 39\n", + " 40\n", + " 23\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 38\n", + " 39\n", + " 40\n", + " 23\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", " 140\n", - " 2520\n", - " 2520\n", - " 140.0\n", " \n", " \n", - " 66\n", - " 202\n", - " 1704389640\n", + " 60\n", + " 201\n", + " 1704388800\n", + " 24\n", + " 24\n", + " 17\n", + " 58\n", + " 17\n", + " 0\n", + " 0\n", + " 0\n", + " 24\n", + " 24\n", + " 17\n", + " 58\n", + " 17\n", + " 0\n", + " 0\n", + " 0\n", " 140\n", - " 2660\n", - " 2660\n", - " 140.0\n", " \n", " \n", - " 67\n", + " 60\n", " 202\n", - " 1704389780\n", + " 1704388800\n", + " 39\n", + " 101\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 39\n", + " 101\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", " 140\n", - " 2800\n", - " 2800\n", - " 140.0\n", " \n", " \n", - " 68\n", - " 202\n", - " 1704389920\n", - " 140\n", - " 2940\n", - " 2940\n", - " 140.0\n", + " 70\n", + " 206\n", + " 1704388800\n", + " 33\n", + " 35\n", + " 26\n", + " 26\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 33\n", + " 35\n", + " 26\n", + " 26\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 120\n", " \n", " \n", - " 69\n", - " 202\n", - " 1704390389\n", - " 140\n", - " 3409\n", - " 3080\n", - " 469.0\n", + " 56\n", + " 177\n", + " 1704388801\n", + " 36\n", + " 20\n", + " 68\n", + " 26\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 36\n", + " 20\n", + " 68\n", + " 26\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 150\n", " \n", " \n", - " 70\n", - " 202\n", - " 1704390529\n", - " 140\n", - " 3549\n", - " 3220\n", - " 140.0\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", " \n", " \n", - " 71\n", - " 202\n", - " 1704390670\n", - " 140\n", - " 3690\n", - " 3360\n", - " 141.0\n", + " 78\n", + " 210\n", + " 1704392159\n", + " 43\n", + " 29\n", + " 56\n", + " 22\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 24\n", + " 48\n", + " 56\n", + " 22\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 150\n", " \n", " \n", - " 72\n", - " 202\n", - " 1704390810\n", + " 84\n", + " 178\n", + " 1704392160\n", + " 38\n", + " 39\n", + " 40\n", + " 23\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 38\n", + " 39\n", + " 40\n", + " 23\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", " 140\n", - " 3830\n", - " 3500\n", - " 140.0\n", " \n", " \n", - " 73\n", - " 202\n", - " 1704390950\n", + " 84\n", + " 201\n", + " 1704392160\n", + " 24\n", + " 24\n", + " 17\n", + " 58\n", + " 17\n", + " 0\n", + " 0\n", + " 0\n", + " 24\n", + " 24\n", + " 17\n", + " 58\n", + " 17\n", + " 0\n", + " 0\n", + " 0\n", " 140\n", - " 3970\n", - " 3640\n", - " 140.0\n", " \n", " \n", - " 74\n", - " 202\n", - " 1704391090\n", - " 140\n", - " 4110\n", - " 3780\n", - " 140.0\n", - " \n", - " \n", - " 75\n", - " 202\n", - " 1704391230\n", - " 140\n", - " 701\n", - " 700\n", - " 140.0\n", - " \n", - " \n", - " 76\n", - " 202\n", - " 1704391370\n", - " 140\n", - " 841\n", - " 840\n", - " 140.0\n", - " \n", - " \n", - " 77\n", - " 202\n", - " 1704391509\n", - " 140\n", - " 980\n", - " 980\n", - " 139.0\n", - " \n", - " \n", - " 78\n", - " 202\n", - " 1704391650\n", - " 140\n", - " 1121\n", - " 1120\n", - " 141.0\n", - " \n", - " \n", - " 79\n", - " 202\n", - " 1704391790\n", - " 140\n", - " 1261\n", - " 1260\n", - " 140.0\n", - " \n", - " \n", - " 80\n", - " 202\n", - " 1704391930\n", - " 140\n", - " 1401\n", - " 1400\n", - " 140.0\n", - " \n", - " \n", - " 81\n", - " 202\n", - " 1704392070\n", - " 140\n", - " 1541\n", - " 1540\n", - " 140.0\n", - " \n", - " \n", - " 82\n", - " 202\n", - " 1704392211\n", - " 140\n", - " 1682\n", - " 1680\n", - " 141.0\n", - " \n", - " \n", - " 83\n", - " 202\n", - " 1704392350\n", - " 140\n", - " 1821\n", - " 1820\n", - " 139.0\n", + " 98\n", + " 206\n", + " 1704392160\n", + " 33\n", + " 35\n", + " 26\n", + " 26\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 33\n", + " 35\n", + " 26\n", + " 26\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 120\n", " \n", " \n", " 84\n", " 202\n", - " 1704392490\n", + " 1704392211\n", + " 39\n", + " 101\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 39\n", + " 101\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", + " 0\n", " 140\n", - " 1961\n", - " 1960\n", - " 140.0\n", " \n", " \n", "\n", + "

194 rows × 19 columns

\n", "" ], "text/plain": [ - " inter_no start_unix cycle D_n S_n diff\n", - "65 202 1704389500 140 2520 2520 140.0\n", - "66 202 1704389640 140 2660 2660 140.0\n", - "67 202 1704389780 140 2800 2800 140.0\n", - "68 202 1704389920 140 2940 2940 140.0\n", - "69 202 1704390389 140 3409 3080 469.0\n", - "70 202 1704390529 140 3549 3220 140.0\n", - "71 202 1704390670 140 3690 3360 141.0\n", - "72 202 1704390810 140 3830 3500 140.0\n", - "73 202 1704390950 140 3970 3640 140.0\n", - "74 202 1704391090 140 4110 3780 140.0\n", - "75 202 1704391230 140 701 700 140.0\n", - "76 202 1704391370 140 841 840 140.0\n", - "77 202 1704391509 140 980 980 139.0\n", - "78 202 1704391650 140 1121 1120 141.0\n", - "79 202 1704391790 140 1261 1260 140.0\n", - "80 202 1704391930 140 1401 1400 140.0\n", - "81 202 1704392070 140 1541 1540 140.0\n", - "82 202 1704392211 140 1682 1680 141.0\n", - "83 202 1704392350 140 1821 1820 139.0\n", - "84 202 1704392490 140 1961 1960 140.0" + " inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 \\\n", + "60 178 1704388800 38 39 40 23 0 \n", + "60 201 1704388800 24 24 17 58 17 \n", + "60 202 1704388800 39 101 0 0 0 \n", + "70 206 1704388800 33 35 26 26 0 \n", + "56 177 1704388801 36 20 68 26 0 \n", + ".. ... ... ... ... ... ... ... \n", + "78 210 1704392159 43 29 56 22 0 \n", + "84 178 1704392160 38 39 40 23 0 \n", + "84 201 1704392160 24 24 17 58 17 \n", + "98 206 1704392160 33 35 26 26 0 \n", + "84 202 1704392211 39 101 0 0 0 \n", + "\n", + " dura_A6 dura_A7 dura_A8 dura_B1 dura_B2 dura_B3 dura_B4 dura_B5 \\\n", + "60 0 0 0 38 39 40 23 0 \n", + "60 0 0 0 24 24 17 58 17 \n", + "60 0 0 0 39 101 0 0 0 \n", + "70 0 0 0 33 35 26 26 0 \n", + "56 0 0 0 36 20 68 26 0 \n", + ".. ... ... ... ... ... ... ... ... \n", + "78 0 0 0 24 48 56 22 0 \n", + "84 0 0 0 38 39 40 23 0 \n", + "84 0 0 0 24 24 17 58 17 \n", + "98 0 0 0 33 35 26 26 0 \n", + "84 0 0 0 39 101 0 0 0 \n", + "\n", + " dura_B6 dura_B7 dura_B8 cycle \n", + "60 0 0 0 140 \n", + "60 0 0 0 140 \n", + "60 0 0 0 140 \n", + "70 0 0 0 120 \n", + "56 0 0 0 150 \n", + ".. ... ... ... ... \n", + "78 0 0 0 150 \n", + "84 0 0 0 140 \n", + "84 0 0 0 140 \n", + "98 0 0 0 120 \n", + "84 0 0 0 140 \n", + "\n", + "[194 rows x 19 columns]" ] }, - "execution_count": 15, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "inter_no = 202\n", + "m = 40\n", + "fmins = range(midnight, next_day, 300) # fmins : unix time by Five MINuteS\n", + "present_time = fmins[m] # 현재시점\n", + "print(datetime.fromtimestamp(present_time))\n", + "\n", + "# 1. 조회시점의 유닉스 타임 이전의 신호이력 수집\n", + "rhistory = history.copy() # recent history\n", + "rhistory = rhistory[(rhistory.end_unix < present_time)]\n", + "# 2. 시작 유닉스 타임컬럼 생성 후 종류 유닉스 타임에서 현시별 현시기간 컬럼의 합을 뺀 값으로 입력\n", + "# - 현시시간의 합을 뺀 시간의 +- 10초 이내에 이전 주기정보가 존재하면 그 유닉스 시간을 시작 유닉스시간 값으로 하고, 존재하지 않으면 현시시간의 합을 뺀 유닉스 시간을 시작 유닉스 시간으로 지정\n", + "for i, row in rhistory.iterrows():\n", + " inter_no = row.inter_no\n", + " end_unix = row.end_unix\n", + " elapsed_time = row[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]].sum() // 2 # 현시시간 합\n", + " # 이전 유닉스 존재하지 않음 : 현시시간 합의 차\n", + " start_unix = end_unix - elapsed_time\n", + " pre_rows = history[:i] # previous rows\n", + " if inter_no in pre_rows.inter_no.unique(): # 이전 유닉스 존재\n", + " pre_unix = pre_rows[pre_rows.inter_no == inter_no]['end_unix'].iloc[-1] # previous unix time\n", + " # 이전 유닉스 존재, abs < 10 : 이전 유닉스\n", + " if abs(pre_unix - start_unix) < 10:\n", + " start_unix = pre_unix\n", + " # 이전 유닉스 존재, abs >=10 : 현시시간 합의 차\n", + " else:\n", + " pass\n", + " rhistory.loc[i, 'start_unix'] = start_unix \n", + "rhistory[rhistory.isna()] = 0\n", + "rhistory['start_unix'] = rhistory['start_unix'].astype(int)\n", + "rhistory[['inter_no', 'start_unix', 'cycle']][rhistory.inter_no==175]\n", + "rhistory = rhistory[['inter_no', 'start_unix'] + [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)] + ['cycle']]\n", + "rhistory\n", + "\n", "# 2-1. 참값 판단 프로세스\n", "hours = np.array(range(midnight, next_day + 1, 3600)) # 정각에 해당하는 시각들 목록\n", "\n", - "rhist = rhistory.copy()[rhistory.inter_no==inter_no]\n", - "rhist = rhist.drop_duplicates(subset=['start_unix']).reset_index(drop=True)\n", + "def calculate_DS(rhist, curr_unix):\n", + " ghour_lt_curr_unix = hours[hours <= curr_unix].max() # the greatest hour less than (or equal to) curr_unix\n", + " start_unixes = rhist.start_unix.unique()\n", + " start_unixes_lt_ghour = np.sort(start_unixes[start_unixes < ghour_lt_curr_unix]) # start unixes less than ghour_lt_curr_unix\n", + " # 기준유닉스(base_unix) : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 start_unix\n", + " if list(start_unixes_lt_ghour):\n", + " base_unix = start_unixes_lt_ghour[-5]\n", + " # start_unixes_lt_ghour가 비었을 경우에는 맨 앞 start_unix로 base_unix를 지정\n", + " else:\n", + " base_unix = rhist.start_unix.min()\n", + " D_n = curr_unix - base_unix\n", + " S_n_durs = rhist[(rhist.start_unix > base_unix) & (rhist.start_unix <= curr_unix)] \\\n", + " [[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n", + " S_n = S_n_durs.values.sum() // 2\n", + " return D_n, S_n\n", + "\n", + "rhists = []\n", + "for inter_no in sorted(rhistory.inter_no.unique()):\n", + " rhist = rhistory.copy()[rhistory.inter_no==inter_no]\n", + " rhist = rhist.drop_duplicates(subset=['start_unix']).reset_index(drop=True)\n", "\n", - "# D_n 및 S_n 값 정의\n", - "rhist['D_n'] = 0 # D_n : 시간차이\n", - "rhist['S_n'] = 0 # S_n : 현시시간합\n", - "for n in range(len(rhist)):\n", - " curr_unix = rhist.iloc[n].start_unix # current start_unix\n", - " rhist.loc[n, ['D_n', 'S_n']] = calculate_DS(rhist, curr_unix)\n", + " # D_n 및 S_n 값 정의\n", + " rhist['D_n'] = 0 # D_n : 시간차이\n", + " rhist['S_n'] = 0 # S_n : 현시시간합\n", + " for n in range(len(rhist)):\n", + " curr_unix = rhist.iloc[n].start_unix # current start_unix\n", + " rhist.loc[n, ['D_n', 'S_n']] = calculate_DS(rhist, curr_unix)\n", + "\n", + " # 이전시각, 현재시각\n", + " prev_unix = rhist.loc[0, 'start_unix'] # previous start_unix\n", + " curr_unix = rhist.loc[1, 'start_unix'] # current start_unix\n", + "\n", + " # rhist의 마지막 행에 도달할 때까지 반복\n", + " while True:\n", + " n = rhist[rhist.start_unix==curr_unix].index[0]\n", + " cycle = rhist.loc[n, 'cycle']\n", + " D_n = rhist.loc[n, 'D_n']\n", + " S_n = rhist.loc[n, 'S_n']\n", + " # 참값인 경우\n", + " if (abs(D_n - S_n) <= 5):\n", + " pass\n", + " # 참값이 아닌 경우\n", + " else:\n", + " # 2-1-1. 결측치 처리 : 인접한 두 start_unix의 차이가 계획된 주기의 두 배보다 크면 결측이 일어났다고 판단, 신호계획의 현시시간으로 \"대체\"\n", + " if curr_unix - prev_unix >= 2 * cycle:\n", + " # prev_unix를 계획된 주기만큼 늘려가면서 한 행씩 채워나간다.\n", + " # (curr_unix와의 차이가 계획된 주기보다 작거나 같아질 때까지)\n", + " new_rows = []\n", + " while curr_unix - prev_unix > cycle:\n", + " prev_unix += cycle\n", + " # 신호 계획(prow) 불러오기\n", + " start_seconds = np.array(timetable.start_seconds)\n", + " idx = (start_seconds <= prev_unix).sum() - 1\n", + " start_hour = timetable.iloc[idx].start_hour\n", + " start_minute = timetable.iloc[idx].start_minute\n", + " prow = plan.copy()[(plan.inter_no==inter_no) & (plan.start_hour==start_hour) & (plan.start_minute==start_minute)] # planned row\n", + " # prow에서 필요한 부분을 rhist에 추가\n", + " prow['start_unix'] = prev_unix\n", + " prow = prow.drop(['start_hour', 'start_minute', 'offset'], axis=1)\n", + " cycle = prow.iloc[0].cycle\n", + " rhist = pd.concat([rhist, prow])\n", + " rhist = rhist.sort_values(by='start_unix').reset_index(drop=True)\n", + " n += 1\n", "\n", - "# 결측 및 이상치 처리\n", - "prev_unix = rhist.loc[0, 'start_unix'] # previous start_unix\n", - "curr_unix = rhist.loc[1, 'start_unix'] # current start_unix\n", - "fina_unix = rhist.start_unix.max() # final start_unix\n", - "rhist_diff = rhist.copy()\n", - "rhist_diff['diff'] = rhist['start_unix'].diff()\n", - "rhist_diff[list(rhist_diff.columns)[:2]+list(rhist_diff.columns)[-4:]][65:85]" + " # 2-1-2. 이상치 처리 : 비율에 따라 해당 행을 \"삭제\"(R_n <= 0.5) 또는 \"조정\"(R_n > 0.5)한다\n", + " R_n = (curr_unix - prev_unix) / cycle # R_n : 비율\n", + " # R_n이 0.5보다 작거나 같으면 해당 행을 삭제\n", + " if R_n <= 0.5:\n", + " rhist = rhist.drop(index=n).reset_index(drop=True)\n", + " # 행삭제에 따른 curr_unix, R_n 재정의\n", + " curr_unix = rhist.loc[n, 'start_unix']\n", + " R_n = (curr_unix - prev_unix) / cycle # R_n : 비율\n", + "\n", + " # R_n이 0.5보다 크면 해당 행 조정 (비율을 유지한 채로 현시시간 대체)\n", + " if R_n > 0.5:\n", + " # 신호 계획(prow) 불러오기\n", + " start_seconds = np.array(timetable.start_seconds)\n", + " idx = (start_seconds <= curr_unix).sum() - 1\n", + " start_hour = timetable.iloc[idx].start_hour\n", + " start_minute = timetable.iloc[idx].start_minute\n", + " prow = plan[(plan.inter_no==inter_no) & (plan.start_hour==start_hour) & (plan.start_minute==start_minute)] # planned row\n", + " # 조정된 현시시간 (prow에 R_n을 곱하고 정수로 바꿈)\n", + " adjusted_dur = prow.copy()[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] * R_n\n", + " int_parts = adjusted_dur.iloc[0].apply(lambda x: int(x))\n", + " frac_parts = adjusted_dur.iloc[0] - int_parts\n", + " difference = round(adjusted_dur.iloc[0].sum()) - int_parts.sum()\n", + " for _ in range(difference): # 소수 부분이 가장 큰 상위 'difference'개의 값에 대해 올림 처리\n", + " max_frac_index = frac_parts.idxmax()\n", + " int_parts[max_frac_index] += 1\n", + " frac_parts[max_frac_index] = 0 # 이미 처리된 항목은 0으로 설정\n", + " # rhist에 조정된 현시시간을 반영\n", + " rhist.loc[n, [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] = int_parts.values\n", + " rhist.loc[n, 'cycle'] = int_parts.sum().sum() // 2\n", + "\n", + " if n == rhist.index[-1]:\n", + " break\n", + " prev_unix = curr_unix\n", + " curr_unix = rhist.loc[n+1, 'start_unix']\n", + " # rhist['start_dt'] = rhist['start_unix'].map(lambda x:datetime.fromtimestamp(x))\n", + "\n", + " # 생략해도 무방할 코드\n", + " rhist = rhist.reset_index(drop=True)\n", + " rhist = rhist.sort_values(by=['start_unix'])\n", + "\n", + " # D_n 및 S_n 값 재정의\n", + " for n in range(len(rhist)):\n", + " curr_unix = rhist.iloc[n].start_unix # current start_unix\n", + " rhist.loc[n, ['D_n', 'S_n']] = calculate_DS(rhist, curr_unix)\n", + " rhists.append(rhist)\n", + "rhists = pd.concat(rhists).sort_values(by=['start_unix','inter_no'])\n", + "rhists = rhists[rhists.start_unix >= present_time - 3600]\n", + "rhists = rhists.drop(columns=['D_n', 'S_n'])\n", + "rhists" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 34, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "array([175, 176, 177, 178, 201, 202, 206, 210], dtype=int64)" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/17280 [00:00\n", " \n", " \n", - " a\n", - " b\n", - " c\n", + " inter_no\n", + " phas_A\n", + " phas_B\n", + " move_A\n", + " move_B\n", " \n", " \n", " \n", " \n", - " 0\n", + " 8\n", + " 175\n", + " 1\n", " 1\n", - " 11\n", - " 111\n", + " 8\n", + " 4\n", " \n", " \n", - " 1\n", + " 15\n", + " 175\n", " 2\n", - " 22\n", - " 222\n", + " 2\n", + " 7\n", + " 3\n", " \n", " \n", - " 2\n", + " 20\n", + " 175\n", " 3\n", - " 33\n", - " 333\n", + " 3\n", + " 6\n", + " 1\n", + " \n", + " \n", + " 24\n", + " 175\n", + " 3\n", + " 4\n", + " 6\n", + " 2\n", + " \n", + " \n", + " 26\n", + " 175\n", + " 4\n", + " 4\n", + " 5\n", + " 2\n", " \n", " \n", "\n", "" ], "text/plain": [ - " a b c\n", - "0 1 11 111\n", - "1 2 22 222\n", - "2 3 33 333" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "22" + " inter_no phas_A phas_B move_A move_B\n", + "8 175 1 1 8 4\n", + "15 175 2 2 7 3\n", + "20 175 3 3 6 1\n", + "24 175 3 4 6 2\n", + "26 175 4 4 5 2" ] }, - "execution_count": 19, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df = pd.DataFrame({'a':[1,2,3],'b':[11,22,33], 'c':[111,222,333]})\n", - "display(df)\n", - "# curr_unix = rhist.loc[n, 'start_unix']\n", - "df.loc[1,'b']\n" + "movements_wo_start_unix_list = [] # movements without start_unix\n", + "for inter_no in sorted(movements.inter_no.unique()):\n", + " movements_wo_start_unix = movements[movements_wo_start_unix.inter_no==inter_no]\n", + " movements_wo_start_unix = movements_wo_start_unix[['inter_no', 'phas_A', 'phas_B', 'move_A', 'move_B']]\n", + " movements_wo_start_unix = movements_wo_start_unix.drop_duplicates().sort_values(by=['phas_A','phas_B'])\n", + " movements_wo_start_unix_list.append(movements_wo_start_unix)\n", + "movements_wo_start_unix = pd.concat(movements_wo_start_unix_list)\n", + "movements_wo_start_unix.head()" ] }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 67, "metadata": {}, "outputs": [ { @@ -5386,3295 +5572,456 @@ " \n", " inter_no\n", " start_unix\n", - " dura_A1\n", - " dura_A2\n", - " dura_A3\n", - " dura_A4\n", - " dura_A5\n", - " cycle\n", - " D_n\n", - " S_n\n", - " diff\n", - " start_dt\n", + " phas_A\n", + " phas_B\n", + " duration\n", " \n", " \n", " \n", " \n", - " 24\n", - " 176\n", - " 1704384054\n", - " 37\n", - " 73\n", - " 40\n", - " 0\n", - " 0\n", - " 150\n", - " 804\n", - " 750\n", - " 204.0\n", - " 2024-01-05 01:00:54\n", + " 0\n", + " 178\n", + " 1704388800\n", + " 1\n", + " 1\n", + " 38\n", " \n", " \n", - " 81\n", - " 176\n", - " 1704392578\n", - " 37\n", - " 73\n", - " 40\n", - " 0\n", - " 0\n", - " 150\n", - " 2078\n", - " 2100\n", - " 128.0\n", - " 2024-01-05 03:22:58\n", + " 1\n", + " 178\n", + " 1704388800\n", + " 2\n", + " 2\n", + " 39\n", " \n", " \n", - " 143\n", - " 176\n", - " 1704402004\n", - " 37\n", - " 73\n", + " 2\n", + " 178\n", + " 1704388800\n", + " 3\n", + " 3\n", " 40\n", - " 0\n", - " 0\n", - " 150\n", - " 874\n", - " 750\n", - " 274.0\n", - " 2024-01-05 06:00:04\n", " \n", " \n", - " 144\n", - " 176\n", - " 1704402240\n", - " 37\n", - " 73\n", - " 40\n", - " 0\n", - " 0\n", - " 150\n", - " 1110\n", - " 900\n", - " 236.0\n", - " 2024-01-05 06:04:00\n", + " 3\n", + " 178\n", + " 1704388800\n", + " 4\n", + " 4\n", + " 23\n", " \n", " \n", - " 167\n", - " 176\n", - " 1704405690\n", - " 37\n", - " 93\n", - " 40\n", - " 0\n", - " 0\n", - " 170\n", - " 750\n", - " 770\n", - " 150.0\n", - " 2024-01-05 07:01:30\n", + " 4\n", + " 201\n", + " 1704388800\n", + " 1\n", + " 1\n", + " 24\n", " \n", " \n", - " 171\n", - " 176\n", - " 1704406231\n", - " 37\n", - " 93\n", - " 40\n", - " 0\n", - " 0\n", - " 170\n", - " 1291\n", - " 1450\n", - " 31.0\n", - " 2024-01-05 07:10:31\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", " \n", " \n", - " 210\n", - " 176\n", - " 1704412860\n", - " 37\n", - " 103\n", - " 40\n", - " 0\n", - " 0\n", - " 180\n", - " 851\n", - " 860\n", - " 169.0\n", - " 2024-01-05 09:01:00\n", + " 767\n", + " 206\n", + " 1704392160\n", + " 2\n", + " 2\n", + " 35\n", " \n", " \n", - " 253\n", - " 176\n", - " 1704420442\n", - " 37\n", - " 103\n", - " 40\n", - " 0\n", - " 0\n", - " 180\n", - " 1283\n", - " 1440\n", - " 22.0\n", - " 2024-01-05 11:07:22\n", + " 768\n", + " 206\n", + " 1704392160\n", + " 3\n", + " 3\n", + " 26\n", " \n", " \n", - " 277\n", - " 176\n", - " 1704424600\n", - " 37\n", - " 103\n", - " 40\n", - " 0\n", - " 0\n", - " 180\n", - " 1820\n", - " 1980\n", - " 20.0\n", - " 2024-01-05 12:16:40\n", + " 769\n", + " 206\n", + " 1704392160\n", + " 4\n", + " 4\n", + " 26\n", + " \n", + " \n", + " 770\n", + " 202\n", + " 1704392211\n", + " 1\n", + " 1\n", + " 39\n", + " \n", + " \n", + " 771\n", + " 202\n", + " 1704392211\n", + " 2\n", + " 2\n", + " 101\n", " \n", " \n", "\n", + "

772 rows × 5 columns

\n", "" ], "text/plain": [ - " inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 cycle \\\n", - "24 176 1704384054 37 73 40 0 0 150 \n", - "81 176 1704392578 37 73 40 0 0 150 \n", - "143 176 1704402004 37 73 40 0 0 150 \n", - "144 176 1704402240 37 73 40 0 0 150 \n", - "167 176 1704405690 37 93 40 0 0 170 \n", - "171 176 1704406231 37 93 40 0 0 170 \n", - "210 176 1704412860 37 103 40 0 0 180 \n", - "253 176 1704420442 37 103 40 0 0 180 \n", - "277 176 1704424600 37 103 40 0 0 180 \n", + " inter_no start_unix phas_A phas_B duration\n", + "0 178 1704388800 1 1 38\n", + "1 178 1704388800 2 2 39\n", + "2 178 1704388800 3 3 40\n", + "3 178 1704388800 4 4 23\n", + "4 201 1704388800 1 1 24\n", + ".. ... ... ... ... ...\n", + "767 206 1704392160 2 2 35\n", + "768 206 1704392160 3 3 26\n", + "769 206 1704392160 4 4 26\n", + "770 202 1704392211 1 1 39\n", + "771 202 1704392211 2 2 101\n", "\n", - " D_n S_n diff start_dt \n", - "24 804 750 204.0 2024-01-05 01:00:54 \n", - "81 2078 2100 128.0 2024-01-05 03:22:58 \n", - "143 874 750 274.0 2024-01-05 06:00:04 \n", - "144 1110 900 236.0 2024-01-05 06:04:00 \n", - "167 750 770 150.0 2024-01-05 07:01:30 \n", - "171 1291 1450 31.0 2024-01-05 07:10:31 \n", - "210 851 860 169.0 2024-01-05 09:01:00 \n", - "253 1283 1440 22.0 2024-01-05 11:07:22 \n", - "277 1820 1980 20.0 2024-01-05 12:16:40 " + "[772 rows x 5 columns]" ] }, + "execution_count": 67, "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
inter_nostart_unixdura_A1dura_A2dura_A3dura_A4dura_A5cycleD_nS_ndiffstart_dt
7017617043909503773400015040504050150.02024-01-05 02:55:50
7117617043911003773400015042004200150.02024-01-05 02:58:20
72176170439125037734000150750750150.02024-01-05 03:00:50
73176170439139937734000150899900149.02024-01-05 03:03:19
7417617043915503773400015010501050151.02024-01-05 03:05:50
7517617043917003773400015012001200150.02024-01-05 03:08:20
7617617043918503773400015013501350150.02024-01-05 03:10:50
7717617043920003773400015015001500150.02024-01-05 03:13:20
7817617043921513773400015016511650151.02024-01-05 03:15:51
7917617043923003773400015018001800149.02024-01-05 03:18:20
8017617043924503773400015019501950150.02024-01-05 03:20:50
8117617043925783773400015020782100128.02024-01-05 03:22:58
8217617043927283773400015022282250150.02024-01-05 03:25:28
8317617043928803773400015023802400152.02024-01-05 03:28:00
8417617043930303773400015025302550150.02024-01-05 03:30:30
8517617043931803773400015026802700150.02024-01-05 03:33:00
8617617043933303773400015028302850150.02024-01-05 03:35:30
8717617043934803773400015029803000150.02024-01-05 03:38:00
8817617043936303773400015031303150150.02024-01-05 03:40:30
8917617043937803773400015032803300150.02024-01-05 03:43:00
\n", - "
" - ], - "text/plain": [ - " inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 cycle \\\n", - "70 176 1704390950 37 73 40 0 0 150 \n", - "71 176 1704391100 37 73 40 0 0 150 \n", - "72 176 1704391250 37 73 40 0 0 150 \n", - "73 176 1704391399 37 73 40 0 0 150 \n", - "74 176 1704391550 37 73 40 0 0 150 \n", - "75 176 1704391700 37 73 40 0 0 150 \n", - "76 176 1704391850 37 73 40 0 0 150 \n", - "77 176 1704392000 37 73 40 0 0 150 \n", - "78 176 1704392151 37 73 40 0 0 150 \n", - "79 176 1704392300 37 73 40 0 0 150 \n", - "80 176 1704392450 37 73 40 0 0 150 \n", - "81 176 1704392578 37 73 40 0 0 150 \n", - "82 176 1704392728 37 73 40 0 0 150 \n", - "83 176 1704392880 37 73 40 0 0 150 \n", - "84 176 1704393030 37 73 40 0 0 150 \n", - "85 176 1704393180 37 73 40 0 0 150 \n", - "86 176 1704393330 37 73 40 0 0 150 \n", - "87 176 1704393480 37 73 40 0 0 150 \n", - "88 176 1704393630 37 73 40 0 0 150 \n", - "89 176 1704393780 37 73 40 0 0 150 \n", - "\n", - " D_n S_n diff start_dt \n", - "70 4050 4050 150.0 2024-01-05 02:55:50 \n", - "71 4200 4200 150.0 2024-01-05 02:58:20 \n", - "72 750 750 150.0 2024-01-05 03:00:50 \n", - "73 899 900 149.0 2024-01-05 03:03:19 \n", - "74 1050 1050 151.0 2024-01-05 03:05:50 \n", - "75 1200 1200 150.0 2024-01-05 03:08:20 \n", - "76 1350 1350 150.0 2024-01-05 03:10:50 \n", - "77 1500 1500 150.0 2024-01-05 03:13:20 \n", - "78 1651 1650 151.0 2024-01-05 03:15:51 \n", - "79 1800 1800 149.0 2024-01-05 03:18:20 \n", - "80 1950 1950 150.0 2024-01-05 03:20:50 \n", - "81 2078 2100 128.0 2024-01-05 03:22:58 \n", - "82 2228 2250 150.0 2024-01-05 03:25:28 \n", - "83 2380 2400 152.0 2024-01-05 03:28:00 \n", - "84 2530 2550 150.0 2024-01-05 03:30:30 \n", - "85 2680 2700 150.0 2024-01-05 03:33:00 \n", - "86 2830 2850 150.0 2024-01-05 03:35:30 \n", - "87 2980 3000 150.0 2024-01-05 03:38:00 \n", - "88 3130 3150 150.0 2024-01-05 03:40:30 \n", - "89 3280 3300 150.0 2024-01-05 03:43:00 " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
inter_nostart_unixdura_A1dura_A2dura_A3dura_A4dura_A5cycleD_nS_ndiffstart_dt
7017617043909503773400015040504050150.02024-01-05 02:55:50
7117617043911003773400015042004200150.02024-01-05 02:58:20
72176170439125037734000150750750150.02024-01-05 03:00:50
73176170439139937734000150899900149.02024-01-05 03:03:19
7417617043915503773400015010501050151.02024-01-05 03:05:50
7517617043917003773400015012001200150.02024-01-05 03:08:20
7617617043918503773400015013501350150.02024-01-05 03:10:50
7717617043920003773400015015001500150.02024-01-05 03:13:20
7817617043921513773400015016511650151.02024-01-05 03:15:51
7917617043923003773400015018001800149.02024-01-05 03:18:20
8017617043924503773400015019501950150.02024-01-05 03:20:50
8117617043925783262340012820782078128.02024-01-05 03:22:58
8217617043927283773400015022282228150.02024-01-05 03:25:28
8317617043928803774410015223802380152.02024-01-05 03:28:00
8417617043930303773400015025302530150.02024-01-05 03:30:30
8517617043931803773400015026802680150.02024-01-05 03:33:00
8617617043933303773400015028302830150.02024-01-05 03:35:30
8717617043934803773400015029802980150.02024-01-05 03:38:00
8817617043936303773400015031303130150.02024-01-05 03:40:30
8917617043937803773400015032803280150.02024-01-05 03:43:00
\n", - "
" - ], - "text/plain": [ - " inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 cycle \\\n", - "70 176 1704390950 37 73 40 0 0 150 \n", - "71 176 1704391100 37 73 40 0 0 150 \n", - "72 176 1704391250 37 73 40 0 0 150 \n", - "73 176 1704391399 37 73 40 0 0 150 \n", - "74 176 1704391550 37 73 40 0 0 150 \n", - "75 176 1704391700 37 73 40 0 0 150 \n", - "76 176 1704391850 37 73 40 0 0 150 \n", - "77 176 1704392000 37 73 40 0 0 150 \n", - "78 176 1704392151 37 73 40 0 0 150 \n", - "79 176 1704392300 37 73 40 0 0 150 \n", - "80 176 1704392450 37 73 40 0 0 150 \n", - "81 176 1704392578 32 62 34 0 0 128 \n", - "82 176 1704392728 37 73 40 0 0 150 \n", - "83 176 1704392880 37 74 41 0 0 152 \n", - "84 176 1704393030 37 73 40 0 0 150 \n", - "85 176 1704393180 37 73 40 0 0 150 \n", - "86 176 1704393330 37 73 40 0 0 150 \n", - "87 176 1704393480 37 73 40 0 0 150 \n", - "88 176 1704393630 37 73 40 0 0 150 \n", - "89 176 1704393780 37 73 40 0 0 150 \n", - "\n", - " D_n S_n diff start_dt \n", - "70 4050 4050 150.0 2024-01-05 02:55:50 \n", - "71 4200 4200 150.0 2024-01-05 02:58:20 \n", - "72 750 750 150.0 2024-01-05 03:00:50 \n", - "73 899 900 149.0 2024-01-05 03:03:19 \n", - "74 1050 1050 151.0 2024-01-05 03:05:50 \n", - "75 1200 1200 150.0 2024-01-05 03:08:20 \n", - "76 1350 1350 150.0 2024-01-05 03:10:50 \n", - "77 1500 1500 150.0 2024-01-05 03:13:20 \n", - "78 1651 1650 151.0 2024-01-05 03:15:51 \n", - "79 1800 1800 149.0 2024-01-05 03:18:20 \n", - "80 1950 1950 150.0 2024-01-05 03:20:50 \n", - "81 2078 2078 128.0 2024-01-05 03:22:58 \n", - "82 2228 2228 150.0 2024-01-05 03:25:28 \n", - "83 2380 2380 152.0 2024-01-05 03:28:00 \n", - "84 2530 2530 150.0 2024-01-05 03:30:30 \n", - "85 2680 2680 150.0 2024-01-05 03:33:00 \n", - "86 2830 2830 150.0 2024-01-05 03:35:30 \n", - "87 2980 2980 150.0 2024-01-05 03:38:00 \n", - "88 3130 3130 150.0 2024-01-05 03:40:30 \n", - "89 3280 3280 150.0 2024-01-05 03:43:00 " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "inter_no = 176\n", - "a, b = 70, 90\n", - "# 2-1. 참값 판단 프로세스\n", - "hours = np.array(range(midnight, next_day + 1, 3600)) # 정각에 해당하는 시각들 목록\n", - "\n", - "rhist = rhistory.copy()[rhistory.inter_no==inter_no]\n", - "rhist = rhist.drop_duplicates(subset=['start_unix']).reset_index(drop=True)\n", - "\n", - "# D_n 및 S_n 값 정의\n", - "rhist['D_n'] = 0 # D_n : 시간차이\n", - "rhist['S_n'] = 0 # S_n : 현시시간합\n", - "for n in range(len(rhist)):\n", - " curr_unix = rhist.iloc[n].start_unix # current start_unix\n", - " rhist.loc[n, ['D_n', 'S_n']] = calculate_DS(rhist, curr_unix)\n", - "\n", - "rhist_diff = rhist.copy()\n", - "rhist_diff['diff'] = rhist_diff['start_unix'].diff()\n", - "rhist_diff = rhist_diff[list(rhist_diff.columns)[:7] + list(rhist_diff.columns)[-4:]]\n", - "rhist_diff['start_dt'] = rhist_diff['start_unix'].map(lambda x:datetime.fromtimestamp(x))\n", - "display(rhist_diff[abs(rhist_diff['diff'] - rhist_diff['cycle'])>10])\n", - "display(rhist_diff[a:b])\n", - "\n", - "# 이전시각, 현재시각\n", - "prev_unix = rhist.loc[0, 'start_unix'] # previous start_unix\n", - "curr_unix = rhist.loc[1, 'start_unix'] # current start_unix\n", - "\n", - "# rhist의 마지막 행에 도달할 때까지 반복\n", - "while True:\n", - " n = rhist[rhist.start_unix==curr_unix].index[0]\n", - " cycle = rhist.loc[n, 'cycle']\n", - " D_n = rhist.loc[n, 'D_n']\n", - " S_n = rhist.loc[n, 'S_n']\n", - " # 참값인 경우\n", - " if (abs(D_n - S_n) <= 5):\n", - " pass\n", - " # 참값이 아닌 경우\n", - " else:\n", - " # 2-1-1. 결측치 처리 : 인접한 두 start_unix의 차이가 계획된 주기의 두 배보다 크면 결측이 일어났다고 판단, 신호계획의 현시시간으로 \"대체\"\n", - " if curr_unix - prev_unix >= 2 * cycle:\n", - " # prev_unix를 계획된 주기만큼 늘려가면서 한 행씩 채워나간다.\n", - " # (curr_unix와의 차이가 계획된 주기보다 작거나 같아질 때까지)\n", - " new_rows = []\n", - " while curr_unix - prev_unix > cycle:\n", - " prev_unix += cycle\n", - " # 신호 계획(prow) 불러오기\n", - " start_seconds = np.array(timetable.start_seconds)\n", - " idx = (start_seconds <= prev_unix).sum() - 1\n", - " start_hour = timetable.iloc[idx].start_hour\n", - " start_minute = timetable.iloc[idx].start_minute\n", - " prow = plan.copy()[(plan.inter_no==inter_no) & (plan.start_hour==start_hour) & (plan.start_minute==start_minute)] # planned row\n", - " # prow에서 필요한 부분을 rhist에 추가\n", - " prow['start_unix'] = prev_unix\n", - " prow = prow.drop(['start_hour', 'start_minute', 'offset'], axis=1)\n", - " cycle = prow.iloc[0].cycle\n", - " rhist = pd.concat([rhist, prow])\n", - " rhist = rhist.sort_values(by='start_unix').reset_index(drop=True)\n", - " n += 1\n", - "\n", - " # 2-1-2. 이상치 처리 : 비율에 따라 해당 행을 \"삭제\"(R_n <= 0.5) 또는 \"조정\"(R_n > 0.5)한다\n", - " R_n = (curr_unix - prev_unix) / cycle # R_n : 비율\n", - " # R_n이 0.5보다 작거나 같으면 해당 행을 삭제\n", - " if R_n <= 0.5:\n", - " rhist = rhist.drop(index=n).reset_index(drop=True)\n", - " # 행삭제에 따른 curr_unix, R_n 재정의\n", - " curr_unix = rhist.loc[n, 'start_unix']\n", - " R_n = (curr_unix - prev_unix) / cycle # R_n : 비율\n", - "\n", - " # R_n이 0.5보다 크면 해당 행 조정 (비율을 유지한 채로 현시시간 대체)\n", - " if R_n > 0.5:\n", - " # 신호 계획(prow) 불러오기\n", - " start_seconds = np.array(timetable.start_seconds)\n", - " idx = (start_seconds <= curr_unix).sum() - 1\n", - " start_hour = timetable.iloc[idx].start_hour\n", - " start_minute = timetable.iloc[idx].start_minute\n", - " prow = plan[(plan.inter_no==inter_no) & (plan.start_hour==start_hour) & (plan.start_minute==start_minute)] # planned row\n", - " # 조정된 현시시간 (prow에 R_n을 곱하고 정수로 바꿈)\n", - " adjusted_dur = prow.copy()[[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] * R_n\n", - " int_parts = adjusted_dur.iloc[0].apply(lambda x: int(x))\n", - " frac_parts = adjusted_dur.iloc[0] - int_parts\n", - " difference = round(adjusted_dur.iloc[0].sum()) - int_parts.sum()\n", - " for _ in range(difference): # 소수 부분이 가장 큰 상위 'difference'개의 값에 대해 올림 처리\n", - " max_frac_index = frac_parts.idxmax()\n", - " int_parts[max_frac_index] += 1\n", - " frac_parts[max_frac_index] = 0 # 이미 처리된 항목은 0으로 설정\n", - " # rhist에 조정된 현시시간을 반영\n", - " rhist.loc[n, [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]] = int_parts.values\n", - " rhist.loc[n, 'cycle'] = int_parts.sum().sum() // 2\n", - "\n", - " if n == rhist.index[-1]:\n", - " break\n", - " prev_unix = curr_unix\n", - " curr_unix = rhist.loc[n+1, 'start_unix']\n", - "# rhist['start_dt'] = rhist['start_unix'].map(lambda x:datetime.fromtimestamp(x))\n", - "\n", - "# 생략해도 무방할 코드\n", - "rhist = rhist.reset_index(drop=True)\n", - "rhist = rhist.sort_values(by=['start_unix'])\n", - "\n", - "# D_n 및 S_n 값 재정의\n", - "for n in range(len(rhist)):\n", - " curr_unix = rhist.iloc[n].start_unix # current start_unix\n", - " rhist.loc[n, ['D_n', 'S_n']] = calculate_DS(rhist, curr_unix)\n", - "\n", - "rhist_diff = rhist.copy()\n", - "rhist_diff['diff'] = rhist_diff['start_unix'].diff()\n", - "rhist_diff = rhist_diff[list(rhist_diff.columns)[:7] + list(rhist_diff.columns)[-4:]]\n", - "rhist_diff['start_dt'] = rhist_diff['start_unix'].map(lambda x:datetime.fromtimestamp(x))\n", - "display(rhist_diff[a:b])" - ] - }, - { - "cell_type": "code", - "execution_count": 237, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
inter_nostart_unixdura_A1dura_A2dura_A3dura_A4dura_A5cycleD_nS_n
260177170442177043277040018025202520
261177170442195043277040018027002700
262177170442213043277040018028802880
263177170442231043277040018030603060
264177170442249043277040018032403240
265177170442267043277040018034203420
266177170442284943277040018035993600
267177170442303043277040018037803780
268177170442321043277040018039603960
269177170442339043277040018041404140
270177170442357043277040018043204320
2711771704423750432770400180901900
272177170442392943277040018010801080
273177170442411043277040018012611260
274177170442429043277040018014411440
275177170442446943277040018016201620
10177170442464943277040018018001620
10177170442482943277040018019801800
10177170442500943277040018021601980
10177170442518943277040018023402160
10177170442536943277040018025202340
10177170442554943277040018027002520
10177170442572943277040018028802700
10177170442590943277040018030602880
10177170442608943277040018032403060
10177170442626943277040018034203240
10177170442644943277040018036003420
10177170442662943277040018037803600
10177170442680943277040018039603780
10177170442698943277040018041403960
\n", - "
" - ], - "text/plain": [ - " inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 cycle \\\n", - "260 177 1704421770 43 27 70 40 0 180 \n", - "261 177 1704421950 43 27 70 40 0 180 \n", - "262 177 1704422130 43 27 70 40 0 180 \n", - "263 177 1704422310 43 27 70 40 0 180 \n", - "264 177 1704422490 43 27 70 40 0 180 \n", - "265 177 1704422670 43 27 70 40 0 180 \n", - "266 177 1704422849 43 27 70 40 0 180 \n", - "267 177 1704423030 43 27 70 40 0 180 \n", - "268 177 1704423210 43 27 70 40 0 180 \n", - "269 177 1704423390 43 27 70 40 0 180 \n", - "270 177 1704423570 43 27 70 40 0 180 \n", - "271 177 1704423750 43 27 70 40 0 180 \n", - "272 177 1704423929 43 27 70 40 0 180 \n", - "273 177 1704424110 43 27 70 40 0 180 \n", - "274 177 1704424290 43 27 70 40 0 180 \n", - "275 177 1704424469 43 27 70 40 0 180 \n", - "10 177 1704424649 43 27 70 40 0 180 \n", - "10 177 1704424829 43 27 70 40 0 180 \n", - "10 177 1704425009 43 27 70 40 0 180 \n", - "10 177 1704425189 43 27 70 40 0 180 \n", - "10 177 1704425369 43 27 70 40 0 180 \n", - "10 177 1704425549 43 27 70 40 0 180 \n", - "10 177 1704425729 43 27 70 40 0 180 \n", - "10 177 1704425909 43 27 70 40 0 180 \n", - "10 177 1704426089 43 27 70 40 0 180 \n", - "10 177 1704426269 43 27 70 40 0 180 \n", - "10 177 1704426449 43 27 70 40 0 180 \n", - "10 177 1704426629 43 27 70 40 0 180 \n", - "10 177 1704426809 43 27 70 40 0 180 \n", - "10 177 1704426989 43 27 70 40 0 180 \n", - "\n", - " D_n S_n \n", - "260 2520 2520 \n", - "261 2700 2700 \n", - "262 2880 2880 \n", - "263 3060 3060 \n", - "264 3240 3240 \n", - "265 3420 3420 \n", - "266 3599 3600 \n", - "267 3780 3780 \n", - "268 3960 3960 \n", - "269 4140 4140 \n", - "270 4320 4320 \n", - "271 901 900 \n", - "272 1080 1080 \n", - "273 1261 1260 \n", - "274 1441 1440 \n", - "275 1620 1620 \n", - "10 1800 1620 \n", - "10 1980 1800 \n", - "10 2160 1980 \n", - "10 2340 2160 \n", - "10 2520 2340 \n", - "10 2700 2520 \n", - "10 2880 2700 \n", - "10 3060 2880 \n", - "10 3240 3060 \n", - "10 3420 3240 \n", - "10 3600 3420 \n", - "10 3780 3600 \n", - "10 3960 3780 \n", - "10 4140 3960 " - ] - }, - "execution_count": 237, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rhist[list(rhist.columns)[:7] + list(rhist.columns)[-3:]].sort_values(by=['start_unix'])[260:290]" - ] - }, - { - "cell_type": "code", - "execution_count": 174, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['inter_no', 'start_unix', 'dura_A1', 'dura_A2', 'dura_A3', 'dura_A4', 'dura_A5', 'dura_A6', 'dura_A7', 'dura_A8', 'dura_B1', 'dura_B2', 'dura_B3', 'dura_B4', 'dura_B5', 'dura_B6', 'dura_B7', 'dura_B8', 'cycle', 'D_n', 'S_n', 'offset']\n", - "['inter_no', 'dura_A1', 'dura_A2', 'dura_A3', 'dura_A4', 'dura_A5', 'dura_A6', 'dura_A7', 'dura_A8', 'dura_B1', 'dura_B2', 'dura_B3', 'dura_B4', 'dura_B5', 'dura_B6', 'dura_B7', 'dura_B8', 'cycle', 'offset', 'start_unix']\n" - ] - } - ], - "source": [ - "print(list(rhist.columns))\n", - "print(list(new_rows[0].columns))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# 2-1. 참값 판단 프로세스\n", - "hours = np.array(range(midnight, next_day + 1, 3600)) # 정각에 해당하는 시각들 목록\n", - "\n", - "rhist = rhistory.copy()[rhistory.inter_no==inter_no].reset_index(drop=True)\n", - "\n", - "# D_n 및 S_n 정의\n", - "rhist['D_n'] = 0 # D_n : 시간차이\n", - "rhist['S_n'] = 0 # S_n : 현시시간합\n", - "for n in range(len(rhist)):\n", - " curr_unix = rhist.iloc[n].start_unix # current start_unix\n", - " ghour_lt_curr_unix = hours[hours <= curr_unix].max() # the greatest hour less than (or equal to) curr_unix\n", - " start_unixes = rhist.start_unix.unique()\n", - " start_unixes_lt_ghour = np.sort(start_unixes[start_unixes < ghour_lt_curr_unix]) # start unixes less than ghour_lt_curr_unix\n", - " # 기준유닉스(base_unix) : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 start_unix\n", - " if list(start_unixes_lt_ghour):\n", - " base_unix = start_unixes_lt_ghour[-5]\n", - " # start_unixes_lt_ghour가 비었을 경우에는 맨 앞 start_unix로 base_unix를 지정\n", - " else:\n", - " base_unix = rhist.start_unix.min()\n", - " D_n = curr_unix - base_unix\n", - " S_n_durs = rhist[(rhist.start_unix > base_unix) & (rhist.start_unix <= curr_unix)] \\\n", - " [[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n", - " S_n = S_n_durs.values.sum() // 2\n", - " rhist.loc[n, ['D_n', 'S_n']] = [D_n, S_n]\n", - "rhist[list(rhist.columns[:10]) + list(rhist.columns[-2:])]\n", - "\n", - "new_rows = []\n", - "# 결측 및 이상치 처리\n", - "prev_unix = rhist.loc[0, 'start_unix'] # previous start_unix\n", - "curr_unix = rhist.loc[1, 'start_unix'] # current start_unix\n", - "fina_unix = rhist.loc[-1, 'start_unix'] # final start_unix\n", - "n = rhist[rhist.start_unix==curr_unix].index\n", - "print(n)\n", - "while curr_unix <= fina_unix:\n", - " prev_unix = rhist.loc[n-1, 'start_unix'] # current start_unix\n", - " curr_unix = rhist.loc[n, 'start_unix'] # previous start_unix\n", - " cycle = rhist.iloc[n].cycle\n", - " R_n = (curr_unix - prev_unix) / cycle # R_n : 비율\n", - " # 매 반복마다 D_n 및 S_n을 다시 정의\n", - " ghour_lt_curr_unix = hours[hours <= curr_unix].max() # the greatest hour less than (or equal to) curr_unix\n", - " start_unixes = rhist.start_unix.unique()\n", - " start_unixes_lt_ghour = np.sort(start_unixes[start_unixes < ghour_lt_curr_unix]) # start unixes less than ghour_lt_curr_unix\n", - " # 기준유닉스(base_unix) : curr_unix보다 작은 hour 중에서 가장 큰 값으로부터 다섯 번째로 작은 start_unix\n", - " if list(start_unixes_lt_ghour):\n", - " base_unix = start_unixes_lt_ghour[-5]\n", - " # start_unixes_lt_ghour가 비었을 경우에는 맨 앞 start_unix로 base_unix를 지정\n", - " else:\n", - " base_unix = rhist.start_unix.min()\n", - " D_n = curr_unix - base_unix\n", - " S_n_durs = rhist[(rhist.start_unix > base_unix) & (rhist.start_unix <= curr_unix)] \\\n", - " [[f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)]]\n", - " S_n = S_n_durs.values.sum() // 2\n", - "\n", - " # 참값인 경우\n", - " if (abs(D_n - S_n) <= 5):\n", - " print(n, 'true', D_n, S_n, curr_unix - prev_unix)\n", - " pass\n", - "\n", - " # 참값이 아닌 경우\n", - " else:\n", - " # print(n, 'false', D_n, S_n, curr_unix - prev_unix)\n", - " # 2-1-1. 결측치 처리 : 인접한 두 end_unix의 차이가 계획된 주기의 두 배보다 크면 결측이 일어났다고 판단\n", - " if curr_unix - prev_unix >= 2 * cycle:\n", - " # 현재 unix를 계획된 주기만큼 늘려가면서 한 행씩 채워나간다.\n", - " # (다음 unix와의 차이가 계획된 주기보다 작거나 같아질 때까지)\n", - " while curr_unix - prev_unix > cycle:\n", - " # print(n, 'missing_values', curr_unix - prev_unix)\n", - " prev_unix += cycle\n", - " # 계획된 현시시간(prow) 불러오기\n", - " start_seconds = np.array(timetable.start_seconds)\n", - " idx = (start_seconds <= curr_unix).sum() - 1\n", - " start_hour = timetable.iloc[idx].start_hour\n", - " start_minute = timetable.iloc[idx].start_minute\n", - " prow = plan[(plan.inter_no==inter_no) & (plan.start_hour==start_hour) & (plan.start_minute==start_minute)] # planned row\n", - " prow = prow.drop(['start_hour', 'start_minute'], axis=1)\n", - " prow['start_unix'] = prev_unix\n", - " cycle = prow.iloc[0].cycle\n", - " new_rows.append(prow)\n", - "\n", - " n += 1\n", - "new_rows = pd.concat(new_rows)\n", - "new_rows[list(new_rows.columns)[:6] + list(new_rows.columns)[-2:]]" - ] - }, - { - "cell_type": "code", - "execution_count": 117, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
inter_nostart_unixdura_A1dura_A2dura_A3dura_A4dura_A5dura_A6dura_A7dura_A8...dura_B3dura_B4dura_B5dura_B6dura_B7dura_B8cycleD_nS_ndiff
1551771704403768362068260000...6826000015025182400268.0
2761771704432930432770400000...7040000018091809008461.0
\n", - "

2 rows × 22 columns

\n", - "
" - ], - "text/plain": [ - " inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 \\\n", - "155 177 1704403768 36 20 68 26 0 \n", - "276 177 1704432930 43 27 70 40 0 \n", - "\n", - " dura_A6 dura_A7 dura_A8 ... dura_B3 dura_B4 dura_B5 dura_B6 \\\n", - "155 0 0 0 ... 68 26 0 0 \n", - "276 0 0 0 ... 70 40 0 0 \n", - "\n", - " dura_B7 dura_B8 cycle D_n S_n diff \n", - "155 0 0 150 2518 2400 268.0 \n", - "276 0 0 180 9180 900 8461.0 \n", - "\n", - "[2 rows x 22 columns]" - ] - }, - "execution_count": 117, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rhist_diff = rhist.copy()\n", - "rhist_diff['diff'] = rhist_diff['start_unix'].diff()\n", - "rhist_diff[rhist_diff['diff'] - rhist_diff['cycle'] > 10]" - ] - }, - { - "cell_type": "code", - "execution_count": 130, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
inter_nostart_unixdura_A1dura_A2dura_A3dura_A4dura_A5cycleD_nS_n
270177170442357043277040018043204320
2711771704423750432770400180901900
272177170442392943277040018010801080
273177170442411043277040018012611260
274177170442429043277040018014411440
275177170442446943277040018016201620
27617717044329304327704001809180900
277177170443311043277040018093601080
278177170443329043277040018095401260
279177170443347043277040018097201440
280177170443365043277040018099001620
2811771704433830432770400180100801800
2821771704434011432770400180102611980
2831771704434190432770400180104402160
2841771704434370432770400180106202340
2851771704434550432770400180900900
286177170443472943277040018010791080
287177170443491043277040018012601260
288177170443509043277040018014401440
289177170443527043277040018016201620
290177170443545043277040018018001800
291177170443563043277040018019801980
292177170443581043277040018021602160
293177170443599043277040018023402340
294177170443617043277040018025202520
295177170443635143277040018027012700
296177170443653043277040018028802880
297177170443671043277040018030603060
298177170443689043277040018032403240
299177170443707043277040018034203420
\n", - "
" - ], - "text/plain": [ - " inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 cycle \\\n", - "270 177 1704423570 43 27 70 40 0 180 \n", - "271 177 1704423750 43 27 70 40 0 180 \n", - "272 177 1704423929 43 27 70 40 0 180 \n", - "273 177 1704424110 43 27 70 40 0 180 \n", - "274 177 1704424290 43 27 70 40 0 180 \n", - "275 177 1704424469 43 27 70 40 0 180 \n", - "276 177 1704432930 43 27 70 40 0 180 \n", - "277 177 1704433110 43 27 70 40 0 180 \n", - "278 177 1704433290 43 27 70 40 0 180 \n", - "279 177 1704433470 43 27 70 40 0 180 \n", - "280 177 1704433650 43 27 70 40 0 180 \n", - "281 177 1704433830 43 27 70 40 0 180 \n", - "282 177 1704434011 43 27 70 40 0 180 \n", - "283 177 1704434190 43 27 70 40 0 180 \n", - "284 177 1704434370 43 27 70 40 0 180 \n", - "285 177 1704434550 43 27 70 40 0 180 \n", - "286 177 1704434729 43 27 70 40 0 180 \n", - "287 177 1704434910 43 27 70 40 0 180 \n", - "288 177 1704435090 43 27 70 40 0 180 \n", - "289 177 1704435270 43 27 70 40 0 180 \n", - "290 177 1704435450 43 27 70 40 0 180 \n", - "291 177 1704435630 43 27 70 40 0 180 \n", - "292 177 1704435810 43 27 70 40 0 180 \n", - "293 177 1704435990 43 27 70 40 0 180 \n", - "294 177 1704436170 43 27 70 40 0 180 \n", - "295 177 1704436351 43 27 70 40 0 180 \n", - "296 177 1704436530 43 27 70 40 0 180 \n", - "297 177 1704436710 43 27 70 40 0 180 \n", - "298 177 1704436890 43 27 70 40 0 180 \n", - "299 177 1704437070 43 27 70 40 0 180 \n", - "\n", - " D_n S_n \n", - "270 4320 4320 \n", - "271 901 900 \n", - "272 1080 1080 \n", - "273 1261 1260 \n", - "274 1441 1440 \n", - "275 1620 1620 \n", - "276 9180 900 \n", - "277 9360 1080 \n", - "278 9540 1260 \n", - "279 9720 1440 \n", - "280 9900 1620 \n", - "281 10080 1800 \n", - "282 10261 1980 \n", - "283 10440 2160 \n", - "284 10620 2340 \n", - "285 900 900 \n", - "286 1079 1080 \n", - "287 1260 1260 \n", - "288 1440 1440 \n", - "289 1620 1620 \n", - "290 1800 1800 \n", - "291 1980 1980 \n", - "292 2160 2160 \n", - "293 2340 2340 \n", - "294 2520 2520 \n", - "295 2701 2700 \n", - "296 2880 2880 \n", - "297 3060 3060 \n", - "298 3240 3240 \n", - "299 3420 3420 " - ] - }, - "execution_count": 130, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rhist[list(rhist.columns)[:7] + list(rhist.columns)[-3:]][270:300]" - ] - }, - { - "cell_type": "code", - "execution_count": 109, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + "output_type": "execute_result" + } + ], + "source": [ + "# 계층화된 형태로 변환\n", + "hrhists = [] # hierarchied recent history\n", + "for i, row in rhists.iterrows():\n", + " inter_no = row.inter_no\n", + " start_unix = row.start_unix\n", + "\n", + " ind = (timetable['start_seconds'] <= row.start_unix).sum() - 1\n", + " start_hour = timetable.iloc[ind].start_hour\n", + " start_minute = timetable.iloc[ind].start_minute\n", + " isplit = isplits[(inter_no, start_hour, start_minute)]\n", + " phas_As = [isplit[j][0] for j in isplit.keys()]\n", + " phas_Bs = [isplit[j][1] for j in isplit.keys()]\n", + " durs_A = row[[f'dura_A{j}' for j in range(1,9)]]\n", + " durs_B = row[[f'dura_B{j}' for j in range(1,9)]]\n", + " durations = []\n", + " for j in range(1, len(isplit)+1):\n", + " ja = isplit[j][0]\n", + " jb = isplit[j][1]\n", + " if ja == jb:\n", + " durations.append(min(durs_A[ja-1], durs_B[jb-1]))\n", + " else:\n", + " durations.append(abs(durs_A[ja-1] - durs_B[ja-1]))\n", + " new_rows = pd.DataFrame({'inter_no':[inter_no] * len(durations), 'start_unix':[start_unix] * len(durations),\n", + " 'phas_A':phas_As, 'phas_B':phas_Bs, 'duration':durations})\n", + " hrhists.append(new_rows)\n", + "hrhists = pd.concat(hrhists)\n", + "hrhists = hrhists.sort_values(by = ['start_unix', 'inter_no', 'phas_A', 'phas_B']).reset_index(drop=True)\n", + "hrhists" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "metadata": {}, + "outputs": [], + "source": [ + "movement = time2movement[present_time]" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": {}, + "outputs": [], + "source": [ + "# 중복을 제거하고 (inter_no, start_unix) 쌍을 만듭니다.\n", + "hrhists_inter_unix = set(hrhists[['inter_no', 'start_unix']].drop_duplicates().itertuples(index=False, name=None))\n", + "movement_inter_unix = set(movement[['inter_no', 'start_unix']].drop_duplicates().itertuples(index=False, name=None))\n", + "\n", + "# hrhists에는 있지만 movement에는 없는 (inter_no, start_unix) 쌍을 찾습니다.\n", + "missing_in_movement = hrhists_inter_unix - movement_inter_unix\n", + "\n", + "# 새로운 행들을 생성합니다.\n", + "new_rows = []\n", + "for inter_no, start_unix in missing_in_movement:\n", + " # movements_wo_start_unix에서 해당 inter_no의 데이터를 찾습니다.\n", + " new_row = movements_wo_start_unix[movements_wo_start_unix['inter_no'] == inter_no].copy()\n", + " # start_unix 값을 설정합니다.\n", + " new_row['start_unix'] = start_unix\n", + " new_rows.append(new_row)\n", + "\n", + "# 새로운 데이터프레임을 생성하고 기존 movement 데이터프레임과 합칩니다.\n", + "new_movement = pd.concat(new_rows, ignore_index=True)\n", + "movement_updated = pd.concat([movement, new_movement], ignore_index=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "
inter_nostart_unixdura_A1dura_A2dura_A3dura_A4dura_A5cycleD_nS_n
210177170441278040257134017044204420
2111771704412950432770400180850860
212177170441313043277040018010301040
213177170441331043277040018012101220
214177170441348943277040018013891400
215177170441367043277040018015701580
216177170441385043277040018017501760
217177170441403043277040018019301940
218177170441421043277040018021102120
219177170441439043277040018022902300
220177170441457043277040018024702480
221177170441475043277040018026502660
222177170441493043277040018028302840
223177170441511043277040018030103020
224177170441529043277040018031903200
225177170441547043277040018033703380
226177170441565043277040018035503560
227177170441583043277040018037303740
228177170441601043277040018039103920
229177170441619043277040018040904100
230177170441637043277040018042704280
2311771704416551432770400180901900
232177170441673043277040018010801080
233177170441691143277040018012611260
234177170441709043277040018014401440
235177170441727043277040018016201620
236177170441744943277040018017991800
237177170441763043277040018019801980
238177170441781043277040018021602160
239177170441799043277040018023402340
240177170441816943277040018025192520
241177170441835043277040018027002700
242177170441853043277040018028802880
243177170441871043277040018030603060
244177170441889043277040018032403240
245177170441907043277040018034203420
246177170441925043277040018036003600
247177170441943043277040018037803780
248177170441961043277040018039603960
249177170441979043277040018041404140
250177170441996943277040018043194320
2511771704420150432770400180900900
252177170442033043277040018010801080
253177170442051043277040018012601260
254177170442069043277040018014401440
255177170442087043277040018016201620
256177170442105043277040018018001800
257177170442123043277040018019801980
258177170442141143277040018021612160
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
inter_nonode_idstart_unixphas_Aphas_Bdurationinc_edge_Aout_edge_Ainc_edge_Bout_edge_B
2590177170442159043277040018023402340i217043888011136-571542809_01571542811_01571542811_02571542809_01
2601177170442177043277040018025202520i217043888012220571542811_02571542107_01-571542809_01571542809_01
2612177170442195043277040018027002700i217043888013368NaNNaNNaNNaN
2623177170442213043277040018028802880i217043888014426-571542809_01571542811_01571542107_02571542809_01
2631771704422310432770400180306030604176i117043888501137-571542810_01-571542797_02.99571542797_02.99571542810_01
264177170442249043277040018032403240.................................
265177170442267043277040018034203420748206i717043921602235NaNNaNNaNNaN
266177170442284943277040018035993600749206i717043921603326-571511538_02571542073_02571542073_01571511538_02
267177170442303043277040018037803780750206i717043921604426NaNNaNNaNNaN
268177170442321043277040018039603960751202i917043922111139571510152_02-571510152_01571510152_01571510152_01.65
269177170442339043277040018041404140752202i9170439221122101NaNNaNNaNNaN
\n", + "

757 rows × 10 columns

\n", "
" ], "text/plain": [ - " inter_no start_unix dura_A1 dura_A2 dura_A3 dura_A4 dura_A5 cycle \\\n", - "210 177 1704412780 40 25 71 34 0 170 \n", - "211 177 1704412950 43 27 70 40 0 180 \n", - "212 177 1704413130 43 27 70 40 0 180 \n", - "213 177 1704413310 43 27 70 40 0 180 \n", - "214 177 1704413489 43 27 70 40 0 180 \n", - "215 177 1704413670 43 27 70 40 0 180 \n", - "216 177 1704413850 43 27 70 40 0 180 \n", - "217 177 1704414030 43 27 70 40 0 180 \n", - "218 177 1704414210 43 27 70 40 0 180 \n", - "219 177 1704414390 43 27 70 40 0 180 \n", - "220 177 1704414570 43 27 70 40 0 180 \n", - "221 177 1704414750 43 27 70 40 0 180 \n", - "222 177 1704414930 43 27 70 40 0 180 \n", - "223 177 1704415110 43 27 70 40 0 180 \n", - "224 177 1704415290 43 27 70 40 0 180 \n", - "225 177 1704415470 43 27 70 40 0 180 \n", - "226 177 1704415650 43 27 70 40 0 180 \n", - "227 177 1704415830 43 27 70 40 0 180 \n", - "228 177 1704416010 43 27 70 40 0 180 \n", - "229 177 1704416190 43 27 70 40 0 180 \n", - "230 177 1704416370 43 27 70 40 0 180 \n", - "231 177 1704416551 43 27 70 40 0 180 \n", - "232 177 1704416730 43 27 70 40 0 180 \n", - "233 177 1704416911 43 27 70 40 0 180 \n", - "234 177 1704417090 43 27 70 40 0 180 \n", - "235 177 1704417270 43 27 70 40 0 180 \n", - "236 177 1704417449 43 27 70 40 0 180 \n", - "237 177 1704417630 43 27 70 40 0 180 \n", - "238 177 1704417810 43 27 70 40 0 180 \n", - "239 177 1704417990 43 27 70 40 0 180 \n", - "240 177 1704418169 43 27 70 40 0 180 \n", - "241 177 1704418350 43 27 70 40 0 180 \n", - "242 177 1704418530 43 27 70 40 0 180 \n", - "243 177 1704418710 43 27 70 40 0 180 \n", - "244 177 1704418890 43 27 70 40 0 180 \n", - "245 177 1704419070 43 27 70 40 0 180 \n", - "246 177 1704419250 43 27 70 40 0 180 \n", - "247 177 1704419430 43 27 70 40 0 180 \n", - "248 177 1704419610 43 27 70 40 0 180 \n", - "249 177 1704419790 43 27 70 40 0 180 \n", - "250 177 1704419969 43 27 70 40 0 180 \n", - "251 177 1704420150 43 27 70 40 0 180 \n", - "252 177 1704420330 43 27 70 40 0 180 \n", - "253 177 1704420510 43 27 70 40 0 180 \n", - "254 177 1704420690 43 27 70 40 0 180 \n", - "255 177 1704420870 43 27 70 40 0 180 \n", - "256 177 1704421050 43 27 70 40 0 180 \n", - "257 177 1704421230 43 27 70 40 0 180 \n", - "258 177 1704421411 43 27 70 40 0 180 \n", - "259 177 1704421590 43 27 70 40 0 180 \n", - "260 177 1704421770 43 27 70 40 0 180 \n", - "261 177 1704421950 43 27 70 40 0 180 \n", - "262 177 1704422130 43 27 70 40 0 180 \n", - "263 177 1704422310 43 27 70 40 0 180 \n", - "264 177 1704422490 43 27 70 40 0 180 \n", - "265 177 1704422670 43 27 70 40 0 180 \n", - "266 177 1704422849 43 27 70 40 0 180 \n", - "267 177 1704423030 43 27 70 40 0 180 \n", - "268 177 1704423210 43 27 70 40 0 180 \n", - "269 177 1704423390 43 27 70 40 0 180 \n", + " inter_no node_id start_unix phas_A phas_B duration inc_edge_A \\\n", + "0 177 i2 1704388801 1 1 36 -571542809_01 \n", + "1 177 i2 1704388801 2 2 20 571542811_02 \n", + "2 177 i2 1704388801 3 3 68 NaN \n", + "3 177 i2 1704388801 4 4 26 -571542809_01 \n", + "4 176 i1 1704388850 1 1 37 -571542810_01 \n", + ".. ... ... ... ... ... ... ... \n", + "748 206 i7 1704392160 2 2 35 NaN \n", + "749 206 i7 1704392160 3 3 26 -571511538_02 \n", + "750 206 i7 1704392160 4 4 26 NaN \n", + "751 202 i9 1704392211 1 1 39 571510152_02 \n", + "752 202 i9 1704392211 2 2 101 NaN \n", "\n", - " D_n S_n \n", - "210 4420 4420 \n", - "211 850 860 \n", - "212 1030 1040 \n", - "213 1210 1220 \n", - "214 1389 1400 \n", - "215 1570 1580 \n", - "216 1750 1760 \n", - "217 1930 1940 \n", - "218 2110 2120 \n", - "219 2290 2300 \n", - "220 2470 2480 \n", - "221 2650 2660 \n", - "222 2830 2840 \n", - "223 3010 3020 \n", - "224 3190 3200 \n", - "225 3370 3380 \n", - "226 3550 3560 \n", - "227 3730 3740 \n", - "228 3910 3920 \n", - "229 4090 4100 \n", - "230 4270 4280 \n", - "231 901 900 \n", - "232 1080 1080 \n", - "233 1261 1260 \n", - "234 1440 1440 \n", - "235 1620 1620 \n", - "236 1799 1800 \n", - "237 1980 1980 \n", - "238 2160 2160 \n", - "239 2340 2340 \n", - "240 2519 2520 \n", - "241 2700 2700 \n", - "242 2880 2880 \n", - "243 3060 3060 \n", - "244 3240 3240 \n", - "245 3420 3420 \n", - "246 3600 3600 \n", - "247 3780 3780 \n", - "248 3960 3960 \n", - "249 4140 4140 \n", - "250 4319 4320 \n", - "251 900 900 \n", - "252 1080 1080 \n", - "253 1260 1260 \n", - "254 1440 1440 \n", - "255 1620 1620 \n", - "256 1800 1800 \n", - "257 1980 1980 \n", - "258 2161 2160 \n", - "259 2340 2340 \n", - "260 2520 2520 \n", - "261 2700 2700 \n", - "262 2880 2880 \n", - "263 3060 3060 \n", - "264 3240 3240 \n", - "265 3420 3420 \n", - "266 3599 3600 \n", - "267 3780 3780 \n", - "268 3960 3960 \n", - "269 4140 4140 " + " out_edge_A inc_edge_B out_edge_B \n", + "0 571542811_01 571542811_02 571542809_01 \n", + "1 571542107_01 -571542809_01 571542809_01 \n", + "2 NaN NaN NaN \n", + "3 571542811_01 571542107_02 571542809_01 \n", + "4 -571542797_02.99 571542797_02.99 571542810_01 \n", + ".. ... ... ... \n", + "748 NaN NaN NaN \n", + "749 571542073_02 571542073_01 571511538_02 \n", + "750 NaN NaN NaN \n", + "751 -571510152_01 571510152_01 571510152_01.65 \n", + "752 NaN NaN NaN \n", + "\n", + "[757 rows x 10 columns]" ] }, - "execution_count": 109, + "execution_count": 143, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "rhist[210:210+60][list(rhist.columns)[:7] + list(rhist.columns)[-3:]]" + "movedur = pd.merge(movement_updated, hrhists, how='inner', on=['inter_no', 'start_unix', 'phas_A', 'phas_B']) # movements and durations\n", + "movedur = movedur.sort_values(by=['start_unix', 'inter_no', 'phas_A','phas_B'])\n", + "movedur = movedur[['inter_no', 'start_unix', 'phas_A', 'phas_B', 'move_A', 'move_B', 'duration']]\n", + "\n", + "# 이동류 매칭 테이블에서 진입id, 진출id를 가져와서 붙임.\n", + "for i, row in movedur.iterrows():\n", + " inter_no = row.inter_no\n", + " start_unix = row.start_unix\n", + " # incoming and outgoing edges A\n", + " move_A = row.move_A\n", + " if move_A in [17, 18]:\n", + " inc_edge_A = np.nan\n", + " out_edge_A = np.nan\n", + " else:\n", + " match_A = matching[(matching.inter_no == inter_no) & (matching.move_no == move_A)].iloc[0]\n", + " inc_edge_A = match_A.inc_edge\n", + " out_edge_A = match_A.out_edge\n", + " movedur.loc[i, ['inc_edge_A', 'out_edge_A']] = [inc_edge_A, out_edge_A]\n", + " # incoming and outgoing edges B\n", + " move_B = row.move_B\n", + " if move_B in [17, 18]:\n", + " inc_edge_B = np.nan\n", + " out_edge_B = np.nan\n", + " else:\n", + " match_B = matching[(matching.inter_no == inter_no) & (matching.move_no == move_B)].iloc[0]\n", + " inc_edge_B = match_B.inc_edge\n", + " out_edge_B = match_B.out_edge\n", + " movedur.loc[i, ['inc_edge_B', 'out_edge_B']] = [inc_edge_B, out_edge_B]\n", + "\n", + "# 이동류 컬럼 제거\n", + "movedur = movedur.drop(['move_A', 'move_B'], axis=1)\n", + "\n", + "histid = movedur.copy() # history with edge ids (incoming and outgoing edge ids)\n", + "histid['node_id'] = histid['inter_no'].map(inter2node)\n", + "histid = histid[['inter_no', 'node_id', 'start_unix', 'phas_A', 'phas_B', 'duration', 'inc_edge_A', 'out_edge_A', 'inc_edge_B', 'out_edge_B']]\n", + "histid = histid[histid.start_unix > present_time - 3600]\n", + "histid" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "code", "execution_count": 71, @@ -9042,7 +6389,7 @@ "rhistory = rhistory[['inter_no', 'start_unix'] + [f'dura_{alph}{j}' for alph in ['A', 'B'] for j in range(1,9)] + ['cycle']]\n", "\n", "# 계층화된 형태로 변환\n", - "hrhistory = [] # hierarchied recent history\n", + "hrhistory = [] # hierarchized recent history\n", "for i, row in rhistory.iterrows():\n", " inter_no = row.inter_no\n", " start_unix = row.start_unix\n", diff --git a/Analysis/0109_preprocess/0125/hrhists.csv b/Analysis/0109_preprocess/0125/hrhists.csv new file mode 100644 index 000000000..bcb6a6140 --- /dev/null +++ b/Analysis/0109_preprocess/0125/hrhists.csv @@ -0,0 +1,773 @@ +,inter_no,start_unix,phas_A,phas_B,duration +0,178,1704388800,1,1,38 +1,178,1704388800,2,2,39 +2,178,1704388800,3,3,40 +3,178,1704388800,4,4,23 +4,201,1704388800,1,1,24 +5,201,1704388800,2,2,24 +6,201,1704388800,3,3,17 +7,201,1704388800,4,4,58 +8,201,1704388800,5,5,17 +9,202,1704388800,1,1,39 +10,202,1704388800,2,2,101 +11,206,1704388800,1,1,33 +12,206,1704388800,2,2,35 +13,206,1704388800,3,3,26 +14,206,1704388800,4,4,26 +15,177,1704388801,1,1,36 +16,177,1704388801,2,2,20 +17,177,1704388801,3,3,68 +18,177,1704388801,4,4,26 +19,176,1704388850,1,1,37 +20,176,1704388850,2,2,73 +21,176,1704388850,3,3,40 +22,210,1704388860,1,1,24 +23,210,1704388860,1,2,19 +24,210,1704388860,2,2,29 +25,210,1704388860,3,3,56 +26,210,1704388860,4,4,22 +27,175,1704388880,1,1,37 +28,175,1704388880,2,2,39 +29,175,1704388880,3,3,25 +30,175,1704388880,3,4,30 +31,175,1704388880,4,4,29 +32,206,1704388920,1,1,33 +33,206,1704388920,2,2,35 +34,206,1704388920,3,3,26 +35,206,1704388920,4,4,26 +36,202,1704388939,1,1,39 +37,202,1704388939,2,2,101 +38,178,1704388940,1,1,38 +39,178,1704388940,2,2,39 +40,178,1704388940,3,3,40 +41,178,1704388940,4,4,23 +42,201,1704388940,1,1,24 +43,201,1704388940,2,2,24 +44,201,1704388940,3,3,17 +45,201,1704388940,4,4,58 +46,201,1704388940,5,5,17 +47,177,1704388950,1,1,36 +48,177,1704388950,2,2,20 +49,177,1704388950,3,3,68 +50,177,1704388950,4,4,26 +51,176,1704389000,1,1,37 +52,176,1704389000,2,2,73 +53,176,1704389000,3,3,40 +54,210,1704389010,1,1,24 +55,210,1704389010,1,2,19 +56,210,1704389010,2,2,29 +57,210,1704389010,3,3,56 +58,210,1704389010,4,4,22 +59,175,1704389040,1,1,37 +60,175,1704389040,2,2,39 +61,175,1704389040,3,3,25 +62,175,1704389040,3,4,30 +63,175,1704389040,4,4,29 +64,206,1704389040,1,1,33 +65,206,1704389040,2,2,35 +66,206,1704389040,3,3,26 +67,206,1704389040,4,4,26 +68,201,1704389080,1,1,24 +69,201,1704389080,2,2,24 +70,201,1704389080,3,3,17 +71,201,1704389080,4,4,58 +72,201,1704389080,5,5,17 +73,202,1704389080,1,1,39 +74,202,1704389080,2,2,101 +75,178,1704389081,1,1,38 +76,178,1704389081,2,2,39 +77,178,1704389081,3,3,40 +78,178,1704389081,4,4,23 +79,177,1704389100,1,1,36 +80,177,1704389100,2,2,20 +81,177,1704389100,3,3,68 +82,177,1704389100,4,4,26 +83,176,1704389150,1,1,37 +84,176,1704389150,2,2,73 +85,176,1704389150,3,3,40 +86,206,1704389160,1,1,33 +87,206,1704389160,2,2,35 +88,206,1704389160,3,3,26 +89,206,1704389160,4,4,26 +90,210,1704389160,1,1,24 +91,210,1704389160,1,2,19 +92,210,1704389160,2,2,29 +93,210,1704389160,3,3,56 +94,210,1704389160,4,4,22 +95,175,1704389200,1,1,37 +96,175,1704389200,2,2,39 +97,175,1704389200,3,3,25 +98,175,1704389200,3,4,30 +99,175,1704389200,4,4,29 +100,178,1704389220,1,1,38 +101,178,1704389220,2,2,39 +102,178,1704389220,3,3,40 +103,178,1704389220,4,4,23 +104,201,1704389220,1,1,24 +105,201,1704389220,2,2,24 +106,201,1704389220,3,3,17 +107,201,1704389220,4,4,58 +108,201,1704389220,5,5,17 +109,202,1704389220,1,1,39 +110,202,1704389220,2,2,101 +111,177,1704389250,1,1,36 +112,177,1704389250,2,2,20 +113,177,1704389250,3,3,68 +114,177,1704389250,4,4,26 +115,206,1704389280,1,1,33 +116,206,1704389280,2,2,35 +117,206,1704389280,3,3,26 +118,206,1704389280,4,4,26 +119,176,1704389300,1,1,37 +120,176,1704389300,2,2,73 +121,176,1704389300,3,3,40 +122,210,1704389310,1,1,24 +123,210,1704389310,1,2,19 +124,210,1704389310,2,2,29 +125,210,1704389310,3,3,56 +126,210,1704389310,4,4,22 +127,201,1704389359,1,1,24 +128,201,1704389359,2,2,24 +129,201,1704389359,3,3,17 +130,201,1704389359,4,4,58 +131,201,1704389359,5,5,17 +132,175,1704389360,1,1,37 +133,175,1704389360,2,2,39 +134,175,1704389360,3,3,25 +135,175,1704389360,3,4,30 +136,175,1704389360,4,4,29 +137,178,1704389360,1,1,38 +138,178,1704389360,2,2,39 +139,178,1704389360,3,3,40 +140,178,1704389360,4,4,23 +141,202,1704389360,1,1,39 +142,202,1704389360,2,2,101 +143,177,1704389400,1,1,36 +144,177,1704389400,2,2,20 +145,177,1704389400,3,3,68 +146,177,1704389400,4,4,26 +147,206,1704389400,1,1,33 +148,206,1704389400,2,2,35 +149,206,1704389400,3,3,26 +150,206,1704389400,4,4,26 +151,176,1704389450,1,1,37 +152,176,1704389450,2,2,73 +153,176,1704389450,3,3,40 +154,210,1704389460,1,1,24 +155,210,1704389460,1,2,19 +156,210,1704389460,2,2,29 +157,210,1704389460,3,3,56 +158,210,1704389460,4,4,22 +159,178,1704389500,1,1,38 +160,178,1704389500,2,2,39 +161,178,1704389500,3,3,40 +162,178,1704389500,4,4,23 +163,201,1704389500,1,1,24 +164,201,1704389500,2,2,24 +165,201,1704389500,3,3,17 +166,201,1704389500,4,4,58 +167,201,1704389500,5,5,17 +168,202,1704389500,1,1,39 +169,202,1704389500,2,2,101 +170,175,1704389520,1,1,37 +171,175,1704389520,2,2,39 +172,175,1704389520,3,3,25 +173,175,1704389520,3,4,30 +174,175,1704389520,4,4,29 +175,206,1704389520,1,1,33 +176,206,1704389520,2,2,35 +177,206,1704389520,3,3,26 +178,206,1704389520,4,4,26 +179,177,1704389551,1,1,36 +180,177,1704389551,2,2,20 +181,177,1704389551,3,3,68 +182,177,1704389551,4,4,26 +183,176,1704389599,1,1,37 +184,176,1704389599,2,2,73 +185,176,1704389599,3,3,40 +186,210,1704389610,1,1,24 +187,210,1704389610,1,2,19 +188,210,1704389610,2,2,29 +189,210,1704389610,3,3,56 +190,210,1704389610,4,4,22 +191,178,1704389640,1,1,38 +192,178,1704389640,2,2,39 +193,178,1704389640,3,3,40 +194,178,1704389640,4,4,23 +195,201,1704389640,1,1,24 +196,201,1704389640,2,2,24 +197,201,1704389640,3,3,17 +198,201,1704389640,4,4,58 +199,201,1704389640,5,5,17 +200,202,1704389640,1,1,39 +201,202,1704389640,2,2,101 +202,206,1704389640,1,1,33 +203,206,1704389640,2,2,35 +204,206,1704389640,3,3,26 +205,206,1704389640,4,4,26 +206,175,1704389680,1,1,37 +207,175,1704389680,2,2,39 +208,175,1704389680,3,3,25 +209,175,1704389680,3,4,30 +210,175,1704389680,4,4,29 +211,177,1704389700,1,1,36 +212,177,1704389700,2,2,20 +213,177,1704389700,3,3,68 +214,177,1704389700,4,4,26 +215,176,1704389750,1,1,37 +216,176,1704389750,2,2,73 +217,176,1704389750,3,3,40 +218,210,1704389759,1,1,24 +219,210,1704389759,1,2,19 +220,210,1704389759,2,2,29 +221,210,1704389759,3,3,56 +222,210,1704389759,4,4,22 +223,206,1704389760,1,1,33 +224,206,1704389760,2,2,35 +225,206,1704389760,3,3,26 +226,206,1704389760,4,4,26 +227,201,1704389779,1,1,24 +228,201,1704389779,2,2,24 +229,201,1704389779,3,3,17 +230,201,1704389779,4,4,58 +231,201,1704389779,5,5,17 +232,178,1704389780,1,1,38 +233,178,1704389780,2,2,39 +234,178,1704389780,3,3,40 +235,178,1704389780,4,4,23 +236,202,1704389780,1,1,39 +237,202,1704389780,2,2,101 +238,175,1704389839,1,1,37 +239,175,1704389839,2,2,39 +240,175,1704389839,3,3,25 +241,175,1704389839,3,4,30 +242,175,1704389839,4,4,29 +243,177,1704389850,1,1,36 +244,177,1704389850,2,2,20 +245,177,1704389850,3,3,68 +246,177,1704389850,4,4,26 +247,206,1704389880,1,1,33 +248,206,1704389880,2,2,35 +249,206,1704389880,3,3,26 +250,206,1704389880,4,4,26 +251,176,1704389900,1,1,37 +252,176,1704389900,2,2,73 +253,176,1704389900,3,3,40 +254,210,1704389910,1,1,24 +255,210,1704389910,1,2,19 +256,210,1704389910,2,2,29 +257,210,1704389910,3,3,56 +258,210,1704389910,4,4,22 +259,178,1704389920,1,1,38 +260,178,1704389920,2,2,39 +261,178,1704389920,3,3,40 +262,178,1704389920,4,4,23 +263,201,1704389920,1,1,24 +264,201,1704389920,2,2,24 +265,201,1704389920,3,3,17 +266,201,1704389920,4,4,58 +267,201,1704389920,5,5,17 +268,202,1704389920,1,1,39 +269,202,1704389920,2,2,101 +270,175,1704390000,1,1,37 +271,175,1704390000,2,2,39 +272,175,1704390000,3,3,25 +273,175,1704390000,3,4,30 +274,175,1704390000,4,4,29 +275,177,1704390000,1,1,36 +276,177,1704390000,2,2,20 +277,177,1704390000,3,3,68 +278,177,1704390000,4,4,26 +279,206,1704390000,1,1,33 +280,206,1704390000,2,2,35 +281,206,1704390000,3,3,26 +282,206,1704390000,4,4,26 +283,176,1704390050,1,1,37 +284,176,1704390050,2,2,73 +285,176,1704390050,3,3,40 +286,178,1704390060,1,1,38 +287,178,1704390060,2,2,39 +288,178,1704390060,3,3,40 +289,178,1704390060,4,4,23 +290,201,1704390060,1,1,24 +291,201,1704390060,2,2,24 +292,201,1704390060,3,3,17 +293,201,1704390060,4,4,58 +294,201,1704390060,5,5,17 +295,202,1704390060,1,1,39 +296,202,1704390060,2,2,101 +297,210,1704390060,1,1,24 +298,210,1704390060,1,2,19 +299,210,1704390060,2,2,29 +300,210,1704390060,3,3,56 +301,210,1704390060,4,4,22 +302,206,1704390120,1,1,33 +303,206,1704390120,2,2,35 +304,206,1704390120,3,3,26 +305,206,1704390120,4,4,26 +306,177,1704390150,1,1,36 +307,177,1704390150,2,2,20 +308,177,1704390150,3,3,68 +309,177,1704390150,4,4,26 +310,175,1704390160,1,1,37 +311,175,1704390160,2,2,39 +312,175,1704390160,3,3,25 +313,175,1704390160,3,4,30 +314,175,1704390160,4,4,29 +315,176,1704390200,1,1,37 +316,176,1704390200,2,2,73 +317,176,1704390200,3,3,40 +318,201,1704390200,1,1,24 +319,201,1704390200,2,2,24 +320,201,1704390200,3,3,17 +321,201,1704390200,4,4,58 +322,201,1704390200,5,5,17 +323,202,1704390200,1,1,39 +324,202,1704390200,2,2,101 +325,178,1704390201,1,1,38 +326,178,1704390201,2,2,39 +327,178,1704390201,3,3,40 +328,178,1704390201,4,4,23 +329,210,1704390210,1,1,24 +330,210,1704390210,1,2,19 +331,210,1704390210,2,2,29 +332,210,1704390210,3,3,56 +333,210,1704390210,4,4,22 +334,206,1704390240,1,1,33 +335,206,1704390240,2,2,35 +336,206,1704390240,3,3,26 +337,206,1704390240,4,4,26 +338,177,1704390300,1,1,36 +339,177,1704390300,2,2,20 +340,177,1704390300,3,3,68 +341,177,1704390300,4,4,26 +342,175,1704390320,1,1,37 +343,175,1704390320,2,2,39 +344,175,1704390320,3,3,25 +345,175,1704390320,3,4,30 +346,175,1704390320,4,4,29 +347,178,1704390340,1,1,38 +348,178,1704390340,2,2,39 +349,178,1704390340,3,3,40 +350,178,1704390340,4,4,23 +351,201,1704390340,1,1,24 +352,201,1704390340,2,2,24 +353,201,1704390340,3,3,17 +354,201,1704390340,4,4,58 +355,201,1704390340,5,5,17 +356,202,1704390340,1,1,39 +357,202,1704390340,2,2,101 +358,176,1704390349,1,1,37 +359,176,1704390349,2,2,73 +360,176,1704390349,3,3,40 +361,206,1704390359,1,1,33 +362,206,1704390359,2,2,35 +363,206,1704390359,3,3,26 +364,206,1704390359,4,4,26 +365,210,1704390360,1,1,24 +366,210,1704390360,1,2,19 +367,210,1704390360,2,2,29 +368,210,1704390360,3,3,56 +369,210,1704390360,4,4,22 +370,177,1704390450,1,1,36 +371,177,1704390450,2,2,20 +372,177,1704390450,3,3,68 +373,177,1704390450,4,4,26 +374,175,1704390480,1,1,37 +375,175,1704390480,2,2,39 +376,175,1704390480,3,3,25 +377,175,1704390480,3,4,30 +378,175,1704390480,4,4,29 +379,178,1704390480,1,1,38 +380,178,1704390480,2,2,39 +381,178,1704390480,3,3,40 +382,178,1704390480,4,4,23 +383,201,1704390480,1,1,24 +384,201,1704390480,2,2,24 +385,201,1704390480,3,3,17 +386,201,1704390480,4,4,58 +387,201,1704390480,5,5,17 +388,206,1704390480,1,1,33 +389,206,1704390480,2,2,35 +390,206,1704390480,3,3,26 +391,206,1704390480,4,4,26 +392,176,1704390500,1,1,37 +393,176,1704390500,2,2,73 +394,176,1704390500,3,3,40 +395,210,1704390510,1,1,24 +396,210,1704390510,1,2,19 +397,210,1704390510,2,2,29 +398,210,1704390510,3,3,56 +399,210,1704390510,4,4,22 +400,202,1704390529,1,1,53 +401,202,1704390529,2,2,136 +402,177,1704390599,1,1,36 +403,177,1704390599,2,2,20 +404,177,1704390599,3,3,68 +405,177,1704390599,4,4,26 +406,206,1704390600,1,1,33 +407,206,1704390600,2,2,35 +408,206,1704390600,3,3,26 +409,206,1704390600,4,4,26 +410,178,1704390620,1,1,38 +411,178,1704390620,2,2,39 +412,178,1704390620,3,3,40 +413,178,1704390620,4,4,23 +414,201,1704390620,1,1,24 +415,201,1704390620,2,2,24 +416,201,1704390620,3,3,17 +417,201,1704390620,4,4,58 +418,201,1704390620,5,5,17 +419,175,1704390640,1,1,37 +420,175,1704390640,2,2,39 +421,175,1704390640,3,3,25 +422,175,1704390640,3,4,30 +423,175,1704390640,4,4,29 +424,176,1704390650,1,1,37 +425,176,1704390650,2,2,73 +426,176,1704390650,3,3,40 +427,210,1704390660,1,1,24 +428,210,1704390660,1,2,19 +429,210,1704390660,2,2,29 +430,210,1704390660,3,3,56 +431,210,1704390660,4,4,22 +432,202,1704390670,1,1,39 +433,202,1704390670,2,2,102 +434,206,1704390720,1,1,33 +435,206,1704390720,2,2,35 +436,206,1704390720,3,3,26 +437,206,1704390720,4,4,26 +438,177,1704390750,1,1,36 +439,177,1704390750,2,2,20 +440,177,1704390750,3,3,68 +441,177,1704390750,4,4,26 +442,201,1704390760,1,1,24 +443,201,1704390760,2,2,24 +444,201,1704390760,3,3,17 +445,201,1704390760,4,4,58 +446,201,1704390760,5,5,17 +447,178,1704390761,1,1,38 +448,178,1704390761,2,2,39 +449,178,1704390761,3,3,40 +450,178,1704390761,4,4,23 +451,175,1704390800,1,1,37 +452,175,1704390800,2,2,39 +453,175,1704390800,3,3,25 +454,175,1704390800,3,4,30 +455,175,1704390800,4,4,29 +456,176,1704390800,1,1,37 +457,176,1704390800,2,2,73 +458,176,1704390800,3,3,40 +459,210,1704390809,1,1,24 +460,210,1704390809,1,2,19 +461,210,1704390809,2,2,29 +462,210,1704390809,3,3,56 +463,210,1704390809,4,4,22 +464,202,1704390810,1,1,39 +465,202,1704390810,2,2,101 +466,206,1704390840,1,1,33 +467,206,1704390840,2,2,35 +468,206,1704390840,3,3,26 +469,206,1704390840,4,4,26 +470,177,1704390900,1,1,36 +471,177,1704390900,2,2,20 +472,177,1704390900,3,3,68 +473,177,1704390900,4,4,26 +474,178,1704390900,1,1,38 +475,178,1704390900,2,2,39 +476,178,1704390900,3,3,40 +477,178,1704390900,4,4,23 +478,201,1704390900,1,1,24 +479,201,1704390900,2,2,24 +480,201,1704390900,3,3,17 +481,201,1704390900,4,4,58 +482,201,1704390900,5,5,17 +483,176,1704390950,1,1,37 +484,176,1704390950,2,2,73 +485,176,1704390950,3,3,40 +486,202,1704390950,1,1,39 +487,202,1704390950,2,2,101 +488,175,1704390960,1,1,37 +489,175,1704390960,2,2,39 +490,175,1704390960,3,3,25 +491,175,1704390960,3,4,30 +492,175,1704390960,4,4,29 +493,206,1704390960,1,1,33 +494,206,1704390960,2,2,35 +495,206,1704390960,3,3,26 +496,206,1704390960,4,4,26 +497,210,1704390960,1,1,24 +498,210,1704390960,1,2,19 +499,210,1704390960,2,2,29 +500,210,1704390960,3,3,56 +501,210,1704390960,4,4,22 +502,201,1704391040,1,1,24 +503,201,1704391040,2,2,24 +504,201,1704391040,3,3,17 +505,201,1704391040,4,4,58 +506,201,1704391040,5,5,17 +507,178,1704391041,1,1,38 +508,178,1704391041,2,2,39 +509,178,1704391041,3,3,40 +510,178,1704391041,4,4,23 +511,177,1704391050,1,1,36 +512,177,1704391050,2,2,20 +513,177,1704391050,3,3,68 +514,177,1704391050,4,4,26 +515,206,1704391080,1,1,33 +516,206,1704391080,2,2,35 +517,206,1704391080,3,3,26 +518,206,1704391080,4,4,26 +519,202,1704391090,1,1,39 +520,202,1704391090,2,2,101 +521,176,1704391100,1,1,37 +522,176,1704391100,2,2,73 +523,176,1704391100,3,3,40 +524,210,1704391110,1,1,24 +525,210,1704391110,1,2,19 +526,210,1704391110,2,2,29 +527,210,1704391110,3,3,56 +528,210,1704391110,4,4,22 +529,175,1704391119,1,1,37 +530,175,1704391119,2,2,39 +531,175,1704391119,3,3,25 +532,175,1704391119,3,4,30 +533,175,1704391119,4,4,29 +534,178,1704391180,1,1,38 +535,178,1704391180,2,2,39 +536,178,1704391180,3,3,40 +537,178,1704391180,4,4,23 +538,201,1704391180,1,1,24 +539,201,1704391180,2,2,24 +540,201,1704391180,3,3,17 +541,201,1704391180,4,4,58 +542,201,1704391180,5,5,17 +543,206,1704391200,1,1,33 +544,206,1704391200,2,2,35 +545,206,1704391200,3,3,26 +546,206,1704391200,4,4,26 +547,177,1704391201,1,1,36 +548,177,1704391201,2,2,20 +549,177,1704391201,3,3,68 +550,177,1704391201,4,4,26 +551,202,1704391230,1,1,39 +552,202,1704391230,2,2,101 +553,176,1704391250,1,1,37 +554,176,1704391250,2,2,73 +555,176,1704391250,3,3,40 +556,210,1704391260,1,1,24 +557,210,1704391260,1,2,19 +558,210,1704391260,2,2,29 +559,210,1704391260,3,3,56 +560,210,1704391260,4,4,22 +561,175,1704391280,1,1,37 +562,175,1704391280,2,2,39 +563,175,1704391280,3,3,25 +564,175,1704391280,3,4,30 +565,175,1704391280,4,4,29 +566,178,1704391320,1,1,38 +567,178,1704391320,2,2,39 +568,178,1704391320,3,3,40 +569,178,1704391320,4,4,23 +570,201,1704391320,1,1,24 +571,201,1704391320,2,2,24 +572,201,1704391320,3,3,17 +573,201,1704391320,4,4,58 +574,201,1704391320,5,5,17 +575,206,1704391320,1,1,33 +576,206,1704391320,2,2,35 +577,206,1704391320,3,3,26 +578,206,1704391320,4,4,26 +579,177,1704391350,1,1,36 +580,177,1704391350,2,2,20 +581,177,1704391350,3,3,68 +582,177,1704391350,4,4,26 +583,202,1704391370,1,1,39 +584,202,1704391370,2,2,101 +585,176,1704391399,1,1,37 +586,176,1704391399,2,2,73 +587,176,1704391399,3,3,40 +588,210,1704391410,1,1,24 +589,210,1704391410,1,2,19 +590,210,1704391410,2,2,29 +591,210,1704391410,3,3,56 +592,210,1704391410,4,4,22 +593,175,1704391440,1,1,37 +594,175,1704391440,2,2,39 +595,175,1704391440,3,3,25 +596,175,1704391440,3,4,30 +597,175,1704391440,4,4,29 +598,206,1704391440,1,1,33 +599,206,1704391440,2,2,35 +600,206,1704391440,3,3,26 +601,206,1704391440,4,4,26 +602,201,1704391460,1,1,24 +603,201,1704391460,2,2,24 +604,201,1704391460,3,3,17 +605,201,1704391460,4,4,58 +606,201,1704391460,5,5,17 +607,178,1704391461,1,1,38 +608,178,1704391461,2,2,39 +609,178,1704391461,3,3,40 +610,178,1704391461,4,4,23 +611,177,1704391500,1,1,36 +612,177,1704391500,2,2,20 +613,177,1704391500,3,3,68 +614,177,1704391500,4,4,26 +615,202,1704391509,1,1,39 +616,202,1704391509,2,2,101 +617,176,1704391550,1,1,37 +618,176,1704391550,2,2,73 +619,176,1704391550,3,3,40 +620,206,1704391560,1,1,33 +621,206,1704391560,2,2,35 +622,206,1704391560,3,3,26 +623,206,1704391560,4,4,26 +624,210,1704391560,1,1,24 +625,210,1704391560,1,2,19 +626,210,1704391560,2,2,29 +627,210,1704391560,3,3,56 +628,210,1704391560,4,4,22 +629,175,1704391600,1,1,37 +630,175,1704391600,2,2,39 +631,175,1704391600,3,3,25 +632,175,1704391600,3,4,30 +633,175,1704391600,4,4,29 +634,178,1704391600,1,1,38 +635,178,1704391600,2,2,39 +636,178,1704391600,3,3,40 +637,178,1704391600,4,4,23 +638,201,1704391600,1,1,24 +639,201,1704391600,2,2,24 +640,201,1704391600,3,3,17 +641,201,1704391600,4,4,58 +642,201,1704391600,5,5,17 +643,177,1704391650,1,1,36 +644,177,1704391650,2,2,20 +645,177,1704391650,3,3,68 +646,177,1704391650,4,4,26 +647,202,1704391650,1,1,39 +648,202,1704391650,2,2,101 +649,206,1704391680,1,1,33 +650,206,1704391680,2,2,35 +651,206,1704391680,3,3,26 +652,206,1704391680,4,4,26 +653,176,1704391700,1,1,37 +654,176,1704391700,2,2,73 +655,176,1704391700,3,3,40 +656,210,1704391710,1,1,24 +657,210,1704391710,1,2,19 +658,210,1704391710,2,2,29 +659,210,1704391710,3,3,56 +660,210,1704391710,4,4,22 +661,201,1704391740,1,1,24 +662,201,1704391740,2,2,24 +663,201,1704391740,3,3,17 +664,201,1704391740,4,4,58 +665,201,1704391740,5,5,17 +666,178,1704391741,1,1,38 +667,178,1704391741,2,2,39 +668,178,1704391741,3,3,40 +669,178,1704391741,4,4,23 +670,175,1704391760,1,1,37 +671,175,1704391760,2,2,39 +672,175,1704391760,3,3,25 +673,175,1704391760,3,4,30 +674,175,1704391760,4,4,29 +675,202,1704391790,1,1,39 +676,202,1704391790,2,2,101 +677,177,1704391800,1,1,36 +678,177,1704391800,2,2,20 +679,177,1704391800,3,3,68 +680,177,1704391800,4,4,26 +681,206,1704391801,1,1,33 +682,206,1704391801,2,2,35 +683,206,1704391801,3,3,26 +684,206,1704391801,4,4,26 +685,176,1704391850,1,1,37 +686,176,1704391850,2,2,73 +687,176,1704391850,3,3,40 +688,210,1704391859,1,1,24 +689,210,1704391859,1,2,19 +690,210,1704391859,2,2,29 +691,210,1704391859,3,3,56 +692,210,1704391859,4,4,22 +693,178,1704391880,1,1,38 +694,178,1704391880,2,2,39 +695,178,1704391880,3,3,40 +696,178,1704391880,4,4,23 +697,201,1704391880,1,1,24 +698,201,1704391880,2,2,24 +699,201,1704391880,3,3,17 +700,201,1704391880,4,4,58 +701,201,1704391880,5,5,17 +702,175,1704391920,1,1,37 +703,175,1704391920,2,2,39 +704,175,1704391920,3,3,25 +705,175,1704391920,3,4,30 +706,175,1704391920,4,4,29 +707,206,1704391920,1,1,33 +708,206,1704391920,2,2,35 +709,206,1704391920,3,3,26 +710,206,1704391920,4,4,26 +711,202,1704391930,1,1,39 +712,202,1704391930,2,2,101 +713,177,1704391950,1,1,36 +714,177,1704391950,2,2,20 +715,177,1704391950,3,3,68 +716,177,1704391950,4,4,26 +717,176,1704392000,1,1,37 +718,176,1704392000,2,2,73 +719,176,1704392000,3,3,40 +720,210,1704392010,1,1,24 +721,210,1704392010,1,2,19 +722,210,1704392010,2,2,29 +723,210,1704392010,3,3,56 +724,210,1704392010,4,4,22 +725,178,1704392020,1,1,38 +726,178,1704392020,2,2,39 +727,178,1704392020,3,3,40 +728,178,1704392020,4,4,23 +729,201,1704392020,1,1,24 +730,201,1704392020,2,2,24 +731,201,1704392020,3,3,17 +732,201,1704392020,4,4,58 +733,201,1704392020,5,5,17 +734,206,1704392040,1,1,33 +735,206,1704392040,2,2,35 +736,206,1704392040,3,3,26 +737,206,1704392040,4,4,26 +738,202,1704392070,1,1,39 +739,202,1704392070,2,2,101 +740,175,1704392080,1,1,37 +741,175,1704392080,2,2,39 +742,175,1704392080,3,3,25 +743,175,1704392080,3,4,30 +744,175,1704392080,4,4,29 +745,177,1704392100,1,1,36 +746,177,1704392100,2,2,20 +747,177,1704392100,3,3,68 +748,177,1704392100,4,4,26 +749,176,1704392151,1,1,37 +750,176,1704392151,2,2,73 +751,176,1704392151,3,3,40 +752,210,1704392159,1,1,24 +753,210,1704392159,1,2,19 +754,210,1704392159,2,2,29 +755,210,1704392159,3,3,56 +756,210,1704392159,4,4,22 +757,178,1704392160,1,1,38 +758,178,1704392160,2,2,39 +759,178,1704392160,3,3,40 +760,178,1704392160,4,4,23 +761,201,1704392160,1,1,24 +762,201,1704392160,2,2,24 +763,201,1704392160,3,3,17 +764,201,1704392160,4,4,58 +765,201,1704392160,5,5,17 +766,206,1704392160,1,1,33 +767,206,1704392160,2,2,35 +768,206,1704392160,3,3,26 +769,206,1704392160,4,4,26 +770,202,1704392211,1,1,39 +771,202,1704392211,2,2,101 diff --git a/Analysis/0109_preprocess/0125/movement.csv b/Analysis/0109_preprocess/0125/movement.csv new file mode 100644 index 000000000..9e4bee0b6 --- /dev/null +++ b/Analysis/0109_preprocess/0125/movement.csv @@ -0,0 +1,814 @@ +,inter_no,phas_A,phas_B,move_A,move_B,start_unix +0,177,1,1,8,4,1704388801 +1,177,2,2,7,3,1704388801 +2,177,3,3,17,18,1704388801 +3,177,4,4,5,1,1704388801 +4,176,1,1,8,4,1704388850 +5,176,2,2,8,3,1704388850 +6,176,3,3,5,18,1704388850 +7,210,1,1,6,18,1704388860 +8,210,1,2,6,2,1704388860 +9,210,2,2,5,2,1704388860 +10,210,3,3,7,4,1704388860 +11,210,4,4,8,3,1704388860 +12,175,1,1,8,4,1704388880 +13,175,2,2,7,3,1704388880 +14,175,3,3,6,1,1704388880 +15,175,3,4,6,2,1704388880 +16,175,4,4,5,2,1704388880 +17,206,1,1,8,4,1704388920 +18,206,2,2,17,18,1704388920 +19,206,3,3,8,4,1704388920 +20,206,4,4,17,18,1704388920 +21,202,1,1,6,2,1704388939 +22,202,2,2,17,18,1704388939 +23,178,1,1,8,4,1704388940 +24,178,2,2,7,3,1704388940 +25,178,3,3,5,2,1704388940 +26,178,4,4,6,1,1704388940 +27,201,1,1,8,3,1704388940 +28,201,2,2,5,2,1704388940 +29,201,3,3,6,2,1704388940 +30,201,4,4,6,1,1704388940 +31,201,5,5,7,4,1704388940 +32,177,1,1,8,4,1704388950 +33,177,2,2,7,3,1704388950 +34,177,3,3,17,18,1704388950 +35,177,4,4,5,1,1704388950 +36,176,1,1,8,4,1704389000 +37,176,2,2,8,3,1704389000 +38,176,3,3,5,18,1704389000 +39,210,1,1,6,18,1704389010 +40,210,1,2,6,2,1704389010 +41,210,2,2,5,2,1704389010 +42,210,3,3,7,4,1704389010 +43,210,4,4,8,3,1704389010 +44,175,1,1,8,4,1704389040 +45,175,2,2,7,3,1704389040 +46,175,3,3,6,1,1704389040 +47,175,3,4,6,2,1704389040 +48,175,4,4,5,2,1704389040 +49,206,1,1,8,4,1704389040 +50,206,2,2,17,18,1704389040 +51,206,3,3,8,4,1704389040 +52,206,4,4,17,18,1704389040 +53,201,1,1,8,3,1704389080 +54,201,2,2,5,2,1704389080 +55,201,3,3,6,2,1704389080 +56,201,4,4,6,1,1704389080 +57,201,5,5,7,4,1704389080 +58,202,1,1,6,2,1704389080 +59,202,2,2,17,18,1704389080 +60,178,1,1,8,4,1704389081 +61,178,2,2,7,3,1704389081 +62,178,3,3,5,2,1704389081 +63,178,4,4,6,1,1704389081 +64,177,1,1,8,4,1704389100 +65,177,2,2,7,3,1704389100 +66,177,3,3,17,18,1704389100 +67,177,4,4,5,1,1704389100 +68,176,1,1,8,4,1704389150 +69,176,2,2,8,3,1704389150 +70,176,3,3,5,18,1704389150 +71,206,1,1,8,4,1704389160 +72,206,2,2,17,18,1704389160 +73,206,3,3,8,4,1704389160 +74,206,4,4,17,18,1704389160 +75,210,1,1,6,18,1704389160 +76,210,1,2,6,2,1704389160 +77,210,2,2,5,2,1704389160 +78,210,3,3,7,4,1704389160 +79,210,4,4,8,3,1704389160 +80,175,1,1,8,4,1704389200 +81,175,2,2,7,3,1704389200 +82,175,3,3,6,1,1704389200 +83,175,3,4,6,2,1704389200 +84,175,4,4,5,2,1704389200 +85,178,1,1,8,4,1704389220 +86,178,2,2,7,3,1704389220 +87,178,3,3,5,2,1704389220 +88,178,4,4,6,1,1704389220 +89,201,1,1,8,3,1704389220 +90,201,2,2,5,2,1704389220 +91,201,3,3,6,2,1704389220 +92,201,4,4,6,1,1704389220 +93,201,5,5,7,4,1704389220 +94,202,1,1,6,2,1704389220 +95,202,2,2,17,18,1704389220 +96,177,1,1,8,4,1704389250 +97,177,2,2,7,3,1704389250 +98,177,3,3,17,18,1704389250 +99,177,4,4,5,1,1704389250 +100,206,1,1,8,4,1704389280 +101,206,2,2,17,18,1704389280 +102,206,3,3,8,4,1704389280 +103,206,4,4,17,18,1704389280 +104,176,1,1,8,4,1704389300 +105,176,2,2,8,3,1704389300 +106,176,3,3,5,18,1704389300 +107,210,1,1,6,18,1704389310 +108,210,1,2,6,2,1704389310 +109,210,2,2,5,2,1704389310 +110,210,3,3,7,4,1704389310 +111,210,4,4,8,3,1704389310 +112,201,1,1,8,3,1704389359 +113,201,2,2,5,2,1704389359 +114,201,3,3,6,2,1704389359 +115,201,4,4,6,1,1704389359 +116,201,5,5,7,4,1704389359 +117,175,1,1,8,4,1704389360 +118,175,2,2,7,3,1704389360 +119,175,3,3,6,1,1704389360 +120,175,3,4,6,2,1704389360 +121,175,4,4,5,2,1704389360 +122,178,1,1,8,4,1704389360 +123,178,2,2,7,3,1704389360 +124,178,3,3,5,2,1704389360 +125,178,4,4,6,1,1704389360 +126,202,1,1,6,2,1704389360 +127,202,2,2,17,18,1704389360 +128,177,1,1,8,4,1704389400 +129,177,2,2,7,3,1704389400 +130,177,3,3,17,18,1704389400 +131,177,4,4,5,1,1704389400 +132,206,1,1,8,4,1704389400 +133,206,2,2,17,18,1704389400 +134,206,3,3,8,4,1704389400 +135,206,4,4,17,18,1704389400 +136,176,1,1,8,4,1704389450 +137,176,2,2,8,3,1704389450 +138,176,3,3,5,18,1704389450 +139,210,1,1,6,18,1704389460 +140,210,1,2,6,2,1704389460 +141,210,2,2,5,2,1704389460 +142,210,3,3,7,4,1704389460 +143,210,4,4,8,3,1704389460 +144,178,1,1,8,4,1704389500 +145,178,2,2,7,3,1704389500 +146,178,3,3,5,2,1704389500 +147,178,4,4,6,1,1704389500 +148,201,1,1,8,3,1704389500 +149,201,2,2,5,2,1704389500 +150,201,3,3,6,2,1704389500 +151,201,4,4,6,1,1704389500 +152,201,5,5,7,4,1704389500 +153,202,1,1,6,2,1704389500 +154,202,2,2,17,18,1704389500 +155,175,1,1,8,4,1704389520 +156,175,2,2,7,3,1704389520 +157,175,3,3,6,1,1704389520 +158,175,3,4,6,2,1704389520 +159,175,4,4,5,2,1704389520 +160,206,1,1,8,4,1704389520 +161,206,2,2,17,18,1704389520 +162,206,3,3,8,4,1704389520 +163,206,4,4,17,18,1704389520 +164,177,1,1,8,4,1704389551 +165,177,2,2,7,3,1704389551 +166,177,3,3,17,18,1704389551 +167,177,4,4,5,1,1704389551 +168,176,1,1,8,4,1704389599 +169,176,2,2,8,3,1704389599 +170,176,3,3,5,18,1704389599 +171,210,1,1,6,18,1704389610 +172,210,1,2,6,2,1704389610 +173,210,2,2,5,2,1704389610 +174,210,3,3,7,4,1704389610 +175,210,4,4,8,3,1704389610 +176,178,1,1,8,4,1704389640 +177,178,2,2,7,3,1704389640 +178,178,3,3,5,2,1704389640 +179,178,4,4,6,1,1704389640 +180,201,1,1,8,3,1704389640 +181,201,2,2,5,2,1704389640 +182,201,3,3,6,2,1704389640 +183,201,4,4,6,1,1704389640 +184,201,5,5,7,4,1704389640 +185,202,1,1,6,2,1704389640 +186,202,2,2,17,18,1704389640 +187,206,1,1,8,4,1704389640 +188,206,2,2,17,18,1704389640 +189,206,3,3,8,4,1704389640 +190,206,4,4,17,18,1704389640 +191,175,1,1,8,4,1704389680 +192,175,2,2,7,3,1704389680 +193,175,3,3,6,1,1704389680 +194,175,3,4,6,2,1704389680 +195,175,4,4,5,2,1704389680 +196,177,1,1,8,4,1704389700 +197,177,2,2,7,3,1704389700 +198,177,3,3,17,18,1704389700 +199,177,4,4,5,1,1704389700 +200,176,1,1,8,4,1704389750 +201,176,2,2,8,3,1704389750 +202,176,3,3,5,18,1704389750 +203,210,1,1,6,18,1704389759 +204,210,1,2,6,2,1704389759 +205,210,2,2,5,2,1704389759 +206,210,3,3,7,4,1704389759 +207,210,4,4,8,3,1704389759 +208,206,1,1,8,4,1704389760 +209,206,2,2,17,18,1704389760 +210,206,3,3,8,4,1704389760 +211,206,4,4,17,18,1704389760 +212,201,1,1,8,3,1704389779 +213,201,2,2,5,2,1704389779 +214,201,3,3,6,2,1704389779 +215,201,4,4,6,1,1704389779 +216,201,5,5,7,4,1704389779 +217,178,1,1,8,4,1704389780 +218,178,2,2,7,3,1704389780 +219,178,3,3,5,2,1704389780 +220,178,4,4,6,1,1704389780 +221,202,1,1,6,2,1704389780 +222,202,2,2,17,18,1704389780 +223,175,1,1,8,4,1704389839 +224,175,2,2,7,3,1704389839 +225,175,3,3,6,1,1704389839 +226,175,3,4,6,2,1704389839 +227,175,4,4,5,2,1704389839 +228,177,1,1,8,4,1704389850 +229,177,2,2,7,3,1704389850 +230,177,3,3,17,18,1704389850 +231,177,4,4,5,1,1704389850 +232,206,1,1,8,4,1704389880 +233,206,2,2,17,18,1704389880 +234,206,3,3,8,4,1704389880 +235,206,4,4,17,18,1704389880 +236,176,1,1,8,4,1704389900 +237,176,2,2,8,3,1704389900 +238,176,3,3,5,18,1704389900 +239,210,1,1,6,18,1704389910 +240,210,1,2,6,2,1704389910 +241,210,2,2,5,2,1704389910 +242,210,3,3,7,4,1704389910 +243,210,4,4,8,3,1704389910 +244,178,1,1,8,4,1704389920 +245,178,2,2,7,3,1704389920 +246,178,3,3,5,2,1704389920 +247,178,4,4,6,1,1704389920 +248,201,1,1,8,3,1704389920 +249,201,2,2,5,2,1704389920 +250,201,3,3,6,2,1704389920 +251,201,4,4,6,1,1704389920 +252,201,5,5,7,4,1704389920 +253,202,1,1,6,2,1704389920 +254,202,2,2,17,18,1704389920 +255,175,1,1,8,4,1704390000 +256,175,2,2,7,3,1704390000 +257,175,3,3,6,1,1704390000 +258,175,3,4,6,2,1704390000 +259,175,4,4,5,2,1704390000 +260,177,1,1,8,4,1704390000 +261,177,2,2,7,3,1704390000 +262,177,3,3,17,18,1704390000 +263,177,4,4,5,1,1704390000 +264,206,1,1,8,4,1704390000 +265,206,2,2,17,18,1704390000 +266,206,3,3,8,4,1704390000 +267,206,4,4,17,18,1704390000 +268,176,1,1,8,4,1704390050 +269,176,2,2,8,3,1704390050 +270,176,3,3,5,18,1704390050 +271,178,1,1,8,4,1704390060 +272,178,2,2,7,3,1704390060 +273,178,3,3,5,2,1704390060 +274,178,4,4,6,1,1704390060 +275,201,1,1,8,3,1704390060 +276,201,2,2,5,2,1704390060 +277,201,3,3,6,2,1704390060 +278,201,4,4,6,1,1704390060 +279,201,5,5,7,4,1704390060 +280,202,1,1,6,2,1704390060 +281,202,2,2,17,18,1704390060 +282,210,1,1,6,18,1704390060 +283,210,1,2,6,2,1704390060 +284,210,2,2,5,2,1704390060 +285,210,3,3,7,4,1704390060 +286,210,4,4,8,3,1704390060 +287,206,1,1,8,4,1704390120 +288,206,2,2,17,18,1704390120 +289,206,3,3,8,4,1704390120 +290,206,4,4,17,18,1704390120 +291,177,1,1,8,4,1704390150 +292,177,2,2,7,3,1704390150 +293,177,3,3,17,18,1704390150 +294,177,4,4,5,1,1704390150 +295,175,1,1,8,4,1704390160 +296,175,2,2,7,3,1704390160 +297,175,3,3,6,1,1704390160 +298,175,3,4,6,2,1704390160 +299,175,4,4,5,2,1704390160 +300,176,1,1,8,4,1704390200 +301,176,2,2,8,3,1704390200 +302,176,3,3,5,18,1704390200 +303,201,1,1,8,3,1704390200 +304,201,2,2,5,2,1704390200 +305,201,3,3,6,2,1704390200 +306,201,4,4,6,1,1704390200 +307,201,5,5,7,4,1704390200 +308,178,1,1,8,4,1704390201 +309,178,2,2,7,3,1704390201 +310,178,3,3,5,2,1704390201 +311,178,4,4,6,1,1704390201 +312,210,1,1,6,18,1704390210 +313,210,1,2,6,2,1704390210 +314,210,2,2,5,2,1704390210 +315,210,3,3,7,4,1704390210 +316,210,4,4,8,3,1704390210 +317,206,1,1,8,4,1704390240 +318,206,2,2,17,18,1704390240 +319,206,3,3,8,4,1704390240 +320,206,4,4,17,18,1704390240 +321,177,1,1,8,4,1704390300 +322,177,2,2,7,3,1704390300 +323,177,3,3,17,18,1704390300 +324,177,4,4,5,1,1704390300 +325,175,1,1,8,4,1704390320 +326,175,2,2,7,3,1704390320 +327,175,3,3,6,1,1704390320 +328,175,3,4,6,2,1704390320 +329,175,4,4,5,2,1704390320 +330,178,1,1,8,4,1704390340 +331,178,2,2,7,3,1704390340 +332,178,3,3,5,2,1704390340 +333,178,4,4,6,1,1704390340 +334,201,1,1,8,3,1704390340 +335,201,2,2,5,2,1704390340 +336,201,3,3,6,2,1704390340 +337,201,4,4,6,1,1704390340 +338,201,5,5,7,4,1704390340 +339,176,1,1,8,4,1704390349 +340,176,2,2,8,3,1704390349 +341,176,3,3,5,18,1704390349 +342,206,1,1,8,4,1704390359 +343,206,2,2,17,18,1704390359 +344,206,3,3,8,4,1704390359 +345,206,4,4,17,18,1704390359 +346,210,1,1,6,18,1704390360 +347,210,1,2,6,2,1704390360 +348,210,2,2,5,2,1704390360 +349,210,3,3,7,4,1704390360 +350,210,4,4,8,3,1704390360 +351,177,1,1,8,4,1704390450 +352,177,2,2,7,3,1704390450 +353,177,3,3,17,18,1704390450 +354,177,4,4,5,1,1704390450 +355,175,1,1,8,4,1704390480 +356,175,2,2,7,3,1704390480 +357,175,3,3,6,1,1704390480 +358,175,3,4,6,2,1704390480 +359,175,4,4,5,2,1704390480 +360,178,1,1,8,4,1704390480 +361,178,2,2,7,3,1704390480 +362,178,3,3,5,2,1704390480 +363,178,4,4,6,1,1704390480 +364,201,1,1,8,3,1704390480 +365,201,2,2,5,2,1704390480 +366,201,3,3,6,2,1704390480 +367,201,4,4,6,1,1704390480 +368,201,5,5,7,4,1704390480 +369,206,1,1,8,4,1704390480 +370,206,2,2,17,18,1704390480 +371,206,3,3,8,4,1704390480 +372,206,4,4,17,18,1704390480 +373,176,1,1,8,4,1704390500 +374,176,2,2,8,3,1704390500 +375,176,3,3,5,18,1704390500 +376,210,1,1,6,18,1704390510 +377,210,1,2,6,2,1704390510 +378,210,2,2,5,2,1704390510 +379,210,3,3,7,4,1704390510 +380,210,4,4,8,3,1704390510 +381,202,1,1,6,2,1704390529 +382,202,2,2,17,18,1704390529 +383,177,1,1,8,4,1704390599 +384,177,2,2,7,3,1704390599 +385,177,3,3,17,18,1704390599 +386,177,4,4,5,1,1704390599 +387,206,1,1,8,4,1704390600 +388,206,2,2,17,18,1704390600 +389,206,3,3,8,4,1704390600 +390,206,4,4,17,18,1704390600 +391,178,1,1,8,4,1704390620 +392,178,2,2,7,3,1704390620 +393,178,3,3,5,2,1704390620 +394,178,4,4,6,1,1704390620 +395,201,1,1,8,3,1704390620 +396,201,2,2,5,2,1704390620 +397,201,3,3,6,2,1704390620 +398,201,4,4,6,1,1704390620 +399,201,5,5,7,4,1704390620 +400,175,1,1,8,4,1704390640 +401,175,2,2,7,3,1704390640 +402,175,3,3,6,1,1704390640 +403,175,3,4,6,2,1704390640 +404,175,4,4,5,2,1704390640 +405,176,1,1,8,4,1704390650 +406,176,2,2,8,3,1704390650 +407,176,3,3,5,18,1704390650 +408,210,1,1,6,18,1704390660 +409,210,1,2,6,2,1704390660 +410,210,2,2,5,2,1704390660 +411,210,3,3,7,4,1704390660 +412,210,4,4,8,3,1704390660 +413,202,1,1,6,2,1704390670 +414,202,2,2,17,18,1704390670 +415,206,1,1,8,4,1704390720 +416,206,2,2,17,18,1704390720 +417,206,3,3,8,4,1704390720 +418,206,4,4,17,18,1704390720 +419,177,1,1,8,4,1704390750 +420,177,2,2,7,3,1704390750 +421,177,3,3,17,18,1704390750 +422,177,4,4,5,1,1704390750 +423,201,1,1,8,3,1704390760 +424,201,2,2,5,2,1704390760 +425,201,3,3,6,2,1704390760 +426,201,4,4,6,1,1704390760 +427,201,5,5,7,4,1704390760 +428,178,1,1,8,4,1704390761 +429,178,2,2,7,3,1704390761 +430,178,3,3,5,2,1704390761 +431,178,4,4,6,1,1704390761 +432,175,1,1,8,4,1704390800 +433,175,2,2,7,3,1704390800 +434,175,3,3,6,1,1704390800 +435,175,3,4,6,2,1704390800 +436,175,4,4,5,2,1704390800 +437,176,1,1,8,4,1704390800 +438,176,2,2,8,3,1704390800 +439,176,3,3,5,18,1704390800 +440,210,1,1,6,18,1704390809 +441,210,1,2,6,2,1704390809 +442,210,2,2,5,2,1704390809 +443,210,3,3,7,4,1704390809 +444,210,4,4,8,3,1704390809 +445,202,1,1,6,2,1704390810 +446,202,2,2,17,18,1704390810 +447,206,1,1,8,4,1704390840 +448,206,2,2,17,18,1704390840 +449,206,3,3,8,4,1704390840 +450,206,4,4,17,18,1704390840 +451,177,1,1,8,4,1704390900 +452,177,2,2,7,3,1704390900 +453,177,3,3,17,18,1704390900 +454,177,4,4,5,1,1704390900 +455,178,1,1,8,4,1704390900 +456,178,2,2,7,3,1704390900 +457,178,3,3,5,2,1704390900 +458,178,4,4,6,1,1704390900 +459,201,1,1,8,3,1704390900 +460,201,2,2,5,2,1704390900 +461,201,3,3,6,2,1704390900 +462,201,4,4,6,1,1704390900 +463,201,5,5,7,4,1704390900 +464,176,1,1,8,4,1704390950 +465,176,2,2,8,3,1704390950 +466,176,3,3,5,18,1704390950 +467,202,1,1,6,2,1704390950 +468,202,2,2,17,18,1704390950 +469,175,1,1,8,4,1704390960 +470,175,2,2,7,3,1704390960 +471,175,3,3,6,1,1704390960 +472,175,3,4,6,2,1704390960 +473,175,4,4,5,2,1704390960 +474,206,1,1,8,4,1704390960 +475,206,2,2,17,18,1704390960 +476,206,3,3,8,4,1704390960 +477,206,4,4,17,18,1704390960 +478,210,1,1,6,18,1704390960 +479,210,1,2,6,2,1704390960 +480,210,2,2,5,2,1704390960 +481,210,3,3,7,4,1704390960 +482,210,4,4,8,3,1704390960 +483,201,1,1,8,3,1704391040 +484,201,2,2,5,2,1704391040 +485,201,3,3,6,2,1704391040 +486,201,4,4,6,1,1704391040 +487,201,5,5,7,4,1704391040 +488,178,1,1,8,4,1704391041 +489,178,2,2,7,3,1704391041 +490,178,3,3,5,2,1704391041 +491,178,4,4,6,1,1704391041 +492,177,1,1,8,4,1704391050 +493,177,2,2,7,3,1704391050 +494,177,3,3,17,18,1704391050 +495,177,4,4,5,1,1704391050 +496,206,1,1,8,4,1704391080 +497,206,2,2,17,18,1704391080 +498,206,3,3,8,4,1704391080 +499,206,4,4,17,18,1704391080 +500,202,1,1,6,2,1704391090 +501,202,2,2,17,18,1704391090 +502,176,1,1,8,4,1704391100 +503,176,2,2,8,3,1704391100 +504,176,3,3,5,18,1704391100 +505,210,1,1,6,18,1704391110 +506,210,1,2,6,2,1704391110 +507,210,2,2,5,2,1704391110 +508,210,3,3,7,4,1704391110 +509,210,4,4,8,3,1704391110 +510,175,1,1,8,4,1704391119 +511,175,2,2,7,3,1704391119 +512,175,3,3,6,1,1704391119 +513,175,3,4,6,2,1704391119 +514,175,4,4,5,2,1704391119 +515,178,1,1,8,4,1704391180 +516,178,2,2,7,3,1704391180 +517,178,3,3,5,2,1704391180 +518,178,4,4,6,1,1704391180 +519,201,1,1,8,3,1704391180 +520,201,2,2,5,2,1704391180 +521,201,3,3,6,2,1704391180 +522,201,4,4,6,1,1704391180 +523,201,5,5,7,4,1704391180 +524,206,1,1,8,4,1704391200 +525,206,2,2,17,18,1704391200 +526,206,3,3,8,4,1704391200 +527,206,4,4,17,18,1704391200 +528,177,1,1,8,4,1704391201 +529,177,2,2,7,3,1704391201 +530,177,3,3,17,18,1704391201 +531,177,4,4,5,1,1704391201 +532,202,1,1,6,2,1704391230 +533,202,2,2,17,18,1704391230 +534,176,1,1,8,4,1704391250 +535,176,2,2,8,3,1704391250 +536,176,3,3,5,18,1704391250 +537,210,1,1,6,18,1704391260 +538,210,1,2,6,2,1704391260 +539,210,2,2,5,2,1704391260 +540,210,3,3,7,4,1704391260 +541,210,4,4,8,3,1704391260 +542,175,1,1,8,4,1704391280 +543,175,2,2,7,3,1704391280 +544,175,3,3,6,1,1704391280 +545,175,3,4,6,2,1704391280 +546,175,4,4,5,2,1704391280 +547,178,1,1,8,4,1704391320 +548,178,2,2,7,3,1704391320 +549,178,3,3,5,2,1704391320 +550,178,4,4,6,1,1704391320 +551,201,1,1,8,3,1704391320 +552,201,2,2,5,2,1704391320 +553,201,3,3,6,2,1704391320 +554,201,4,4,6,1,1704391320 +555,201,5,5,7,4,1704391320 +556,206,1,1,8,4,1704391320 +557,206,2,2,17,18,1704391320 +558,206,3,3,8,4,1704391320 +559,206,4,4,17,18,1704391320 +560,177,1,1,8,4,1704391350 +561,177,2,2,7,3,1704391350 +562,177,3,3,17,18,1704391350 +563,177,4,4,5,1,1704391350 +564,202,1,1,6,2,1704391370 +565,202,2,2,17,18,1704391370 +566,176,1,1,8,4,1704391399 +567,176,2,2,8,3,1704391399 +568,176,3,3,5,18,1704391399 +569,210,1,1,6,18,1704391410 +570,210,1,2,6,2,1704391410 +571,210,2,2,5,2,1704391410 +572,210,3,3,7,4,1704391410 +573,210,4,4,8,3,1704391410 +574,175,1,1,8,4,1704391440 +575,175,2,2,7,3,1704391440 +576,175,3,3,6,1,1704391440 +577,175,3,4,6,2,1704391440 +578,175,4,4,5,2,1704391440 +579,206,1,1,8,4,1704391440 +580,206,2,2,17,18,1704391440 +581,206,3,3,8,4,1704391440 +582,206,4,4,17,18,1704391440 +583,201,1,1,8,3,1704391460 +584,201,2,2,5,2,1704391460 +585,201,3,3,6,2,1704391460 +586,201,4,4,6,1,1704391460 +587,201,5,5,7,4,1704391460 +588,178,1,1,8,4,1704391461 +589,178,2,2,7,3,1704391461 +590,178,3,3,5,2,1704391461 +591,178,4,4,6,1,1704391461 +592,177,1,1,8,4,1704391500 +593,177,2,2,7,3,1704391500 +594,177,3,3,17,18,1704391500 +595,177,4,4,5,1,1704391500 +596,202,1,1,6,2,1704391509 +597,202,2,2,17,18,1704391509 +598,176,1,1,8,4,1704391550 +599,176,2,2,8,3,1704391550 +600,176,3,3,5,18,1704391550 +601,206,1,1,8,4,1704391560 +602,206,2,2,17,18,1704391560 +603,206,3,3,8,4,1704391560 +604,206,4,4,17,18,1704391560 +605,210,1,1,6,18,1704391560 +606,210,1,2,6,2,1704391560 +607,210,2,2,5,2,1704391560 +608,210,3,3,7,4,1704391560 +609,210,4,4,8,3,1704391560 +610,175,1,1,8,4,1704391600 +611,175,2,2,7,3,1704391600 +612,175,3,3,6,1,1704391600 +613,175,3,4,6,2,1704391600 +614,175,4,4,5,2,1704391600 +615,178,1,1,8,4,1704391600 +616,178,2,2,7,3,1704391600 +617,178,3,3,5,2,1704391600 +618,178,4,4,6,1,1704391600 +619,201,1,1,8,3,1704391600 +620,201,2,2,5,2,1704391600 +621,201,3,3,6,2,1704391600 +622,201,4,4,6,1,1704391600 +623,201,5,5,7,4,1704391600 +624,177,1,1,8,4,1704391650 +625,177,2,2,7,3,1704391650 +626,177,3,3,17,18,1704391650 +627,177,4,4,5,1,1704391650 +628,202,1,1,6,2,1704391650 +629,202,2,2,17,18,1704391650 +630,206,1,1,8,4,1704391680 +631,206,2,2,17,18,1704391680 +632,206,3,3,8,4,1704391680 +633,206,4,4,17,18,1704391680 +634,176,1,1,8,4,1704391700 +635,176,2,2,8,3,1704391700 +636,176,3,3,5,18,1704391700 +637,210,1,1,6,18,1704391710 +638,210,1,2,6,2,1704391710 +639,210,2,2,5,2,1704391710 +640,210,3,3,7,4,1704391710 +641,210,4,4,8,3,1704391710 +642,201,1,1,8,3,1704391740 +643,201,2,2,5,2,1704391740 +644,201,3,3,6,2,1704391740 +645,201,4,4,6,1,1704391740 +646,201,5,5,7,4,1704391740 +647,178,1,1,8,4,1704391741 +648,178,2,2,7,3,1704391741 +649,178,3,3,5,2,1704391741 +650,178,4,4,6,1,1704391741 +651,175,1,1,8,4,1704391760 +652,175,2,2,7,3,1704391760 +653,175,3,3,6,1,1704391760 +654,175,3,4,6,2,1704391760 +655,175,4,4,5,2,1704391760 +656,202,1,1,6,2,1704391790 +657,202,2,2,17,18,1704391790 +658,177,1,1,8,4,1704391800 +659,177,2,2,7,3,1704391800 +660,177,3,3,17,18,1704391800 +661,177,4,4,5,1,1704391800 +662,206,1,1,8,4,1704391801 +663,206,2,2,17,18,1704391801 +664,206,3,3,8,4,1704391801 +665,206,4,4,17,18,1704391801 +666,176,1,1,8,4,1704391850 +667,176,2,2,8,3,1704391850 +668,176,3,3,5,18,1704391850 +669,210,1,1,6,18,1704391859 +670,210,1,2,6,2,1704391859 +671,210,2,2,5,2,1704391859 +672,210,3,3,7,4,1704391859 +673,210,4,4,8,3,1704391859 +674,178,1,1,8,4,1704391880 +675,178,2,2,7,3,1704391880 +676,178,3,3,5,2,1704391880 +677,178,4,4,6,1,1704391880 +678,201,1,1,8,3,1704391880 +679,201,2,2,5,2,1704391880 +680,201,3,3,6,2,1704391880 +681,201,4,4,6,1,1704391880 +682,201,5,5,7,4,1704391880 +683,175,1,1,8,4,1704391920 +684,175,2,2,7,3,1704391920 +685,175,3,3,6,1,1704391920 +686,175,3,4,6,2,1704391920 +687,175,4,4,5,2,1704391920 +688,206,1,1,8,4,1704391920 +689,206,2,2,17,18,1704391920 +690,206,3,3,8,4,1704391920 +691,206,4,4,17,18,1704391920 +692,202,1,1,6,2,1704391930 +693,202,2,2,17,18,1704391930 +694,177,1,1,8,4,1704391950 +695,177,2,2,7,3,1704391950 +696,177,3,3,17,18,1704391950 +697,177,4,4,5,1,1704391950 +698,176,1,1,8,4,1704392000 +699,176,2,2,8,3,1704392000 +700,176,3,3,5,18,1704392000 +701,210,1,1,6,18,1704392010 +702,210,1,2,6,2,1704392010 +703,210,2,2,5,2,1704392010 +704,210,3,3,7,4,1704392010 +705,210,4,4,8,3,1704392010 +706,178,1,1,8,4,1704392020 +707,178,2,2,7,3,1704392020 +708,178,3,3,5,2,1704392020 +709,178,4,4,6,1,1704392020 +710,201,1,1,8,3,1704392020 +711,201,2,2,5,2,1704392020 +712,201,3,3,6,2,1704392020 +713,201,4,4,6,1,1704392020 +714,201,5,5,7,4,1704392020 +715,206,1,1,8,4,1704392040 +716,206,2,2,17,18,1704392040 +717,206,3,3,8,4,1704392040 +718,206,4,4,17,18,1704392040 +719,202,1,1,6,2,1704392070 +720,202,2,2,17,18,1704392070 +721,175,1,1,8,4,1704392080 +722,175,2,2,7,3,1704392080 +723,175,3,3,6,1,1704392080 +724,175,3,4,6,2,1704392080 +725,175,4,4,5,2,1704392080 +726,177,1,1,8,4,1704392100 +727,177,2,2,7,3,1704392100 +728,177,3,3,17,18,1704392100 +729,177,4,4,5,1,1704392100 +730,176,1,1,8,4,1704392151 +731,176,2,2,8,3,1704392151 +732,176,3,3,5,18,1704392151 +733,210,1,1,6,18,1704392159 +734,210,1,2,6,2,1704392159 +735,210,2,2,5,2,1704392159 +736,210,3,3,7,4,1704392159 +737,210,4,4,8,3,1704392159 +738,178,1,1,8,4,1704392160 +739,178,2,2,7,3,1704392160 +740,178,3,3,5,2,1704392160 +741,178,4,4,6,1,1704392160 +742,201,1,1,8,3,1704392160 +743,201,2,2,5,2,1704392160 +744,201,3,3,6,2,1704392160 +745,201,4,4,6,1,1704392160 +746,201,5,5,7,4,1704392160 +747,206,1,1,8,4,1704392160 +748,206,2,2,17,18,1704392160 +749,206,3,3,8,4,1704392160 +750,206,4,4,17,18,1704392160 +751,202,1,1,6,2,1704392211 +752,202,2,2,17,18,1704392211 +753,175,1,1,8,4,1704392240 +754,175,2,2,7,3,1704392240 +755,175,3,3,6,1,1704392240 +756,175,3,4,6,2,1704392240 +757,175,4,4,5,2,1704392240 +758,177,1,1,8,4,1704392250 +759,177,2,2,7,3,1704392250 +760,177,3,3,17,18,1704392250 +761,177,4,4,5,1,1704392250 +762,206,1,1,8,4,1704392280 +763,206,2,2,17,18,1704392280 +764,206,3,3,8,4,1704392280 +765,206,4,4,17,18,1704392280 +766,176,1,1,8,4,1704392300 +767,176,2,2,8,3,1704392300 +768,176,3,3,5,18,1704392300 +769,178,1,1,8,4,1704392300 +770,178,2,2,7,3,1704392300 +771,178,3,3,5,2,1704392300 +772,201,1,1,8,3,1704392301 +773,201,2,2,5,2,1704392301 +774,201,3,3,6,2,1704392301 +775,201,4,4,6,1,1704392301 +776,210,1,1,6,18,1704392310 +777,210,2,2,5,2,1704392310 +778,210,3,3,7,4,1704392310 +779,210,4,4,8,3,1704392310 +780,202,2,2,17,18,1704392350 +781,176,1,1,8,4,1704392300 +782,176,2,2,8,3,1704392300 +783,176,3,3,5,18,1704392300 +784,210,1,1,6,18,1704392310 +785,210,1,2,6,2,1704392310 +786,210,2,2,5,2,1704392310 +787,210,3,3,7,4,1704392310 +788,210,4,4,8,3,1704392310 +789,178,1,1,8,4,1704392300 +790,178,2,2,7,3,1704392300 +791,178,3,3,5,2,1704392300 +792,178,4,4,6,1,1704392300 +793,206,1,1,8,4,1704392280 +794,206,2,2,17,18,1704392280 +795,206,3,3,8,4,1704392280 +796,206,4,4,17,18,1704392280 +797,177,1,1,8,4,1704392250 +798,177,2,2,7,3,1704392250 +799,177,3,3,17,18,1704392250 +800,177,4,4,5,1,1704392250 +801,201,1,1,8,3,1704392301 +802,201,2,2,5,2,1704392301 +803,201,3,3,6,2,1704392301 +804,201,4,4,6,1,1704392301 +805,201,5,5,7,4,1704392301 +806,175,1,1,8,4,1704392240 +807,175,2,2,7,3,1704392240 +808,175,3,3,6,1,1704392240 +809,175,3,4,6,2,1704392240 +810,175,4,4,5,2,1704392240 +811,202,1,1,6,2,1704392350 +812,202,2,2,17,18,1704392350 diff --git a/Analysis/0109_preprocess/0125/movements_wo_start_unix.csv b/Analysis/0109_preprocess/0125/movements_wo_start_unix.csv new file mode 100644 index 000000000..7e4b23c66 --- /dev/null +++ b/Analysis/0109_preprocess/0125/movements_wo_start_unix.csv @@ -0,0 +1,33 @@ +,inter_no,phas_A,phas_B,move_A,move_B +8,175,1,1,8,4 +15,175,2,2,7,3 +20,175,3,3,6,1 +24,175,3,4,6,2 +26,175,4,4,5,2 +5,176,1,1,8,4 +11,176,2,2,8,3 +16,176,3,3,5,18 +6,177,1,1,8,4 +13,177,2,2,7,3 +15,177,3,3,17,18 +21,177,4,4,5,1 +1,178,1,1,8,4 +3,178,2,2,7,3 +6,178,3,3,5,2 +7,178,4,4,6,1 +2,201,1,1,8,3 +4,201,2,2,5,2 +7,201,3,3,6,2 +8,201,4,4,6,1 +12,201,5,5,7,4 +3,202,1,1,6,2 +7,202,2,2,17,18 +0,206,1,1,8,4 +1,206,2,2,17,18 +2,206,3,3,8,4 +3,206,4,4,17,18 +27,210,1,1,6,18 +28,210,1,2,6,2 +18,210,2,2,5,2 +21,210,3,3,7,4 +28,210,4,4,8,3 diff --git a/Documents/1127_table_definition/table_definition_v0.8.4.xlsx b/Documents/1127_table_definition/table_definition_v0.8.4.xlsx index cbcb7eee60f3fef6ef6811034f3b6a904307d46d..997e2b01d0efb1c07f8ad6f86a7f68d293da2f8c 100644 GIT binary patch delta 25960 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 TIKVi)gb_fC98UF;st)&m&SrN~ delta 25999 zcmagEWmsEX_a|JWKybI>1a~X$?(Xi^LUD?vxI+l;?(Po7-K}`>;#ypW`+lC8`Oo!! zct7l%D>-K``7PZmXK)I3dJ47%2mYhV^yKZQctUs^j>6Nw8S*hMr8QuqL}}hU+ep+GyJhiuWW6DajO7 z{j=&A9VHJlmY8Q!SzFPvU5G6+3x+`xiWD2kTo~wHQo|B>AdfDkHtz42I&Hh0V>$Er z8-bPef<}167esW*G&Mifz)>~a)~EOm6VC*(UoIB1E^x-5{A2<}9hCwqy`?QV%_McB z9#BQfXy415&Q=AX16f9%l3>1_ZzXI`#?JXxsw`AWOR1uh z!xDxgMbzr4L1LOEgCo!HJSF(@Zr6s~=JXt2E6OM{38U?+w?(x*CmWaA`sH5o$e7u?2MJ ztsm;SaY8mxY2zclqo(hRec8dm={+U!Gw+aCot?o^g0g7#IcVRB4My=W25NmPFO@+i zkeaXDL)m5=i^w@xg}O`d;uvOzx%wy&pftE&qJ#@@I2EyMmW zsGQ=qH~m~I%@dtdF_5p763DrZfom~|CTAp^n@78gpQ_hf$Xk^6F{Ci%D?Fz)VH;?c z!&k6I&!5yYX*$Dmuk}rOry6PX>qcRKWdH#wD^X_8rxxWw66Rc)qjnYlb86iwOl>sm z3H0EIa3aM^fmIDgVa^KND{p_C4KU7DEa@-zRl8F~*6JLpa0iVkL$;9eg}>XLtu>gd zm44f|zHxVncijX+!GF~23Y|PV3Qd{LN49={lV1%qVHE&0bDfcR`FVIhIdpHnc%u8v z6Xm{|izVYR59$@!QO0+6L*Q}hjgaJ_;X)zqAO3LESEEG0fR>#pr6H%)!$&X$y}gx+ z5M4}IgddWa^3Hwf3hJK)(dK+B3zuJC`OrxS&JH{+ix3|Qwr4Jf5$>?kr7gA(gkN9( z9%p-WzdWo~3%?y_zg_or`#o^J-t>{aoi~G?FUN{!HkqZe{qCQ#ud0tp9hrq*E}lRy zmj}XcE)Rc&L9Z{cevexq>A6k6x7F^K&GjW=zqdy;a=%xntHY&ikZ_VZF%n;z-=l1t zzL*uD75o-R*XNDilg;l;XuyR-A( zIolkLp5yOpo%Stgtx1rsCV>`7=uTF*bHwETJP-PRHWVZu6p4R7(*b*)l?{Wzx?&Xv z2&q_gWV=~lDsl#~#UKInD=P9%0UF{&{)@d>Q0p7X*u&mj!##?>F0@4yZD#XL;2hbv zWZL9xLu-O3R3YuzlJD~YU~jRcpb7+Ctg9TEL!faBPQEQcfPn|@8`?H##hlkDK4=`% zOnPwUFI7}jxC`C-C~`J>Kr2L!4DWyFBgvd5;|EA%W19H3(MdSmKIGit0Z66l_r^QO z?1wtv_~D*t(IG!9NG>m?6;uKEuF~(xZ8O;1;VlUEh~4u%$7GieyF2@6!|l}JQT)e{ zir^g6S$P-)0ppO{i;-ZnZJ?xGGM#TA@2;EkZnVEkw7sY>hvE6p<19jf|6k(C>1>Zl z9@6X}WcG_J#H&|Jnw2$Gil%89AbVBqWJ{;UhBEVn=|Q*ND@_F=)}TD#sa zHPj_=_IY+S)FE*80X8+%5peds@0S=jZxkOK*k;5${fCRTue-Esg&<|PYmHg9k7jTI z7|7Gj>rnQ)1&O1sgf`6d-}4~$UUc~~e?42D%TBVAcnQ>GTEW* z81qN}&Mj z0-vbVcuCqREvmv!IIhuahrtV0^dpC;Ah^oHG+tC>z49M0#7^rf&b}nrwQ?sjkJ4NW zrXUK7{IEnr`Zk@;_yzw833nUnI!fB+iIEr`{?8SsSeYk-rYlGM79QU8vT!2J+CW*l z<5^}7YV^H!1$w0n>k=EMI8qynBJd|@Q?`aE9v)aYA|mKda+DmBU!G`K!+l03KsKM& zNfIrBq=%(2C= zop}Lqt3PToP0zd)cZj@-qB_YK@FC5bKgksflN8cIg-cZ1iyB@|)8v5VbP}H*Sadl|-^M@{#Nv%yH))9ViJOIVifcHHYteu-js}(CBbwz_+pj?` z*=f9S{sG!hp|A~qzKnLkN9OPbFo;eP2@t1X8$$Be zR0}EGq7jVF&q#KVIm)YYEQw@8tw&}v5u$H(ieFZlyVPrf=Qc=(vzGN0AY0R)N>|$Q zFiFw%n4!k%6rHYwC|( zyiupI-FfWh0RP>6cG|Q$WvEcA&wkh>n8G$}R#T*{adjYN|4?e}--E?M4nAjFgDCAz zpHfUQ9hdr|pB%UsRoPfYy1}1}pIU157{;u;2}ZeCE6~QSG95}NLkDy?{<;gvf^p8n z@T{Q1@vIam9<1baQ>gkam8e;7{ATPt6v#^pN)@w}s!Sxl&*qJq+$ju)bT()XyE)mc zF>l|~xsifYauWD*Owd58N{3t3z5>8&QRldHG=zWHt^8tbUQ9?V_hY|-COK*``@AUN z<&CN+`#H1-Jdt}?8hnc66UEw=7bifWiW@CEkH=nk6CC7v6D&jnIHGQE9SsuWYYn=W*Rf-j2p73qmz;oF{0A@W4n23@C7%_d<%s(!qJQ3yosgAKIFwA_Cj zBZlL+2Io%lS(z*DdhEV(N;|lK5SQ1C1J?4Wd74`C))Xar1Cc6A7SR6&8z>zj0S^Bl z`A)LmTsE=%ZtaocReD(C?0D-y()%26y4}_O*G=43DGkS|vin1Kmlc#NLMEzg(k_N> z0|=Oe#YeDz%a{8}{LNuOrI?|9q!#%7dcqdYRXIe$7xFMYHYJ!_zfU84!{mB}rjA$=impB@t<*$Ki`!3I zF}8&NRmq&3csv<+XHgTFt}dHn+nEmfB4uaw9vW$rG&K8*Ke?>57RCW@a2(}O;hc&? zoOZjMzA$-@c?GD7bG*@MsX>ffpidfvn+3llD?>HMyV@_`6&pM(xx{1D=(x4*ut`IU z!PirNlAN&K^zT9|))GkZgW2|Ndzu0}flVj>ms0{sT+I9NTC6#mYTxJCE-borE>z!j(38mLc`Ol_MmA*;ak$l_6DaJ2gZVC&f`{!%0p| zSQsMUw3I9sklJWo(iCDOu?Kr@fKhl&NJ9~@ zj}?H6sEhG2)N9FeB^P96B;mP&0hW<)y(*R>rpWt$2=>-jd+cHB5|I}RQ5k99&d)tSU4(7ZGSU7 zEaxF8=iOr^de~-Bm|7_?Pqwu5nluT+!zR<_hr-`QG{@k3AiX8H@?R zI0*??yZR!;u(10tp}8xBd>D#j%af^d%ca0o>A(IV9jU#ChwDu(K6R?F8Z zI)e$-vrjM_Nyjl{TN8}XSJJ2DE8vb@;|0(GdeESCQx>$qlzs5LoY#L9X0PX=cr0YOIRWw2FjcZeS%brcApDRJ#SWcVSkK9 z=#5bX+IuZ23I90D{EXQkJh2VzS|r5rJCb3!{{Cf)ki{=8mWwg(sC%&yt9$mjnonS* zy9BfO_Bo9fV07IGXhVqiitiK4gCQrU?ZY5cbq=UdBRT{gPXAr(hL@})y!Aj_b!H-A zdb3a(g=vQbbSR!{s(LuBV)Z z&&*V|b3XVs5uw8%kI_2g@5A8M!%8r*c>wYmRn}H{s`||P1sV)q1WRhpeo)3El$^E}EA4_%Zy`daBUPR~Z zY07NDU_m7KuUi>|=LhU><+-l6VJs`5L73sO?A@(Y?zuzT@>cA{K2P-qv1=>;#uZrk z-Lzv43QO;%b(Q2@KjHBfnGDhYy!KCrSIiLCBSI=6kU0NWbO;=Dp22XaPk#NE^hnLa z?K$Q2kejzcMI`9GGwNo`DOgyqmazD_b-Oc>UZl(mF=02vwfwGg3o_9POD>uUioUe%hoat zXg=U*wess?GCGv&HjkCHJ7jBKlPHzfT~Cy;dH;re$St<0o_gl0-f?s#<|bq|hmyv8 z7pQGjK~~Ku_4LmY4)iPtR@Q}T**3ka=>4Qo4jBKVp9K}FMhXRw2dm0<&!oJUVyN_6 z>IupGP|Wss?j`J~AEFFi&cy+V(OL~&vtUQd@z#KEGu|DJG)gARe{Y#pOcrQhvAqe&R44-KU(lhWTv3(DFRaNWa4p<1oXeX@y^DQw8>N5Y z9XfBcaYqn@scDHpNxJGM*1APna%-k8q7NaVu2YN=aHDKa>m0QPcM2-gf@2R$t?Tte z`l$6tRLe>V#yJzf_?U69tTg?umy@4l&-2>4^~JH;sgL$h|MbT&wy1Wn@!k-0!#x+|aea<$8>iatA~W-Wz5Sez(MIA zhg#wj;tpHarJgh~Z8dCRgX1h18T*G?yMY`{hMQBAJsfu+b=KhP9O1IfG)-C^yk5M8 zTwN*Xy?B6DYLuH0AN*lg>X2lAxA=lUD*rm|Ha2q7YRH|5Beyi+ z)!jb5BYsU4g1qcEI@CDo%x~ngV?_|>a6wB&rYa07+|lE*J1<^YyY)+xsmjK@sfgvM zh!(r$=TmiYI#~%8>WP(cdn$0Comf2)^tl>D`ELCuFc*efyUi9=KDF#JN1=@_zN$5y zJ=|Iy+kZS0V5jcyDu-C?DmQowm6S>3I_m7;=TJQF;sV+Z-)!uj#&h~2tT}u;2iy9P z5Zex-x!I3TI^*N$N~l4UnO8piZ4kZkRO*$}nSHgYs@EiVX;j` z?vOo?Qg}0WbN@NJ!%2LD;L+sI&xu68(bLZUGq+FRi#_U8C4Ls=Vb=%>u;0qM*0xoyDGVb&@1Np5tKQZZ&P>ZO<%)!n_?!pON6|>+WpSFWP}Uw%r&9MW^=)|(sBk{2 zb#ayaTcuJwwiSLVWAW)a!(!lKh;LnVS|rQ@^9_L0bMrL5EjK|am411Hu9Wh1{KN8=b$r1VK*CQ%+&y}ae znLmWI(G}mwcKVnPlC4E`JMsSuhDc>1^GIUAd1*V_B;r__vzFe{dKqmRbp~h8q zw!>BSAItcT8(ulrD1&seG(Fa4uJ6pUpHx(q=zJLjm}W#cgMWA{yL< z_I?GiX9hd;x&Lm?rkF)3vTIvaRp&SIYRE6kgIuot{!F$tWuR4m#;4_>F=Dr2B=7O{ zw{yuS`FeF(qvU&vO)*}rz&V_>xd%q-WLrE`ToT4xC)Z%o7A(R20Kx#XC!Ufu`m zA_g2xp_S}2DAe=Xs=-k$@AIAeAKIPr@1&_V=KzCaCB$Hq)!@?~`DeZ!{6`^buBndX zDOmO$9-5LMDs#Bw&t!(?emp~MhRJ`v%vjnpbuz~eRUZ!2T;I0eB|oVAGKe7*k4%EH zji`RBg2tp{6s{N_2H2|q`b?X`*TY;v5#+dOIM9}hed(&L3diM6>8ED|$3?wm9c@{M zB6p>&U|AFe>lJ~kMZ(i`Rz(pcpV2^$mPYsztC>mRu>}3-~}dd%``x`^c(Rp+5y_6@L9kCMj{DvD{Lg@!!9X z6wqzF=)H@EMx0do521R7w5B`|{r0k^2hMSb+WSsmafDpabAxArp z0=y|US-~hz9&O>Y-=WCNshk7ZVut_HIeH&4y$iJ6W33}8V18I-wyqN4>6O8wp*qqM z*M=g)?aDlBD2;)Z9ofJ?8(Be~$!@ln zM3kKS{#P7IZX-#mId2Up01Mh^!vbZXa$|dAiweyEQG$Yf){j8`I$aMGNxlpd2akMG54nH`gTrq^E&;8f zdpPk$_tf+60q#oMQz3Oa3vm8ja%QL_slfUl7v%HB92XriAAMU7VFY=3ceE!_kSeh? zx6h6h7o=?$a4_u;KE;aGQ~@2h&EJsZ-DF&JeM6BQZa`t@4K_6be#UPMNUU=F0YttIbCmA zS@8Grs`pR-O3<^kNN#K%5&KAohL+@1v9E>(UqP_7s%Q!yDo+YRnl#bcg|%^dhy~h3 zaB+DL`(!ah$2LnLkcoTmCc8Dz0f+RayaPWGr3uf5|G^&gzDH#435)ERWsIXAcQ zcQl?zz|6AOqVB}IuG7xrr^>qB^@bOdZo5D)&_Ua(EPFIuYakT*vCkccQk?jmet;47opU_mJlBX~ZeUqmUSZQ~Doqt;4&b9j9* zef6D&ynGl}Y!|6qgKHc_^NjFm1tvLu!|vU2bZ~G`Y2>Obalei2e4%V-Ryj72hST;s z&~KAVWk0kp8g-Ul&uBSTaIa1WIm@jy^OJX@WGM;S;b~zQlOf2U&!v^!=gH{DdW|_S zI%;+O(*uc;SDU&6{b-~hKcE1Mx_Mhaf)2Cz?P@Kc0!w}i35O1J7Edx&yw|nP@zE}l z6M-EK$g>(m`!jQC;$C8Ovpx(aYClS$Y7<2zjMIB4v=T02%tfrbRe(xkSOkymla6f) zCZ^y23kl9>2-LgcCV<8S#pkwnE*SpoiNs$JxPtPH_fOY8h5kZnvV7{l*zNS_e4VUp zT&2FaVe88`=%~gpW={-a5G0FRJiM2TUTGwmcZza+Jn!W*BWY-ld7qML5x?^(BD$tB z6)R&BZ(XF}PcH2sp+1S))xboyo?}C?_EG35m17z``XQze3bdOi*|u09 z4h!!(<9oMTP|K6r)4S87(=gzf1vpm*qNBOHJ7uz8vm&Um?C-!R+1jdB!niRPSMawh z!!@ZA58ZG5c;_p}ecpcjUWhQaNs968EX6Y_48j1Tji_P*I(4sng@)vy{`ttjr>%sY znLIslg=MezMsmQExD-#?tskiDLHwT7#nvbdtF=D&kBkPVu= zR=G|4!;j4vxopH#@iT(NF*mf3WH^!3W3=A8Miy-hmOt=QgIJ+wM++#0uInTZx{Y-` zidt32m<{#rUB{@2vuj51vMg-}co5p++0>bebmxe>HjXq$JIl`Gii|si6-N6 zK^lMgVA5%wM7~9HDV$)Q{MB>n_fL}YvY*T?r06yG=_gR(lf`*MGY=Y7#hs)%DVa$G zqo!Nq`x7d*)kEqaS;*}bd7%FzUA>;zZAC^C_-lf>@HKwQR<+RyH0p-J20W30mE?d( zgOM|ee9ZJ&_~=I+R0A6vxHd-F5P@3B5ndFIv7oW?LxmB@V9w=d`H zTv%aLSs_v-UU)&`sHRogza0*?mK>LiQVcoyoi^uURniOMALDPVPb1kGNbwb+*fV9m zkc_Ta9l9~c5wk-*oah!F??zkWj3a1{K2MSOYM$yOD}cZrs_Y+d8*>lySY)~|^Dq(q zIx{js+K7vb@U=u@dq**DH2&f4pFznhN_T9B<}ec6<~p*hX95XWMl;3FM>QW+)An_S zh^H)**ADdh-us{8lwO|NcA;T{?}cP`arorXWc(MM1L_SBwid&>hS3&;e%cK{H=-oY z`3PjmjPmE-KJEWA9#tJyEXjBv+A)M=u6)nj9y*1_ltrJ*XL%o)i7GI3mFuRO3OUaW z?(0$20waoOyHW7zi61=kOS@)Gv+%vF-cKcwAf<03c$;p&N;4xT@r5sO!L)oS%kLt_ z`~lYAGSR!(M2;qyM3w=YB~h}b^yhP2SMuOK&fq5Uc1WV|bVw?`-{1l-S&igp-9gn1 zeNuQ3#HiEk_i*RA-joDB%bvf3IJa*n4d}nq){{y0UncPYuF7G|4z+&m@%6AP2b6WslJG-9tgqoblF$u7(cZ8N{jJJnp4UfiWL{alAlFJsMFUisMSZpcnQ|2m7$Y%n2a&LRG9keEa8cVLJ6c@m%R{Mu? zL;v525C=i^f&3}Kt4a(2Rux7lM-|GLYj_P}iVI3)Xo0;Bx`iPnYLTHh>ORPjW8@YR zm8x2qn~2j`BIfHb#MLBNMuBk(+(CrZOhDdSE}PbO6p{pRgxru8E)!9Kvp7n*WK(6` zmq`fJ(%30fv)C!NbO>;RQb&u@s5MjBSYXHJM=ro*^;$UOK;#hk(W`KDp6dfdSn`Cm z&1JEi-OWE7Vwl^o%Qwb>t)Q$)+j2Ie!^A-;#*UvDwLC?w1y<1GR(^0nGg2YX7Jtms zSeIH8_xYM1dp#T)1l=8aErz*2iYdsaot~tm38VvI(?{ir#z@(*oXeQZ{VbvR;cN+L zN(S$fZiUR8KG3ZvO&EMAR{01pVZVXuZ+DrcOWcPpIlYCFST+9uhzEU0gC_q$<>Kc4 zf!B@eQ6VKLo;BRA_gQ4@kl|7F@XH^uSo_(qezwAA&CmA6Nmfa*bXJYPBES_)Wz)(K z_SaZ8Dg`q;#GsTUpQZ0?l~UO*8@)c7M0ZZjY)DDe?3FfW1qGK~77DM*E(%|S`Or=Y z>9r|N<@BxF!T4KFF%6({c>5&Xud;RRVVwT_9oyvVyZVm5m+o;<%4H6PDq#F#SQ$51 zB(zOMv+7Y-w|UXX;jzhQluuu@Zj?6{!L{VlJqpPPnzN(`Pv7uuY)f`SZDb?pj|NI2 zBG%r9?#d;E=~PYBbtwh*aiG|cx+AEdw;RT=r!XZ&(tdt}Mq~tCnwO|v-Wb+|!3I{+ zhGmDaS}UuT;|7n z9E9{AHKUazU#>>DaIs#S$&o0z>~)%I0LafCDCH-5`zTtw&BG}#%iU4B1Hap&$HIby zgPJ2`IMqrWNAYjK6BPk}xDUL)A72iS#;?S`>@2_5js$~J8+R5lCHRYS?9N}yGP!JQ zN`f-`1^0rO*TjfGsB+NN4YSyQ4l~Q?#Gm%eqo}kItv|&(fEOdvkPB&YstbkfpVms( zO(NJ?Dbb~0Sob}}hXVj?C!^KcxJ6h$)NVU=b6IGIu0 zk#l$JQTN>4d^h zXbAD9{;V_Ny&WWB9z;NVY(Z99FILF_l9%FHgF191xaO@5?XILT7mDX8Nm+^?5fUX9RV=8=v3oKg zrBMiw`^8p*ET=+{kfVnl;H5x-GXI?`{2)Ls1vZftV5iiW=oicI5kMb*5lTr_A}ZU$ z0J7mJDyFWF$)Q&3o}afVNl151PN4q8KZQx1MWrB+&bnlHF?WFh=niAaLXo4GvWmI< z62K>rE+Z(&uQ97EP|h8hVGY3g=kdKr0W2SFNr^GW=LJ|Nrg%@_DACRetXoTyU_M-5 z4;wGr^f&Mo5uW9jcs3&rt&dnsnABCEJ&S1^#+m+lg;$YSc7X6P^Zyo!kw!nD(%HLez+3B?HNi?* zvbB8CgK}^m$~~KndwLr$fCAI+(g!CgC~HA)85ksXn(q&JL}}RBf`Fik^QP+?&fi0l zIt%4?zhMkb=AKUf@=L6tUmsnXW=UUt=}A_W;8{@!fwiUPhidpRtN*Aw!LL()lK0{) z(yLq+VI2sOsZTW*NY6o?qE=I$BH?BYeD=Ar$>4S!xl~fY{2tmIYqz+S zd3#D3l_-9?B?02^!Hv8%g|ZE5HFi>tjn?U7+dizvP;bxLCa~iMo&i2HxO(A&FLoBU zGfDWG!ePUjky!z(my1xh=pd8r;oF6mL;UkvWAp3)cmeod z)IXb`nviOIe=I=VVwyOjXiXAq!kke4M1|7gQfsCCs1>clsIzO9B1r_tc*JTF7XTHB zi>%Xc@-q((2A3DVW+t%G2heSrWb&y-V)X}A0~}*5mkFQ>O5PPkr`P`H60MZ#bUE#j zb6wWcOeshqu7}y&Qz3SDMGjs7SMj?Dh`EY zJ_VNJJ;(4m-<;qvv7gY5S*_>OU)0gjlCY3Sew--_AM=<0FsllUYAB#K+icY<04~ZK zT~4^646^X)ZwZTtqau`&furNBu=pdQM@0#5$_|nOSKb(G%MMW~w3XEUCAK!>UOE8i zM2wcl>pv)-?Z+-(#?G~0U6HyRpaH+%p%5~b?Wa;J(p$@*pGm4G;Z$k$o&CNfd}IHl zhiUAID3|AB)JG@ZbOKK!*5Uq2rJXBYrk9dPFPd(k<|=fvj}SfJ+?Iaij8FO(nncj)Au2IT;+{kbG7^wN0gOdnxA9&t7DYm&G4l3Q zgMzrazFF^%V_`rl!=^RxC2X+xts`oPi#givt`&_mlwOQKUpkm(a7h0#QiDPWs^5ykjS z?p8!0*QSka%F;7RIz-U0DdcAsFJiqod{$SuRslyqtL|LnOHK&3At(G65Nu=BIs@V= zfo77(-*zG=Z2X9q2NjB&hw;AT>@wGl>%5gGK6Wk>EvC*e-JMG~?xBS{$T5fi86&iZ zR);YDqQI39p_ZR?RQ%qVBy+Z6ZGu0MC3=bVto2O;Kmyka>{6&mq@RTNvn{(-E@9dq zNl6VTjiDgaD-LE7>^r|G^%}f_L9E4`nfj+>Kqv*U@hR>8qj~T1Y-)^KBWE+>5I3#G z%61)(QL4GtFM#umtjbjGToJ|8jo0W}D-<@lE*JIiah4;J!sP&3>J|m=>u-gAGvTX= zKm(@ZMmp+S$p^u@c=n`BAlg+EAl-$CiFqE6IRpDa@2Bgyi}=r8mWXg{P@p#gC;tV` z`<`>LUlS2Xt8lk3N|0MM!MTWRdiWWeF2A;)4ZBQ}pl6wq7Lc$B*_Hmb#siTx6}1g*$3MdV~SoZ#Hz8PBwIT1%Bc?t|h0< z{S05LpN|6SQZSH&n>nXImaT`dgkGd^0f|9E(-X$ohh^V>=3#I#0`9it>Rb}V1Yw-l zAjmUsRAjau=2o7EEJ5M*0IW^w3iHKSo%_D&@)E||uYN|Ue;dCYjPxHJj^s9d+a769 zb4R1ZD`tZ~ch3bR;y{n#AhFWV*d# zGbeE;0lkP~$wP@b;rrlJba%Ws^S#bj9*!Yy2bCP9z}lPr>t~-k8U+E_6i;?X>(Q*I zkR@~|0BD7eF`OtBgv1`B06sqj9Mg@|dGk%hHB&BAlVTaUmzJs=t6j5wYP++UpY607 z`V~U@h>LwkVnPb#{(Bp!JrbK}VfkUyAVt7r^E^KH<2uE8IBdTm>=|W^yQEk*t#?Cx zU#dIrXMdhXUHI!z*O)61$qA`(45*<{lOO=4J z9N1)005A|!2964h8G7qNqEYZJ6Hh!9A{xOu^2a?fnPbY{O56XDi8)F)T4p=UMV! z8Q~h~QoqjdJnS!A!y^|z8g*Dl)_fJdJppBQ? z1IO-H(1#Bn-roNGaMd`q+hIlb!O6vwvCw}&cOr{cq@%u(qucX4!W_VL1Cp0BEfsgy zx-`Hyzcin)w%7ABd}XF?vT}U%Gm(BfQX9F>06B7J+u}~N?k1v_VFXOQir5Ds)QQbW~+R0tj?jutbIhvE?-= zpJV`gNM*6G(vS?~6?VN*7%oX6xdBO5MWLQu!(zIVt zQPSl3weMA3UwzlS9yG}xe{v~pVSPTkUb-7lf5V>w;qSgXo9OTH;!Y!VwMXS^T12Vf zw(eNvwVr8O=aLgrNHrFs0;Tp&{)rFQQTMzRGVJS4BvJH2VfqCis=COS=Sp++ypk^thGRnYbMS25 zcbArbqGVTv<7Y&105#>%ISl9@KB&f@i;{ujS7TOK(L>G|{t`28(kO``phGd(h!~cZ zl{ug-4LXHM5*0V;=4ftq?pTbdkyoOtp~nBZo_Jf`IqXx_`jcu;sUg^xOKQ?@U*xRn zXnp_G+{isRtfP0(pvINGg~feu`ue(llXEkfkf9G7v@-t9_G>(*na&6mSC^e93S}^8 z7NU1QuWv>;VY@*+5+NZ9MwgY0<`*k-G%d+PkFt(9rK?U@I`>BOb$~x~5g1 zDh~&#EXG&8Yz6_$^B(HIeY%f`IEx2iqk3!IAbwf{$a|&eGiRPj3iW|-^G$e1a2Xuy zNJ5P=2IL)68KpOzaVmB!G6rOu9wQIt41S{WYs*}lh2W_^auS-bXE&kTh+hP@hQ(=4 z&=~zf>nK~Z0Ke(eJ@l8Xc3xg=U)S5qrtJE)F>lZ|y0l2E;E9;_F-#f=lOuwvtvAT) zbNKBvA1J{%@7MjBiqqR|`yn^!r|9>L7!obvJ zl?U~Of#B`OX9(l!VL_%X#d4hmjnX3$U+3hhZ_9eRVztNJxiUl&(-V#2bp0g>%18tq zb_8DL>SdK>v-_>2>-GNe@bzx<)#dtWNV2Qt`_s~r@#bT<5Xd5ZV1h+hh`DZ|-P!5- zbkkAT@5%c5g%m_;8JYfOHCDYT^n40hxNCOY1f4oHpGOQ7KRE`bhW1Pj4Oq3d9O5{3 z-X9d3wYGxZuIFB!9I^h)1a2rpB7j`7O~B>20`ie8Ad@T~gh<92ID#dcCF@Kvf+TBH zxa-?Zb6mY<8Pq$sG%m=T?+dD+a*ycoBazkB1G^$Dokim78tGu$l5`^$ktKH zibDit^&qZ5Uhu9Aga#rIzbgU3gLKG+>&4?#$lm-Q{OSAqDR6>RWw|J5g4JIOiPRG^ z4+JekETkbJKyOF`@KDB?Y$Oh-4E#<#5)Nbme$NCRlM~Wk9NR++{}5(=jNaSn8YeqJ z9$8|DE@d3oGq*#6@wT@&Ir}*|+501Nu=nS3o3(N5+JMk-mDgrI*v+^~Gg-l8d-waJ1zh9TC>DP`N|yyJ0MQA8pI^osKt*q%YZh?Xm& znM{hd0m7CF>0F@b+LyuE-`OPLe*#r05& zxAIYnQ9U}-Mg78{^@j9>&dX_coxWdRznn}mSaw`Aafq7Y6VG?`w@{S8v^lm0(ejl=;`EEA<1^j=`P|ZuP#3c)GR7R64RnJ0PRf@mB6Y<@yfurkrr6lbI-XV4 zaVTurP{5`WF!`;R);7O(iXBwIr{|$9X)l5{|D|YtB*Q3ykBG?@R!r9$$$V4$ys=V! z)JE1EJfFFxq&gcuE;I%%v)S{XG_K*6b_MDgkwzx52kdInUADQ%VK4=Uwsmu?(aFjD z3Irg!>Pjr1wRTYS(nf&OSfgAjIWadJi(J@!5A4Kghse-et*y&Q3CD2Uq&<~Ku7C$M(547? z0;aOlVr!DfowC&s4oo#^XrCRWd>jz+!BSRQd?nyf}b7WNs9Y8OCYCUCRl5C zBfMAX%YrKhjPa#?=HPb!;>vRBg%o-0kEDno+t*y)ef0j`z z!poOaY8K&4h70=2xKAKEml`1{&xwp6e}surN_zo8GEeH_(I%<@gHdDw;ai;}%5_7u zJ2iqb6Fh`1ZH?Wm05Q-{evr^c@omk0JpY^VX`&1Zrviy2#Av$U(???s$RtMF&JPSb?I)l8p-(aUlM zk1NlJRns1bd*UMe!iIN~VA?}MM1M;X5iCmm)f6oI3EyfKH!P(AAV%>u;D^u|4f;1{ zlP{GVARNs6cCv5q)&`x1Zb&p^Gc^fJThD%7CN1%n2&mb3W2jyFW~M(6Sr&EjRu;dP z+qGM4C?(2KI4+nY`zaUx_6pTsC$ZrAm4I1}+SlP^uE&L^MLY?qfL!COm3xOCG32W7 zRb7Nlgl1Z*MKbnL|u8T4^m{Eg3o-J{^G3gUHQYQ2RJ)eSj%ODp; zE{O_*_#flrTzf+bRiz}->`R#IkpZhn&-guoPswD4LUZ+sNP)xz|16lk_p1ak0anmID`6VeRNM;s?+ATX!S*M0 zYTATKujs17N(F!Vl3fOLRy%pkIfbDHTS+vaX-hXy~%5luf>`%J`@k zywS2jqwS`Y6h0ZgB)tTjB`RG&(3v3IZ%yM8?SG^u-Cn5R!0D{k2ieb3teKY=)r)Kg z+H_KDyWuB=qXsTXr?${*Z+WY8L2LPjd^gYjmK<0vWKCDAJT3&Q<-1t$JsZCh&*|qO z7a-B|4GB|lE2`_hOF?7%Kf+Bimlhlim-SzI%lEV{ z=J@c)^^o7)z)skEFxL`HN-T$s_Fg>0N__|r)2^Fd`_8iLGu=Q1LCOv6JV_)&TSCl> z9$O5gxC`+%F2|}9K!|1<=AmzHm&X%_J!>NK)eP|hGpG_8(hQ?O9(~I@kTUmyGJTu|%5rDWiW%{qzesUs+e{j&*d(x{Ej13PI#b>f* zQ}m-VRm>fF@^RAd2A`xd)@B#o$!edA`?qTAKdO-*D=b0z_4Y(${DFP}<`Br& z`arTqHf`7#li1xHl&9b~`DOKfyJA5PPEvl6IGtiJMbJy-8}`5od34l> zdQY$H=yF@lu#-}qH}u4!ZB6zq6K9gCdj6|ZifrGB1Lbtik_fcIGqr08y-Og)E%XXU zOzTHkugD|k)+@s)v20wEn|CBCVcNtJQAWY!kp#c=CYD@>0G`o zYy%tH={e7|s1{S}lDMB+p=G?u>VSxVRWI`$Q8pO9%%GRV?e<&O zEwbJgU>8>y@$DJylZ#@Vzj-&Irnrs2)fTTa)LP%I6}xK1x^dK@O`OGEVr`8IjA+}2 z?Iv`CR2H%?`2RrpK$ILlTVFq7>OKgoPe9zpqY0~i#Z@^G)^6%-F!SP`S(4|N;A1X) zA9pEC&(SBWP(fz{l%$BA)HBf2HoV6zptp(iM^< zAj`A}LJ$q%A>+$$$SuMyM7BqdCJY)y-nFi#XEj0HDqD#;nw>^io9<8oKvZ6t=*5Rh z_HSG&q4Tr4Kv*Z>Fh|K) zi7u|tM6hCMXCf+T{v}z|zA%4u$c>`NvY4H~hVU1NpKL^YXl1I5&yK*+GQ2_BAb|UK z(XyQxYiKLuGp6>+AvspUv#FTosc84}jM;Xy2-4R2#M25^Q0m$QG*K6bne?rUOUDHS zZPDcd+(CDA`Ja7w=k&j88lz;(JJ{&e77JwJ@`?Rx@*Y!yp(&67W6#IvZD?2ZE2h4fMeb^JGnY_^ySp=p7yj2Mm#pYpQ9^7SW-g0aBImA%2@ZwsX2zzdZ2zeadI5UB@S^NPGZjBl20bgHRjBeBKdU9hjTZ95DCIlU_j&_4xtoPse)sdB11Q3w>um z522HMdXRBNa;#Xk=s)E^z;?))ixtPyM&v(h;=5(?F_85t<<#ugP}Y)|s~BiNRCh0s zZS57VXf3LyNoP8l8!390HNaM{6HMkNjGonxItD`>dkwHP?pz>o%f=No!xili%39A= zS0ItB=Ur%l2pW2IK!`pm<%9N-+i zK~w}k=ku)QK_SiM^aD}v7Xe}e_rE1RFJ$%sJ@(!vW;K%oiwLr(HBImwipKs6F$wQn zl*4JUjRmp!+K@o+s#Qv-`Qvv@Y0izlFS2Ul4YWKlwLF!zA@T3d*Hk^uv*yZ=q)xif zx+Vul&rRz}+e8psLCKkz(extYRMob}DYhphh5_B9E%z}$T0JFlT#hs!9SkVROQ~01 zsyoD31Jjf8Sq8I!!%C?2&Fw3{^yT-4B>x$eY{|vJ%*nK$nb{fKKwBK$nK!C) z^+0TRiZd6oii^z|`YEms+)Qj)>&4z@vuhMP3TJ}!7lMTP3PEB>l0uSPU%tB{@~Vm? z4J3h(q=zIhl1%yvnQ;W#rZPCSpr-Rh%kU*kT0=qWiCE-j#uk@RwA~E@=nTvtH@dy3 zC=xk&CR4UG73YOuIaJKnNP%Ak6*+(^J10-S0kqqUsR1)YeN@uJ5YA@bCYzhZ<(7yD zAsL;=~1_dkSpB|fCQYd;3HPvRU+NM4L^0v(hJ zyU$Ff(?=)Yx1tVvgSLg$Z&hOW?vCb7qX)o;qg1$ZaV~KQP=EY!4$MuW9KHJiS3sQQ zKsA3A>_p!5)XGfWkDGx;O{JfB(ipp>G}`c5v3%A;N>8uLW7$EMglo=rMsWit6|&zj zV^kq=XFl@5xD4)&K76&bXtmfK@+aUWJV4^CvR?8+?Wq1$7;~9{?>7N51d*QUDK%)5 zgqLWuZVv~$4k5^E+wy}dAoVMWkAB-3ZtQ4io zY`lHT+Xoei47K*3|3^CJ7B#5;AT`pc>?=ik8_(QL<07$esk?Uq6)5ndMDFR8%&t=xEyvNlqzkxJla{@(lz{QV;jlgUrxl_ zCh~g;b2~ws;hV}jbj{($7zOus&5h=_?PE?wkt@i` zh}#=pJ-&bnJJl)ahRs1d6?Uhul{*@gw8;9*mZb@J{6cB#`cFu|(^i&xQj`Sf2`Luo zM*sRkwo#%U^V*^ytFI8B3ULbdpj-#572M^m8s~}FVBh7!qatX(V7BS5q7KzgCk(qS zv>kW9nNgiyQaf}9$Hua8;AltcTX3|% zMmXnO!s!K<+^MWT#-viWfGkwgL;z3+4K|U6us8!-F%{~sgV;usW$xO9{2rr{mioIC z6TYMQ5(0#5*fqsAZP}j;ujpNT0N5MJXQU+V5l^;;UQ8w*sJIgP)C2&z?x&?1cZmGx zj~R3Oxcb;5AGmCEo^IzBT>gSyn}nsD08Egm+y_NE&^=YM{cOyP{mJ0q<>59anN&9f zYrZA%5n0u9f?M#=FPbs@=Oe_wXf8yaAbVBcQDG4Cf}b+x2)oLej)ZO1EfTVywpPaB5a1azK|>9->fn8dpc(7MEE=$?DJxQk6bI(-gNIk@dPide0edVYEeG*so2uM{IWCzUH@zo|y$P zTP&Pvr6yb!?By0t)ahPI+Un=)`R4{WaGitV^Zs1=d9b7cT-x`NR=<*0LM+muBzBD;+h73)f{QMuF=FaU{&7vSmStNDtc|O330|qFOv@{+Foh#6o3lrcoL59 z9Z*WEdmb7!SNzl2YSzdsa4SiUOhtAr&P``1?9A?&UE#T^)iE3!_h$>#i zkm{THY$n^@{Va8uKCw4D62gLKtD~x&JGZ@BeRm;cN8Ct;_}H5t--#5~npfxp^W(LA zQm-Ij+1;DadDGqZ6f2{Kjt0vlqL_XwCVcS!?QwV-%rJ&p2&F3dhf#$HYQ;PNLVw2uXS$9Lo`dr%@Jt&i5S_%tS)C4>Um;%hpYc}v@`Ef$Q@7)o6^>D9zhAu^^pvFqS_tLGP_ z6%v}$CMSC4%k^eYeTXNPcby{JGZ5il@ymIzepK&>Me^tY9?lN**1Opg_Ni(?3PLPH zo_n@Pc|Jm1Rhvhrt6i(d4f%;ZthNn-iU1y~K zIMp^=tUH-Lo0r6g{C>Mn>Q*pff~%C1Nj|ZbN&D9NQn{phKWIZM=SQ4K4*MtkFcOj> zL&1NIGAWl)joml6P>e8_-*b?zmp=}?*BZ{f=8&^mZ!Va5H~f8^ls&_vuD47+&*GW% z%_TpB^`7+?_6}2?p>N)(VC+s&4n;frIjOKb8#~IH)4(nZB)x{Hd!MrvonOmik-AYC_d&A{> zW?I*b9E+^0k}*`}9w7#k3JzrL)5o*UGGjpJSIK)vC5L0}ps!&fI`Q*k)Mb0?V(0QV zpZ7(-LdF({ic9!dAnYhUllr07{ak+y;tUZ!Tpa#!0;DhnA4Bd&Buit>+Ne7eQ$h2c z{;=mAbN{^AXfzo#%n`6uG>(E|`Wg>fVJY=#_&g#~tB64{F|(0-#pocKg{~d88b?q+ zogo-_h+3hpl9_yzZQdK;>Vn&-(^p|dJ`PE@$VK#~C$}Q3_?ekDq}wexU3|fdDo->c zlMz1Gr)2A3iEiiqqeZo;j}Qznw|&TB8ZZ#!qcpd1)Fpy;CFSBIi-L1eE$hY5k{XMp zApZvv^ZDreG8B6zYtEB$f|^q>jaAPM+kgv*)!_{`yCtU_Zv2e%$kBj)K%nb-9Ap~s zRlxsyyR!|s9jE&imn&!b$O2m*^peBf-> zE6(=zh7%7!&1{^Oh+Y|%KL>BAqY%#t_@rQ`!z(mkwa<2I}nv3bn zKfT;D5iUmBX8tv>hswr8^-D_axj{aagGACqVMJ-xQMPPODim-xi#>g{JBEjvGeWN! zw>3)NK5G7O<*DmM_R^4D;N$}*XrtB&Kz z`Y#FXRq=BUJA)hFc;+3-Ua^^03ag6D*te2_Y(8XaHj_$2aiO+@abA^~ojdb!c$V*% z2f{zSK+9te^l)12>RnEvxVc+_w|mFeDYh)r*D1Gj=`D8^5){vNNxX9UjzQk8-`1wL%5J0X=%s=ArcEGzkVpd+_(JNt%eTO zpb|EENqAwPgzk;j9j2<2`B-zLi%iImL`738luLH6~!=*@<)#-OqKq#ENJ z&k0JU+_{NXMVd=4u4ICyRHUlfH%reS(~wtu`6f%xYinpce`hG6inzp^4Dkh%W_rYU z+FhEIR8^uBGE6+lF-5~c$v9pP7f9L$_DzuQ zr}9@i4*Nm#JY_qtoJ820ofx@{Q;_=dOT@! zvRM>GghEq9@l5K%X>YV#M1J2#d=X3n)e!*{W$qdwZ$wP%L#ov|8ol2<%lVl znr#bB5yxvQBNn>ojIihm3s+nUt?l6A*7>C!3IC0YU%XTHvr2WV8L(!r=ud`&oS2Lf zSW+hzhHlp86T<5UyvRlkF&2F2%?er>j%3S2EE8=)%#hkHfqYL0)nT{xj_^QSi!WJXUHP z{BUs)NIoMq(S|v{IaH9Bfm==GFNjbVdmhN2tAX1})s_xvq*O(+6rF;UP>G*#q1d1w zNu-x=J!2HAn--GeM>TX9g*(C$Um$TD@Uh3|=`x}-daD2Plh*{LAN~7$#kRx=Mv#-K zypeTt4+2fT57{*g8{A>Bh45vM+`1%D<}a8Y%0|eZkyCZGuSXWDs^(1dl-~wQE^?GNEx8x zTb!&HgsX(8mSfe~M@C55OxI1Q5jWY`1^h;(becRPUH$gn*1uKR!7bcmE(Re*&ci_4 zZ50rLzFrYpnplR4@#n;zdJy896`CeL7D5yCCgRbR__hjkKMu2sXVWWQY>W=7>{t^={F;^a#CdR!-r*d6 za0hj&`N2qrR=%mRXR23eR|;Gy)6}c+92Rxt@iag4>dt1LXGbdX{jj0a^<1f<9@FPC z1|Qbpxu44K;{x2e*(2&^SzS$os`4kQ-nyCv*Y@TMhS*7cI0Nfl?|5PNu%WKMzGHY~ z1lH$-m5NI%SE|y~+xOzPQNMGmyO?N*l)S}&0x+M$Y#0Ggp;vOxYU>@>u+c@;vJ{!2 z8Qx|%zJyTAFKO3wdohvt5&sdNO0A$I+6=hi|Fk!LBRdNNLE2c{3juayJ3j z!*JO`RFxz=9_b?YEuU!i@?WZu1`(txt4lp=&AwhGiAnHS@hZ8LyYEmxaMgE(EV`RP^`EcdFG#sKoH0CUvU7dMWC_VYsOS?WR zFPTK1JQkK&88~MMK8fN`+sR4$ze-=E+B+2I7z(HgX@;^0{85 z@UydEcW1cY6BXIfhQ3XmFzL4T&~l4&CBGeals96k3R!-HevYH1-#2MdYl-=dj*LMJi7z)dp9z_@A< zHjdT1r?NEMmUY#e_!!frvtQcHh?#Rdx7N^lF&b7c<`J9kr1*W$%7xsuuT#TlUfH@~ z&Q1ZWujTVh*%xk|4VbYAj|Sw1VEy!$^!E39LpW?B3YqTIGqAug-@zNH_vKSodD1sy z^>}tMjdD0r?D#l|m5AxBN-mPYJ9{J+bnqEXg)tYpuUL|#zI98Ihk~h`Hq`ej(S|9o zEBvnb`%6up3W9Ro<9HeA&Xfdl{#cH~kcu@d>G-3%3c-CIHD+xC4E~uO=zLP3D9=Ug zqUZ{yGox zqQ3iFY}s_BS&qIMU)`>>xdm8MSbrAp=inzTQFAY~Hr3}QnFw^g)+B|N)X;=hy*keb z(O$H-L~+c2-}J(Yx956U91HR7>y^;g$xXx*PY6UB?-K}@qgyq~>20qI=%Z?=a6|t_ zE(NuO`{V+BCjnh%Be#&>u7c2fRKggXLn9!Ftzl-TL`sl#$vtUl{&kv~u$8420q{mU z?nmG!G;AJ^^9Gd(?6lN!JP>%3)6ImvqL0|(<4zxglbvA}LH+b+Y4HG^2*qTT@oUcR z{4EG=;zc&PdGbvy%1Ei10O;f1Gn8=gq0-9NP;>8S+?Y}!!hWX{UDgv(N$YJ)o%Uot z(>Qh`> z_V@8Mq>YKOqW77o1?XKLsoS{7!mZtdV`L4$)xf(sxI-W6VN^^6HPiYuZB)8%(E?@o%aVA^O4`aOQ2{~1JKI=bHbx8GzBd(;_lHc zo0u~gb}t!jqvDO1sPH{wkRbnwOv4od@TbRWda8o8`G?N8q{Y2Dje-L9y#3TkiiCP?;j0mIJU& z4CpuuTU>GJ!zuMx+T2me3{~}Q5sVNYPn3o$p z?3MULCK6ZDbPmZ|csu%yY85peEBz-WHSC9b0BX1&JzPL18c?#TF@u`lsV#>;1b)T( z9O6rpw)oieorB5Nq&e^E^O$?T6T7&(8=aFF`Sty8E4qdk0Ux5x^a&H3XR36IjIm{X zInbYBG&;VjIOO@3ck9&>ZQO8XyYh+NHQ{#j!7nxcrr|r-f38rMz=}4Bjes3L4=hKl z#Hh5pUp1Hcu;Dz%0~qKmvNf4A^^HG1iecXK`6ZsOx^7_*n$)!YdtRn~H|SFA>`yNc zC~fgZ;e|R@-V{+a<}c@+V;QzTPyRyQ;79|=NBj3hAh72Q0G%gVxF{%47hFnM6bs-f z)xYl$KtVZF2cVE6PgMNplL4z_0B}R4O^7k%{;-5Pv7!NCegzE3$H3y)e#G|615dFVOe}|c}0;B=9u+OXjCX57nBooU2 E0Ild>o&W#<