Evaluating pyDeid

We show how to evaluate pyDeid on a custom dataset of Canadian admission notes, as described in the paper

pyDeid: An Improved, Fast, Flexible, and Generalizable Rules-based Approach for De-identification of Free-text Medical Records

As well as on the popular n2c2 benchmark dataset of American discharge notes, using the ETUDE engine.

Testing CSV output against a gold standard dataset with CSVEvaluator

Given a test dataset of clinical notes formatted in a csv such as that found in tests/test.csv, and a “gold standard” dataset with each note split by token, and annotated with the appropriate PII type, we can evaluate the performance of pyDeid using the CSVEvaluator class.

First we run pyDeid on tests/test.csv, outputting in csv format.

[1]:
from pyDeid import pyDeid

pyDeid(
    original_file = "../../tests/test.csv",
    note_varname = "note_text",
    encounter_id_varname = "genc_id",
    note_id_varname = "note_id"
)
Processing encounter 3, note Record 3: : 3it [00:01,  2.75it/s]
Diagnostics:
                - chars/s = 149.41586216889525
                - s/note = 0.36363832155863446

From here we use the annotated ground truth dataset.

We show how to create a ground truth CSV given raw notes in the form of ./tests/test.csv.

  1. Begin by tokenizing the raw notes using tokenize_csv().

  2. Manually annotate the notes for PHI.

  3. Using melt_annotations(), combine multi-token PHI into a single entry.

In particular dates and locations are usually multi-token, so we handle them specifically.

[2]:
from pyDeid.phi_types import tokenize_csv, melt_annotations

tokenize_csv(
    input_file = "../../tests/test.csv",
    output_file = "../../tests/test_tokenized.csv",
    encounter_id_varname = "genc_id",
    note_id_varname = "note_id",
    note_text_varname = "note_text"
)

Then we annotate the file ./tests/test_tokenized.csv by adding the PHI type to the annotation column.

Once that is complete, we combine multi-token PHI. In this example file, dates and locations are split across multiple tokens.

[3]:
melt_annotations(
    input_file = "../../tests/test_tokenized.csv",
    output_file = "../../tests/ground_truth_processed.csv",
    merge_annotations = ["d", "l"]
)

Now we have a ground truth dataset that we can use to compare against the output of pyDeid.

To do this we use the CSVEvaluator class.

[4]:
from pyDeid.phi_types.CSVEvaluator import CSVEvaluator

evaluator = CSVEvaluator()

precision, recall, f1 = evaluator.add_ground_truth_file("../../tests/ground_truth.csv", note_id_varname = "note_id")\
    .add_result_file("../../tests/test__PHI.csv")\
    .evaluate()

print(
    f"""
    Precision: {precision}
    Recall: {recall}
    F1: {f1}
    """
)

    Precision: 1.0
    Recall: 1.0
    F1: 1.0

Using the ETUDE Engine

The ETUDE engine is a well established, standard tool for analyzing de-identification performance against various benchmark dataset formats, such as the n2c2 format.

In this section, we use the ETUDE engine to evaluate the performance of pyDeid on the n2c2 dataset. We begin by cloning the repository.

!git clone git@github.com:MUSC-TBIC/etude-engine.git

In order to run the evaluation on n2c2, pyDeid does require the ability to read and write from xml. This is available through the pyDeid_n2c2() function.

Ensure that the n2c2 dataset is saved to some directory such as ./tests/n2c2.

[ ]:
from pyDeid.n2c2 import pyDeid_n2c2

pyDeid_n2c2(
    input_dir = "path/to/n2c2_test_data",
    output_dir = "path/to/pydeid_n2c2_output",
)

Note that this is essentially ready to run the evaluation on, however there is a significant difference between how pyDeid recognizes names and how names are annotated in the n2c2 ground truth. In pyDeid, first and last names are considered separately, and so we must separate these annotations in the n2c2 ground truth using split_multi_word_tags().

[ ]:
from pyDeid import split_multi_word_tags

split_multi_word_tags(
    input_dir = "path/to/n2c2_test_data",
    output_dir = "path/to/n2c2_test_data_preprocessed"
)

Now we are ready to run the ETUDE engine.

In order to compare a given reference file with a given test file, the ETUDE engine uses a config for each of the reference file, and the tool’s output. We provide both of the relevant configs under the ./tests directory.

With this, we run the following command from the directory in which we cloned the ETUDE engine repository.

import os os.chdir("path/to/etude-engine")
[6]:
!python H:/repos/GitHub/etude-engine/etude.py \
    --reference-input "path/to/n2c2_test_data_preprocessed" \
    --reference-config ../../tests/n2c2_pydeid.conf \
    --test-input "path/to/pydeid_n2c2_output" \
    --test-config ../../tests/pydeid_n2c2.conf \
    --by-type --score-key "Parent"

exact   TP      FP      TN      FN
micro-average   8280.0  1153.0  0.0     2816.0
Address 116.0   4.0     0.0     420.0
Contact Information     83.0    48.0    0.0     135.0
Identifiers     81.0    33.0    0.0     536.0
Names   4031.0  845.0   0.0     714.0
Time    3969.0  223.0   0.0     1011.0
macro-average by type   8280.0  1153.0  0.0     2816.0

  0%|          | 0/514 [00:00<?, ?it/s]
  0%|          | 1/514 [00:01<09:57,  1.16s/it]
  0%|          | 2/514 [00:02<08:39,  1.02s/it]
  1%|          | 3/514 [00:02<08:17,  1.03it/s]
  1%|          | 4/514 [00:04<08:57,  1.05s/it]
  1%|          | 5/514 [00:05<08:39,  1.02s/it]
  1%|1         | 6/514 [00:06<08:24,  1.01it/s]
  1%|1         | 7/514 [00:07<08:15,  1.02it/s]
  2%|1         | 8/514 [00:08<08:55,  1.06s/it]
  2%|1         | 9/514 [00:09<08:42,  1.04s/it]
  2%|1         | 10/514 [00:10<08:32,  1.02s/it]
  2%|2         | 11/514 [00:11<08:25,  1.01s/it]
  2%|2         | 12/514 [00:12<09:35,  1.15s/it]
  3%|2         | 13/514 [00:13<09:14,  1.11s/it]
  3%|2         | 14/514 [00:14<08:55,  1.07s/it]
  3%|2         | 15/514 [00:15<08:47,  1.06s/it]
  3%|3         | 16/514 [00:16<08:39,  1.04s/it]
  3%|3         | 17/514 [00:17<08:35,  1.04s/it]
  4%|3         | 18/514 [00:18<08:48,  1.06s/it]
  4%|3         | 19/514 [00:19<08:51,  1.07s/it]
  4%|3         | 20/514 [00:20<08:41,  1.06s/it]
  4%|4         | 21/514 [00:22<08:40,  1.05s/it]
  4%|4         | 22/514 [00:23<08:59,  1.10s/it]
  4%|4         | 23/514 [00:24<08:47,  1.07s/it]
  5%|4         | 24/514 [00:25<08:42,  1.07s/it]
  5%|4         | 25/514 [00:26<08:36,  1.06s/it]
  5%|5         | 26/514 [00:27<09:04,  1.12s/it]
  5%|5         | 27/514 [00:28<09:15,  1.14s/it]
  5%|5         | 28/514 [00:29<09:04,  1.12s/it]
  6%|5         | 29/514 [00:30<08:39,  1.07s/it]
  6%|5         | 30/514 [00:31<08:25,  1.04s/it]
  6%|6         | 31/514 [00:32<08:11,  1.02s/it]
  6%|6         | 32/514 [00:33<08:04,  1.00s/it]
  6%|6         | 33/514 [00:35<08:58,  1.12s/it]
  7%|6         | 34/514 [00:36<08:43,  1.09s/it]
  7%|6         | 35/514 [00:37<08:34,  1.07s/it]
  7%|7         | 36/514 [00:38<08:19,  1.05s/it]
  7%|7         | 37/514 [00:39<08:14,  1.04s/it]
  7%|7         | 38/514 [00:40<08:39,  1.09s/it]
  8%|7         | 39/514 [00:41<08:20,  1.05s/it]
  8%|7         | 40/514 [00:42<08:02,  1.02s/it]
  8%|7         | 41/514 [00:43<07:53,  1.00s/it]
  8%|8         | 42/514 [00:44<07:47,  1.01it/s]
  8%|8         | 43/514 [00:45<07:51,  1.00s/it]
  9%|8         | 44/514 [00:46<07:59,  1.02s/it]
  9%|8         | 45/514 [00:47<08:41,  1.11s/it]
  9%|8         | 46/514 [00:48<09:13,  1.18s/it]
  9%|9         | 47/514 [00:50<09:22,  1.20s/it]
  9%|9         | 48/514 [00:51<08:49,  1.14s/it]
 10%|9         | 49/514 [00:52<09:00,  1.16s/it]
 10%|9         | 50/514 [00:53<09:10,  1.19s/it]
 10%|9         | 51/514 [00:54<09:00,  1.17s/it]
 10%|#         | 52/514 [00:55<08:36,  1.12s/it]
 10%|#         | 53/514 [00:56<08:34,  1.12s/it]
 11%|#         | 54/514 [00:58<08:39,  1.13s/it]
 11%|#         | 55/514 [00:59<08:32,  1.12s/it]
 11%|#         | 56/514 [01:00<08:23,  1.10s/it]
 11%|#1        | 57/514 [01:01<08:35,  1.13s/it]
 11%|#1        | 58/514 [01:02<08:28,  1.11s/it]
 11%|#1        | 59/514 [01:03<08:08,  1.07s/it]
 12%|#1        | 60/514 [01:04<08:28,  1.12s/it]
 12%|#1        | 61/514 [01:05<08:31,  1.13s/it]
 12%|#2        | 62/514 [01:07<08:36,  1.14s/it]
 12%|#2        | 63/514 [01:08<08:27,  1.13s/it]
 12%|#2        | 64/514 [01:09<08:51,  1.18s/it]
 13%|#2        | 65/514 [01:10<08:47,  1.17s/it]
 13%|#2        | 66/514 [01:11<08:56,  1.20s/it]
 13%|#3        | 67/514 [01:13<09:23,  1.26s/it]
 13%|#3        | 68/514 [01:14<08:47,  1.18s/it]
 13%|#3        | 69/514 [01:16<10:28,  1.41s/it]
 14%|#3        | 70/514 [01:17<10:27,  1.41s/it]
 14%|#3        | 71/514 [01:19<11:19,  1.53s/it]
 14%|#4        | 72/514 [01:21<12:25,  1.69s/it]
 14%|#4        | 73/514 [01:22<11:18,  1.54s/it]
 14%|#4        | 74/514 [01:23<10:19,  1.41s/it]
 15%|#4        | 75/514 [01:25<09:59,  1.37s/it]
 15%|#4        | 76/514 [01:26<09:13,  1.26s/it]
 15%|#4        | 77/514 [01:26<08:32,  1.17s/it]
 15%|#5        | 78/514 [01:28<08:10,  1.13s/it]
 15%|#5        | 79/514 [01:29<07:52,  1.09s/it]
 16%|#5        | 80/514 [01:30<08:36,  1.19s/it]
 16%|#5        | 81/514 [01:31<08:11,  1.14s/it]
 16%|#5        | 82/514 [01:32<07:57,  1.11s/it]
 16%|#6        | 83/514 [01:33<07:38,  1.06s/it]
 16%|#6        | 84/514 [01:34<07:28,  1.04s/it]
 17%|#6        | 85/514 [01:35<07:27,  1.04s/it]
 17%|#6        | 86/514 [01:36<08:03,  1.13s/it]
 17%|#6        | 87/514 [01:37<07:54,  1.11s/it]
 17%|#7        | 88/514 [01:38<07:41,  1.08s/it]
 17%|#7        | 89/514 [01:40<07:59,  1.13s/it]
 18%|#7        | 90/514 [01:41<08:11,  1.16s/it]
 18%|#7        | 91/514 [01:42<07:58,  1.13s/it]
 18%|#7        | 92/514 [01:43<07:48,  1.11s/it]
 18%|#8        | 93/514 [01:44<07:46,  1.11s/it]
 18%|#8        | 94/514 [01:45<07:33,  1.08s/it]
 18%|#8        | 95/514 [01:46<07:26,  1.06s/it]
 19%|#8        | 96/514 [01:47<07:20,  1.05s/it]
 19%|#8        | 97/514 [01:48<07:19,  1.05s/it]
 19%|#9        | 98/514 [01:49<07:13,  1.04s/it]
 19%|#9        | 99/514 [01:50<07:09,  1.03s/it]
 19%|#9        | 100/514 [01:51<07:08,  1.04s/it]
 20%|#9        | 101/514 [01:52<06:59,  1.02s/it]
 20%|#9        | 102/514 [01:53<07:07,  1.04s/it]
 20%|##        | 103/514 [01:54<07:16,  1.06s/it]
 20%|##        | 104/514 [01:56<07:18,  1.07s/it]
 20%|##        | 105/514 [01:57<07:11,  1.05s/it]
 21%|##        | 106/514 [01:58<07:03,  1.04s/it]
 21%|##        | 107/514 [01:59<06:58,  1.03s/it]
 21%|##1       | 108/514 [02:00<07:05,  1.05s/it]
 21%|##1       | 109/514 [02:01<07:08,  1.06s/it]
 21%|##1       | 110/514 [02:02<06:56,  1.03s/it]
 22%|##1       | 111/514 [02:03<06:56,  1.03s/it]
 22%|##1       | 112/514 [02:04<06:57,  1.04s/it]
 22%|##1       | 113/514 [02:05<06:59,  1.05s/it]
 22%|##2       | 114/514 [02:06<07:22,  1.11s/it]
 22%|##2       | 115/514 [02:08<08:48,  1.33s/it]
 23%|##2       | 116/514 [02:09<08:42,  1.31s/it]
 23%|##2       | 117/514 [02:10<08:14,  1.24s/it]
 23%|##2       | 118/514 [02:11<08:01,  1.22s/it]
 23%|##3       | 119/514 [02:13<07:56,  1.21s/it]
 23%|##3       | 120/514 [02:14<07:24,  1.13s/it]
 24%|##3       | 121/514 [02:15<07:33,  1.15s/it]
 24%|##3       | 122/514 [02:16<07:16,  1.11s/it]
 24%|##3       | 123/514 [02:17<07:29,  1.15s/it]
 24%|##4       | 124/514 [02:18<07:13,  1.11s/it]
 24%|##4       | 125/514 [02:19<07:01,  1.08s/it]
 25%|##4       | 126/514 [02:21<07:44,  1.20s/it]
 25%|##4       | 127/514 [02:22<07:54,  1.23s/it]
 25%|##4       | 128/514 [02:23<07:26,  1.16s/it]
 25%|##5       | 129/514 [02:24<07:04,  1.10s/it]
 25%|##5       | 130/514 [02:25<06:53,  1.08s/it]
 25%|##5       | 131/514 [02:26<06:49,  1.07s/it]
 26%|##5       | 132/514 [02:27<06:42,  1.05s/it]
 26%|##5       | 133/514 [02:28<06:41,  1.05s/it]
 26%|##6       | 134/514 [02:29<07:05,  1.12s/it]
 26%|##6       | 135/514 [02:30<06:52,  1.09s/it]
 26%|##6       | 136/514 [02:31<07:06,  1.13s/it]
 27%|##6       | 137/514 [02:33<07:18,  1.16s/it]
 27%|##6       | 138/514 [02:34<08:07,  1.30s/it]
 27%|##7       | 139/514 [02:36<08:06,  1.30s/it]
 27%|##7       | 140/514 [02:37<07:23,  1.18s/it]
 27%|##7       | 141/514 [02:38<07:01,  1.13s/it]
 28%|##7       | 142/514 [02:39<06:53,  1.11s/it]
 28%|##7       | 143/514 [02:40<06:36,  1.07s/it]
 28%|##8       | 144/514 [02:41<07:02,  1.14s/it]
 28%|##8       | 145/514 [02:42<07:10,  1.17s/it]
 28%|##8       | 146/514 [02:43<06:55,  1.13s/it]
 29%|##8       | 147/514 [02:44<06:53,  1.13s/it]
 29%|##8       | 148/514 [02:45<06:47,  1.11s/it]
 29%|##8       | 149/514 [02:47<07:43,  1.27s/it]
 29%|##9       | 150/514 [02:48<07:46,  1.28s/it]
 29%|##9       | 151/514 [02:50<07:48,  1.29s/it]
 30%|##9       | 152/514 [02:51<08:09,  1.35s/it]
 30%|##9       | 153/514 [02:52<07:28,  1.24s/it]
 30%|##9       | 154/514 [02:53<06:59,  1.16s/it]
 30%|###       | 155/514 [02:54<06:45,  1.13s/it]
 30%|###       | 156/514 [02:55<06:40,  1.12s/it]
 31%|###       | 157/514 [02:57<07:50,  1.32s/it]
 31%|###       | 158/514 [02:58<07:22,  1.24s/it]
 31%|###       | 159/514 [02:59<07:19,  1.24s/it]
 31%|###1      | 160/514 [03:00<07:01,  1.19s/it]
 31%|###1      | 161/514 [03:01<06:46,  1.15s/it]
 32%|###1      | 162/514 [03:03<06:41,  1.14s/it]
 32%|###1      | 163/514 [03:04<06:58,  1.19s/it]
 32%|###1      | 164/514 [03:05<06:47,  1.16s/it]
 32%|###2      | 165/514 [03:06<06:35,  1.13s/it]
 32%|###2      | 166/514 [03:07<06:27,  1.11s/it]
 32%|###2      | 167/514 [03:08<06:16,  1.09s/it]
 33%|###2      | 168/514 [03:09<06:11,  1.07s/it]
 33%|###2      | 169/514 [03:11<07:29,  1.30s/it]
 33%|###3      | 170/514 [03:12<07:02,  1.23s/it]
 33%|###3      | 171/514 [03:13<06:59,  1.22s/it]
 33%|###3      | 172/514 [03:15<07:21,  1.29s/it]
 34%|###3      | 173/514 [03:16<06:57,  1.23s/it]
 34%|###3      | 174/514 [03:17<06:39,  1.17s/it]
 34%|###4      | 175/514 [03:18<06:54,  1.22s/it]
 34%|###4      | 176/514 [03:19<06:45,  1.20s/it]
 34%|###4      | 177/514 [03:20<06:34,  1.17s/it]
 35%|###4      | 178/514 [03:22<06:25,  1.15s/it]
 35%|###4      | 179/514 [03:23<06:28,  1.16s/it]
 35%|###5      | 180/514 [03:24<06:43,  1.21s/it]
 35%|###5      | 181/514 [03:25<06:39,  1.20s/it]
 35%|###5      | 182/514 [03:27<07:49,  1.41s/it]
 36%|###5      | 183/514 [03:28<07:14,  1.31s/it]
 36%|###5      | 184/514 [03:30<07:27,  1.36s/it]
 36%|###5      | 185/514 [03:31<07:25,  1.35s/it]
 36%|###6      | 186/514 [03:32<07:02,  1.29s/it]
 36%|###6      | 187/514 [03:33<07:03,  1.29s/it]
 37%|###6      | 188/514 [03:35<07:12,  1.33s/it]
 37%|###6      | 189/514 [03:37<07:46,  1.43s/it]
 37%|###6      | 190/514 [03:38<07:31,  1.39s/it]
 37%|###7      | 191/514 [03:39<07:25,  1.38s/it]
 37%|###7      | 192/514 [03:40<06:59,  1.30s/it]
 38%|###7      | 193/514 [03:42<06:45,  1.26s/it]
 38%|###7      | 194/514 [03:43<06:28,  1.21s/it]
 38%|###7      | 195/514 [03:44<06:20,  1.19s/it]
 38%|###8      | 196/514 [03:45<06:29,  1.23s/it]
 38%|###8      | 197/514 [03:46<06:22,  1.21s/it]
 39%|###8      | 198/514 [03:47<06:24,  1.22s/it]
 39%|###8      | 199/514 [03:49<06:14,  1.19s/it]
 39%|###8      | 200/514 [03:50<06:18,  1.20s/it]
 39%|###9      | 201/514 [03:51<06:06,  1.17s/it]
 39%|###9      | 202/514 [03:52<06:30,  1.25s/it]
 39%|###9      | 203/514 [03:53<06:11,  1.19s/it]
 40%|###9      | 204/514 [03:55<06:00,  1.16s/it]
 40%|###9      | 205/514 [03:56<06:18,  1.22s/it]
 40%|####      | 206/514 [03:57<06:03,  1.18s/it]
 40%|####      | 207/514 [03:58<06:14,  1.22s/it]
 40%|####      | 208/514 [03:59<06:13,  1.22s/it]
 41%|####      | 209/514 [04:01<06:09,  1.21s/it]
 41%|####      | 210/514 [04:02<05:52,  1.16s/it]
 41%|####1     | 211/514 [04:03<05:36,  1.11s/it]
 41%|####1     | 212/514 [04:04<05:54,  1.17s/it]
 41%|####1     | 213/514 [04:05<06:15,  1.25s/it]
 42%|####1     | 214/514 [04:07<05:59,  1.20s/it]
 42%|####1     | 215/514 [04:08<06:42,  1.35s/it]
 42%|####2     | 216/514 [04:09<06:09,  1.24s/it]
 42%|####2     | 217/514 [04:10<05:42,  1.15s/it]
 42%|####2     | 218/514 [04:11<05:54,  1.20s/it]
 43%|####2     | 219/514 [04:13<06:15,  1.27s/it]
 43%|####2     | 220/514 [04:14<06:28,  1.32s/it]
 43%|####2     | 221/514 [04:16<06:29,  1.33s/it]
 43%|####3     | 222/514 [04:17<06:07,  1.26s/it]
 43%|####3     | 223/514 [04:18<05:49,  1.20s/it]
 44%|####3     | 224/514 [04:19<05:32,  1.15s/it]
 44%|####3     | 225/514 [04:20<05:21,  1.11s/it]
 44%|####3     | 226/514 [04:21<05:15,  1.10s/it]
 44%|####4     | 227/514 [04:22<05:51,  1.22s/it]
 44%|####4     | 228/514 [04:24<05:42,  1.20s/it]
 45%|####4     | 229/514 [04:25<06:11,  1.30s/it]
 45%|####4     | 230/514 [04:26<05:51,  1.24s/it]
 45%|####4     | 231/514 [04:27<05:36,  1.19s/it]
 45%|####5     | 232/514 [04:29<06:10,  1.31s/it]
 45%|####5     | 233/514 [04:30<06:07,  1.31s/it]
 46%|####5     | 234/514 [04:31<05:54,  1.26s/it]
 46%|####5     | 235/514 [04:33<05:45,  1.24s/it]
 46%|####5     | 236/514 [04:34<05:27,  1.18s/it]
 46%|####6     | 237/514 [04:35<05:26,  1.18s/it]
 46%|####6     | 238/514 [04:36<05:44,  1.25s/it]
 46%|####6     | 239/514 [04:37<05:29,  1.20s/it]
 47%|####6     | 240/514 [04:39<05:51,  1.28s/it]
 47%|####6     | 241/514 [04:40<05:32,  1.22s/it]
 47%|####7     | 242/514 [04:41<05:53,  1.30s/it]
 47%|####7     | 243/514 [04:43<05:49,  1.29s/it]
 47%|####7     | 244/514 [04:45<07:18,  1.62s/it]
 48%|####7     | 245/514 [04:46<06:47,  1.52s/it]
 48%|####7     | 246/514 [04:47<06:09,  1.38s/it]
 48%|####8     | 247/514 [04:48<05:35,  1.26s/it]
 48%|####8     | 248/514 [04:49<05:30,  1.24s/it]
 48%|####8     | 249/514 [04:51<05:34,  1.26s/it]
 49%|####8     | 250/514 [04:52<05:34,  1.27s/it]
 49%|####8     | 251/514 [04:53<05:22,  1.23s/it]
 49%|####9     | 252/514 [04:54<05:19,  1.22s/it]
 49%|####9     | 253/514 [04:56<05:41,  1.31s/it]
 49%|####9     | 254/514 [04:57<05:46,  1.33s/it]
 50%|####9     | 255/514 [04:59<06:04,  1.41s/it]
 50%|####9     | 256/514 [05:00<05:36,  1.31s/it]
 50%|#####     | 257/514 [05:01<05:23,  1.26s/it]
 50%|#####     | 258/514 [05:03<05:33,  1.30s/it]
 50%|#####     | 259/514 [05:04<05:24,  1.27s/it]
 51%|#####     | 260/514 [05:05<05:06,  1.21s/it]
 51%|#####     | 261/514 [05:06<04:56,  1.17s/it]
 51%|#####     | 262/514 [05:07<05:12,  1.24s/it]
 51%|#####1    | 263/514 [05:09<05:16,  1.26s/it]
 51%|#####1    | 264/514 [05:10<05:33,  1.33s/it]
 52%|#####1    | 265/514 [05:11<05:24,  1.30s/it]
 52%|#####1    | 266/514 [05:13<05:19,  1.29s/it]
 52%|#####1    | 267/514 [05:14<05:02,  1.23s/it]
 52%|#####2    | 268/514 [05:15<05:01,  1.23s/it]
 52%|#####2    | 269/514 [05:16<04:59,  1.22s/it]
 53%|#####2    | 270/514 [05:18<05:29,  1.35s/it]
 53%|#####2    | 271/514 [05:19<05:42,  1.41s/it]
 53%|#####2    | 272/514 [05:21<05:29,  1.36s/it]
 53%|#####3    | 273/514 [05:22<05:06,  1.27s/it]
 53%|#####3    | 274/514 [05:23<05:07,  1.28s/it]
 54%|#####3    | 275/514 [05:24<04:52,  1.23s/it]
 54%|#####3    | 276/514 [05:25<04:43,  1.19s/it]
 54%|#####3    | 277/514 [05:26<04:44,  1.20s/it]
 54%|#####4    | 278/514 [05:27<04:34,  1.16s/it]
 54%|#####4    | 279/514 [05:29<04:34,  1.17s/it]
 54%|#####4    | 280/514 [05:30<04:25,  1.13s/it]
 55%|#####4    | 281/514 [05:31<04:43,  1.22s/it]
 55%|#####4    | 282/514 [05:32<04:40,  1.21s/it]
 55%|#####5    | 283/514 [05:33<04:31,  1.18s/it]
 55%|#####5    | 284/514 [05:34<04:28,  1.17s/it]
 55%|#####5    | 285/514 [05:36<04:45,  1.25s/it]
 56%|#####5    | 286/514 [05:37<04:32,  1.20s/it]
 56%|#####5    | 287/514 [05:39<04:55,  1.30s/it]
 56%|#####6    | 288/514 [05:40<05:04,  1.35s/it]
 56%|#####6    | 289/514 [05:41<04:48,  1.28s/it]
 56%|#####6    | 290/514 [05:42<04:34,  1.22s/it]
 57%|#####6    | 291/514 [05:44<04:38,  1.25s/it]
 57%|#####6    | 292/514 [05:45<04:53,  1.32s/it]
 57%|#####7    | 293/514 [05:46<04:49,  1.31s/it]
 57%|#####7    | 294/514 [05:48<04:46,  1.30s/it]
 57%|#####7    | 295/514 [05:49<04:46,  1.31s/it]
 58%|#####7    | 296/514 [05:50<04:41,  1.29s/it]
 58%|#####7    | 297/514 [05:51<04:28,  1.24s/it]
 58%|#####7    | 298/514 [05:52<04:10,  1.16s/it]
 58%|#####8    | 299/514 [05:54<04:28,  1.25s/it]
 58%|#####8    | 300/514 [05:55<04:18,  1.21s/it]
 59%|#####8    | 301/514 [05:56<04:06,  1.16s/it]
 59%|#####8    | 302/514 [05:57<04:09,  1.18s/it]
 59%|#####8    | 303/514 [05:59<04:49,  1.37s/it]
 59%|#####9    | 304/514 [06:00<04:39,  1.33s/it]
 59%|#####9    | 305/514 [06:01<04:30,  1.30s/it]
 60%|#####9    | 306/514 [06:03<04:20,  1.25s/it]
 60%|#####9    | 307/514 [06:04<04:16,  1.24s/it]
 60%|#####9    | 308/514 [06:05<04:13,  1.23s/it]
 60%|######    | 309/514 [06:06<04:00,  1.17s/it]
 60%|######    | 310/514 [06:07<03:53,  1.14s/it]
 61%|######    | 311/514 [06:08<04:11,  1.24s/it]
 61%|######    | 312/514 [06:10<04:08,  1.23s/it]
 61%|######    | 313/514 [06:11<04:00,  1.20s/it]
 61%|######1   | 314/514 [06:12<03:57,  1.19s/it]
 61%|######1   | 315/514 [06:13<03:51,  1.16s/it]
 61%|######1   | 316/514 [06:14<03:52,  1.17s/it]
 62%|######1   | 317/514 [06:15<03:47,  1.16s/it]
 62%|######1   | 318/514 [06:17<03:42,  1.14s/it]
 62%|######2   | 319/514 [06:18<03:43,  1.14s/it]
 62%|######2   | 320/514 [06:20<05:17,  1.64s/it]
 62%|######2   | 321/514 [06:22<04:42,  1.47s/it]
 63%|######2   | 322/514 [06:23<04:18,  1.34s/it]
 63%|######2   | 323/514 [06:24<04:06,  1.29s/it]
 63%|######3   | 324/514 [06:25<03:56,  1.25s/it]
 63%|######3   | 325/514 [06:26<03:55,  1.25s/it]
 63%|######3   | 326/514 [06:27<03:57,  1.26s/it]
 64%|######3   | 327/514 [06:29<04:07,  1.32s/it]
 64%|######3   | 328/514 [06:30<04:20,  1.40s/it]
 64%|######4   | 329/514 [06:32<04:25,  1.44s/it]
 64%|######4   | 330/514 [06:33<04:04,  1.33s/it]
 64%|######4   | 331/514 [06:34<03:51,  1.26s/it]
 65%|######4   | 332/514 [06:35<03:41,  1.22s/it]
 65%|######4   | 333/514 [06:36<03:36,  1.20s/it]
 65%|######4   | 334/514 [06:38<03:48,  1.27s/it]
 65%|######5   | 335/514 [06:39<03:52,  1.30s/it]
 65%|######5   | 336/514 [06:41<03:55,  1.32s/it]
 66%|######5   | 337/514 [06:42<03:57,  1.34s/it]
 66%|######5   | 338/514 [06:43<03:50,  1.31s/it]
 66%|######5   | 339/514 [06:45<03:46,  1.29s/it]
 66%|######6   | 340/514 [06:46<03:50,  1.33s/it]
 66%|######6   | 341/514 [06:47<03:42,  1.28s/it]
 67%|######6   | 342/514 [06:48<03:35,  1.25s/it]
 67%|######6   | 343/514 [06:50<04:02,  1.42s/it]
 67%|######6   | 344/514 [06:51<03:51,  1.36s/it]
 67%|######7   | 345/514 [06:53<04:09,  1.48s/it]
 67%|######7   | 346/514 [06:54<03:50,  1.37s/it]
 68%|######7   | 347/514 [06:55<03:43,  1.34s/it]
 68%|######7   | 348/514 [06:57<03:36,  1.30s/it]
 68%|######7   | 349/514 [06:58<03:38,  1.33s/it]
 68%|######8   | 350/514 [07:00<03:56,  1.44s/it]
 68%|######8   | 351/514 [07:02<04:20,  1.60s/it]
 68%|######8   | 352/514 [07:04<05:12,  1.93s/it]
 69%|######8   | 353/514 [07:07<05:31,  2.06s/it]
 69%|######8   | 354/514 [07:09<05:37,  2.11s/it]
 69%|######9   | 355/514 [07:11<05:20,  2.02s/it]
 69%|######9   | 356/514 [07:13<05:03,  1.92s/it]
 69%|######9   | 357/514 [07:14<04:55,  1.88s/it]
 70%|######9   | 358/514 [07:16<04:53,  1.88s/it]
 70%|######9   | 359/514 [07:18<04:51,  1.88s/it]
 70%|#######   | 360/514 [07:20<04:43,  1.84s/it]
 70%|#######   | 361/514 [07:21<04:25,  1.73s/it]
 70%|#######   | 362/514 [07:23<04:31,  1.79s/it]
 71%|#######   | 363/514 [07:26<05:02,  2.01s/it]
 71%|#######   | 364/514 [07:27<04:43,  1.89s/it]
 71%|#######1  | 365/514 [07:29<04:42,  1.90s/it]
 71%|#######1  | 366/514 [07:31<04:34,  1.86s/it]
 71%|#######1  | 367/514 [07:33<04:24,  1.80s/it]
 72%|#######1  | 368/514 [07:35<04:44,  1.95s/it]
 72%|#######1  | 369/514 [07:37<04:35,  1.90s/it]
 72%|#######1  | 370/514 [07:38<04:13,  1.76s/it]
 72%|#######2  | 371/514 [07:40<04:02,  1.69s/it]
 72%|#######2  | 372/514 [07:42<04:14,  1.79s/it]
 73%|#######2  | 373/514 [07:43<04:07,  1.76s/it]
 73%|#######2  | 374/514 [07:45<04:04,  1.75s/it]
 73%|#######2  | 375/514 [07:47<04:07,  1.78s/it]
 73%|#######3  | 376/514 [07:49<04:00,  1.75s/it]
 73%|#######3  | 377/514 [07:50<03:54,  1.71s/it]
 74%|#######3  | 378/514 [07:52<04:02,  1.78s/it]
 74%|#######3  | 379/514 [07:54<03:58,  1.77s/it]
 74%|#######3  | 380/514 [07:56<03:56,  1.77s/it]
 74%|#######4  | 381/514 [07:58<04:07,  1.86s/it]
 74%|#######4  | 382/514 [08:00<04:00,  1.82s/it]
 75%|#######4  | 383/514 [08:01<03:50,  1.76s/it]
 75%|#######4  | 384/514 [08:03<03:43,  1.72s/it]
 75%|#######4  | 385/514 [08:04<03:37,  1.68s/it]
 75%|#######5  | 386/514 [08:06<03:47,  1.78s/it]
 75%|#######5  | 387/514 [08:08<03:43,  1.76s/it]
 75%|#######5  | 388/514 [08:10<03:45,  1.79s/it]
 76%|#######5  | 389/514 [08:12<03:36,  1.73s/it]
 76%|#######5  | 390/514 [08:13<03:32,  1.71s/it]
 76%|#######6  | 391/514 [08:15<03:40,  1.79s/it]
 76%|#######6  | 392/514 [08:17<03:43,  1.83s/it]
 76%|#######6  | 393/514 [08:20<04:07,  2.05s/it]
 77%|#######6  | 394/514 [08:22<04:03,  2.03s/it]
 77%|#######6  | 395/514 [08:23<03:44,  1.89s/it]
 77%|#######7  | 396/514 [08:25<03:52,  1.97s/it]
 77%|#######7  | 397/514 [08:27<03:40,  1.89s/it]
 77%|#######7  | 398/514 [08:29<03:31,  1.82s/it]
 78%|#######7  | 399/514 [08:31<03:37,  1.89s/it]
 78%|#######7  | 400/514 [08:33<03:29,  1.84s/it]
 78%|#######8  | 401/514 [08:34<03:20,  1.77s/it]
 78%|#######8  | 402/514 [08:36<03:17,  1.76s/it]
 78%|#######8  | 403/514 [08:38<03:13,  1.74s/it]
 79%|#######8  | 404/514 [08:39<03:09,  1.72s/it]
 79%|#######8  | 405/514 [08:41<03:07,  1.72s/it]
 79%|#######8  | 406/514 [08:43<03:09,  1.75s/it]
 79%|#######9  | 407/514 [08:45<03:05,  1.73s/it]
 79%|#######9  | 408/514 [08:47<03:12,  1.82s/it]
 80%|#######9  | 409/514 [08:48<03:04,  1.76s/it]
 80%|#######9  | 410/514 [08:50<03:03,  1.76s/it]
 80%|#######9  | 411/514 [08:52<02:56,  1.71s/it]
 80%|########  | 412/514 [08:53<02:49,  1.66s/it]
 80%|########  | 413/514 [08:55<02:46,  1.65s/it]
 81%|########  | 414/514 [08:57<02:52,  1.72s/it]
 81%|########  | 415/514 [08:58<02:45,  1.67s/it]
 81%|########  | 416/514 [09:00<02:52,  1.76s/it]
 81%|########1 | 417/514 [09:02<02:47,  1.73s/it]
 81%|########1 | 418/514 [09:03<02:44,  1.72s/it]
 82%|########1 | 419/514 [09:05<02:39,  1.68s/it]
 82%|########1 | 420/514 [09:07<02:32,  1.62s/it]
 82%|########1 | 421/514 [09:08<02:25,  1.57s/it]
 82%|########2 | 422/514 [09:10<02:24,  1.57s/it]
 82%|########2 | 423/514 [09:11<02:21,  1.55s/it]
 82%|########2 | 424/514 [09:13<02:29,  1.66s/it]
 83%|########2 | 425/514 [09:14<02:24,  1.62s/it]
 83%|########2 | 426/514 [09:16<02:21,  1.61s/it]
 83%|########3 | 427/514 [09:18<02:19,  1.60s/it]
 83%|########3 | 428/514 [09:19<02:16,  1.58s/it]
 83%|########3 | 429/514 [09:21<02:16,  1.61s/it]
 84%|########3 | 430/514 [09:22<02:15,  1.61s/it]
 84%|########3 | 431/514 [09:24<02:18,  1.67s/it]
 84%|########4 | 432/514 [09:26<02:16,  1.67s/it]
 84%|########4 | 433/514 [09:27<02:11,  1.63s/it]
 84%|########4 | 434/514 [09:29<02:06,  1.58s/it]
 85%|########4 | 435/514 [09:31<02:05,  1.59s/it]
 85%|########4 | 436/514 [09:33<02:24,  1.85s/it]
 85%|########5 | 437/514 [09:35<02:17,  1.79s/it]
 85%|########5 | 438/514 [09:37<02:29,  1.97s/it]
 85%|########5 | 439/514 [09:39<02:29,  2.00s/it]
 86%|########5 | 440/514 [09:41<02:26,  1.99s/it]
 86%|########5 | 441/514 [09:43<02:23,  1.97s/it]
 86%|########5 | 442/514 [09:45<02:18,  1.92s/it]
 86%|########6 | 443/514 [09:47<02:12,  1.86s/it]
 86%|########6 | 444/514 [09:49<02:26,  2.09s/it]
 87%|########6 | 445/514 [09:51<02:19,  2.02s/it]
 87%|########6 | 446/514 [09:53<02:21,  2.08s/it]
 87%|########6 | 447/514 [09:55<02:15,  2.03s/it]
 87%|########7 | 448/514 [09:58<02:20,  2.12s/it]
 87%|########7 | 449/514 [09:59<02:07,  1.95s/it]
 88%|########7 | 450/514 [10:01<02:06,  1.98s/it]
 88%|########7 | 451/514 [10:03<02:03,  1.95s/it]
 88%|########7 | 452/514 [10:05<01:57,  1.90s/it]
 88%|########8 | 453/514 [10:07<01:58,  1.95s/it]
 88%|########8 | 454/514 [10:08<01:51,  1.86s/it]
 89%|########8 | 455/514 [10:10<01:50,  1.87s/it]
 89%|########8 | 456/514 [10:12<01:50,  1.91s/it]
 89%|########8 | 457/514 [10:14<01:43,  1.81s/it]
 89%|########9 | 458/514 [10:16<01:43,  1.84s/it]
 89%|########9 | 459/514 [10:18<01:43,  1.88s/it]
 89%|########9 | 460/514 [10:20<01:45,  1.95s/it]
 90%|########9 | 461/514 [10:22<01:48,  2.05s/it]
 90%|########9 | 462/514 [10:24<01:37,  1.88s/it]
 90%|######### | 463/514 [10:25<01:30,  1.77s/it]
 90%|######### | 464/514 [10:27<01:25,  1.71s/it]
 90%|######### | 465/514 [10:29<01:29,  1.83s/it]
 91%|######### | 466/514 [10:31<01:27,  1.83s/it]
 91%|######### | 467/514 [10:33<01:25,  1.81s/it]
 91%|#########1| 468/514 [10:34<01:22,  1.79s/it]
 91%|#########1| 469/514 [10:36<01:18,  1.74s/it]
 91%|#########1| 470/514 [10:37<01:13,  1.67s/it]
 92%|#########1| 471/514 [10:41<01:30,  2.11s/it]
 92%|#########1| 472/514 [10:43<01:30,  2.15s/it]
 92%|#########2| 473/514 [10:45<01:26,  2.10s/it]
 92%|#########2| 474/514 [10:47<01:23,  2.10s/it]
 92%|#########2| 475/514 [10:49<01:18,  2.01s/it]
 93%|#########2| 476/514 [10:50<01:11,  1.89s/it]
 93%|#########2| 477/514 [10:53<01:19,  2.14s/it]
 93%|#########2| 478/514 [10:55<01:11,  1.99s/it]
 93%|#########3| 479/514 [10:56<01:07,  1.94s/it]
 93%|#########3| 480/514 [11:01<01:31,  2.69s/it]
 94%|#########3| 481/514 [11:03<01:22,  2.51s/it]
 94%|#########3| 482/514 [11:05<01:13,  2.31s/it]
 94%|#########3| 483/514 [11:07<01:07,  2.17s/it]
 94%|#########4| 484/514 [11:08<00:59,  1.98s/it]
 94%|#########4| 485/514 [11:10<00:55,  1.93s/it]
 95%|#########4| 486/514 [11:12<00:54,  1.94s/it]
 95%|#########4| 487/514 [11:14<00:51,  1.92s/it]
 95%|#########4| 488/514 [11:15<00:47,  1.83s/it]
 95%|#########5| 489/514 [11:17<00:43,  1.74s/it]
 95%|#########5| 490/514 [11:19<00:41,  1.75s/it]
 96%|#########5| 491/514 [11:21<00:41,  1.79s/it]
 96%|#########5| 492/514 [11:23<00:39,  1.81s/it]
 96%|#########5| 493/514 [11:24<00:38,  1.82s/it]
 96%|#########6| 494/514 [11:27<00:38,  1.92s/it]
 96%|#########6| 495/514 [11:28<00:35,  1.86s/it]
 96%|#########6| 496/514 [11:30<00:32,  1.82s/it]
 97%|#########6| 497/514 [11:32<00:31,  1.83s/it]
 97%|#########6| 498/514 [11:34<00:28,  1.80s/it]
 97%|#########7| 499/514 [11:35<00:26,  1.80s/it]
 97%|#########7| 500/514 [11:37<00:24,  1.71s/it]
 97%|#########7| 501/514 [11:39<00:21,  1.69s/it]
 98%|#########7| 502/514 [11:40<00:20,  1.67s/it]
 98%|#########7| 503/514 [11:42<00:20,  1.83s/it]
 98%|#########8| 504/514 [11:44<00:17,  1.78s/it]
 98%|#########8| 505/514 [11:46<00:16,  1.79s/it]
 98%|#########8| 506/514 [11:48<00:14,  1.77s/it]
 99%|#########8| 507/514 [11:49<00:12,  1.80s/it]
 99%|#########8| 508/514 [11:51<00:10,  1.81s/it]
 99%|#########9| 509/514 [11:53<00:08,  1.70s/it]
 99%|#########9| 510/514 [11:54<00:06,  1.67s/it]
 99%|#########9| 511/514 [11:56<00:05,  1.71s/it]
100%|#########9| 512/514 [11:58<00:03,  1.79s/it]
100%|#########9| 513/514 [12:00<00:01,  1.92s/it]
100%|##########| 514/514 [12:02<00:00,  1.88s/it]
100%|##########| 514/514 [12:02<00:00,  1.41s/it]