{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Big Data Derby 2022\n### Notebook for analyzing horse racing data to improve the health of the horse and strategy of competition","metadata":{}},{"cell_type":"markdown","source":"## Copyright & Version\n\n> ### Author\n>> George Serbanut   \n>> Email: *george.serbanut@gmail.com*   \n>> Position: Competitor in \"Big Data Derby 2022\" competition posted on Kaggle\n>\n> ### Version\n>> Version number: 1.0.0\n>> Version release: November, 2022\n>\n> ### License\n>> Type: MIT License\n>> \n>> Copyright (c) 2022   \n>>> New York Racing Association (NYRA) and   \n>>> New York Thoroughbred Horseman's Association (NYTHA)\n>> \n>> *Permission is hereby granted, free of charge, to any person obtaining a copy\n>> of this software and associated documentation files (the \"Software\"), to deal\n>> in the Software without restriction, including without limitation the rights\n>> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n>> copies of the Software, and to permit persons to whom the Software is\n>> furnished to do so, subject to the following conditions:*\n>> \n>> *The above copyright notice and this permission notice shall be included in all\n>> copies or substantial portions of the Software.*\n>> \n>> *THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n>> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n>> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n>> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n>> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n>> SOFTWARE.*\n>> \n>> **NB!** NYRA/NYTHA reserves the right to change this license without any previous notice.\n>> Please, consult NYRA/NYTHA before using any piece of the Software from this notebook.\n","metadata":{}},{"cell_type":"markdown","source":"## Abstract\n\n> Like every other sport, the horse racing requires strategy. This strategy is based on horse capabilities and race evolution. In this notebook, we will see what may cause horse to drop out from the race, possible errors in racing strategy that may exhaust the horse before the race end and what possible strategy can help winning the race, or, at least, being among the first three positions. This analysis does not cover predicting the race stats. That type of analysis requires a different approach.\n> \n> We will also follow how the dataset size affects the analysis and what is needed to improve the accuracy of the strategy.\n>\n> Last but not least, we will see how we can overcome some ML problems encounted during the analysis.","metadata":{}},{"cell_type":"markdown","source":"## Introduction","metadata":{}},{"cell_type":"markdown","source":"### Notebook Structure\n\nThe **Introduction** chapter is dedicated to understanding how I used the data provided by NYRA to detect errors in strategy.\nThe chapter is divided further in two more sections: **Elements of Horse Race Strategy** and **Machine Learning Strategy**. \nEach section provides an introduction to the specified strategy.\n\nThe **Results and Analysis** will walk the reader through the results obtained from processing the provided data. In the same\ntime, I will provide a way to interpret those results.\n\nThe **Conclusions** will summarize the information provided throughout this notebook.\n\nThe **References** and **Appendices** will provide further reading materials.\n\nNote that throughout the notebook, I will only call the functions defined in **Software** which must be run \n***before*** the main chapters.","metadata":{}},{"cell_type":"markdown","source":"### Elements of Horse Race Strategy","metadata":{}},{"cell_type":"markdown","source":"The literature in the field is rich in elements one should look at to understand the horse race strategy. The most of them focus on speed and acceleration in the three parts of a race: the first 20 seconds of the race, the last 20 seconds of the race and whatever is in between. Lately, the focus was shifted also on the drafting.\n\nAs the race time was not provided in the data, and because the Trkus index does not stop when the last competitor passes the finish line, I extracted this parameter from publicly available data source (see **Reference**). The same for the race opening to specific sex and age.\n\nFor this study, I chose the following categories:\n - Mathematics related elements:\n   - minimum (min) value: the lowest value from a series;\n   - maximum (max) value: the largest value from a series;\n   - mean value: the central point from a series;\n   - variance (var): the measure of how far a set of numbers is spread out from their average value;\n   - other mathematical supporting elements\n - Physics related elements:\n   - distance: a numerical measurement of how far apart objects or points are (Wikipedia - see **References**);\n   - speed: the magnitude of the change of an object position over time (Wikipedia - see **References**);\n   - acceleration: the rate of change of the velocity of an object with respect to time (Wikipedia - see **References**);\n   - drafting: is an aerodynamic technique where two vehicles or other moving objects are caused to align in a close group (Wikipedia - see **References**);\n   - longitude: a geographic coordinate that specifies the east–west position of a point on the surface of the Earth (Wikipedia - see **References**);\n   - latitude: a geographic coordinate that specifies the enorth-south position of a point on the surface of the Earth (Wikipedia - see **References**);\n   - other support elements\n - Race related elements:\n   - the first 20 seconds: 80 Trakus ticks (considering 0.25 sec / Trakus tick) counted from the first index value;\n   - the last 20 seconds: 80 Trakus ticks (considering 0.25 sec / Trakus tick) counted from the race final time;\n   - mid-race: the Trakus ticks in between the points mentioned above;\n   - pack: a *virtual jockey* situated in the Center of Mass, defined by mean position at every Trakus tick;\n   - race position: the position of each jockey at the finish line;\n   - race time: the time for the last position (excluding the drop-out horses) to finish the race;\n   - line-up position: the order in which the horses are positioned from internal to external direction;\n   - horse sex: mares and/or fillies, both sexes (race entry allowed sex);\n   - horse age: minimum age allowed to enter the race;\n   - other provided data.\n","metadata":{}},{"cell_type":"markdown","source":"Before starting any analysis, we need to make sure we got the correct data. As a point of reference, I will use the world record entries publically available for Thoroughbred (see fig I1). Just for comparison, I added the world records for American Quarter. As you can easily see, as expected, American Quarter cannot compete with Thoroughbred at distances larger than five or six furlongs.\n\nTo be noted that we do not have any data for five, six and seven furlongs.","metadata":{}},{"cell_type":"code","source":"plot_world_records()","metadata":{"execution":{"iopub.status.busy":"2022-11-10T17:32:21.999661Z","iopub.execute_input":"2022-11-10T17:32:22.000597Z","iopub.status.idle":"2022-11-10T17:32:23.745895Z","shell.execute_reply.started":"2022-11-10T17:32:22.000431Z","shell.execute_reply":"2022-11-10T17:32:23.744955Z"},"_kg_hide-input":false,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Fig I1: World Records data base on distances with fit data and errors: Thoroughbred (left) and American Quarter (right).","metadata":{}},{"cell_type":"markdown","source":"We can easily see that our data is well within the specified parameters from the world records (see fig I2). As we do not have any data for five, six and seven furlongs among the World Record entries, we cannot say the outliers seen mainly in the speed and time distributions are confirmed. It may be that the chosen fitting distribution does not match that specific area. Therefore, I will not discard those points.","metadata":{}},{"cell_type":"code","source":"validation_against_world_records()","metadata":{"execution":{"iopub.status.busy":"2022-11-10T17:35:34.246112Z","iopub.execute_input":"2022-11-10T17:35:34.246531Z","iopub.status.idle":"2022-11-10T17:35:35.168523Z","shell.execute_reply.started":"2022-11-10T17:35:34.246490Z","shell.execute_reply":"2022-11-10T17:35:35.166926Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Fig I2: Provided dataset validation against the World Records: time distribution (lower), speed distribution (middle) and acceleration (upper).","metadata":{}},{"cell_type":"markdown","source":"As I mentioned at the beginning of this section, a lot of efforts were put into analyzing the influence of the drafting over the race results. Drafting plays its part in influencing the race results, but there are some pitfalls the jockey may fall into. For the time being, I would only introduce the reader in this field.\n\nTo begin with, according to the literature in the field, drafting occurs only at maximum 2.5 meters from the horse in front and only at a deviation of 10 degrees angle on each side of the front runner. This observation helps a lot in reducing the computational time and I used it in my software.\n\nNow, the power necessary to overcome the drag effect depends on the speed we are moving with. For a car on a highway, the drag is felt especially if you drive a town car. The drivers call that \"not enough power\" and they are right. The same thing for a horse. When the horse reaches its top speed, the power used by the horse to overcome the drag effect is tremendous compared to a sustainable developed power. Like for the cars on highway, the acceleration developed by the horse is much affected by the drag effect. Fig I3 shows the necessary power needed to overcome the drag effect as a function of speed.","metadata":{}},{"cell_type":"code","source":"drag_power()","metadata":{"execution":{"iopub.status.busy":"2022-11-10T17:35:44.607069Z","iopub.execute_input":"2022-11-10T17:35:44.607543Z","iopub.status.idle":"2022-11-10T17:35:45.405253Z","shell.execute_reply.started":"2022-11-10T17:35:44.607506Z","shell.execute_reply":"2022-11-10T17:35:45.403048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Fig I3: Drag Power distribution as a function of speed.","metadata":{}},{"cell_type":"markdown","source":"Let us analyze one race to see how the draft effect influenced the race position. In fig I4, we can see Manuel Franco keeping an external position all the time which explains the longest run distance. Obviously, his average speed was the highest or he could not run the longest distance and still win it. But, if we look at the maximum speed he managed during the race, one can easily see it was not the best, but it was also quite high. Compared to the fourth position (Jomar Garcia), which had the highest maximum speed, one could think that forcing the horse in such way may not give the desired result. It is the drafting graph that explains such race stats for Manuel Franco.\n\nHere is the main points of the story behind the well deserved victory (see also fig I5 - the width and length components of the distance spread):\n - Manuel Franco started from exterior position which gave him an apparent disadvantage. Dylan Davis started from a better position (the most interior one).\n - From the beginning, Manuel Franco stayed behind, looking for drafting another competitor. On the other side, Dylan Davis used his position to try a victory on a brute force.\n - Both followed the best strategy to keep an slow incresing speed, in order to preserve the horse strength for the last straight line.\n - Manuel Franco used Jomar Garcia to boost his speed without spending too much energy from his horse. Meanwhile, Dylan Davis was holding his interior position that gave him a final advantage of nine meters less running.\n - Finally, Manuel Franco won the race on the last meters.\n \nIs this strategy a pattern we can use to define the strategy? We will see later on.","metadata":{}},{"cell_type":"code","source":"position_stats()","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2022-11-10T17:43:28.608075Z","iopub.execute_input":"2022-11-10T17:43:28.608517Z","iopub.status.idle":"2022-11-10T17:43:29.565768Z","shell.execute_reply.started":"2022-11-10T17:43:28.608480Z","shell.execute_reply":"2022-11-10T17:43:29.564133Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Fig I4: Drafting distance influence on final position for race 1 from Aqueduct on January 1, 2019.","metadata":{}},{"cell_type":"markdown","source":"Fig I5 shows the evolution of the race. Here is how to read the plots:\n- Spread means the distribution of the competitors over a certain area. For example, we see in Spread Width plot that Manuel Franco started from the most exterior position (or seeked that position in the first meters), while Dylan Davis started on the opposite side of the pack.\n- The Width component of the Spread refers to the component of the distance/speed vector which is perpendicular on the race direction (pack CM speed direction).\n- The Length component of the Spread refers to the component of the distance/speed vector which is parallel on (along) the race direction (pack CM speed direction).\n- The Speed Relative to CM refers to the vector norm (or vector size) of the difference in between the jockey and pack Center of Mass.\n- The distance on the x-axis is the pack CM distance.","metadata":{}},{"cell_type":"code","source":"race_stats()","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2022-11-10T17:47:25.782057Z","iopub.execute_input":"2022-11-10T17:47:25.783314Z","iopub.status.idle":"2022-11-10T17:47:27.509528Z","shell.execute_reply.started":"2022-11-10T17:47:25.783255Z","shell.execute_reply":"2022-11-10T17:47:27.508408Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Fig I5: Speeds and relative distances from CM distributions for race 1 from Aqueduct on January 1, 2019 (see text for details).","metadata":{}},{"cell_type":"markdown","source":"Until now, I showed how a simple GPS location tracker can provide so much information about the race. Most of this information is not even visible to the naked eye during the race. The question is what do we do with so much information? How can we structure it to be able to analyze it? Luckily, we do not need to worry about that. We have Machine Learning for that task. But this is will be explained in the next section (**Machine Learning Strategy**).","metadata":{}},{"cell_type":"markdown","source":"### Machine Learning Strategy","metadata":{}},{"cell_type":"markdown","source":"##### ...a short introduction in Machine Learning...","metadata":{}},{"cell_type":"markdown","source":"As we could see in the previous section, trying to analyze a large dataset manually may take quite a long time and still prone to errors (\"*errare humanum est*\"). Even with sofisticated data analysis models, this may prove to be a tedious job. I am old enough to speak from my own experience here.\n\nNowadays, Machine Learning makes life much simpler by detecting complex patterns beyond human capabilities. Even more, Machine Learning is increasingly becoming a natural part of our life, getting more and more incorporated in everything we use on daily basis. For example, almost every store provides a mobile application or a card. The reason behind is to optimize the business by reducing its losses. To do so, the store owner uses a Machine Learning model to predict what products are in demand and when. In this way, the store is able to provide the products at a more reasonable price and of better quality. That definitely impacts our lifestyle by being able to redirect more funds from life necessity costs to our personal projects.\n\nTo introduce shortly the reader in this field, we need to understand what is AI, firstly. \n\nBy definition, AI (Artificial Intelligence) is an attempt for the machines to mimic human intelligence. There is a misconcept also for humans that the intelligence is based on the capability to observe patterns in a picture, numerical series or words association. I do not need to prove that, just take an IQ test and you will easily notice that.\n\nIn human intelligence, there are two components: patterns detection and reasoning (to be noted that reasoning is not the same with logic - the main difference is that the logic is only one, while reasoning is biased mostly by experience, for example). The same is applicable to AI, it has two main components Machine Learning for pattern recognition and Reasoning System for reasoning. In real life, especially in the past few years, many try to solve even the logic of a problem with Machine Learning. Hence, the Machine Learning got a boom in products it offers.\n\nIn the area of Machine Learning, there are two notable frameworks: SciKit Learn (for standard CPU environment) and Rapids (for GPU environment).\n\nThe disadvantage of Machine Learning is it depends on the algorythm used. A more generic sub-domain with more powerful capabilities is Deep Learning. As this is not the intent of this notebook, I will not enter details here. I will mention only that even if there are more commenrcial tools than free ones, a notable such framework is Tensorflow/Keras.","metadata":{}},{"cell_type":"markdown","source":"##### ...about tools and metrics...","metadata":{}},{"cell_type":"markdown","source":"For the ML main strategy, I chose to be as much independent on the ML algorythm as possible. Therefore, in this notebook, I used XGBClassifier from XGBoost, DecisionTreeClassifier and RandomForestClassifier from SciKit Learn and Tensorflow/Keras (as Deep Learning Framework). Also, I stayed with Binary Classification. This is a simple problem with one shiny ball that can be black or white. Very easy at normal light. The complications appear when you try to guess the ball color when the ball is in between you and a bright light, a bright light is reflected from the ball into your eyes or no light at all. But, if you notice an imperfection in the white balls (e.g., its surface is rougher than the black ball surphace), you can use the tactile sense to identify easier the color. In the same way, if you are in a very cold environment and you need to wear gloves, the tactile sense is quite useless.\n\nIn the same way, I have no clue how the dataset will be enhanced in the future or how the further granularity will be reinforced upon the ML model. So, instead of using one single ML or DL framework, I choose to use multiple frameworks that will increase the odds of being right in my horse race strategy detection.","metadata":{}},{"cell_type":"markdown","source":"On Binary versus Multiclass Classification, the main reason is the imbalanced dataset (say, the black balls are much more than the white balls when you extract one ball at the time from a box). The Binary Classification is simpler and more easily handled by ML frameworks (see Siblini at al. to understand the complications on imbalanced classes in Binary Classification, while in multiclass classification it is close to a big headache). But, in the same time, the most of the provided metrics is True Positive (e.g., the white balls correctly identified as white balls) detection oriented, considering True Negative (e.g., the black balls identified as black balls) just some background noise. In this notebook, I chose Matthew Correlation Coefficient (MCC) as the base metrics because it balances the focus on both classes. If we define:\n- True Positive (TP): the members of the signal class correctly identified (e.g., how many white balls we identify correctly as white);\n- False Negative (FN): the members of the signal class mistaken as members of the noise class (e.g., how many white balls we identify as black);\n- True Negative (TP): the members of the noise class correctly identified (e.g., how many black balls we identify correctly as black);\n- False Positive (FP): the members of the noise class mistaken as members of the signal class (e.g., how many black balls we identify as white);\n\nthen, the MCC is defined as:\n\n$$MCC = \\displaystyle \\frac{TP \\times TN - FN \\times FP}{\\sqrt{(TP + FN) \\times (TP + FP) \\times (TN + FN) \\times (TN + FP)}}$$\n\nMCC has one major drawback: it explodes numerically in two cases:\n- when we provide only members of one class (e.g., if we use a split of 80% of data for training and 20% of data for testing on a sorted dataset, then the 20% of data for the testing purposes may contain only signal or noise) - that is why I devised my own data split function;\n- when the model has no clue about the patterns and misidentifies completely the noise as signal or vice-versa (it may happen during the early stages of the model training).\n\nThis may be easily overcome programmatically (add a check on denominator before creating the fraction) or numerically (add a small fractional number to the denominator). I prefer the first option because MCC is very sensitive at small differences in denominator, especially when high class imbalance is tested. For example, 3 out of 330 black balls were mistaken as white ones and we have only 4 white balls in our box. In such a case, MCC goes down to 0.75 from the maximum 1.0 allowed for this coefficient.\n\nThe main advantage of this coefficient is, beside the provided symmetry, that you can evaluate your model against flipping a coin method to identify the classes. Thus, the value \"1\" means your model distinguish clearly your classes without any error. The value \"0\" means the model is as good as flipping the coin on identifying the classes. If you reach the value \"-1\", you should review your strategy and start over with your ML project. In our case here, the \"-1\" value means that one should definitely disconsider that cluster of feature when building up the horse race strategy.","metadata":{}},{"cell_type":"markdown","source":"##### ...about outliers and feature importance...","metadata":{}},{"cell_type":"markdown","source":"There are two more subjects I need to talk about before presenting the results: outliers and feature importance.\n\nThe outliers are the data that stands out in the crowd and, usually, confuse your model. The standard procedure to identify such data in your dataset is IQR (interquartile range) method. The drawback of this method is that it is applicable only on one dimansional array of data. To apply it to a 80 columns x 15,000 rows dataset, one method is to create a so called *norm*. Here is how this can be implemented in few simple steps:\n- Scale your data to be in between 0 and 1 or whatever range may be more appropriate for your case. In my case, I used a simple min-max scaler on each column to down or up the data in each cell.\n- Add a column in your DataFrame named *norm*, in which you put the computed value from the following formula:\n$$ NORM_j = \\sum \\limits _{i = 1} ^N X_{j, i}^2 $$\nwhere $j$ is the row index, $i$ is the column index which maxes at $N$ and $X_{i, j}$ is the value from the cell from the $i^{th}$ column and $j^{th}$ row. $\\sum$ represents the sum function within lower and upper limits.\n- Apply NumPy Ndarray.quantile([.25, .75]) method and set the values to $Q1$ and $Q3$ variables. Compute $IQR$ as the difference in between $Q3$ and $Q1$ and apply the filter:\n$$ Q1 - 1.5 \\times IQR \\le NORM \\le Q3 + 1.5 \\times IQR $$\non your *norm* column. You can play with the factor $1.5$ to see how your model behaves on more constrained or loose dataset.\n- Remove norm column and you have a clean dataset.\n\nThat is all about outliers. The only things worth mentioning here is that the data is quite well balanced and attempting to remove the outliers influenced more the execution time than providing any constructive input to the ML model.\n\nBefore we start with feature importance, let us understand a bit the concept of feature. In your DataFrame, a feature is one column. In ML modelling, a feature is a series of data that is used to fit the parameters. For example, a linear system of equations for fitting a dataset to labels (members of signal/noise classes) looks like this:\n\n$\n\\displaystyle \\left\\{ \\begin{align} \na_{1, 1} \\cdot X_{1, 1} & + \\ldots + \\; a_{1, i} \\cdot X_{1, i} + \\ldots + \\; a_{1, N} \\cdot X_{1, N} = \\;  y_1\\\\\n\\\\\n\\vdots & \\\\\n\\\\\na_{j, 1} \\cdot X_{j, 1} & + \\ldots + \\; a_{j, i} \\cdot X_{j, i} + \\ldots + \\; a_{j, N} \\cdot X_{j, N} = \\;  y_j\\\\\n\\\\\n\\vdots & \\\\\n\\\\\na_{M, 1} \\cdot X_{M, 1} & + \\ldots + \\; a_{M, i} \\cdot X_{M, i} + \\ldots + \\; a_{M, N} \\cdot X_{M, N} = \\; y_M\n\\end{align} \\right.\n$\n\nwhere $a_j$ is the parameter to be trained and $y_j$ is the label (actual value) associated to a class for that row. $M$ is the maximum number of rows.\n\nAs you can see, if we introduce features (columns) that confuse the ML model, the capability of correctly identifying $L_j$ decreases. Thus, we can categorize the features in three main categories: predictive, indifferent and confusing.\n\nAlso, the position of the data on a specific column may change the result. After all, matrix operations are not symmetric to columns inter-change.\n\nI put here this small introduction for the reader to understand that one needs to pay attention to two aspects when feeding data to a model:\n- the more correlated the data on one type of features (say, predictive), the more the model will deviate from peak efficiency;\n- the features positions and types influence the model predictive power.\n\nIn our case here, we do want to speculate the first aspect (as opose to predictive case) in order to validate the horse race strategy (and not to predict the position for betting purposes). But, we have to pay attention to the second aspect not to be under the assumption the feature is important, but, in reality, the feature is a confusing one.\n\nTo tackle this issue, I used Spearman Ranking method to detect the clsuters with highly correlated features and Permutation Importance from SciKit Learn to detect the important (predictive or confusing) features. I applied the Permutation Importance on XGBClassifier, DecisionTreeClassifier and RandomForrestClassifier, and I classify the cluster of features (predictive, indifferent or confusing) against Tensorflow/Keras using Matthew Correlation Coefficient.","metadata":{}},{"cell_type":"markdown","source":"##### ...what about hyperparameters and model architecture?","metadata":{}},{"cell_type":"markdown","source":"Nothing special here. The only point worth mentioning is about using *bias initializer* along with *class imbalance* in Tensorflow/Keras to compensate the class imbalanced dataset. These two hyperparameters showed a performance comparable to Siblini's model.","metadata":{}},{"cell_type":"markdown","source":"##### ...anything else before showing the results?","metadata":{}},{"cell_type":"markdown","source":"Just for disclaimer, I couldn't stabilize the Tensorflow/Keras model (every time I ran it, the prediction was a bit different), so, I applied the *Best of Breed* statistical model on a chaotic system (I ran the fitting and the evaluation five times, I shuffled the rows and I took the best result). In such way, probabilistic, it should minimize the differences among different runs at the expense of more computational time.","metadata":{}},{"cell_type":"markdown","source":"\nLast, here is the Machine Learning global technical information:\n- Dataset split:\n  - training dataset: 60%\n  - validation dataset: 20%\n  - test dataset (held-out information): 20%\n- Correlation based clustering:\n  - Method: Spearman Ranking\n  - Criterion: distance\n  - Distance parametrization: 0.0, 0.25, 0.5, 0.75 and 1.0\n  - Applied on full dataset\n- Computation of Permutation Importance:\n  - Package provider: SciKit Learn\n  - Method: shuffle\n  - Number of shuffles: 10\n  - Metrics: Matthew Correlation Coefficient\n  - ML Models: XGBClassifier, DecisionTreeClassifier, RandomForestClassifier\n  - ML Models fit on training dataset\n  - Held-out information: validation and test concatenated dataset\n- Evaluation of the predictive power for the clusters of features with Permutation Importance higher than 0.0:\n  - Methods:\n    - Best of Breed (out of a population of five runs)\n    - Asymmetrical signal/noise output assumption\n  - Framework type: Deep Learning\n  - Framework: Tensorflow/Keras\n  - Model: Sequential\n  - Numbers of layers: 7\n    - Input Layer: 1\n    - Dense Layers: 3\n      - activation: ReLU (Rectified Linear Unit)\n      - units: 128, 64 and 32\n    - Dropout Layers: 2\n      - rate: 0.25\n    - Output Layer:\n      - type: Dense\n      - activation: SIGMOID\n      - units: 1\n      - with bias initializer\n  - Metrics: Loss, TP, FN, TN, FP, MCC\n  - Optimizer: Adam\n  - Loss: Binary Cross-Entropy\n  - Fitted on the training dataset with validation on the validation dataset\n  - Evaluation on test dataset (held-out information)\n  - Other parameters:\n    - number of epochs: 20\n    - batch size: 10\n    - with class weight\n    - with shuffle","metadata":{}},{"cell_type":"markdown","source":"## Results and Analysis\n\n","metadata":{}},{"cell_type":"markdown","source":"In this chapter, I will focus on what the ML identified as differences among different position. As a general note, I grouped the competitors in five groups:\n- Position 1 Group. This group contains all the winners.\n- Position 2 Group. This group contains all the competitors comming on the second position.\n- Position 3 Group. This group contains all the competitors comming on the third position.\n- Position 4 Group. This group contains all the competitors comming on the fourth position and on and finished the race.\n- Position 0 Group. This group contains all the competitors who started the race, but not finished it.\n\nThe reasons behind such a categorization are simple:\n- All the races will have a first, second and third position. So, there will be no missing data.\n- The number of competitors per race varies significantly and a fifth position on a five competitor race is not equivalent with the fifth position on a 14 competitors race. To avoid complications, I decided that all these positions should enter the first position outside the winners circle (positions 1, 2 and 3).\n- The competitors who started the race, but dropped out for various reasons, cannot be in the same category with those who managed to finish the race.\n\nIn Fig R1 to Fig R4, I present an exhaustive list of technical features averaged per position. Here is how to read them (everything relative to the selected interval of time):\n- distances (expressed in meters):\n  - distance_ahead: running distance while being ahead of the pack;\n  - distance_behind: running distance while being behind the pack;\n  - distance_drafting: running distance while drafting;\n  - distance_extra: the difference in between the horse real running distance and the race distance (*distance_id* column from provided dataset);\n  - distance_inside: the distance while being inside (on the interior) of the track;\n  - distance_outside: the distance while being outside (on the exterior) of the track;\n  - distance: full distance;\n  - distance_pack_relative: the average distance in between the horse and the pack center of mass;\n  - distance_x: the distance run toward the interior or exterior of the track (perpendicular on the track direction);\n  - distance_y: the distance run forward (along the track direction);\n- speed (expressed in meters per second) and acceleration (expressed in meters per second at second power):\n  - minimum value;\n  - maximum value;\n  - mean (or average) value;\n  - square deviation from mean (or variance).\n\nFig 5 shows additional feature averaged per position:\n- weight carried by the horse;\n- line up position (the smaller value, the more toward the inside of the track).","metadata":{}},{"cell_type":"code","source":"position_all_stats('overall')","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2022-11-10T17:54:27.142647Z","iopub.execute_input":"2022-11-10T17:54:27.143531Z","iopub.status.idle":"2022-11-10T17:54:30.801892Z","shell.execute_reply.started":"2022-11-10T17:54:27.143465Z","shell.execute_reply":"2022-11-10T17:54:30.800286Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Fig R1: All average stats for each position for full race (see text for more details).","metadata":{}},{"cell_type":"code","source":"position_all_stats('first_20s')","metadata":{"execution":{"iopub.status.busy":"2022-11-10T17:55:31.416761Z","iopub.execute_input":"2022-11-10T17:55:31.417731Z","iopub.status.idle":"2022-11-10T17:55:34.912319Z","shell.execute_reply.started":"2022-11-10T17:55:31.417683Z","shell.execute_reply":"2022-11-10T17:55:34.911052Z"},"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Fig R2: All average stats for each position for the first 20s (see text for more details).","metadata":{}},{"cell_type":"code","source":"position_all_stats('mid_race')","metadata":{"execution":{"iopub.status.busy":"2022-11-10T17:56:36.417143Z","iopub.execute_input":"2022-11-10T17:56:36.418084Z","iopub.status.idle":"2022-11-10T17:56:40.071246Z","shell.execute_reply.started":"2022-11-10T17:56:36.418017Z","shell.execute_reply":"2022-11-10T17:56:40.070078Z"},"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Fig R3: All average stats for each position for the time in between the first 20s and the final 20s (see text for more details).","metadata":{}},{"cell_type":"code","source":"position_all_stats('final_20s')","metadata":{"execution":{"iopub.status.busy":"2022-11-10T17:57:13.304328Z","iopub.execute_input":"2022-11-10T17:57:13.305315Z","iopub.status.idle":"2022-11-10T17:57:16.519665Z","shell.execute_reply.started":"2022-11-10T17:57:13.305263Z","shell.execute_reply":"2022-11-10T17:57:16.518803Z"},"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Fig R4: All average stats for each position for the final 20s (see text for more details).","metadata":{}},{"cell_type":"code","source":"position_all_stats()","metadata":{"execution":{"iopub.status.busy":"2022-11-10T17:57:29.119390Z","iopub.execute_input":"2022-11-10T17:57:29.120163Z","iopub.status.idle":"2022-11-10T17:57:29.552281Z","shell.execute_reply.started":"2022-11-10T17:57:29.120121Z","shell.execute_reply":"2022-11-10T17:57:29.551017Z"},"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Fig R5: Additional stats for each position (see text for more details).","metadata":{}},{"cell_type":"markdown","source":"##### ...recommendations from the Machine Learning...","metadata":{}},{"cell_type":"markdown","source":"Now, let us see what Machine Learning recommend us after analyzing the full dataset. I will focus only on the clusters providing a better prediction power than the full dataset. Also, the focus will be only for the first position versus the rest of the positions because one trains to win, not to be on some lower positions. The software is capable to provide the full set of results.\n","metadata":{}},{"cell_type":"markdown","source":"### Analysis for the first position","metadata":{}},{"cell_type":"markdown","source":"> Generic information:\n> - Size of dataset: 2001 rows\n>\n> #### Analysis against the second position\n> - Size of dataset: 2001 rows\n>\n> Analysis:\n> - The model suggests that the differences in between these two positions are minimal (as in the example from the introduction, Manuel Franco won on the last 50 meters).\n> - It also suggests that there are seven possible clusters of features one should study to formulate the strategy. For example, the second cluster suggests that the strategy should be:\n>   - overall (see Fig R2):\n>     - keep a low maximum speed (aka, do not force the horse);\n>     - keep an alert average speed;\n>     - the two points above speak together about keeping the horse speed increase factor as constant as possible;\n>     - make sure you adapt the speed to the track (as in *track_id*);\n>     - Fig I4 tells the same story and that means Manuel Franco played by the book;\n>   - for the first 20 seconds (see Fig R2):\n>     - the maximum speed should be lower than the others;\n>     - the average speed should be higher than the others;\n>     - the run distance should be already higher than the others;\n>     - the direction should be along the track (aka, do not try to get on interior side of the track;\n>     - in the example from the introduction, Manuel Franco seemed to have implemented this strategy in his race;\n>   - for the mid race part (see Fig R3):\n>     - ML model emphasizes horse should use a low horse speed increase factor;\n>   - for the final 20 seconds (see Fig R4):\n>     - maximize the horse efforts;\n>     - keep the direction along the track direction and get ahead as soon as possible;\n>     - in our example, Manuel Franco deviated from the above recommendation and that is why he cought up with Dylan Davis so late.\n> - Another example is Dylan Davis main issue on the final 20 seconds when he made quite a slalom, reducing his speed component which is along the track direction. Also, he spent more of his horse efforts to reach ahead of the pack in the first 20 seconds. It looks that at least these two points costed him the first place.\n>\n> \n> Results:\n>> Prediction power on the full dataset: low\n>>\n>> Clusters analyzed: 162\n>>\n>> Clusters worth looking into (prediction power greater than full dataset): 7\n>>> - Cluster members: distance_pack_relative_final_20s\n>>> - Cluster members: speed_maximum_first_20s, distance_extra_overall, speed_maximum_final_20s, speed_average_mid_race, distance_ahead_final_20s, speed_maximum_overall, distance_final_20s, speed_minimum_final_20s, distance_first_20s, track_id, distance_y_first_20s, speed_average_overall, speed_average_final_20s, distance_y_final_20s, speed_average_first_20s, speed_maximum_mid_race, speed_variance_mid_race\n>>> - Cluster members: distance_behind_final_20s, distance_ahead_mid_race, distance_ahead_overall\n>>> - Cluster members: distance_behind_final_20s\n>>> - Cluster members: distance_behind_mid_race, distance_behind_overall, distance_pack_relative_first_20s, distance_ahead_first_20s, distance_behind_first_20s, distance_behind_final_20s, distance_ahead_mid_race, distance_ahead_overall\n>>> - Cluster members: distance_extra_overall, speed_maximum_final_20s, speed_average_mid_race, distance_ahead_final_20s, distance_final_20s, speed_minimum_final_20s, track_id, speed_average_overall, speed_average_final_20s, distance_y_final_20s, speed_maximum_mid_race\n>>> - Cluster members: distance_ahead_mid_race, distance_ahead_overall\n>\n> #### Analysis against the third position\n> - Size of dataset: 2001 rows\n>\n> Analysis:\n> - The model suggests that the differences in between these two positions are still low, but better than the 1 - 2 position pair.\n> - It also suggests that there are eight possible clusters of features one should study to formulate the strategy. For example, the main difference comes from less aggressive strategy for the third position at the beginning of the race and in mid-race. It seems the third position lingers too much behind (see the fourth cluster).\n>\n> \n> Results:\n>> Prediction power on the full dataset: medium\n>>\n>> Clusters analyzed: 140\n>>\n>> Clusters worth looking into (prediction power greater than full dataset): 8 (distinct) / 13 (with duplicates in different correlation distances)\n>>> - Cluster members: distance_pack_relative_mid_race\n>>> - Cluster members: distance_pack_relative_final_20s, distance_pack_relative_mid_race\n>>> - Cluster members: distance_ahead_final_20s\n>>> - Cluster members: distance_behind_mid_race, distance_behind_overall, distance_pack_relative_first_20s, distance_ahead_first_20s, distance_behind_first_20s\n>>> - Cluster members: distance_behind_mid_race, distance_behind_overall, distance_ahead_final_20s, distance_pack_relative_first_20s, distance_ahead_first_20s, distance_behind_first_20s, distance_behind_final_20s, distance_ahead_mid_race, distance_ahead_overall\n>>> - Cluster members: distance_behind_final_20s\n>>> - Cluster members: distance_pack_relative_final_20s\n>>> - Cluster members: distance_ahead_final_20s, distance_behind_final_20s\n>\n> #### Analysis against the fourth position on\n> - Size of dataset: 8823 rows\n>\n> Analysis:\n> - The model suggests that the differences in between these two positions are high, generally.\n> - It also suggests that there is one possible cluster of features one should study to formulate the strategy. The cluster indicates that the fourth position does not preseve the horse efforts during the race.\n> - The last observation is related to the number of clusters that overpass the predictive power of the full dataset. It seems that most of the strategies are good enough to exit the crowd.\n>\n> \n> Results:\n>> Prediction power on the full dataset: good\n>>\n>> Clusters analyzed: 157\n>>\n>> Clusters worth looking into (prediction power greater than full dataset): 1 (distinct) / 2 (with duplicates in different correlation distances)\n>>> - Cluster members: distance_pack_relative_final_20s, distance_pack_relative_mid_race\n>\n> #### Analysis against the drop-outs\n> - Size of dataset: 94 rows\n>\n> Analysis:\n> - The model suggests two positions can be easily separated within one or two percents error on the full dataset. For the two clusters below, the MCC shows 1.0 (everything is identified properly).\n> - To note that the distance relative to the pack in the final 20 seconds increases considerably (obviously because of dropping out, but also due to slowing down just before dropping out). The same comment for the mid-race zone.\n> - Otherwise, one needs to go below the full dataset to see what clusters the Machine Learning model identified for this case.\n> - I think what ML model is trying to say here is that the competitors dropping out may not be blamed for poor strategy. But, that can be confirmed if we could have access to some medical data for the horse.\n>\n> \n> Results:\n>> Prediction power on the full dataset: excellent\n>>\n>> Clusters analyzed: 22\n>>\n>> Clusters worth looking into (prediction power greater than full dataset): 2 (distinct) / 5 (with duplicates in different correlation distances)\n>>> - Cluster members: distance_pack_relative_final_20s, distance_pack_relative_mid_race\n>>> - Cluster members: distance_pack_relative_final_20s\n","metadata":{}},{"cell_type":"markdown","source":"## Conclusions\n\n","metadata":{}},{"cell_type":"markdown","source":"There are few conclusions the reader can easily draw from this notebook:\n1. The ML model works on identifying winning strategies (see example from Introduction versus identified strategy for winners versus the second position).\n2. The drafting effect is a supporting one and not a main component for winning.\n3. The ML model is built for identifying and validating strategies and not for predicting the winner. Indeed, one cannot ignore the fact that we build clusters and we validate or invalidate them based on Best of Breed method relying on knowing the data in advance (ML model must not have it).\n4. The chosen metrics can easily connect this ML model with a Reasoning System to further enhance its predictive capabilities.\n5. To be able to analyze further the horse races, ML will need more data for better granularity of the filters.","metadata":{}},{"cell_type":"markdown","source":"## References\n\n","metadata":{}},{"cell_type":"markdown","source":"### Mathematical Elements\n> - Minimum and Maximum Value: https://en.wikipedia.org/wiki/Maxima_and_minima\n> - Mean Value: https://en.wikipedia.org/wiki/Mean\n> - Variance: https://en.wikipedia.org/wiki/Variance","metadata":{}},{"cell_type":"markdown","source":"### Physics Quantities\n> - Distance: https://en.wikipedia.org/wiki/Distance\n> - Speed: https://en.wikipedia.org/wiki/Speed\n> - Acceleration: https://en.wikipedia.org/wiki/Acceleration\n> - Drafting: https://en.wikipedia.org/wiki/Drafting_(aerodynamics)\n> - Longitude: https://en.wikipedia.org/wiki/Longitude\n> - Latitude: https://en.wikipedia.org/wiki/Latitude\n> - Center of Mass: https://en.wikipedia.org/wiki/Center_of_mass\n> - Frame of Reference: https://en.wikipedia.org/wiki/Frame_of_reference","metadata":{}},{"cell_type":"markdown","source":"### World Record Data\n> Data provided publicly by https://horseracingsense.com with specifics at:\n>> - Thoroughbred: https://horseracingsense.com/how-fast-can-horse-run-racing-records/\n>> - American Quarter: https://horseracingsense.com/quarter-horse-racing-distance-history-records/\n","metadata":{}},{"cell_type":"markdown","source":"### Final Time and Open for Sex and Age\n\n> Data provided publicly by https://entries.horseracingnation.com\n>> - Example open for all: https://entries.horseracingnation.com/entries-results/aqueduct/2019-01-01\n>> - Exemple open for mares and fillies, three years old and up: https://entries.horseracingnation.com/entries-results/saratoga/2019-09-02#race-8","metadata":{}},{"cell_type":"markdown","source":"### On Imbalanced Dataset\n\n> https://link.springer.com/chapter/10.1007/978-3-030-44584-3_36","metadata":{}},{"cell_type":"markdown","source":"## Software\n","metadata":{}},{"cell_type":"markdown","source":"### Imports","metadata":{}},{"cell_type":"code","source":"import math\nimport re\nfrom os import mkdir, path, listdir, remove, environ\nimport inspect\nimport itertools as it\nfrom datetime import datetime\nimport math\nfrom typing import Union, TypeVar, Any\nimport numpy as np\nimport pandas as pd\nimport requests\nfrom bs4 import BeautifulSoup\nimport logging\nimport tensorflow as tf\nfrom tensorflow import keras\nimport keras.backend as K\nfrom sklearn.preprocessing import MinMaxScaler\nfrom sklearn.impute import SimpleImputer\nfrom xgboost import XGBClassifier\nfrom sklearn.tree import DecisionTreeClassifier\nfrom sklearn.ensemble import RandomForestClassifier\nfrom IPython.display import display_markdown\nimport matplotlib.pyplot as plt\nfrom scipy.optimize import curve_fit","metadata":{"_kg_hide-input":false,"execution":{"iopub.status.busy":"2022-11-10T18:46:27.167530Z","iopub.execute_input":"2022-11-10T18:46:27.168072Z","iopub.status.idle":"2022-11-10T18:46:27.178452Z","shell.execute_reply.started":"2022-11-10T18:46:27.168032Z","shell.execute_reply":"2022-11-10T18:46:27.176744Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Global Utility","metadata":{}},{"cell_type":"code","source":"def log(message: str, level: str = 'info') -> None:\n    date_time = datetime.now().strftime(\"%Y-%m-%dT%H:%M:%S\")\n    if level.upper() not in ['INFO', 'WARNING', 'ERROR']:\n        print(F'[{date_time}] ERROR: Unknown log level {level.upper()}.')\n        raise Exception(F'Unknown log level {level.upper()}')\n    if level.upper() == 'ERROR':\n        print(F'[{date_time}] {level.upper()}: {message}', flush = True)\n        raise Exception(F'{message}')\n    print(F'[{date_time}] {level.upper()}: {message}', flush = True)\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-11-10T18:46:47.809025Z","iopub.execute_input":"2022-11-10T18:46:47.809565Z","iopub.status.idle":"2022-11-10T18:46:47.819043Z","shell.execute_reply.started":"2022-11-10T18:46:47.809526Z","shell.execute_reply":"2022-11-10T18:46:47.817803Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Data Engineering Pipeline","metadata":{}},{"cell_type":"markdown","source":"#### Variables","metadata":{}},{"cell_type":"code","source":"# Earth radius at NY in m\nRE = 6369108.5","metadata":{"execution":{"iopub.status.busy":"2022-11-10T18:47:07.477444Z","iopub.execute_input":"2022-11-10T18:47:07.478778Z","iopub.status.idle":"2022-11-10T18:47:07.485512Z","shell.execute_reply.started":"2022-11-10T18:47:07.478731Z","shell.execute_reply":"2022-11-10T18:47:07.483483Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Utilities","metadata":{}},{"cell_type":"code","source":"def thoroughbred_world_record_level(distance: float, unit: str = 'furlong') -> (float, float, float):\n    dist = distance\n    if unit == 'm' or unit == 'meter':\n        dist /= 201.2\n    if dist == 0:\n        minimum_time_seconds = 0.0\n        maximum_speed_mps = 0.0\n        maximum_acceleration_mpss = 0.0\n    else:\n        minimum_time_seconds = -6.27 + 12.11 * dist\n        maximum_speed_mps = 16.84 + 7.1 / dist\n        maximum_acceleration_mpss = -0.03 + 1.77 / dist + 0.52 / (dist * dist)\n    return round(minimum_time_seconds, 2), round(maximum_speed_mps, 2), round(maximum_acceleration_mpss, 2)\n\ndef compute_distance_numpy(long_diff: np.ndarray, lat_diff: np.ndarray) -> \\\n        (np.ndarray, np.ndarray, np.ndarray, np.ndarray):\n    # x -> longitude & y -> latitude\n    # returns numpy arrays\n    long_diff = long_diff.astype(float)\n    lat_diff = lat_diff.astype(float)\n    x: np.ndarray = 2 * RE * np.sin(np.radians(long_diff) / 2)\n    y: np.ndarray = 2 * RE * np.sin(np.radians(lat_diff) / 2)\n    d: np.ndarray = np.sqrt(np.power(x, 2) + np.power(y, 2))\n    alpha: np.ndarray = np.degrees(np.arctan2(y, x))\n    return x, y, d, alpha\n\ndef decompose_numpy(axis_angle: np.ndarray, direction_angle: np.ndarray, vector_magnitude: np.ndarray) -> \\\n        (np.ndarray, np.ndarray):\n    # x_prime: perpendicular component on the new axis\n    # y_prime: parallel component on the new axis\n    rads: np.ndarray = np.radians(direction_angle - axis_angle)\n    x_prime = vector_magnitude * np.sin(rads)\n    y_prime = vector_magnitude * np.cos(rads)\n    return x_prime, y_prime\n\ndef compute_speed_diff_numpy(v1_magnitudes: np.ndarray, v1_angles: np.ndarray,\n                             v2_magnitudes: np.ndarray, v2_angles: np.ndarray) -> (np.ndarray, np.ndarray):\n    dx: np.ndarray = v2_magnitudes * np.cos(np.radians(v2_angles)) - v1_magnitudes * np.cos(np.radians(v1_angles))\n    dy: np.ndarray = v2_magnitudes * np.sin(np.radians(v2_angles)) - v1_magnitudes * np.sin(np.radians(v1_angles))\n    return np.sqrt(np.power(dx, 2) + np.power(dy, 2)), np.degrees(np.arctan2(dy, dx))\n\n","metadata":{"execution":{"iopub.status.busy":"2022-11-10T18:47:23.127392Z","iopub.execute_input":"2022-11-10T18:47:23.127831Z","iopub.status.idle":"2022-11-10T18:47:23.146513Z","shell.execute_reply.started":"2022-11-10T18:47:23.127794Z","shell.execute_reply":"2022-11-10T18:47:23.144700Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Additional Data\n\nData scrapped from https://entries.horseracingnation.com","metadata":{}},{"cell_type":"code","source":"web_scrapping = dict(racing_time = {'AQU_2019-01-01-1': 79.56, 'AQU_2019-01-01-2': 73.38, 'AQU_2019-01-01-3': 68.63,\n                                    'AQU_2019-01-01-4': 114.15, 'AQU_2019-01-01-5': 86.08, 'AQU_2019-01-01-6': 72.45,\n                                    'AQU_2019-01-01-7': 80.88, 'AQU_2019-01-01-8': 99.06, 'AQU_2019-01-01-9': 73.64,\n                                    'AQU_2019-01-04-1': 99.58, 'AQU_2019-01-04-2': 84.48, 'AQU_2019-01-04-3': 74.52,\n                                    'AQU_2019-01-04-4': 86.58, 'AQU_2019-01-04-5': 114.69,\n                                    'AQU_2019-01-04-6': 99.28999999999999, 'AQU_2019-01-04-7': 112.83,\n                                    'AQU_2019-01-04-8': 74.74, 'AQU_2019-01-05-1': 104.67, 'AQU_2019-01-05-2': 100.08,\n                                    'AQU_2019-01-05-3': 104.09, 'AQU_2019-01-05-4': 82.18, 'AQU_2019-01-05-5': 79.17,\n                                    'AQU_2019-01-05-6': 66.62, 'AQU_2019-01-05-7': 71.38, 'AQU_2019-01-05-8': 85.22,\n                                    'AQU_2019-01-05-9': 117.18, 'AQU_2019-01-06-1': 99.45, 'AQU_2019-01-06-2': 64.5,\n                                    'AQU_2019-01-06-3': 79.41, 'AQU_2019-01-06-4': 100.81, 'AQU_2019-01-06-5': 103.32,\n                                    'AQU_2019-01-06-6': 79.86, 'AQU_2019-01-06-7': 73.71000000000001,\n                                    'AQU_2019-01-06-8': 85.66, 'AQU_2019-01-10-1': 102.37, 'AQU_2019-01-10-2': 117.1,\n                                    'AQU_2019-01-10-3': 105.22999999999999, 'AQU_2019-01-10-4': 74.22,\n                                    'AQU_2019-01-10-5': 73.36, 'AQU_2019-01-11-1': 101.47, 'AQU_2019-01-11-2': 100.75,\n                                    'AQU_2019-01-11-3': 72.68, 'AQU_2019-01-11-4': 101.05, 'AQU_2019-01-11-5': 74.34,\n                                    'AQU_2019-01-11-6': 63.92, 'AQU_2019-01-11-7': 85.39, 'AQU_2019-01-11-8': 82.7,\n                                    'AQU_2019-01-12-1': 80.73, 'AQU_2019-01-12-2': 66.24, 'AQU_2019-01-12-3': 77.52,\n                                    'AQU_2019-01-12-4': 79.86, 'AQU_2019-01-12-5': 72.0, 'AQU_2019-01-12-6': 71.16,\n                                    'AQU_2019-01-12-7': 97.62, 'AQU_2019-01-12-8': 83.56, 'AQU_2019-01-12-9': 101.59,\n                                    'AQU_2019-01-13-1': 64.79, 'AQU_2019-01-13-2': 111.44, 'AQU_2019-01-13-3': 77.84,\n                                    'AQU_2019-01-13-4': 67.13, 'AQU_2019-01-13-5': 72.02, 'AQU_2019-01-13-6': 99.32,\n                                    'AQU_2019-01-13-7': 78.99, 'AQU_2019-01-13-8': 72.03999999999999,\n                                    'AQU_2019-01-18-1': 72.44, 'AQU_2019-01-18-2': 72.42, 'AQU_2019-01-18-3': 73.34,\n                                    'AQU_2019-01-18-4': 98.22999999999999, 'AQU_2019-01-18-5': 102.89,\n                                    'AQU_2019-01-18-6': 97.63, 'AQU_2019-01-18-7': 78.53, 'AQU_2019-01-18-8': 72.86,\n                                    'AQU_2019-01-19-1': 72.62, 'AQU_2019-01-19-2': 113.28, 'AQU_2019-01-19-3': 85.72,\n                                    'AQU_2019-01-19-4': 101.28999999999999, 'AQU_2019-01-19-5': 83.95,\n                                    'AQU_2019-01-19-6': 100.87, 'AQU_2019-01-19-7': 71.47, 'AQU_2019-01-19-8': 114.45,\n                                    'AQU_2019-01-19-9': 98.71000000000001, 'AQU_2019-01-20-1': 120.37,\n                                    'AQU_2019-01-20-2': 102.7, 'AQU_2019-01-20-3': 67.0, 'AQU_2019-01-20-4': 73.14,\n                                    'AQU_2019-01-20-5': 86.9, 'AQU_2019-01-20-6': 74.53999999999999,\n                                    'AQU_2019-01-20-7': 114.12, 'AQU_2019-01-20-8': 69.94, 'AQU_2019-01-25-1': 72.58,\n                                    'AQU_2019-01-25-2': 72.25, 'AQU_2019-01-25-3': 72.47,\n                                    'AQU_2019-01-25-4': 74.78999999999999, 'AQU_2019-01-25-5': 102.58,\n                                    'AQU_2019-01-25-6': 103.52000000000001, 'AQU_2019-01-25-7': 100.05,\n                                    'AQU_2019-01-25-8': 85.74, 'AQU_2019-01-25-9': 67.12, 'AQU_2019-01-26-1': 97.22,\n                                    'AQU_2019-01-26-2': 79.72, 'AQU_2019-01-26-3': 99.03, 'AQU_2019-01-26-4': 72.45,\n                                    'AQU_2019-01-26-5': 66.06, 'AQU_2019-01-26-6': 76.8, 'AQU_2019-01-26-7': 98.0,\n                                    'AQU_2019-01-26-8': 110.71000000000001, 'AQU_2019-01-26-9': 97.00999999999999,\n                                    'AQU_2019-01-26-10': 101.49000000000001, 'AQU_2019-01-27-1': 73.26,\n                                    'AQU_2019-01-27-2': 96.65, 'AQU_2019-01-27-3': 73.3, 'AQU_2019-01-27-4': 121.19,\n                                    'AQU_2019-01-27-5': 70.97, 'AQU_2019-01-27-6': 72.81, 'AQU_2019-01-27-7': 71.16,\n                                    'AQU_2019-01-27-8': 85.18, 'AQU_2019-01-27-9': 101.38,\n                                    'AQU_2019-02-01-1': 72.46000000000001, 'AQU_2019-02-01-2': 85.8,\n                                    'AQU_2019-02-01-3': 72.51, 'AQU_2019-02-01-4': 72.15, 'AQU_2019-02-01-5': 118.1,\n                                    'AQU_2019-02-01-6': 65.7, 'AQU_2019-02-01-7': 99.06, 'AQU_2019-02-01-8': 66.94,\n                                    'AQU_2019-02-02-1': 98.07, 'AQU_2019-02-02-2': 112.06, 'AQU_2019-02-02-3': 77.64,\n                                    'AQU_2019-02-02-4': 99.7, 'AQU_2019-02-02-5': 66.31, 'AQU_2019-02-02-6': 95.78,\n                                    'AQU_2019-02-02-7': 70.96000000000001, 'AQU_2019-02-02-8': 97.47,\n                                    'AQU_2019-02-02-9': 110.22999999999999, 'AQU_2019-02-02-10': 78.05,\n                                    'AQU_2019-02-03-1': 98.32, 'AQU_2019-02-03-2': 70.91,\n                                    'AQU_2019-02-03-3': 69.71000000000001, 'AQU_2019-02-03-4': 78.62,\n                                    'AQU_2019-02-03-5': 71.03999999999999, 'AQU_2019-02-03-6': 78.9,\n                                    'AQU_2019-02-03-7': 83.58, 'AQU_2019-02-03-8': 112.24000000000001,\n                                    'AQU_2019-02-03-9': 69.52, 'AQU_2019-02-07-1': 85.91, 'AQU_2019-02-07-2': 71.9,\n                                    'AQU_2019-02-07-3': 86.28, 'AQU_2019-02-07-4': 73.28999999999999,\n                                    'AQU_2019-02-07-5': 99.83, 'AQU_2019-02-07-6': 77.86, 'AQU_2019-02-07-7': 97.11,\n                                    'AQU_2019-02-07-8': 98.78, 'AQU_2019-02-08-1': 105.44, 'AQU_2019-02-08-2': 85.6,\n                                    'AQU_2019-02-08-3': 73.51, 'AQU_2019-02-08-4': 73.0, 'AQU_2019-02-08-5': 100.56,\n                                    'AQU_2019-02-08-6': 79.7, 'AQU_2019-02-08-7': 72.25, 'AQU_2019-02-08-8': 75.39,\n                                    'AQU_2019-02-09-1': 81.3, 'AQU_2019-02-09-2': 88.4, 'AQU_2019-02-09-3': 114.85,\n                                    'AQU_2019-02-09-4': 81.28999999999999, 'AQU_2019-02-09-5': 71.34,\n                                    'AQU_2019-02-09-6': 73.71000000000001, 'AQU_2019-02-09-7': 87.16,\n                                    'AQU_2019-02-09-8': 85.24, 'AQU_2019-02-09-9': 74.72, 'AQU_2019-02-10-1': 86.93,\n                                    'AQU_2019-02-10-2': 114.78, 'AQU_2019-02-10-3': 100.65, 'AQU_2019-02-10-4': 63.71,\n                                    'AQU_2019-02-10-5': 101.82, 'AQU_2019-02-10-6': 71.74, 'AQU_2019-02-10-7': 83.51,\n                                    'AQU_2019-02-10-8': 97.32, 'AQU_2019-02-15-1': 97.78999999999999,\n                                    'AQU_2019-02-15-2': 98.45, 'AQU_2019-02-15-3': 100.9, 'AQU_2019-02-15-4': 66.59,\n                                    'AQU_2019-02-15-5': 72.3, 'AQU_2019-02-15-6': 71.47, 'AQU_2019-02-15-7': 96.86,\n                                    'AQU_2019-02-15-8': 72.66, 'AQU_2019-02-16-1': 86.64, 'AQU_2019-02-16-2': 84.98,\n                                    'AQU_2019-02-16-3': 79.81, 'AQU_2019-02-16-4': 100.78, 'AQU_2019-02-16-5': 71.52,\n                                    'AQU_2019-02-16-6': 99.46000000000001, 'AQU_2019-02-16-7': 69.91,\n                                    'AQU_2019-02-16-8': 71.13, 'AQU_2019-02-16-9': 101.24000000000001,\n                                    'AQU_2019-02-17-1': 78.06, 'AQU_2019-02-17-2': 97.46000000000001,\n                                    'AQU_2019-02-17-3': 98.64, 'AQU_2019-02-17-4': 112.57, 'AQU_2019-02-17-5': 73.03,\n                                    'AQU_2019-02-17-6': 86.25, 'AQU_2019-02-17-7': 97.03999999999999,\n                                    'AQU_2019-02-17-8': 73.2, 'AQU_2019-02-18-1': 88.9, 'AQU_2019-02-18-2': 115.2,\n                                    'AQU_2019-02-18-3': 103.2, 'AQU_2019-02-18-4': 98.88,\n                                    'AQU_2019-02-18-5': 100.02000000000001, 'AQU_2019-02-18-6': 101.15,\n                                    'AQU_2019-02-18-7': 72.44, 'AQU_2019-02-18-8': 71.78, 'AQU_2019-02-18-9': 81.83,\n                                    'AQU_2019-02-21-1': 117.15, 'AQU_2019-02-21-2': 101.35, 'AQU_2019-02-21-3': 100.56,\n                                    'AQU_2019-02-21-4': 78.74, 'AQU_2019-02-21-5': 78.39, 'AQU_2019-02-21-6': 97.08,\n                                    'AQU_2019-02-21-7': 85.41, 'AQU_2019-02-21-8': 96.75999999999999,\n                                    'AQU_2019-02-22-1': 87.37, 'AQU_2019-02-22-2': 73.51, 'AQU_2019-02-22-3': 72.66,\n                                    'AQU_2019-02-22-4': 80.06, 'AQU_2019-02-22-5': 100.31, 'AQU_2019-02-22-6': 99.47,\n                                    'AQU_2019-02-22-7': 112.8, 'AQU_2019-02-22-8': 72.73, 'AQU_2019-02-23-1': 98.42,\n                                    'AQU_2019-02-23-2': 72.39, 'AQU_2019-02-23-3': 82.23, 'AQU_2019-02-23-4': 71.75,\n                                    'AQU_2019-02-23-5': 71.4, 'AQU_2019-02-23-6': 76.83, 'AQU_2019-02-23-7': 82.11,\n                                    'AQU_2019-02-23-8': 70.66, 'AQU_2019-02-23-9': 70.43, 'AQU_2019-02-24-1': 66.53,\n                                    'AQU_2019-02-24-2': 85.92, 'AQU_2019-02-24-3': 73.07, 'AQU_2019-02-24-4': 99.6,\n                                    'AQU_2019-02-24-5': 65.45, 'AQU_2019-02-24-6': 85.44, 'AQU_2019-02-24-7': 114.15,\n                                    'AQU_2019-02-24-8': 74.5, 'AQU_2019-02-28-1': 81.44, 'AQU_2019-02-28-2': 102.15,\n                                    'AQU_2019-02-28-3': 103.2, 'AQU_2019-02-28-4': 104.17,\n                                    'AQU_2019-02-28-5': 105.22999999999999, 'AQU_2019-02-28-6': 101.58,\n                                    'AQU_2019-02-28-7': 79.6, 'AQU_2019-02-28-8': 105.50999999999999,\n                                    'AQU_2019-03-01-1': 74.16, 'AQU_2019-03-01-2': 98.89,\n                                    'AQU_2019-03-01-3': 73.28999999999999, 'AQU_2019-03-01-4': 101.55,\n                                    'AQU_2019-03-01-5': 72.15, 'AQU_2019-03-01-6': 74.19,\n                                    'AQU_2019-03-01-7': 101.27000000000001, 'AQU_2019-03-01-8': 71.38,\n                                    'AQU_2019-03-02-1': 81.74, 'AQU_2019-03-02-2': 74.43, 'AQU_2019-03-02-3': 73.7,\n                                    'AQU_2019-03-02-4': 70.43, 'AQU_2019-03-02-5': 75.53, 'AQU_2019-03-02-6': 69.33,\n                                    'AQU_2019-03-02-7': 74.23, 'AQU_2019-03-02-8': 138.99, 'AQU_2019-03-02-9': 99.5,\n                                    'AQU_2019-03-03-1': 72.8, 'AQU_2019-03-03-2': 73.96000000000001,\n                                    'AQU_2019-03-03-3': 71.25, 'AQU_2019-03-03-4': 79.97, 'AQU_2019-03-03-5': 66.68,\n                                    'AQU_2019-03-03-6': 72.96000000000001, 'AQU_2019-03-03-7': 70.62,\n                                    'AQU_2019-03-03-8': 85.75, 'AQU_2019-03-08-1': 65.62, 'AQU_2019-03-08-2': 97.97,\n                                    'AQU_2019-03-08-3': 84.82, 'AQU_2019-03-08-4': 73.58, 'AQU_2019-03-08-5': 71.53,\n                                    'AQU_2019-03-08-6': 99.75, 'AQU_2019-03-08-7': 72.09, 'AQU_2019-03-08-8': 99.72,\n                                    'AQU_2019-03-09-1': 72.28, 'AQU_2019-03-09-2': 98.05, 'AQU_2019-03-09-3': 73.86,\n                                    'AQU_2019-03-09-4': 112.12, 'AQU_2019-03-09-5': 96.99000000000001,\n                                    'AQU_2019-03-09-6': 78.66, 'AQU_2019-03-09-7': 80.41, 'AQU_2019-03-09-8': 68.77,\n                                    'AQU_2019-03-09-9': 95.27000000000001, 'AQU_2019-03-09-10': 95.63,\n                                    'AQU_2019-03-09-11': 97.69, 'AQU_2019-03-10-1': 102.34,\n                                    'AQU_2019-03-10-2': 101.03999999999999, 'AQU_2019-03-10-3': 86.38,\n                                    'AQU_2019-03-10-4': 100.97, 'AQU_2019-03-10-5': 73.44, 'AQU_2019-03-10-6': 98.37,\n                                    'AQU_2019-03-10-7': 84.37, 'AQU_2019-03-10-8': 97.32, 'AQU_2019-03-10-9': 114.38,\n                                    'AQU_2019-03-15-1': 101.47, 'AQU_2019-03-15-2': 112.67, 'AQU_2019-03-15-3': 73.33,\n                                    'AQU_2019-03-15-4': 99.92, 'AQU_2019-03-15-5': 73.51, 'AQU_2019-03-15-6': 99.6,\n                                    'AQU_2019-03-15-7': 71.13, 'AQU_2019-03-15-8': 97.92, 'AQU_2019-03-15-9': 84.84,\n                                    'AQU_2019-03-16-1': 97.97, 'AQU_2019-03-16-2': 98.88, 'AQU_2019-03-16-3': 71.19,\n                                    'AQU_2019-03-16-4': 101.19, 'AQU_2019-03-16-5': 102.72, 'AQU_2019-03-16-6': 85.73,\n                                    'AQU_2019-03-16-7': 72.95, 'AQU_2019-03-16-8': 78.65, 'AQU_2019-03-16-9': 85.95,\n                                    'AQU_2019-03-17-1': 97.34, 'AQU_2019-03-17-2': 115.91, 'AQU_2019-03-17-3': 97.9,\n                                    'AQU_2019-03-17-4': 85.57, 'AQU_2019-03-17-5': 115.1, 'AQU_2019-03-17-6': 71.78,\n                                    'AQU_2019-03-17-7': 72.25, 'AQU_2019-03-17-8': 71.03999999999999,\n                                    'AQU_2019-03-17-9': 79.96000000000001, 'AQU_2019-03-22-1': 79.89,\n                                    'AQU_2019-03-22-2': 100.27000000000001, 'AQU_2019-03-22-3': 99.9,\n                                    'AQU_2019-03-22-4': 73.78, 'AQU_2019-03-22-5': 99.44,\n                                    'AQU_2019-03-22-6': 75.21000000000001, 'AQU_2019-03-22-7': 73.45,\n                                    'AQU_2019-03-22-8': 72.09, 'AQU_2019-03-22-9': 80.21000000000001,\n                                    'AQU_2019-03-23-1': 101.17, 'AQU_2019-03-23-2': 88.42, 'AQU_2019-03-23-3': 99.68,\n                                    'AQU_2019-03-23-4': 68.28999999999999, 'AQU_2019-03-23-5': 101.46000000000001,\n                                    'AQU_2019-03-23-6': 68.1, 'AQU_2019-03-23-7': 73.4, 'AQU_2019-03-23-8': 73.19,\n                                    'AQU_2019-03-23-9': 75.19, 'AQU_2019-03-24-1': 73.09, 'AQU_2019-03-24-2': 78.41,\n                                    'AQU_2019-03-24-3': 65.0, 'AQU_2019-03-24-4': 75.88, 'AQU_2019-03-24-5': 72.81,\n                                    'AQU_2019-03-24-6': 98.5, 'AQU_2019-03-24-7': 84.43, 'AQU_2019-03-24-8': 97.72,\n                                    'AQU_2019-03-24-9': 99.86, 'AQU_2019-03-29-1': 98.63, 'AQU_2019-03-29-2': 72.69,\n                                    'AQU_2019-03-29-3': 101.7, 'AQU_2019-03-29-4': 73.28999999999999,\n                                    'AQU_2019-03-29-5': 87.61, 'AQU_2019-03-29-6': 66.96, 'AQU_2019-03-29-7': 85.16,\n                                    'AQU_2019-03-29-8': 100.09, 'AQU_2019-03-29-9': 100.69, 'AQU_2019-03-30-1': 86.76,\n                                    'AQU_2019-03-30-2': 72.61, 'AQU_2019-03-30-3': 83.86, 'AQU_2019-03-30-4': 78.53,\n                                    'AQU_2019-03-30-5': 99.92, 'AQU_2019-03-30-6': 72.12, 'AQU_2019-03-30-7': 80.17,\n                                    'AQU_2019-03-30-8': 97.57, 'AQU_2019-03-30-9': 143.32999999999998,\n                                    'AQU_2019-03-30-10': 84.32, 'AQU_2019-03-31-1': 73.28999999999999,\n                                    'AQU_2019-03-31-2': 74.38, 'AQU_2019-03-31-3': 73.42,\n                                    'AQU_2019-03-31-4': 73.53999999999999, 'AQU_2019-03-31-5': 101.99000000000001,\n                                    'AQU_2019-03-31-6': 74.5, 'AQU_2019-03-31-7': 73.58, 'AQU_2019-03-31-8': 101.8,\n                                    'AQU_2019-03-31-9': 74.02, 'AQU_2019-04-05-1': 99.36, 'AQU_2019-04-05-2': 73.56,\n                                    'AQU_2019-04-05-3': 79.98, 'AQU_2019-04-05-4': 81.49, 'AQU_2019-04-05-5': 79.49,\n                                    'AQU_2019-04-05-6': 94.4, 'AQU_2019-04-05-7': 98.3, 'AQU_2019-04-05-8': 82.31,\n                                    'AQU_2019-04-05-9': 97.94, 'AQU_2019-04-06-1': 72.71000000000001,\n                                    'AQU_2019-04-06-2': 64.95, 'AQU_2019-04-06-3': 71.03, 'AQU_2019-04-06-4': 85.05,\n                                    'AQU_2019-04-06-5': 102.33, 'AQU_2019-04-06-6': 83.45,\n                                    'AQU_2019-04-06-7': 111.53999999999999, 'AQU_2019-04-06-8': 112.91,\n                                    'AQU_2019-04-06-9': 83.28, 'AQU_2019-04-06-10': 111.22999999999999,\n                                    'AQU_2019-04-06-11': 97.39, 'AQU_2019-04-07-1': 101.86, 'AQU_2019-04-07-2': 73.16,\n                                    'AQU_2019-04-07-3': 107.56, 'AQU_2019-04-07-4': 72.3, 'AQU_2019-04-07-5': 94.13,\n                                    'AQU_2019-04-07-6': 108.87, 'AQU_2019-04-07-7': 70.81, 'AQU_2019-04-07-8': 101.95,\n                                    'AQU_2019-04-07-9': 73.93, 'AQU_2019-04-10-1': 99.03, 'AQU_2019-04-10-2': 101.07,\n                                    'AQU_2019-04-10-3': 100.65, 'AQU_2019-04-10-4': 103.18, 'AQU_2019-04-10-5': 71.55,\n                                    'AQU_2019-04-10-6': 70.66, 'AQU_2019-04-10-7': 73.68, 'AQU_2019-04-10-8': 95.35,\n                                    'AQU_2019-04-10-9': 69.41, 'AQU_2019-04-11-1': 99.25999999999999,\n                                    'AQU_2019-04-11-2': 98.71000000000001, 'AQU_2019-04-11-3': 85.5,\n                                    'AQU_2019-04-11-4': 68.02, 'AQU_2019-04-11-5': 97.62, 'AQU_2019-04-11-6': 68.61,\n                                    'AQU_2019-04-11-7': 77.85, 'AQU_2019-04-11-8': 110.24000000000001,\n                                    'AQU_2019-04-11-9': 69.93, 'AQU_2019-04-12-1': 97.71000000000001,\n                                    'AQU_2019-04-12-2': 84.16, 'AQU_2019-04-12-3': 95.00999999999999,\n                                    'AQU_2019-04-12-4': 69.83, 'AQU_2019-04-12-5': 78.25, 'AQU_2019-04-12-6': 68.87,\n                                    'AQU_2019-04-12-7': 97.50999999999999, 'AQU_2019-04-12-8': 68.97,\n                                    'AQU_2019-04-12-9': 105.06, 'AQU_2019-04-13-1': 97.4,\n                                    'AQU_2019-04-13-2': 100.96000000000001, 'AQU_2019-04-13-3': 70.28,\n                                    'AQU_2019-04-13-4': 72.81, 'AQU_2019-04-13-5': 79.86, 'AQU_2019-04-13-6': 71.38,\n                                    'AQU_2019-04-13-7': 99.28999999999999, 'AQU_2019-04-13-8': 112.99000000000001,\n                                    'AQU_2019-04-13-9': 72.74, 'AQU_2019-04-14-1': 96.44, 'AQU_2019-04-14-2': 72.15,\n                                    'AQU_2019-04-14-3': 96.1, 'AQU_2019-04-14-4': 69.63,\n                                    'AQU_2019-04-14-5': 97.53999999999999, 'AQU_2019-04-14-6': 105.5,\n                                    'AQU_2019-04-14-7': 97.49000000000001, 'AQU_2019-04-14-8': 69.92,\n                                    'AQU_2019-04-14-9': 105.75, 'AQU_2019-04-17-1': 54.22, 'AQU_2019-04-17-2': 85.7,\n                                    'AQU_2019-04-17-3': 103.95, 'AQU_2019-04-17-4': 68.53, 'AQU_2019-04-17-5': 70.55,\n                                    'AQU_2019-04-17-6': 84.77, 'AQU_2019-04-17-7': 67.69, 'AQU_2019-04-17-8': 77.34,\n                                    'AQU_2019-04-17-9': 69.42, 'AQU_2019-04-18-1': 66.74, 'AQU_2019-04-18-2': 73.62,\n                                    'AQU_2019-04-18-3': 103.38, 'AQU_2019-04-18-4': 99.22999999999999,\n                                    'AQU_2019-04-18-5': 103.49000000000001, 'AQU_2019-04-18-6': 68.82,\n                                    'AQU_2019-04-18-7': 77.28999999999999, 'AQU_2019-04-18-8': 70.76,\n                                    'AQU_2019-04-18-9': 69.39, 'AQU_2019-04-19-1': 52.82, 'AQU_2019-04-19-2': 87.2,\n                                    'AQU_2019-04-19-3': 102.13, 'AQU_2019-04-19-4': 72.34, 'AQU_2019-04-19-5': 103.84,\n                                    'AQU_2019-04-19-6': 97.12, 'AQU_2019-04-19-7': 67.78, 'AQU_2019-04-19-8': 72.92,\n                                    'AQU_2019-04-19-9': 105.17, 'AQU_2019-04-20-1': 71.87, 'AQU_2019-04-20-2': 99.16,\n                                    'AQU_2019-04-20-3': 100.2, 'AQU_2019-04-20-4': 87.06,\n                                    'AQU_2019-04-20-5': 113.77000000000001, 'AQU_2019-04-20-6': 105.78999999999999,\n                                    'AQU_2019-04-20-7': 98.75, 'AQU_2019-04-20-8': 78.81,\n                                    'AQU_2019-04-20-9': 78.28999999999999, 'AQU_2019-11-01-1': 77.81,\n                                    'AQU_2019-11-01-2': 71.28, 'AQU_2019-11-01-3': 77.3, 'AQU_2019-11-01-4': 96.88,\n                                    'AQU_2019-11-01-5': 96.36, 'AQU_2019-11-01-6': 71.71000000000001,\n                                    'AQU_2019-11-01-7': 94.97, 'AQU_2019-11-01-8': 97.1, 'AQU_2019-11-01-9': 96.75,\n                                    'AQU_2019-11-01-10': 70.98, 'AQU_2019-11-02-1': 70.91, 'AQU_2019-11-02-2': 72.43,\n                                    'AQU_2019-11-02-3': 106.13, 'AQU_2019-11-02-4': 75.9, 'AQU_2019-11-02-5': 70.56,\n                                    'AQU_2019-11-02-6': 107.95, 'AQU_2019-11-02-7': 69.66, 'AQU_2019-11-02-8': 73.16,\n                                    'AQU_2019-11-02-9': 109.46000000000001, 'AQU_2019-11-02-10': 71.96000000000001,\n                                    'AQU_2019-11-03-1': 70.99, 'AQU_2019-11-03-2': 97.75, 'AQU_2019-11-03-3': 76.23,\n                                    'AQU_2019-11-03-4': 70.23, 'AQU_2019-11-03-5': 98.87, 'AQU_2019-11-03-6': 71.73,\n                                    'AQU_2019-11-03-7': 95.2, 'AQU_2019-11-03-8': 153.43, 'AQU_2019-11-03-9': 94.66,\n                                    'AQU_2019-11-03-10': 72.03999999999999, 'AQU_2019-11-07-1': 72.77,\n                                    'AQU_2019-11-07-2': 72.03, 'AQU_2019-11-07-3': 103.0, 'AQU_2019-11-07-4': 96.45,\n                                    'AQU_2019-11-07-5': 69.2, 'AQU_2019-11-07-6': 138.85, 'AQU_2019-11-07-7': 70.33,\n                                    'AQU_2019-11-07-8': 69.44, 'AQU_2019-11-07-9': 97.62,\n                                    'AQU_2019-11-08-1': 78.28999999999999, 'AQU_2019-11-08-2': 71.8,\n                                    'AQU_2019-11-08-3': 79.03999999999999, 'AQU_2019-11-08-4': 70.63,\n                                    'AQU_2019-11-08-5': 70.96000000000001, 'AQU_2019-11-08-6': 77.67,\n                                    'AQU_2019-11-08-7': 97.38, 'AQU_2019-11-08-8': 69.48,\n                                    'AQU_2019-11-08-9': 105.96000000000001, 'AQU_2019-11-09-1': 87.23,\n                                    'AQU_2019-11-09-2': 98.7, 'AQU_2019-11-09-3': 104.34, 'AQU_2019-11-09-4': 79.91,\n                                    'AQU_2019-11-09-5': 102.99000000000001, 'AQU_2019-11-09-6': 102.5,\n                                    'AQU_2019-11-09-7': 85.36, 'AQU_2019-11-09-8': 95.11, 'AQU_2019-11-09-9': 69.11,\n                                    'AQU_2019-11-09-10': 86.11, 'AQU_2019-11-10-1': 68.8, 'AQU_2019-11-10-2': 104.4,\n                                    'AQU_2019-11-10-3': 97.62, 'AQU_2019-11-10-4': 79.02, 'AQU_2019-11-10-5': 68.74,\n                                    'AQU_2019-11-10-6': 81.24, 'AQU_2019-11-10-7': 98.03, 'AQU_2019-11-10-8': 85.91,\n                                    'AQU_2019-11-10-9': 69.16, 'AQU_2019-11-10-10': 104.1,\n                                    'AQU_2019-11-11-1': 103.77000000000001, 'AQU_2019-11-11-2': 73.53999999999999,\n                                    'AQU_2019-11-11-3': 85.32, 'AQU_2019-11-11-4': 74.21000000000001,\n                                    'AQU_2019-11-11-5': 79.58, 'AQU_2019-11-11-6': 103.14, 'AQU_2019-11-11-7': 69.25,\n                                    'AQU_2019-11-11-8': 114.39, 'AQU_2019-11-11-9': 102.67, 'AQU_2019-11-11-10': 70.73,\n                                    'AQU_2019-11-14-1': 102.08, 'AQU_2019-11-14-2': 69.21000000000001,\n                                    'AQU_2019-11-14-3': 87.73, 'AQU_2019-11-14-4': 103.83, 'AQU_2019-11-14-5': 102.75,\n                                    'AQU_2019-11-14-6': 68.62, 'AQU_2019-11-14-7': 102.71000000000001,\n                                    'AQU_2019-11-14-8': 96.59, 'AQU_2019-11-14-9': 70.27, 'AQU_2019-11-15-1': 100.07,\n                                    'AQU_2019-11-15-2': 96.43, 'AQU_2019-11-15-3': 100.17, 'AQU_2019-11-15-4': 81.55,\n                                    'AQU_2019-11-15-5': 81.22, 'AQU_2019-11-15-6': 103.8,\n                                    'AQU_2019-11-15-7': 69.46000000000001, 'AQU_2019-11-15-8': 79.03,\n                                    'AQU_2019-11-15-9': 95.89, 'AQU_2019-11-15-10': 70.1, 'AQU_2019-11-16-1': 101.84,\n                                    'AQU_2019-11-16-2': 103.7, 'AQU_2019-11-16-3': 102.94, 'AQU_2019-11-16-4': 72.47,\n                                    'AQU_2019-11-16-5': 108.33, 'AQU_2019-11-16-6': 96.53999999999999,\n                                    'AQU_2019-11-16-7': 80.13, 'AQU_2019-11-16-8': 72.22, 'AQU_2019-11-16-9': 95.87,\n                                    'AQU_2019-11-16-10': 68.92, 'AQU_2019-11-17-1': 98.84, 'AQU_2019-11-17-2': 104.34,\n                                    'AQU_2019-11-17-3': 99.5, 'AQU_2019-11-17-4': 136.57999999999998,\n                                    'AQU_2019-11-17-5': 69.27, 'AQU_2019-11-17-6': 99.62, 'AQU_2019-11-17-7': 104.14,\n                                    'AQU_2019-11-17-8': 69.9, 'AQU_2019-11-17-9': 72.28,\n                                    'AQU_2019-11-17-10': 74.71000000000001, 'AQU_2019-11-20-1': 72.38,\n                                    'AQU_2019-11-20-2': 72.32, 'AQU_2019-11-20-3': 85.65, 'AQU_2019-11-20-4': 99.16,\n                                    'AQU_2019-11-20-5': 99.99000000000001, 'AQU_2019-11-20-6': 73.13,\n                                    'AQU_2019-11-20-7': 97.39, 'AQU_2019-11-20-8': 82.59, 'AQU_2019-11-20-9': 71.49,\n                                    'AQU_2019-11-21-1': 73.72, 'AQU_2019-11-21-2': 100.3, 'AQU_2019-11-21-3': 105.6,\n                                    'AQU_2019-11-21-4': 71.21000000000001, 'AQU_2019-11-21-5': 85.74,\n                                    'AQU_2019-11-21-6': 105.31, 'AQU_2019-11-21-7': 103.74000000000001,\n                                    'AQU_2019-11-21-8': 73.07, 'AQU_2019-11-22-1': 71.69, 'AQU_2019-11-22-2': 84.08,\n                                    'AQU_2019-11-22-3': 72.03999999999999, 'AQU_2019-11-22-4': 106.99000000000001,\n                                    'AQU_2019-11-22-5': 97.12, 'AQU_2019-11-22-6': 112.78999999999999,\n                                    'AQU_2019-11-22-7': 84.57, 'AQU_2019-11-22-8': 80.15, 'AQU_2019-11-23-1': 71.55,\n                                    'AQU_2019-11-23-2': 72.59, 'AQU_2019-11-23-3': 104.2, 'AQU_2019-11-23-4': 78.64,\n                                    'AQU_2019-11-23-5': 70.84, 'AQU_2019-11-23-6': 105.15, 'AQU_2019-11-23-7': 83.42,\n                                    'AQU_2019-11-23-8': 71.47, 'AQU_2019-11-23-9': 135.76, 'AQU_2019-11-23-10': 73.52,\n                                    'AQU_2019-11-24-1': 72.53999999999999, 'AQU_2019-11-24-2': 100.46000000000001,\n                                    'AQU_2019-11-24-3': 98.37, 'AQU_2019-11-24-4': 86.18, 'AQU_2019-11-24-5': 72.49,\n                                    'AQU_2019-11-24-6': 73.16, 'AQU_2019-11-24-7': 97.83, 'AQU_2019-11-24-8': 84.39,\n                                    'AQU_2019-11-24-9': 71.49, 'AQU_2019-11-27-1': 101.38, 'AQU_2019-11-27-2': 100.16,\n                                    'AQU_2019-11-27-3': 98.53, 'AQU_2019-11-27-4': 73.69,\n                                    'AQU_2019-11-27-5': 71.78999999999999, 'AQU_2019-11-27-6': 105.47999999999999,\n                                    'AQU_2019-11-27-7': 70.62, 'AQU_2019-11-27-8': 98.75, 'AQU_2019-11-27-9': 71.63,\n                                    'AQU_2019-11-29-1': 79.9, 'AQU_2019-11-29-2': 97.08, 'AQU_2019-11-29-3': 59.33,\n                                    'AQU_2019-11-29-4': 73.73, 'AQU_2019-11-29-5': 103.03, 'AQU_2019-11-29-6': 71.47,\n                                    'AQU_2019-11-29-7': 79.91, 'AQU_2019-11-29-8': 112.91, 'AQU_2019-11-29-9': 104.32,\n                                    'AQU_2019-11-29-10': 106.35, 'AQU_2019-11-30-1': 72.02, 'AQU_2019-11-30-2': 72.27,\n                                    'AQU_2019-11-30-3': 103.61, 'AQU_2019-11-30-4': 69.4, 'AQU_2019-11-30-5': 79.09,\n                                    'AQU_2019-11-30-6': 102.94, 'AQU_2019-11-30-7': 69.49, 'AQU_2019-11-30-8': 110.36,\n                                    'AQU_2019-11-30-9': 139.68, 'AQU_2019-11-30-10': 72.57, 'AQU_2019-12-01-1': 79.7,\n                                    'AQU_2019-12-01-2': 98.05, 'AQU_2019-12-01-3': 70.83, 'AQU_2019-12-01-4': 97.56,\n                                    'AQU_2019-12-05-1': 72.58, 'AQU_2019-12-05-2': 98.46000000000001,\n                                    'AQU_2019-12-05-3': 98.87, 'AQU_2019-12-05-4': 96.75999999999999,\n                                    'AQU_2019-12-05-5': 71.43, 'AQU_2019-12-05-6': 71.53999999999999,\n                                    'AQU_2019-12-05-7': 98.47999999999999, 'AQU_2019-12-05-8': 97.69,\n                                    'AQU_2019-12-05-9': 70.76, 'AQU_2019-12-06-1': 74.03999999999999,\n                                    'AQU_2019-12-06-2': 98.59, 'AQU_2019-12-06-3': 75.6, 'AQU_2019-12-06-4': 82.14,\n                                    'AQU_2019-12-06-5': 74.05, 'AQU_2019-12-06-6': 99.64, 'AQU_2019-12-06-7': 74.17,\n                                    'AQU_2019-12-06-8': 72.66, 'AQU_2019-12-06-9': 105.18, 'AQU_2019-12-06-10': 74.99,\n                                    'AQU_2019-12-07-1': 99.33, 'AQU_2019-12-07-2': 103.16, 'AQU_2019-12-07-3': 86.67,\n                                    'AQU_2019-12-07-4': 71.68, 'AQU_2019-12-07-5': 99.25, 'AQU_2019-12-07-6': 99.11,\n                                    'AQU_2019-12-07-7': 73.16, 'AQU_2019-12-07-8': 114.55,\n                                    'AQU_2019-12-07-9': 114.24000000000001, 'AQU_2019-12-07-10': 96.46000000000001,\n                                    'AQU_2019-12-08-1': 80.74, 'AQU_2019-12-08-2': 72.51, 'AQU_2019-12-08-3': 104.93,\n                                    'AQU_2019-12-08-4': 71.91, 'AQU_2019-12-08-5': 73.62, 'AQU_2019-12-08-6': 70.9,\n                                    'AQU_2019-12-08-7': 72.18, 'AQU_2019-12-08-8': 114.56, 'AQU_2019-12-08-9': 71.91,\n                                    'AQU_2019-12-08-10': 81.6, 'AQU_2019-12-12-1': 74.11,\n                                    'AQU_2019-12-12-2': 100.02000000000001, 'AQU_2019-12-12-3': 79.09,\n                                    'AQU_2019-12-12-4': 71.16, 'AQU_2019-12-12-5': 99.13, 'AQU_2019-12-12-6': 86.93,\n                                    'AQU_2019-12-12-7': 97.16, 'AQU_2019-12-12-8': 100.75, 'AQU_2019-12-13-1': 101.95,\n                                    'AQU_2019-12-13-2': 100.39, 'AQU_2019-12-13-3': 101.31, 'AQU_2019-12-13-4': 73.06,\n                                    'AQU_2019-12-13-5': 87.95, 'AQU_2019-12-13-6': 73.24, 'AQU_2019-12-13-7': 78.57,\n                                    'AQU_2019-12-13-8': 80.93, 'AQU_2019-12-14-1': 71.82, 'AQU_2019-12-14-2': 71.77,\n                                    'AQU_2019-12-14-3': 72.39, 'AQU_2019-12-14-4': 97.58, 'AQU_2019-12-14-5': 85.01,\n                                    'AQU_2019-12-14-6': 98.33, 'AQU_2019-12-14-7': 71.42, 'AQU_2019-12-14-8': 86.59,\n                                    'AQU_2019-12-14-9': 80.65, 'AQU_2019-12-15-1': 98.2, 'AQU_2019-12-15-2': 100.32,\n                                    'AQU_2019-12-15-3': 73.12, 'AQU_2019-12-15-4': 99.33, 'AQU_2019-12-15-5': 112.57,\n                                    'AQU_2019-12-15-6': 98.86, 'AQU_2019-12-15-7': 78.72, 'AQU_2019-12-15-8': 85.81,\n                                    'AQU_2019-12-15-9': 79.65, 'AQU_2019-12-20-1': 104.87, 'AQU_2019-12-20-2': 101.91,\n                                    'AQU_2019-12-20-3': 104.22, 'AQU_2019-12-20-4': 80.96000000000001,\n                                    'AQU_2019-12-20-5': 98.38, 'AQU_2019-12-20-6': 99.0, 'AQU_2019-12-20-7': 72.27,\n                                    'AQU_2019-12-20-8': 100.03, 'AQU_2019-12-21-1': 79.53999999999999,\n                                    'AQU_2019-12-21-2': 97.42, 'AQU_2019-12-21-3': 79.11,\n                                    'AQU_2019-12-21-4': 96.49000000000001, 'AQU_2019-12-21-5': 71.06,\n                                    'AQU_2019-12-21-6': 78.17, 'AQU_2019-12-21-7': 70.35, 'AQU_2019-12-21-8': 110.72,\n                                    'AQU_2019-12-21-9': 73.72, 'AQU_2019-12-22-1': 100.84,\n                                    'AQU_2019-12-22-2': 98.28999999999999, 'AQU_2019-12-22-3': 71.52,\n                                    'AQU_2019-12-22-4': 71.2, 'AQU_2019-12-22-5': 80.33,\n                                    'AQU_2019-12-22-6': 97.28999999999999, 'AQU_2019-12-22-7': 78.24,\n                                    'AQU_2019-12-22-8': 97.53, 'AQU_2019-12-22-9': 69.72, 'AQU_2019-12-22-10': 77.69,\n                                    'AQU_2019-12-28-1': 74.51, 'AQU_2019-12-28-2': 79.91, 'AQU_2019-12-28-3': 87.12,\n                                    'AQU_2019-12-28-4': 112.84, 'AQU_2019-12-28-5': 79.36, 'AQU_2019-12-28-6': 80.76,\n                                    'AQU_2019-12-28-7': 71.89, 'AQU_2019-12-28-8': 74.09, 'AQU_2019-12-28-9': 74.75,\n                                    'AQU_2019-12-29-1': 100.72, 'AQU_2019-12-29-2': 74.94, 'AQU_2019-12-29-3': 101.84,\n                                    'AQU_2019-12-29-4': 86.39, 'AQU_2019-12-29-5': 102.15, 'AQU_2019-12-29-6': 101.4,\n                                    'AQU_2019-12-29-7': 84.99, 'AQU_2019-12-29-8': 116.14, 'AQU_2019-12-29-9': 101.85,\n                                    'AQU_2019-12-30-1': 87.38, 'AQU_2019-12-30-2': 101.83, 'AQU_2019-12-30-3': 98.94,\n                                    'AQU_2019-12-30-4': 100.78, 'AQU_2019-12-30-5': 79.51, 'AQU_2019-12-30-6': 77.58,\n                                    'AQU_2019-12-30-7': 71.59, 'AQU_2019-12-30-8': 88.03, 'AQU_2019-12-31-1': 101.45,\n                                    'AQU_2019-12-31-2': 80.66, 'AQU_2019-12-31-3': 114.58, 'AQU_2019-12-31-4': 79.12,\n                                    'AQU_2019-12-31-5': 98.71000000000001, 'AQU_2019-12-31-6': 83.88,\n                                    'AQU_2019-12-31-7': 111.75999999999999, 'AQU_2019-12-31-8': 73.03999999999999,\n                                    'BEL_2019-04-26-1': 72.23, 'BEL_2019-04-26-2': 73.4, 'BEL_2019-04-26-3': 100.63,\n                                    'BEL_2019-04-26-4': 108.99000000000001, 'BEL_2019-04-26-5': 85.46000000000001,\n                                    'BEL_2019-04-26-6': 111.78, 'BEL_2019-04-26-7': 79.33, 'BEL_2019-04-26-8': 70.75,\n                                    'BEL_2019-04-26-9': 86.43, 'BEL_2019-04-27-1': 71.2,\n                                    'BEL_2019-04-27-2': 109.77000000000001, 'BEL_2019-04-27-3': 81.94,\n                                    'BEL_2019-04-27-4': 70.14, 'BEL_2019-04-27-5': 69.7, 'BEL_2019-04-27-6': 95.38,\n                                    'BEL_2019-04-27-7': 102.99000000000001, 'BEL_2019-04-27-8': 107.69,\n                                    'BEL_2019-04-27-9': 84.75, 'BEL_2019-04-27-10': 69.87, 'BEL_2019-04-28-1': 98.35,\n                                    'BEL_2019-04-28-2': 102.71000000000001, 'BEL_2019-04-28-3': 70.32,\n                                    'BEL_2019-04-28-4': 127.81, 'BEL_2019-04-28-5': 71.08, 'BEL_2019-04-28-6': 98.35,\n                                    'BEL_2019-04-28-7': 83.14, 'BEL_2019-04-28-8': 69.92, 'BEL_2019-04-28-9': 70.99,\n                                    'BEL_2019-04-28-10': 98.47, 'BEL_2019-05-02-1': 57.51, 'BEL_2019-05-02-2': 103.11,\n                                    'BEL_2019-05-02-3': 58.75, 'BEL_2019-05-02-4': 95.85, 'BEL_2019-05-02-5': 98.7,\n                                    'BEL_2019-05-02-6': 70.71000000000001, 'BEL_2019-05-02-7': 77.28,\n                                    'BEL_2019-05-02-8': 81.76, 'BEL_2019-05-02-9': 85.47, 'BEL_2019-05-03-1': 102.95,\n                                    'BEL_2019-05-03-2': 98.03999999999999, 'BEL_2019-05-03-3': 102.75,\n                                    'BEL_2019-05-03-4': 73.48, 'BEL_2019-05-04-1': 69.7, 'BEL_2019-05-04-2': 72.73,\n                                    'BEL_2019-05-04-3': 70.66, 'BEL_2019-05-04-4': 146.7, 'BEL_2019-05-04-5': 71.14,\n                                    'BEL_2019-05-04-6': 75.96000000000001, 'BEL_2019-05-04-7': 104.28,\n                                    'BEL_2019-05-04-8': 71.13, 'BEL_2019-05-04-9': 84.4, 'BEL_2019-05-04-10': 113.92,\n                                    'BEL_2019-05-04-11': 95.07, 'BEL_2019-05-04-12': 78.15, 'BEL_2019-05-05-1': 105.32,\n                                    'BEL_2019-05-05-2': 107.66, 'BEL_2019-05-05-3': 72.26, 'BEL_2019-05-05-4': 99.57,\n                                    'BEL_2019-05-05-5': 106.37, 'BEL_2019-05-05-6': 79.16, 'BEL_2019-05-05-7': 105.0,\n                                    'BEL_2019-05-05-8': 96.53999999999999, 'BEL_2019-05-05-9': 72.52,\n                                    'BEL_2019-05-09-1': 95.72, 'BEL_2019-05-09-2': 58.89, 'BEL_2019-05-09-3': 124.44,\n                                    'BEL_2019-05-09-4': 96.91, 'BEL_2019-05-09-5': 82.34, 'BEL_2019-05-09-6': 70.08,\n                                    'BEL_2019-05-09-7': 82.05, 'BEL_2019-05-09-8': 135.35, 'BEL_2019-05-09-9': 70.35,\n                                    'BEL_2019-05-10-1': 77.63, 'BEL_2019-05-10-2': 70.88, 'BEL_2019-05-10-3': 82.02,\n                                    'BEL_2019-05-10-4': 70.97, 'BEL_2019-05-10-5': 58.93, 'BEL_2019-05-10-6': 70.24,\n                                    'BEL_2019-05-10-7': 82.57, 'BEL_2019-05-10-8': 95.72999999999999,\n                                    'BEL_2019-05-10-9': 78.53, 'BEL_2019-05-11-1': 74.99, 'BEL_2019-05-11-2': 95.39,\n                                    'BEL_2019-05-11-3': 69.15, 'BEL_2019-05-11-4': 106.71000000000001,\n                                    'BEL_2019-05-11-5': 102.25, 'BEL_2019-05-11-6': 82.21000000000001,\n                                    'BEL_2019-05-11-7': 104.75999999999999, 'BEL_2019-05-11-8': 103.86,\n                                    'BEL_2019-05-11-9': 68.12, 'BEL_2019-05-11-10': 132.43,\n                                    'BEL_2019-05-11-11': 69.21000000000001, 'BEL_2019-05-12-1': 85.28,\n                                    'BEL_2019-05-12-2': 79.47, 'BEL_2019-05-12-3': 73.49, 'BEL_2019-05-12-4': 71.51,\n                                    'BEL_2019-05-12-5': 84.77, 'BEL_2019-05-12-6': 98.75, 'BEL_2019-05-12-7': 71.15,\n                                    'BEL_2019-05-12-8': 70.06, 'BEL_2019-05-12-9': 98.3, 'BEL_2019-05-16-1': 98.31,\n                                    'BEL_2019-05-16-2': 97.36, 'BEL_2019-05-16-3': 97.2, 'BEL_2019-05-16-4': 70.27,\n                                    'BEL_2019-05-16-5': 82.38, 'BEL_2019-05-16-6': 105.38, 'BEL_2019-05-16-7': 124.97,\n                                    'BEL_2019-05-16-8': 83.32, 'BEL_2019-05-16-9': 72.37, 'BEL_2019-05-17-1': 97.42,\n                                    'BEL_2019-05-17-2': 77.32, 'BEL_2019-05-17-3': 71.17,\n                                    'BEL_2019-05-17-4': 104.28999999999999, 'BEL_2019-05-17-5': 94.45,\n                                    'BEL_2019-05-17-6': 69.64, 'BEL_2019-05-17-7': 101.86, 'BEL_2019-05-17-8': 83.2,\n                                    'BEL_2019-05-17-9': 71.31, 'BEL_2019-05-18-1': 103.78999999999999,\n                                    'BEL_2019-05-18-2': 70.14, 'BEL_2019-05-18-3': 69.4,\n                                    'BEL_2019-05-18-4': 96.96000000000001, 'BEL_2019-05-18-5': 70.53,\n                                    'BEL_2019-05-18-6': 69.13, 'BEL_2019-05-18-7': 95.28999999999999,\n                                    'BEL_2019-05-18-8': 82.98, 'BEL_2019-05-18-9': 104.71000000000001,\n                                    'BEL_2019-05-18-10': 76.19, 'BEL_2019-05-18-11': 82.53, 'BEL_2019-05-18-12': 104.67,\n                                    'BEL_2019-05-19-1': 95.55, 'BEL_2019-05-19-2': 101.67, 'BEL_2019-05-19-3': 77.85,\n                                    'BEL_2019-05-19-4': 122.12, 'BEL_2019-05-19-5': 95.7, 'BEL_2019-05-19-6': 95.22,\n                                    'BEL_2019-05-19-7': 101.67, 'BEL_2019-05-19-8': 70.45, 'BEL_2019-05-19-9': 103.38,\n                                    'BEL_2019-05-23-1': 57.34, 'BEL_2019-05-23-2': 72.7, 'BEL_2019-05-23-3': 72.67,\n                                    'BEL_2019-05-23-4': 101.53999999999999, 'BEL_2019-05-23-5': 79.74,\n                                    'BEL_2019-05-23-6': 102.14, 'BEL_2019-05-23-7': 135.73,\n                                    'BEL_2019-05-23-8': 102.49000000000001, 'BEL_2019-05-23-9': 106.43,\n                                    'BEL_2019-05-24-1': 67.48, 'BEL_2019-05-24-2': 68.75,\n                                    'BEL_2019-05-24-3': 103.21000000000001, 'BEL_2019-05-24-4': 101.42,\n                                    'BEL_2019-05-24-5': 104.42, 'BEL_2019-05-24-6': 67.8, 'BEL_2019-05-24-7': 81.82,\n                                    'BEL_2019-05-24-8': 107.33, 'BEL_2019-05-24-9': 86.12, 'BEL_2019-05-25-1': 57.38,\n                                    'BEL_2019-05-25-2': 76.5, 'BEL_2019-05-25-3': 71.61,\n                                    'BEL_2019-05-25-4': 102.77000000000001, 'BEL_2019-05-25-5': 83.81,\n                                    'BEL_2019-05-25-6': 68.44, 'BEL_2019-05-25-7': 82.3, 'BEL_2019-05-25-8': 77.14,\n                                    'BEL_2019-05-25-9': 80.77, 'BEL_2019-05-25-10': 67.15, 'BEL_2019-05-26-1': 75.83,\n                                    'BEL_2019-05-26-2': 94.36, 'BEL_2019-05-26-3': 97.45, 'BEL_2019-05-26-4': 108.36,\n                                    'BEL_2019-05-26-5': 100.05, 'BEL_2019-05-26-6': 101.87, 'BEL_2019-05-26-7': 100.61,\n                                    'BEL_2019-05-26-8': 109.39, 'BEL_2019-05-26-9': 76.74,\n                                    'BEL_2019-05-27-1': 69.28999999999999, 'BEL_2019-05-27-2': 75.55,\n                                    'BEL_2019-05-27-3': 68.24, 'BEL_2019-05-27-4': 82.07, 'BEL_2019-05-27-5': 94.09,\n                                    'BEL_2019-05-27-6': 69.31, 'BEL_2019-05-27-7': 93.63,\n                                    'BEL_2019-05-27-8': 93.50999999999999, 'BEL_2019-05-27-9': 81.53,\n                                    'BEL_2019-05-27-10': 93.43, 'BEL_2019-05-27-11': 69.5, 'BEL_2019-05-30-1': 78.92,\n                                    'BEL_2019-05-30-2': 71.03999999999999, 'BEL_2019-05-30-3': 103.57,\n                                    'BEL_2019-05-30-4': 59.89, 'BEL_2019-05-30-5': 104.82, 'BEL_2019-05-30-6': 71.78,\n                                    'BEL_2019-05-30-7': 105.6, 'BEL_2019-05-30-8': 72.35,\n                                    'BEL_2019-05-31-1': 69.71000000000001, 'BEL_2019-05-31-2': 57.46,\n                                    'BEL_2019-05-31-3': 81.9, 'BEL_2019-05-31-4': 70.57, 'BEL_2019-05-31-5': 71.57,\n                                    'BEL_2019-05-31-6': 104.14, 'BEL_2019-05-31-7': 102.88, 'BEL_2019-05-31-8': 81.68,\n                                    'BEL_2019-05-31-9': 70.42, 'BEL_2019-06-01-1': 68.09, 'BEL_2019-06-01-2': 109.4,\n                                    'BEL_2019-06-01-3': 101.09, 'BEL_2019-06-01-4': 100.77000000000001,\n                                    'BEL_2019-06-01-5': 69.71000000000001, 'BEL_2019-06-01-6': 94.91,\n                                    'BEL_2019-06-01-7': 69.15, 'BEL_2019-06-01-8': 108.2, 'BEL_2019-06-01-9': 69.23,\n                                    'BEL_2019-06-02-1': 70.72, 'BEL_2019-06-02-2': 103.74000000000001,\n                                    'BEL_2019-06-02-3': 101.08, 'BEL_2019-06-02-4': 84.57, 'BEL_2019-06-02-5': 69.67,\n                                    'BEL_2019-06-02-6': 83.87, 'BEL_2019-06-02-7': 101.35, 'BEL_2019-06-02-8': 101.84,\n                                    'BEL_2019-06-02-9': 76.86, 'BEL_2019-06-02-10': 111.45, 'BEL_2019-06-06-1': 132.77,\n                                    'BEL_2019-06-06-2': 95.8, 'BEL_2019-06-06-3': 106.34, 'BEL_2019-06-06-4': 76.6,\n                                    'BEL_2019-06-06-5': 93.33, 'BEL_2019-06-06-6': 74.94, 'BEL_2019-06-06-7': 63.94,\n                                    'BEL_2019-06-06-8': 79.83, 'BEL_2019-06-06-9': 69.08, 'BEL_2019-06-07-1': 81.77,\n                                    'BEL_2019-06-07-2': 68.3, 'BEL_2019-06-07-3': 93.09, 'BEL_2019-06-07-4': 75.12,\n                                    'BEL_2019-06-07-5': 81.46000000000001, 'BEL_2019-06-07-6': 92.68,\n                                    'BEL_2019-06-07-7': 64.44, 'BEL_2019-06-07-8': 74.85, 'BEL_2019-06-07-9': 120.6,\n                                    'BEL_2019-06-07-10': 199.95, 'BEL_2019-06-07-11': 68.44, 'BEL_2019-06-08-1': 100.97,\n                                    'BEL_2019-06-08-2': 122.5, 'BEL_2019-06-08-3': 101.55, 'BEL_2019-06-08-4': 91.67,\n                                    'BEL_2019-06-08-5': 99.69, 'BEL_2019-06-08-6': 66.37, 'BEL_2019-06-08-7': 93.58,\n                                    'BEL_2019-06-08-8': 81.12, 'BEL_2019-06-08-9': 92.75, 'BEL_2019-06-08-10': 118.11,\n                                    'BEL_2019-06-08-11': 148.3, 'BEL_2019-06-08-12': 108.31,\n                                    'BEL_2019-06-08-13': 148.97, 'BEL_2019-06-09-1': 72.0,\n                                    'BEL_2019-06-09-2': 102.25999999999999, 'BEL_2019-06-09-3': 69.2,\n                                    'BEL_2019-06-09-4': 71.53, 'BEL_2019-06-09-5': 81.91, 'BEL_2019-06-09-6': 67.29,\n                                    'BEL_2019-06-09-7': 70.81, 'BEL_2019-06-09-8': 93.08, 'BEL_2019-06-09-9': 67.13,\n                                    'BEL_2019-06-09-10': 81.17, 'BEL_2019-06-12-1': 104.07, 'BEL_2019-06-12-2': 77.97,\n                                    'BEL_2019-06-12-3': 58.57, 'BEL_2019-06-12-4': 101.45, 'BEL_2019-06-12-5': 104.65,\n                                    'BEL_2019-06-12-6': 82.38, 'BEL_2019-06-12-7': 96.69, 'BEL_2019-06-12-8': 79.91,\n                                    'BEL_2019-06-12-9': 68.43, 'BEL_2019-06-13-1': 77.8,\n                                    'BEL_2019-06-13-2': 99.52000000000001, 'BEL_2019-06-13-3': 71.27,\n                                    'BEL_2019-06-13-4': 105.03, 'BEL_2019-06-13-5': 78.87, 'BEL_2019-06-13-6': 106.15,\n                                    'BEL_2019-06-13-7': 94.47, 'BEL_2019-06-13-8': 77.82, 'BEL_2019-06-13-9': 74.11,\n                                    'BEL_2019-06-14-1': 107.52000000000001, 'BEL_2019-06-14-2': 83.09,\n                                    'BEL_2019-06-14-3': 98.53999999999999, 'BEL_2019-06-14-4': 104.31,\n                                    'BEL_2019-06-14-5': 57.24, 'BEL_2019-06-14-6': 95.53999999999999,\n                                    'BEL_2019-06-14-7': 77.39, 'BEL_2019-06-14-8': 137.54,\n                                    'BEL_2019-06-14-9': 102.53999999999999, 'BEL_2019-06-15-1': 102.02000000000001,\n                                    'BEL_2019-06-15-2': 70.49, 'BEL_2019-06-15-3': 68.59, 'BEL_2019-06-15-4': 63.77,\n                                    'BEL_2019-06-15-5': 103.94, 'BEL_2019-06-15-6': 70.65, 'BEL_2019-06-15-7': 93.28,\n                                    'BEL_2019-06-15-8': 103.03, 'BEL_2019-06-15-9': 70.33, 'BEL_2019-06-15-10': 102.3,\n                                    'BEL_2019-06-16-1': 69.95, 'BEL_2019-06-16-2': 68.62,\n                                    'BEL_2019-06-16-3': 103.03999999999999, 'BEL_2019-06-16-4': 96.31,\n                                    'BEL_2019-06-16-5': 135.06, 'BEL_2019-06-16-6': 102.05, 'BEL_2019-06-16-7': 101.55,\n                                    'BEL_2019-06-16-8': 92.53999999999999, 'BEL_2019-06-16-9': 78.94,\n                                    'BEL_2019-06-19-1': 66.32, 'BEL_2019-06-19-2': 72.28, 'BEL_2019-06-19-3': 72.35,\n                                    'BEL_2019-06-19-4': 100.27000000000001, 'BEL_2019-06-19-5': 72.98,\n                                    'BEL_2019-06-19-6': 70.24, 'BEL_2019-06-19-7': 127.03,\n                                    'BEL_2019-06-19-8': 103.71000000000001, 'BEL_2019-06-19-9': 86.27,\n                                    'BEL_2019-06-20-1': 97.14, 'BEL_2019-06-20-2': 72.27, 'BEL_2019-06-20-3': 97.14,\n                                    'BEL_2019-06-20-4': 97.55, 'BEL_2019-06-20-5': 59.0, 'BEL_2019-06-20-6': 71.98,\n                                    'BEL_2019-06-20-7': 98.52000000000001, 'BEL_2019-06-20-8': 104.28,\n                                    'BEL_2019-06-20-9': 106.03, 'BEL_2019-06-21-1': 100.59, 'BEL_2019-06-21-2': 58.11,\n                                    'BEL_2019-06-21-3': 70.87, 'BEL_2019-06-21-4': 97.42,\n                                    'BEL_2019-06-21-5': 99.02000000000001, 'BEL_2019-06-21-6': 70.1,\n                                    'BEL_2019-06-21-7': 57.5, 'BEL_2019-06-21-8': 70.13, 'BEL_2019-06-21-9': 64.81,\n                                    'BEL_2019-06-22-1': 84.48, 'BEL_2019-06-22-2': 81.47, 'BEL_2019-06-22-3': 103.57,\n                                    'BEL_2019-06-22-4': 56.47, 'BEL_2019-06-22-5': 95.67, 'BEL_2019-06-22-6': 68.85,\n                                    'BEL_2019-06-22-7': 102.77000000000001, 'BEL_2019-06-22-8': 76.7,\n                                    'BEL_2019-06-22-9': 94.02000000000001, 'BEL_2019-06-22-10': 69.44,\n                                    'BEL_2019-06-23-1': 78.08, 'BEL_2019-06-23-2': 58.09, 'BEL_2019-06-23-3': 100.47,\n                                    'BEL_2019-06-23-4': 69.57, 'BEL_2019-06-23-5': 81.49, 'BEL_2019-06-23-6': 57.48,\n                                    'BEL_2019-06-23-7': 68.78, 'BEL_2019-06-23-8': 81.3, 'BEL_2019-06-23-9': 69.41,\n                                    'BEL_2019-06-26-1': 101.63, 'BEL_2019-06-26-2': 68.96000000000001,\n                                    'BEL_2019-06-26-3': 99.61, 'BEL_2019-06-26-4': 68.07, 'BEL_2019-06-26-5': 100.35,\n                                    'BEL_2019-06-26-6': 58.28, 'BEL_2019-06-26-7': 68.15, 'BEL_2019-06-26-8': 69.22,\n                                    'BEL_2019-06-27-1': 104.75999999999999, 'BEL_2019-06-27-2': 81.24,\n                                    'BEL_2019-06-27-3': 83.47, 'BEL_2019-06-27-4': 98.61, 'BEL_2019-06-27-5': 70.57,\n                                    'BEL_2019-06-27-6': 107.78999999999999, 'BEL_2019-06-27-7': 67.64,\n                                    'BEL_2019-06-27-8': 95.18, 'BEL_2019-06-27-9': 68.08, 'BEL_2019-06-28-1': 81.76,\n                                    'BEL_2019-06-28-2': 99.13, 'BEL_2019-06-28-3': 100.8, 'BEL_2019-06-28-4': 59.19,\n                                    'BEL_2019-06-28-5': 69.52, 'BEL_2019-06-28-6': 120.85,\n                                    'BEL_2019-06-28-7': 95.47999999999999, 'BEL_2019-06-28-8': 67.17,\n                                    'BEL_2019-06-28-9': 81.23, 'BEL_2019-06-29-1': 96.68, 'BEL_2019-06-29-2': 100.78,\n                                    'BEL_2019-06-29-3': 81.03999999999999, 'BEL_2019-06-29-4': 82.69,\n                                    'BEL_2019-06-29-5': 93.72999999999999, 'BEL_2019-06-29-6': 69.59,\n                                    'BEL_2019-06-29-7': 92.84, 'BEL_2019-06-29-8': 103.53999999999999,\n                                    'BEL_2019-06-29-9': 68.5, 'BEL_2019-06-30-1': 102.16, 'BEL_2019-06-30-2': 82.32,\n                                    'BEL_2019-06-30-3': 75.77, 'BEL_2019-06-30-4': 69.9, 'BEL_2019-06-30-5': 72.77,\n                                    'BEL_2019-06-30-6': 67.41, 'BEL_2019-06-30-7': 101.21000000000001,\n                                    'BEL_2019-06-30-8': 101.22999999999999, 'BEL_2019-07-03-1': 78.17,\n                                    'BEL_2019-07-03-2': 70.24, 'BEL_2019-07-03-3': 122.6, 'BEL_2019-07-03-4': 68.2,\n                                    'BEL_2019-07-03-5': 64.87, 'BEL_2019-07-03-6': 76.01, 'BEL_2019-07-03-7': 101.07,\n                                    'BEL_2019-07-03-8': 70.87, 'BEL_2019-07-04-1': 67.89, 'BEL_2019-07-04-2': 100.31,\n                                    'BEL_2019-07-04-3': 96.72, 'BEL_2019-07-04-4': 99.6, 'BEL_2019-07-04-5': 63.75,\n                                    'BEL_2019-07-04-6': 81.45, 'BEL_2019-07-04-7': 107.78999999999999,\n                                    'BEL_2019-07-04-8': 91.56, 'BEL_2019-07-04-9': 79.06, 'BEL_2019-07-05-1': 102.07,\n                                    'BEL_2019-07-05-2': 80.93, 'BEL_2019-07-05-3': 77.52, 'BEL_2019-07-05-4': 67.71,\n                                    'BEL_2019-07-05-5': 69.24, 'BEL_2019-07-05-6': 121.47, 'BEL_2019-07-05-7': 145.48,\n                                    'BEL_2019-07-05-8': 75.82, 'BEL_2019-07-05-9': 94.6, 'BEL_2019-07-06-1': 71.18,\n                                    'BEL_2019-07-06-2': 101.11, 'BEL_2019-07-06-3': 71.59, 'BEL_2019-07-06-4': 78.14,\n                                    'BEL_2019-07-06-5': 68.87, 'BEL_2019-07-06-6': 95.81, 'BEL_2019-07-06-7': 119.97,\n                                    'BEL_2019-07-06-8': 81.75, 'BEL_2019-07-06-9': 118.28999999999999,\n                                    'BEL_2019-07-06-10': 119.99000000000001, 'BEL_2019-07-06-11': 94.12,\n                                    'BEL_2019-07-07-1': 102.43, 'BEL_2019-07-07-2': 79.87, 'BEL_2019-07-07-3': 71.35,\n                                    'BEL_2019-07-07-4': 71.88, 'BEL_2019-07-07-5': 93.9, 'BEL_2019-07-07-6': 68.12,\n                                    'BEL_2019-07-07-7': 81.15, 'BEL_2019-07-07-8': 101.22999999999999,\n                                    'BEL_2019-07-07-9': 76.98, 'BEL_2019-09-06-1': 98.12, 'BEL_2019-09-06-2': 72.5,\n                                    'BEL_2019-09-06-3': 86.24, 'BEL_2019-09-06-4': 72.14, 'BEL_2019-09-06-5': 72.65,\n                                    'BEL_2019-09-06-6': 104.47999999999999, 'BEL_2019-09-06-7': 69.99,\n                                    'BEL_2019-09-06-8': 107.16, 'BEL_2019-09-07-1': 69.72, 'BEL_2019-09-07-2': 70.27,\n                                    'BEL_2019-09-07-3': 75.11, 'BEL_2019-09-07-4': 102.00999999999999,\n                                    'BEL_2019-09-07-5': 76.6, 'BEL_2019-09-07-6': 70.06, 'BEL_2019-09-07-7': 81.13,\n                                    'BEL_2019-09-07-8': 148.07, 'BEL_2019-09-07-9': 137.02,\n                                    'BEL_2019-09-07-10': 147.57999999999998, 'BEL_2019-09-07-11': 83.36,\n                                    'BEL_2019-09-08-1': 68.84, 'BEL_2019-09-08-2': 97.91, 'BEL_2019-09-08-3': 68.82,\n                                    'BEL_2019-09-08-4': 82.99, 'BEL_2019-09-08-5': 96.13, 'BEL_2019-09-08-6': 69.02,\n                                    'BEL_2019-09-08-7': 96.18, 'BEL_2019-09-08-8': 68.57, 'BEL_2019-09-08-9': 102.97,\n                                    'BEL_2019-09-11-1': 96.44, 'BEL_2019-09-11-2': 67.17, 'BEL_2019-09-11-3': 71.51,\n                                    'BEL_2019-09-11-4': 71.02, 'BEL_2019-09-11-5': 94.85, 'BEL_2019-09-11-6': 101.87,\n                                    'BEL_2019-09-11-7': 103.9, 'BEL_2019-09-11-8': 101.43, 'BEL_2019-09-12-1': 102.64,\n                                    'BEL_2019-09-12-2': 95.5, 'BEL_2019-09-12-3': 69.17, 'BEL_2019-09-12-4': 100.75,\n                                    'BEL_2019-09-12-5': 76.26, 'BEL_2019-09-12-6': 102.71000000000001,\n                                    'BEL_2019-09-12-7': 75.92, 'BEL_2019-09-12-8': 95.32, 'BEL_2019-09-13-1': 96.4,\n                                    'BEL_2019-09-13-2': 68.78999999999999, 'BEL_2019-09-13-3': 97.38,\n                                    'BEL_2019-09-13-4': 68.2, 'BEL_2019-09-13-5': 92.44, 'BEL_2019-09-13-6': 72.87,\n                                    'BEL_2019-09-13-7': 68.61, 'BEL_2019-09-13-8': 93.8, 'BEL_2019-09-14-1': 69.5,\n                                    'BEL_2019-09-14-2': 102.53999999999999, 'BEL_2019-09-14-3': 75.62,\n                                    'BEL_2019-09-14-4': 71.78999999999999, 'BEL_2019-09-14-5': 102.00999999999999,\n                                    'BEL_2019-09-14-6': 76.65, 'BEL_2019-09-14-7': 95.45,\n                                    'BEL_2019-09-14-8': 102.50999999999999, 'BEL_2019-09-14-9': 76.62,\n                                    'BEL_2019-09-14-10': 93.35, 'BEL_2019-09-14-11': 69.11, 'BEL_2019-09-15-1': 78.07,\n                                    'BEL_2019-09-15-2': 69.18, 'BEL_2019-09-15-3': 108.22999999999999,\n                                    'BEL_2019-09-15-4': 72.61, 'BEL_2019-09-15-5': 93.28999999999999,\n                                    'BEL_2019-09-15-6': 68.64, 'BEL_2019-09-15-7': 119.96000000000001,\n                                    'BEL_2019-09-15-8': 69.21000000000001, 'BEL_2019-09-15-9': 80.52,\n                                    'BEL_2019-09-15-10': 67.73, 'BEL_2019-09-18-1': 257.37, 'BEL_2019-09-18-2': 84.6,\n                                    'BEL_2019-09-18-3': 101.64, 'BEL_2019-09-18-4': 68.31,\n                                    'BEL_2019-09-18-5': 94.99000000000001, 'BEL_2019-09-18-6': 67.59,\n                                    'BEL_2019-09-18-7': 83.27, 'BEL_2019-09-18-8': 94.47999999999999,\n                                    'BEL_2019-09-19-1': 274.31, 'BEL_2019-09-19-2': 70.74, 'BEL_2019-09-19-3': 83.07,\n                                    'BEL_2019-09-19-4': 122.5, 'BEL_2019-09-19-5': 69.19, 'BEL_2019-09-19-6': 102.28,\n                                    'BEL_2019-09-19-7': 119.61, 'BEL_2019-09-19-8': 99.38, 'BEL_2019-09-20-1': 70.47,\n                                    'BEL_2019-09-20-2': 70.65, 'BEL_2019-09-20-3': 82.88, 'BEL_2019-09-20-4': 67.27,\n                                    'BEL_2019-09-20-5': 93.43, 'BEL_2019-09-20-6': 76.53999999999999,\n                                    'BEL_2019-09-20-7': 107.43, 'BEL_2019-09-20-8': 68.82, 'BEL_2019-09-21-1': 75.68,\n                                    'BEL_2019-09-21-2': 105.07, 'BEL_2019-09-21-3': 102.72999999999999,\n                                    'BEL_2019-09-21-4': 102.58, 'BEL_2019-09-21-5': 70.14, 'BEL_2019-09-21-6': 70.09,\n                                    'BEL_2019-09-21-7': 103.12, 'BEL_2019-09-21-8': 93.47999999999999,\n                                    'BEL_2019-09-21-9': 95.64, 'BEL_2019-09-21-10': 93.97, 'BEL_2019-09-21-11': 94.78,\n                                    'BEL_2019-09-22-1': 69.3, 'BEL_2019-09-22-2': 68.88,\n                                    'BEL_2019-09-22-3': 74.96000000000001, 'BEL_2019-09-22-4': 67.91,\n                                    'BEL_2019-09-22-5': 101.2, 'BEL_2019-09-22-6': 84.42, 'BEL_2019-09-22-7': 106.57,\n                                    'BEL_2019-09-22-8': 69.74, 'BEL_2019-09-22-9': 107.67, 'BEL_2019-09-22-10': 94.33,\n                                    'BEL_2019-09-25-1': 78.09, 'BEL_2019-09-25-2': 104.75, 'BEL_2019-09-25-3': 78.02,\n                                    'BEL_2019-09-25-4': 75.07, 'BEL_2019-09-25-5': 103.47, 'BEL_2019-09-25-6': 93.85,\n                                    'BEL_2019-09-25-7': 69.61, 'BEL_2019-09-25-8': 69.32, 'BEL_2019-09-26-1': 96.78,\n                                    'BEL_2019-09-26-2': 70.43, 'BEL_2019-09-26-3': 101.77000000000001,\n                                    'BEL_2019-09-26-4': 70.84, 'BEL_2019-09-26-5': 94.37, 'BEL_2019-09-26-6': 64.63,\n                                    'BEL_2019-09-26-7': 100.81, 'BEL_2019-09-26-8': 101.72, 'BEL_2019-09-27-1': 105.31,\n                                    'BEL_2019-09-27-2': 70.0, 'BEL_2019-09-27-3': 77.84,\n                                    'BEL_2019-09-27-4': 94.97999999999999, 'BEL_2019-09-27-5': 68.06,\n                                    'BEL_2019-09-27-6': 102.87, 'BEL_2019-09-27-7': 68.78,\n                                    'BEL_2019-09-27-8': 68.03999999999999, 'BEL_2019-09-28-1': 78.02,\n                                    'BEL_2019-09-28-2': 77.71000000000001, 'BEL_2019-09-28-3': 81.66,\n                                    'BEL_2019-09-28-4': 68.35, 'BEL_2019-09-28-5': 101.67, 'BEL_2019-09-28-6': 70.87,\n                                    'BEL_2019-09-28-7': 68.59, 'BEL_2019-09-28-8': 108.86,\n                                    'BEL_2019-09-28-9': 101.46000000000001, 'BEL_2019-09-28-10': 120.3,\n                                    'BEL_2019-09-28-11': 93.88, 'BEL_2019-09-29-1': 82.26, 'BEL_2019-09-29-2': 70.7,\n                                    'BEL_2019-09-29-3': 104.5, 'BEL_2019-09-29-4': 80.98,\n                                    'BEL_2019-09-29-5': 77.46000000000001, 'BEL_2019-09-29-6': 68.39,\n                                    'BEL_2019-09-29-7': 101.55, 'BEL_2019-09-29-8': 102.32, 'BEL_2019-09-29-9': 82.2,\n                                    'BEL_2019-10-02-1': 77.33, 'BEL_2019-10-02-2': 109.53999999999999,\n                                    'BEL_2019-10-02-3': 84.94, 'BEL_2019-10-02-4': 101.49000000000001,\n                                    'BEL_2019-10-02-5': 69.55, 'BEL_2019-10-02-6': 81.96000000000001,\n                                    'BEL_2019-10-02-7': 100.43, 'BEL_2019-10-02-8': 81.45, 'BEL_2019-10-03-1': 79.76,\n                                    'BEL_2019-10-03-2': 73.17, 'BEL_2019-10-03-3': 97.41, 'BEL_2019-10-03-4': 74.43,\n                                    'BEL_2019-10-03-5': 80.08, 'BEL_2019-10-03-6': 85.83, 'BEL_2019-10-03-7': 103.75,\n                                    'BEL_2019-10-03-8': 79.97, 'BEL_2019-10-04-1': 79.17, 'BEL_2019-10-04-2': 71.87,\n                                    'BEL_2019-10-04-3': 97.69, 'BEL_2019-10-04-4': 78.14, 'BEL_2019-10-04-5': 103.9,\n                                    'BEL_2019-10-04-6': 95.78, 'BEL_2019-10-04-7': 98.6, 'BEL_2019-10-04-8': 107.14,\n                                    'BEL_2019-10-05-1': 69.66, 'BEL_2019-10-05-2': 64.87,\n                                    'BEL_2019-10-05-3': 103.00999999999999, 'BEL_2019-10-05-4': 96.1,\n                                    'BEL_2019-10-05-5': 67.39, 'BEL_2019-10-05-6': 69.3,\n                                    'BEL_2019-10-05-7': 96.00999999999999, 'BEL_2019-10-05-8': 109.74000000000001,\n                                    'BEL_2019-10-05-9': 147.34, 'BEL_2019-10-05-10': 95.41,\n                                    'BEL_2019-10-05-11': 98.02000000000001, 'BEL_2019-10-06-1': 104.42,\n                                    'BEL_2019-10-06-2': 78.22, 'BEL_2019-10-06-3': 121.06, 'BEL_2019-10-06-4': 95.25,\n                                    'BEL_2019-10-06-5': 78.58, 'BEL_2019-10-06-6': 70.62, 'BEL_2019-10-06-7': 68.07,\n                                    'BEL_2019-10-06-8': 122.21, 'BEL_2019-10-06-9': 95.92, 'BEL_2019-10-06-10': 82.07,\n                                    'BEL_2019-10-10-1': 102.21000000000001, 'BEL_2019-10-10-2': 105.57,\n                                    'BEL_2019-10-10-3': 82.41, 'BEL_2019-10-10-4': 68.46000000000001,\n                                    'BEL_2019-10-10-5': 69.9, 'BEL_2019-10-10-6': 68.91, 'BEL_2019-10-10-7': 76.0,\n                                    'BEL_2019-10-10-8': 70.45, 'BEL_2019-10-11-1': 68.83, 'BEL_2019-10-11-2': 77.05,\n                                    'BEL_2019-10-11-3': 71.37, 'BEL_2019-10-11-4': 69.65, 'BEL_2019-10-11-5': 108.64,\n                                    'BEL_2019-10-11-6': 69.47, 'BEL_2019-10-11-7': 124.52, 'BEL_2019-10-11-8': 104.06,\n                                    'BEL_2019-10-12-1': 72.11, 'BEL_2019-10-12-2': 103.13, 'BEL_2019-10-12-3': 69.72,\n                                    'BEL_2019-10-12-4': 68.42, 'BEL_2019-10-12-5': 82.83, 'BEL_2019-10-12-6': 68.99,\n                                    'BEL_2019-10-12-7': 68.28999999999999, 'BEL_2019-10-12-8': 82.52,\n                                    'BEL_2019-10-12-9': 108.44, 'BEL_2019-10-12-10': 95.57, 'BEL_2019-10-13-1': 69.27,\n                                    'BEL_2019-10-13-2': 81.87, 'BEL_2019-10-13-3': 102.45, 'BEL_2019-10-13-4': 97.06,\n                                    'BEL_2019-10-13-5': 102.07, 'BEL_2019-10-13-6': 70.99, 'BEL_2019-10-13-7': 145.94,\n                                    'BEL_2019-10-13-8': 95.55, 'BEL_2019-10-13-9': 81.31, 'BEL_2019-10-14-1': 77.8,\n                                    'BEL_2019-10-14-2': 81.17, 'BEL_2019-10-14-3': 103.95, 'BEL_2019-10-14-4': 71.2,\n                                    'BEL_2019-10-14-5': 104.11, 'BEL_2019-10-14-6': 81.72, 'BEL_2019-10-14-7': 102.22,\n                                    'BEL_2019-10-14-8': 106.87, 'BEL_2019-10-14-9': 71.39,\n                                    'BEL_2019-10-16-1': 75.03999999999999, 'BEL_2019-10-16-2': 71.99,\n                                    'BEL_2019-10-16-3': 100.15, 'BEL_2019-10-16-4': 79.23,\n                                    'BEL_2019-10-16-5': 95.28999999999999, 'BEL_2019-10-16-6': 85.34,\n                                    'BEL_2019-10-16-7': 71.18, 'BEL_2019-10-16-8': 107.12, 'BEL_2019-10-18-1': 82.58,\n                                    'BEL_2019-10-18-2': 72.39, 'BEL_2019-10-18-3': 83.16, 'BEL_2019-10-18-4': 82.87,\n                                    'BEL_2019-10-18-5': 102.56, 'BEL_2019-10-18-6': 82.7, 'BEL_2019-10-18-7': 75.23,\n                                    'BEL_2019-10-18-8': 105.3, 'BEL_2019-10-19-1': 110.37, 'BEL_2019-10-19-2': 97.07,\n                                    'BEL_2019-10-19-3': 70.78, 'BEL_2019-10-19-4': 99.50999999999999,\n                                    'BEL_2019-10-19-5': 108.65, 'BEL_2019-10-19-6': 75.88, 'BEL_2019-10-19-7': 75.62,\n                                    'BEL_2019-10-19-8': 96.64, 'BEL_2019-10-19-9': 100.75999999999999,\n                                    'BEL_2019-10-19-10': 95.45, 'BEL_2019-10-19-11': 81.82, 'BEL_2019-10-20-1': 98.58,\n                                    'BEL_2019-10-20-2': 68.86, 'BEL_2019-10-20-3': 87.11, 'BEL_2019-10-20-4': 108.5,\n                                    'BEL_2019-10-20-5': 98.05, 'BEL_2019-10-20-6': 108.00999999999999,\n                                    'BEL_2019-10-20-7': 94.8, 'BEL_2019-10-20-8': 79.11,\n                                    'BEL_2019-10-20-9': 101.21000000000001, 'BEL_2019-10-20-10': 85.36,\n                                    'BEL_2019-10-23-1': 72.2, 'BEL_2019-10-23-2': 80.49, 'BEL_2019-10-23-3': 106.03,\n                                    'BEL_2019-10-23-4': 88.46000000000001, 'BEL_2019-10-23-5': 71.45,\n                                    'BEL_2019-10-23-6': 71.28999999999999, 'BEL_2019-10-23-7': 113.1,\n                                    'BEL_2019-10-23-8': 108.35, 'BEL_2019-10-24-1': 70.93, 'BEL_2019-10-24-2': 70.35,\n                                    'BEL_2019-10-24-3': 96.39, 'BEL_2019-10-24-4': 102.87, 'BEL_2019-10-24-5': 68.98,\n                                    'BEL_2019-10-24-6': 95.43, 'BEL_2019-10-24-7': 83.92,\n                                    'BEL_2019-10-24-8': 104.28999999999999, 'BEL_2019-10-25-1': 103.59,\n                                    'BEL_2019-10-25-2': 105.66, 'BEL_2019-10-25-3': 101.11, 'BEL_2019-10-25-4': 82.87,\n                                    'BEL_2019-10-25-5': 77.17, 'BEL_2019-10-25-6': 83.45, 'BEL_2019-10-25-7': 100.43,\n                                    'BEL_2019-10-25-8': 81.92, 'BEL_2019-10-25-9': 70.59, 'BEL_2019-10-26-1': 102.72,\n                                    'BEL_2019-10-26-2': 104.50999999999999, 'BEL_2019-10-26-3': 70.3,\n                                    'BEL_2019-10-26-4': 76.62, 'BEL_2019-10-26-5': 94.37, 'BEL_2019-10-26-6': 109.09,\n                                    'BEL_2019-10-26-7': 103.17, 'BEL_2019-10-26-8': 80.76, 'BEL_2019-10-26-9': 95.7,\n                                    'BEL_2019-10-26-10': 69.32, 'BEL_2019-10-27-1': 107.36, 'SAR_2019-07-11-1': 117.18,\n                                    'SAR_2019-07-11-2': 61.05, 'SAR_2019-07-11-3': 109.56, 'SAR_2019-07-11-4': 95.25,\n                                    'SAR_2019-07-11-5': 66.91, 'SAR_2019-07-11-6': 62.36, 'SAR_2019-07-11-7': 112.81,\n                                    'SAR_2019-07-11-8': 71.66, 'SAR_2019-07-11-9': 63.94,\n                                    'SAR_2019-07-11-10': 116.78999999999999, 'SAR_2019-07-12-1': 108.92,\n                                    'SAR_2019-07-12-2': 111.12, 'SAR_2019-07-12-3': 105.53, 'SAR_2019-07-12-4': 83.32,\n                                    'SAR_2019-07-12-5': 64.67, 'SAR_2019-07-12-6': 110.03, 'SAR_2019-07-12-7': 63.51,\n                                    'SAR_2019-07-12-8': 110.44, 'SAR_2019-07-12-9': 97.5, 'SAR_2019-07-12-10': 64.94,\n                                    'SAR_2019-07-13-1': 83.27, 'SAR_2019-07-13-2': 63.67, 'SAR_2019-07-13-3': 70.22,\n                                    'SAR_2019-07-13-4': 63.78, 'SAR_2019-07-13-5': 62.8,\n                                    'SAR_2019-07-13-6': 105.74000000000001, 'SAR_2019-07-13-7': 69.85,\n                                    'SAR_2019-07-13-8': 62.88, 'SAR_2019-07-13-9': 107.93, 'SAR_2019-07-13-10': 81.92,\n                                    'SAR_2019-07-13-11': 96.27000000000001, 'SAR_2019-07-14-1': 105.87,\n                                    'SAR_2019-07-14-2': 70.13, 'SAR_2019-07-14-3': 62.51, 'SAR_2019-07-14-4': 64.02,\n                                    'SAR_2019-07-14-5': 96.71000000000001, 'SAR_2019-07-14-6': 108.47,\n                                    'SAR_2019-07-14-7': 75.5, 'SAR_2019-07-14-8': 103.07, 'SAR_2019-07-14-9': 61.59,\n                                    'SAR_2019-07-14-10': 83.46000000000001, 'SAR_2019-07-17-1': 0.0,\n                                    'SAR_2019-07-17-2': 73.17, 'SAR_2019-07-17-3': 63.73, 'SAR_2019-07-17-4': 84.14,\n                                    'SAR_2019-07-17-5': 65.24, 'SAR_2019-07-17-6': 65.57, 'SAR_2019-07-17-7': 84.5,\n                                    'SAR_2019-07-17-8': 84.1, 'SAR_2019-07-17-9': 70.41, 'SAR_2019-07-17-10': 65.02,\n                                    'SAR_2019-07-18-1': 82.78, 'SAR_2019-07-18-2': 64.35, 'SAR_2019-07-18-3': 70.31,\n                                    'SAR_2019-07-18-4': 140.07999999999998, 'SAR_2019-07-18-5': 64.66,\n                                    'SAR_2019-07-18-6': 109.19, 'SAR_2019-07-18-7': 64.3, 'SAR_2019-07-18-8': 104.57,\n                                    'SAR_2019-07-18-9': 108.64, 'SAR_2019-07-18-10': 63.15, 'SAR_2019-07-19-1': 82.75,\n                                    'SAR_2019-07-19-2': 81.4, 'SAR_2019-07-19-3': 63.59, 'SAR_2019-07-19-4': 82.23,\n                                    'SAR_2019-07-19-5': 69.78, 'SAR_2019-07-19-6': 102.96000000000001,\n                                    'SAR_2019-07-19-7': 135.78, 'SAR_2019-07-19-8': 68.69,\n                                    'SAR_2019-07-19-9': 96.22999999999999, 'SAR_2019-07-19-10': 109.28999999999999,\n                                    'SAR_2019-07-21-1': 231.52, 'SAR_2019-07-21-2': 83.88, 'SAR_2019-07-21-3': 109.4,\n                                    'SAR_2019-07-21-4': 109.65, 'SAR_2019-07-21-5': 109.72999999999999,\n                                    'SAR_2019-07-21-6': 96.4, 'SAR_2019-07-21-7': 62.94, 'SAR_2019-07-21-8': 69.77,\n                                    'SAR_2019-07-21-9': 96.27000000000001, 'SAR_2019-07-21-10': 81.8,\n                                    'SAR_2019-07-21-11': 61.54, 'SAR_2019-07-21-12': 105.33,\n                                    'SAR_2019-07-21-13': 109.64, 'SAR_2019-07-24-1': 228.05, 'SAR_2019-07-24-2': 83.14,\n                                    'SAR_2019-07-24-3': 86.97, 'SAR_2019-07-24-4': 114.71000000000001,\n                                    'SAR_2019-07-24-5': 83.16, 'SAR_2019-07-24-6': 63.33, 'SAR_2019-07-24-7': 96.28,\n                                    'SAR_2019-07-24-8': 68.81, 'SAR_2019-07-24-9': 62.94,\n                                    'SAR_2019-07-24-10': 82.78999999999999, 'SAR_2019-07-25-1': 225.99,\n                                    'SAR_2019-07-25-2': 64.78, 'SAR_2019-07-25-3': 109.61, 'SAR_2019-07-25-4': 139.76,\n                                    'SAR_2019-07-26-1': 87.2, 'SAR_2019-07-26-2': 88.05, 'SAR_2019-07-26-3': 64.92,\n                                    'SAR_2019-07-26-4': 113.16, 'SAR_2019-07-26-5': 72.82, 'SAR_2019-07-26-6': 116.05,\n                                    'SAR_2019-07-26-7': 85.67, 'SAR_2019-07-26-8': 63.22,\n                                    'SAR_2019-07-26-9': 112.27000000000001, 'SAR_2019-07-26-10': 86.4,\n                                    'SAR_2019-07-27-1': 63.48, 'SAR_2019-07-27-2': 70.38, 'SAR_2019-07-27-3': 62.09,\n                                    'SAR_2019-07-27-4': 63.99, 'SAR_2019-07-27-5': 102.14, 'SAR_2019-07-27-6': 71.19,\n                                    'SAR_2019-07-27-7': 104.33, 'SAR_2019-07-27-8': 70.56, 'SAR_2019-07-27-9': 67.92,\n                                    'SAR_2019-07-27-10': 134.43, 'SAR_2019-07-27-11': 109.28,\n                                    'SAR_2019-07-27-12': 97.09, 'SAR_2019-07-28-1': 71.25, 'SAR_2019-07-28-2': 82.37,\n                                    'SAR_2019-07-28-3': 61.97, 'SAR_2019-07-28-4': 83.39,\n                                    'SAR_2019-07-28-5': 96.72999999999999, 'SAR_2019-07-28-6': 110.4,\n                                    'SAR_2019-07-28-7': 96.85, 'SAR_2019-07-28-8': 72.5, 'SAR_2019-07-28-9': 61.35,\n                                    'SAR_2019-07-28-10': 135.06, 'SAR_2019-07-28-11': 74.01, 'SAR_2019-07-28-12': 63.38,\n                                    'SAR_2019-07-31-1': 111.32, 'SAR_2019-07-31-2': 79.28999999999999,\n                                    'SAR_2019-07-31-3': 73.05, 'SAR_2019-07-31-4': 95.22, 'SAR_2019-07-31-5': 65.5,\n                                    'SAR_2019-07-31-6': 65.49, 'SAR_2019-07-31-7': 101.37, 'SAR_2019-07-31-8': 62.72,\n                                    'SAR_2019-07-31-9': 83.88, 'SAR_2019-07-31-10': 101.49000000000001,\n                                    'SAR_2019-08-01-1': 63.16, 'SAR_2019-08-01-2': 68.53999999999999,\n                                    'SAR_2019-08-01-3': 65.07, 'SAR_2019-08-01-4': 103.58, 'SAR_2019-08-01-5': 62.52,\n                                    'SAR_2019-08-01-6': 109.99000000000001, 'SAR_2019-08-01-7': 95.62,\n                                    'SAR_2019-08-01-8': 114.89, 'SAR_2019-08-01-9': 172.97, 'SAR_2019-08-01-10': 95.28,\n                                    'SAR_2019-08-02-1': 70.51, 'SAR_2019-08-02-2': 85.41, 'SAR_2019-08-02-3': 63.03,\n                                    'SAR_2019-08-02-4': 93.13, 'SAR_2019-08-02-5': 110.3, 'SAR_2019-08-02-6': 99.55,\n                                    'SAR_2019-08-02-7': 93.72, 'SAR_2019-08-02-8': 107.45, 'SAR_2019-08-02-9': 115.34,\n                                    'SAR_2019-08-02-10': 101.92, 'SAR_2019-08-03-1': 101.39,\n                                    'SAR_2019-08-03-2': 109.21000000000001, 'SAR_2019-08-03-3': 84.6,\n                                    'SAR_2019-08-03-4': 93.64, 'SAR_2019-08-03-5': 60.23, 'SAR_2019-08-03-6': 75.44,\n                                    'SAR_2019-08-03-7': 99.63, 'SAR_2019-08-03-8': 81.26, 'SAR_2019-08-03-9': 107.1,\n                                    'SAR_2019-08-03-10': 93.15, 'SAR_2019-08-03-11': 61.55, 'SAR_2019-08-04-1': 83.94,\n                                    'SAR_2019-08-04-2': 75.03, 'SAR_2019-08-04-3': 75.45, 'SAR_2019-08-04-4': 101.17,\n                                    'SAR_2019-08-04-5': 147.21, 'SAR_2019-08-04-6': 70.02, 'SAR_2019-08-04-7': 60.84,\n                                    'SAR_2019-08-04-8': 102.46000000000001, 'SAR_2019-08-04-9': 112.02000000000001,\n                                    'SAR_2019-08-04-10': 78.39, 'SAR_2019-08-04-11': 94.3, 'SAR_2019-08-07-1': 230.2,\n                                    'SAR_2019-08-07-2': 71.01, 'SAR_2019-08-07-3': 61.14, 'SAR_2019-08-07-4': 95.08,\n                                    'SAR_2019-08-07-5': 79.17, 'SAR_2019-08-07-6': 60.8, 'SAR_2019-08-07-7': 77.99,\n                                    'SAR_2019-08-07-8': 77.63, 'SAR_2019-08-07-9': 111.65, 'SAR_2019-08-07-10': 61.38,\n                                    'SAR_2019-08-08-1': 112.05, 'SAR_2019-08-08-2': 70.8,\n                                    'SAR_2019-08-08-3': 100.74000000000001, 'SAR_2019-08-08-4': 85.88,\n                                    'SAR_2019-08-08-5': 78.02, 'SAR_2019-08-08-6': 61.84, 'SAR_2019-08-08-7': 72.08,\n                                    'SAR_2019-08-08-8': 114.09, 'SAR_2019-08-08-9': 100.72999999999999,\n                                    'SAR_2019-08-08-10': 108.57, 'SAR_2019-08-09-1': 62.27, 'SAR_2019-08-09-2': 111.55,\n                                    'SAR_2019-08-09-3': 100.08, 'SAR_2019-08-09-4': 62.5, 'SAR_2019-08-09-5': 110.17,\n                                    'SAR_2019-08-09-6': 61.87, 'SAR_2019-08-09-7': 83.53999999999999,\n                                    'SAR_2019-08-09-8': 93.53999999999999, 'SAR_2019-08-09-9': 69.34,\n                                    'SAR_2019-08-09-10': 95.24000000000001, 'SAR_2019-08-10-1': 101.66,\n                                    'SAR_2019-08-10-2': 70.12, 'SAR_2019-08-10-3': 101.34, 'SAR_2019-08-10-4': 69.69,\n                                    'SAR_2019-08-10-5': 69.86, 'SAR_2019-08-10-6': 61.32, 'SAR_2019-08-10-7': 69.59,\n                                    'SAR_2019-08-10-8': 75.68, 'SAR_2019-08-10-9': 92.0, 'SAR_2019-08-10-10': 69.83,\n                                    'SAR_2019-08-10-11': 62.32, 'SAR_2019-08-11-1': 109.27000000000001,\n                                    'SAR_2019-08-11-2': 106.94, 'SAR_2019-08-11-3': 100.6, 'SAR_2019-08-11-4': 70.16,\n                                    'SAR_2019-08-11-5': 61.77, 'SAR_2019-08-11-6': 70.61,\n                                    'SAR_2019-08-11-7': 107.52000000000001, 'SAR_2019-08-11-8': 82.49,\n                                    'SAR_2019-08-11-9': 61.39, 'SAR_2019-08-11-10': 101.12, 'SAR_2019-08-14-1': 218.82,\n                                    'SAR_2019-08-14-2': 71.27, 'SAR_2019-08-14-3': 70.15, 'SAR_2019-08-14-4': 106.5,\n                                    'SAR_2019-08-14-5': 82.2, 'SAR_2019-08-14-6': 102.50999999999999,\n                                    'SAR_2019-08-14-7': 61.43, 'SAR_2019-08-14-8': 82.39,\n                                    'SAR_2019-08-14-9': 100.78999999999999, 'SAR_2019-08-14-10': 61.66,\n                                    'SAR_2019-08-15-1': 99.83, 'SAR_2019-08-15-2': 70.01, 'SAR_2019-08-15-3': 80.52,\n                                    'SAR_2019-08-15-4': 61.06, 'SAR_2019-08-15-5': 81.99, 'SAR_2019-08-15-6': 106.91,\n                                    'SAR_2019-08-15-7': 61.63, 'SAR_2019-08-15-8': 74.93, 'SAR_2019-08-15-9': 96.35,\n                                    'SAR_2019-08-16-1': 103.57, 'SAR_2019-08-16-2': 81.38, 'SAR_2019-08-16-3': 112.9,\n                                    'SAR_2019-08-16-4': 63.7, 'SAR_2019-08-16-5': 68.27, 'SAR_2019-08-16-6': 100.25,\n                                    'SAR_2019-08-16-7': 102.25999999999999, 'SAR_2019-08-16-8': 108.4,\n                                    'SAR_2019-08-16-9': 61.61, 'SAR_2019-08-16-10': 96.81, 'SAR_2019-08-17-1': 83.11,\n                                    'SAR_2019-08-17-2': 75.03, 'SAR_2019-08-17-3': 62.81, 'SAR_2019-08-17-4': 75.65,\n                                    'SAR_2019-08-17-5': 134.69, 'SAR_2019-08-17-6': 60.21, 'SAR_2019-08-17-7': 77.14,\n                                    'SAR_2019-08-17-8': 60.4, 'SAR_2019-08-17-9': 103.68, 'SAR_2019-08-17-10': 124.07,\n                                    'SAR_2019-08-17-11': 84.85, 'SAR_2019-08-18-1': 63.3, 'SAR_2019-08-18-2': 84.19,\n                                    'SAR_2019-08-18-3': 84.32, 'SAR_2019-08-18-4': 94.91, 'SAR_2019-08-18-5': 63.92,\n                                    'SAR_2019-08-18-6': 75.85, 'SAR_2019-08-18-7': 64.52,\n                                    'SAR_2019-08-18-8': 83.03999999999999, 'SAR_2019-08-18-9': 108.58,\n                                    'SAR_2019-08-18-10': 112.47999999999999, 'SAR_2019-08-21-1': 0.0,\n                                    'SAR_2019-08-21-2': 110.53999999999999, 'SAR_2019-08-21-3': 66.26,\n                                    'SAR_2019-08-21-4': 124.32, 'SAR_2019-08-21-5': 65.13, 'SAR_2019-08-21-6': 84.48,\n                                    'SAR_2019-08-21-7': 83.02, 'SAR_2019-08-21-8': 65.22, 'SAR_2019-08-21-9': 69.85,\n                                    'SAR_2019-08-21-10': 65.07, 'SAR_2019-08-22-1': 278.15999999999997,\n                                    'SAR_2019-08-22-2': 109.42, 'SAR_2019-08-22-3': 116.61, 'SAR_2019-08-22-4': 108.43,\n                                    'SAR_2019-08-22-5': 84.97, 'SAR_2019-08-22-6': 110.7, 'SAR_2019-08-22-7': 83.93,\n                                    'SAR_2019-08-22-8': 110.88, 'SAR_2019-08-22-9': 96.31, 'SAR_2019-08-22-10': 109.41,\n                                    'SAR_2019-08-23-1': 63.77, 'SAR_2019-08-23-2': 104.05, 'SAR_2019-08-23-3': 110.63,\n                                    'SAR_2019-08-23-4': 64.39, 'SAR_2019-08-23-5': 103.75, 'SAR_2019-08-23-6': 62.57,\n                                    'SAR_2019-08-23-7': 76.73, 'SAR_2019-08-23-8': 76.93, 'SAR_2019-08-23-9': 101.18,\n                                    'SAR_2019-08-23-10': 109.35, 'SAR_2019-08-23-11': 116.77000000000001,\n                                    'SAR_2019-08-24-1': 97.47999999999999, 'SAR_2019-08-24-2': 69.6,\n                                    'SAR_2019-08-24-3': 103.02000000000001, 'SAR_2019-08-24-4': 75.0,\n                                    'SAR_2019-08-24-5': 80.8, 'SAR_2019-08-24-6': 81.48, 'SAR_2019-08-24-7': 81.43,\n                                    'SAR_2019-08-24-8': 101.39, 'SAR_2019-08-24-9': 107.92, 'SAR_2019-08-24-10': 147.5,\n                                    'SAR_2019-08-24-11': 121.05, 'SAR_2019-08-24-12': 62.5, 'SAR_2019-08-24-13': 102.12,\n                                    'SAR_2019-08-25-1': 70.33, 'SAR_2019-08-25-2': 62.28, 'SAR_2019-08-25-3': 136.04,\n                                    'SAR_2019-08-25-4': 84.47, 'SAR_2019-08-25-5': 62.19, 'SAR_2019-08-25-6': 70.09,\n                                    'SAR_2019-08-25-7': 63.53, 'SAR_2019-08-25-8': 94.28999999999999,\n                                    'SAR_2019-08-25-9': 108.92, 'SAR_2019-08-25-10': 96.13, 'SAR_2019-08-28-1': 269.25,\n                                    'SAR_2019-08-28-2': 70.82, 'SAR_2019-08-28-3': 100.16, 'SAR_2019-08-28-4': 69.45,\n                                    'SAR_2019-08-28-5': 96.17, 'SAR_2019-08-28-6': 70.78, 'SAR_2019-08-28-7': 63.17,\n                                    'SAR_2019-08-28-8': 69.51, 'SAR_2019-08-28-9': 103.34, 'SAR_2019-08-28-10': 62.83,\n                                    'SAR_2019-08-29-1': 70.55, 'SAR_2019-08-29-2': 107.83, 'SAR_2019-08-29-3': 78.42,\n                                    'SAR_2019-08-29-4': 62.12, 'SAR_2019-08-29-5': 83.34, 'SAR_2019-08-29-6': 61.87,\n                                    'SAR_2019-08-29-7': 70.82, 'SAR_2019-08-29-8': 70.12, 'SAR_2019-08-29-9': 101.36,\n                                    'SAR_2019-08-29-10': 96.83, 'SAR_2019-08-30-1': 82.7, 'SAR_2019-08-30-2': 111.18,\n                                    'SAR_2019-08-30-3': 62.63, 'SAR_2019-08-30-4': 69.62, 'SAR_2019-08-30-5': 95.28,\n                                    'SAR_2019-08-30-6': 62.89, 'SAR_2019-08-30-7': 64.75, 'SAR_2019-08-30-8': 96.44,\n                                    'SAR_2019-08-30-9': 110.0, 'SAR_2019-08-30-10': 61.18, 'SAR_2019-08-30-11': 94.7,\n                                    'SAR_2019-08-31-1': 104.16, 'SAR_2019-08-31-2': 62.74, 'SAR_2019-08-31-3': 69.45,\n                                    'SAR_2019-08-31-4': 61.94, 'SAR_2019-08-31-5': 83.77, 'SAR_2019-08-31-6': 101.8,\n                                    'SAR_2019-08-31-7': 82.93, 'SAR_2019-08-31-8': 100.87, 'SAR_2019-08-31-9': 82.82,\n                                    'SAR_2019-08-31-10': 133.62, 'SAR_2019-08-31-11': 108.11,\n                                    'SAR_2019-08-31-12': 69.47, 'SAR_2019-09-01-1': 62.64,\n                                    'SAR_2019-09-01-2': 84.28999999999999, 'SAR_2019-09-01-3': 70.37,\n                                    'SAR_2019-09-01-4': 62.15, 'SAR_2019-09-01-5': 64.8, 'SAR_2019-09-01-6': 82.89,\n                                    'SAR_2019-09-01-7': 102.3, 'SAR_2019-09-01-8': 83.34,\n                                    'SAR_2019-09-01-9': 95.97999999999999, 'SAR_2019-09-01-10': 69.86,\n                                    'SAR_2019-09-01-11': 83.44, 'SAR_2019-09-01-12': 100.93, 'SAR_2019-09-02-1': 113.44,\n                                    'SAR_2019-09-02-2': 77.03999999999999, 'SAR_2019-09-02-3': 84.52,\n                                    'SAR_2019-09-02-4': 111.88, 'SAR_2019-09-02-5': 112.25999999999999,\n                                    'SAR_2019-09-02-6': 64.29, 'SAR_2019-09-02-7': 112.78, 'SAR_2019-09-02-8': 84.24,\n                                    'SAR_2019-09-02-9': 105.2, 'SAR_2019-09-02-10': 83.48, 'SAR_2019-09-02-11': 84.28},\n                     sex = {'AQU_2019-01-01-1': 'all', 'AQU_2019-01-01-2': 'all', 'AQU_2019-01-01-3': 'all',\n                            'AQU_2019-01-01-4': 'all', 'AQU_2019-01-01-5': 'all', 'AQU_2019-01-01-6': 'all',\n                            'AQU_2019-01-01-7': 'all', 'AQU_2019-01-01-8': 'all', 'AQU_2019-01-01-9': 'all',\n                            'AQU_2019-01-04-1': 'all', 'AQU_2019-01-04-2': 'all', 'AQU_2019-01-04-3': 'all',\n                            'AQU_2019-01-04-4': 'all', 'AQU_2019-01-04-5': 'all', 'AQU_2019-01-04-6': 'all',\n                            'AQU_2019-01-04-7': 'all', 'AQU_2019-01-04-8': 'all', 'AQU_2019-01-05-1': 'all',\n                            'AQU_2019-01-05-2': 'all', 'AQU_2019-01-05-3': 'all', 'AQU_2019-01-05-4': 'all',\n                            'AQU_2019-01-05-5': 'all', 'AQU_2019-01-05-6': 'all', 'AQU_2019-01-05-7': 'all',\n                            'AQU_2019-01-05-8': 'all', 'AQU_2019-01-05-9': 'all', 'AQU_2019-01-06-1': 'all',\n                            'AQU_2019-01-06-2': 'all', 'AQU_2019-01-06-3': 'all', 'AQU_2019-01-06-4': 'all',\n                            'AQU_2019-01-06-5': 'all', 'AQU_2019-01-06-6': 'all', 'AQU_2019-01-06-7': 'all',\n                            'AQU_2019-01-06-8': 'all', 'AQU_2019-01-10-1': 'all', 'AQU_2019-01-10-2': 'all',\n                            'AQU_2019-01-10-3': 'all', 'AQU_2019-01-10-4': 'all', 'AQU_2019-01-10-5': 'all',\n                            'AQU_2019-01-11-1': 'all', 'AQU_2019-01-11-2': 'all', 'AQU_2019-01-11-3': 'all',\n                            'AQU_2019-01-11-4': 'all', 'AQU_2019-01-11-5': 'all', 'AQU_2019-01-11-6': 'all',\n                            'AQU_2019-01-11-7': 'all', 'AQU_2019-01-11-8': 'all', 'AQU_2019-01-12-1': 'all',\n                            'AQU_2019-01-12-2': 'all', 'AQU_2019-01-12-3': 'all', 'AQU_2019-01-12-4': 'all',\n                            'AQU_2019-01-12-5': 'all', 'AQU_2019-01-12-6': 'all', 'AQU_2019-01-12-7': 'all',\n                            'AQU_2019-01-12-8': 'all', 'AQU_2019-01-12-9': 'all', 'AQU_2019-01-13-1': 'all',\n                            'AQU_2019-01-13-2': 'all', 'AQU_2019-01-13-3': 'all', 'AQU_2019-01-13-4': 'all',\n                            'AQU_2019-01-13-5': 'all', 'AQU_2019-01-13-6': 'all', 'AQU_2019-01-13-7': 'all',\n                            'AQU_2019-01-13-8': 'all', 'AQU_2019-01-18-1': 'all', 'AQU_2019-01-18-2': 'all',\n                            'AQU_2019-01-18-3': 'all', 'AQU_2019-01-18-4': 'all', 'AQU_2019-01-18-5': 'all',\n                            'AQU_2019-01-18-6': 'all', 'AQU_2019-01-18-7': 'all', 'AQU_2019-01-18-8': 'all',\n                            'AQU_2019-01-19-1': 'all', 'AQU_2019-01-19-2': 'all', 'AQU_2019-01-19-3': 'all',\n                            'AQU_2019-01-19-4': 'all', 'AQU_2019-01-19-5': 'all', 'AQU_2019-01-19-6': 'all',\n                            'AQU_2019-01-19-7': 'all', 'AQU_2019-01-19-8': 'all', 'AQU_2019-01-19-9': 'all',\n                            'AQU_2019-01-20-1': 'all', 'AQU_2019-01-20-2': 'all', 'AQU_2019-01-20-3': 'all',\n                            'AQU_2019-01-20-4': 'all', 'AQU_2019-01-20-5': 'all', 'AQU_2019-01-20-6': 'all',\n                            'AQU_2019-01-20-7': 'all', 'AQU_2019-01-20-8': 'all', 'AQU_2019-01-25-1': 'all',\n                            'AQU_2019-01-25-2': 'female', 'AQU_2019-01-25-3': 'female', 'AQU_2019-01-25-4': 'female',\n                            'AQU_2019-01-25-5': 'female', 'AQU_2019-01-25-6': 'all', 'AQU_2019-01-25-7': 'female',\n                            'AQU_2019-01-25-8': 'female', 'AQU_2019-01-25-9': 'female', 'AQU_2019-01-26-1': 'all',\n                            'AQU_2019-01-26-2': 'all', 'AQU_2019-01-26-3': 'female', 'AQU_2019-01-26-4': 'female',\n                            'AQU_2019-01-26-5': 'all', 'AQU_2019-01-26-6': 'all', 'AQU_2019-01-26-7': 'all',\n                            'AQU_2019-01-26-8': 'all', 'AQU_2019-01-26-9': 'all', 'AQU_2019-01-26-10': 'female',\n                            'AQU_2019-01-27-1': 'female', 'AQU_2019-01-27-2': 'all', 'AQU_2019-01-27-3': 'all',\n                            'AQU_2019-01-27-4': 'all', 'AQU_2019-01-27-5': 'all', 'AQU_2019-01-27-6': 'female',\n                            'AQU_2019-01-27-7': 'all', 'AQU_2019-01-27-8': 'female', 'AQU_2019-01-27-9': 'female',\n                            'AQU_2019-02-01-1': 'all', 'AQU_2019-02-01-2': 'all', 'AQU_2019-02-01-3': 'all',\n                            'AQU_2019-02-01-4': 'female', 'AQU_2019-02-01-5': 'all', 'AQU_2019-02-01-6': 'all',\n                            'AQU_2019-02-01-7': 'all', 'AQU_2019-02-01-8': 'female', 'AQU_2019-02-02-1': 'female',\n                            'AQU_2019-02-02-2': 'all', 'AQU_2019-02-02-3': 'all', 'AQU_2019-02-02-4': 'female',\n                            'AQU_2019-02-02-5': 'female', 'AQU_2019-02-02-6': 'all', 'AQU_2019-02-02-7': 'all',\n                            'AQU_2019-02-02-8': 'all', 'AQU_2019-02-02-9': 'all', 'AQU_2019-02-02-10': 'all',\n                            'AQU_2019-02-03-1': 'female', 'AQU_2019-02-03-2': 'all', 'AQU_2019-02-03-3': 'all',\n                            'AQU_2019-02-03-4': 'female', 'AQU_2019-02-03-5': 'female', 'AQU_2019-02-03-6': 'female',\n                            'AQU_2019-02-03-7': 'all', 'AQU_2019-02-03-8': 'female', 'AQU_2019-02-03-9': 'all',\n                            'AQU_2019-02-07-1': 'all', 'AQU_2019-02-07-2': 'all', 'AQU_2019-02-07-3': 'all',\n                            'AQU_2019-02-07-4': 'female', 'AQU_2019-02-07-5': 'all', 'AQU_2019-02-07-6': 'all',\n                            'AQU_2019-02-07-7': 'all', 'AQU_2019-02-07-8': 'all', 'AQU_2019-02-08-1': 'female',\n                            'AQU_2019-02-08-2': 'all', 'AQU_2019-02-08-3': 'female', 'AQU_2019-02-08-4': 'all',\n                            'AQU_2019-02-08-5': 'all', 'AQU_2019-02-08-6': 'female', 'AQU_2019-02-08-7': 'female',\n                            'AQU_2019-02-08-8': 'all', 'AQU_2019-02-09-1': 'female', 'AQU_2019-02-09-2': 'female',\n                            'AQU_2019-02-09-3': 'all', 'AQU_2019-02-09-4': 'all', 'AQU_2019-02-09-5': 'female',\n                            'AQU_2019-02-09-6': 'female', 'AQU_2019-02-09-7': 'female', 'AQU_2019-02-09-8': 'all',\n                            'AQU_2019-02-09-9': 'female', 'AQU_2019-02-10-1': 'female', 'AQU_2019-02-10-2': 'female',\n                            'AQU_2019-02-10-3': 'all', 'AQU_2019-02-10-4': 'all', 'AQU_2019-02-10-5': 'female',\n                            'AQU_2019-02-10-6': 'female', 'AQU_2019-02-10-7': 'all', 'AQU_2019-02-10-8': 'female',\n                            'AQU_2019-02-15-1': 'all', 'AQU_2019-02-15-2': 'all', 'AQU_2019-02-15-3': 'female',\n                            'AQU_2019-02-15-4': 'female', 'AQU_2019-02-15-5': 'female', 'AQU_2019-02-15-6': 'all',\n                            'AQU_2019-02-15-7': 'female', 'AQU_2019-02-15-8': 'female', 'AQU_2019-02-16-1': 'female',\n                            'AQU_2019-02-16-2': 'female', 'AQU_2019-02-16-3': 'female', 'AQU_2019-02-16-4': 'female',\n                            'AQU_2019-02-16-5': 'all', 'AQU_2019-02-16-6': 'all', 'AQU_2019-02-16-7': 'all',\n                            'AQU_2019-02-16-8': 'female', 'AQU_2019-02-16-9': 'all', 'AQU_2019-02-17-1': 'female',\n                            'AQU_2019-02-17-2': 'all', 'AQU_2019-02-17-3': 'all', 'AQU_2019-02-17-4': 'all',\n                            'AQU_2019-02-17-5': 'all', 'AQU_2019-02-17-6': 'all', 'AQU_2019-02-17-7': 'all',\n                            'AQU_2019-02-17-8': 'all', 'AQU_2019-02-18-1': 'female', 'AQU_2019-02-18-2': 'all',\n                            'AQU_2019-02-18-3': 'female', 'AQU_2019-02-18-4': 'all', 'AQU_2019-02-18-5': 'all',\n                            'AQU_2019-02-18-6': 'female', 'AQU_2019-02-18-7': 'all', 'AQU_2019-02-18-8': 'all',\n                            'AQU_2019-02-18-9': 'female', 'AQU_2019-02-21-1': 'all', 'AQU_2019-02-21-2': 'female',\n                            'AQU_2019-02-21-3': 'female', 'AQU_2019-02-21-4': 'female', 'AQU_2019-02-21-5': 'all',\n                            'AQU_2019-02-21-6': 'all', 'AQU_2019-02-21-7': 'female', 'AQU_2019-02-21-8': 'all',\n                            'AQU_2019-02-22-1': 'all', 'AQU_2019-02-22-2': 'female', 'AQU_2019-02-22-3': 'female',\n                            'AQU_2019-02-22-4': 'female', 'AQU_2019-02-22-5': 'all', 'AQU_2019-02-22-6': 'all',\n                            'AQU_2019-02-22-7': 'all', 'AQU_2019-02-22-8': 'all', 'AQU_2019-02-23-1': 'all',\n                            'AQU_2019-02-23-2': 'female', 'AQU_2019-02-23-3': 'all', 'AQU_2019-02-23-4': 'female',\n                            'AQU_2019-02-23-5': 'all', 'AQU_2019-02-23-6': 'all', 'AQU_2019-02-23-7': 'all',\n                            'AQU_2019-02-23-8': 'female', 'AQU_2019-02-23-9': 'all', 'AQU_2019-02-24-1': 'all',\n                            'AQU_2019-02-24-2': 'all', 'AQU_2019-02-24-3': 'all', 'AQU_2019-02-24-4': 'all',\n                            'AQU_2019-02-24-5': 'all', 'AQU_2019-02-24-6': 'female', 'AQU_2019-02-24-7': 'all',\n                            'AQU_2019-02-24-8': 'female', 'AQU_2019-02-28-1': 'all', 'AQU_2019-02-28-2': 'female',\n                            'AQU_2019-02-28-3': 'all', 'AQU_2019-02-28-4': 'all', 'AQU_2019-02-28-5': 'all',\n                            'AQU_2019-02-28-6': 'all', 'AQU_2019-02-28-7': 'all', 'AQU_2019-02-28-8': 'female',\n                            'AQU_2019-03-01-1': 'all', 'AQU_2019-03-01-2': 'female', 'AQU_2019-03-01-3': 'all',\n                            'AQU_2019-03-01-4': 'all', 'AQU_2019-03-01-5': 'all', 'AQU_2019-03-01-6': 'all',\n                            'AQU_2019-03-01-7': 'female', 'AQU_2019-03-01-8': 'all', 'AQU_2019-03-02-1': 'all',\n                            'AQU_2019-03-02-2': 'female', 'AQU_2019-03-02-3': 'all', 'AQU_2019-03-02-4': 'female',\n                            'AQU_2019-03-02-5': 'female', 'AQU_2019-03-02-6': 'female', 'AQU_2019-03-02-7': 'female',\n                            'AQU_2019-03-02-8': 'all', 'AQU_2019-03-02-9': 'all', 'AQU_2019-03-03-1': 'female',\n                            'AQU_2019-03-03-2': 'all', 'AQU_2019-03-03-3': 'all', 'AQU_2019-03-03-4': 'all',\n                            'AQU_2019-03-03-5': 'female', 'AQU_2019-03-03-6': 'female', 'AQU_2019-03-03-7': 'all',\n                            'AQU_2019-03-03-8': 'female', 'AQU_2019-03-08-1': 'all', 'AQU_2019-03-08-2': 'female',\n                            'AQU_2019-03-08-3': 'all', 'AQU_2019-03-08-4': 'all', 'AQU_2019-03-08-5': 'female',\n                            'AQU_2019-03-08-6': 'female', 'AQU_2019-03-08-7': 'female', 'AQU_2019-03-08-8': 'all',\n                            'AQU_2019-03-09-1': 'all', 'AQU_2019-03-09-2': 'all', 'AQU_2019-03-09-3': 'female',\n                            'AQU_2019-03-09-4': 'all', 'AQU_2019-03-09-5': 'all', 'AQU_2019-03-09-6': 'female',\n                            'AQU_2019-03-09-7': 'female', 'AQU_2019-03-09-8': 'all', 'AQU_2019-03-09-9': 'all',\n                            'AQU_2019-03-09-10': 'all', 'AQU_2019-03-09-11': 'female', 'AQU_2019-03-10-1': 'female',\n                            'AQU_2019-03-10-2': 'female', 'AQU_2019-03-10-3': 'all', 'AQU_2019-03-10-4': 'female',\n                            'AQU_2019-03-10-5': 'female', 'AQU_2019-03-10-6': 'all', 'AQU_2019-03-10-7': 'all',\n                            'AQU_2019-03-10-8': 'female', 'AQU_2019-03-10-9': 'all', 'AQU_2019-03-15-1': 'female',\n                            'AQU_2019-03-15-2': 'all', 'AQU_2019-03-15-3': 'female', 'AQU_2019-03-15-4': 'female',\n                            'AQU_2019-03-15-5': 'female', 'AQU_2019-03-15-6': 'all', 'AQU_2019-03-15-7': 'all',\n                            'AQU_2019-03-15-8': 'all', 'AQU_2019-03-15-9': 'all', 'AQU_2019-03-16-1': 'all',\n                            'AQU_2019-03-16-2': 'female', 'AQU_2019-03-16-3': 'female', 'AQU_2019-03-16-4': 'female',\n                            'AQU_2019-03-16-5': 'female', 'AQU_2019-03-16-6': 'all', 'AQU_2019-03-16-7': 'all',\n                            'AQU_2019-03-16-8': 'all', 'AQU_2019-03-16-9': 'all', 'AQU_2019-03-17-1': 'all',\n                            'AQU_2019-03-17-2': 'all', 'AQU_2019-03-17-3': 'all', 'AQU_2019-03-17-4': 'all',\n                            'AQU_2019-03-17-5': 'female', 'AQU_2019-03-17-6': 'all', 'AQU_2019-03-17-7': 'all',\n                            'AQU_2019-03-17-8': 'all', 'AQU_2019-03-17-9': 'female', 'AQU_2019-03-22-1': 'all',\n                            'AQU_2019-03-22-2': 'all', 'AQU_2019-03-22-3': 'all', 'AQU_2019-03-22-4': 'female',\n                            'AQU_2019-03-22-5': 'all', 'AQU_2019-03-22-6': 'female', 'AQU_2019-03-22-7': 'all',\n                            'AQU_2019-03-22-8': 'female', 'AQU_2019-03-22-9': 'female', 'AQU_2019-03-23-1': 'all',\n                            'AQU_2019-03-23-2': 'female', 'AQU_2019-03-23-3': 'all', 'AQU_2019-03-23-4': 'all',\n                            'AQU_2019-03-23-5': 'all', 'AQU_2019-03-23-6': 'all', 'AQU_2019-03-23-7': 'all',\n                            'AQU_2019-03-23-8': 'female', 'AQU_2019-03-23-9': 'female', 'AQU_2019-03-24-1': 'all',\n                            'AQU_2019-03-24-2': 'all', 'AQU_2019-03-24-3': 'all', 'AQU_2019-03-24-4': 'female',\n                            'AQU_2019-03-24-5': 'female', 'AQU_2019-03-24-6': 'all', 'AQU_2019-03-24-7': 'all',\n                            'AQU_2019-03-24-8': 'female', 'AQU_2019-03-24-9': 'all', 'AQU_2019-03-29-1': 'female',\n                            'AQU_2019-03-29-2': 'female', 'AQU_2019-03-29-3': 'all', 'AQU_2019-03-29-4': 'female',\n                            'AQU_2019-03-29-5': 'female', 'AQU_2019-03-29-6': 'all', 'AQU_2019-03-29-7': 'all',\n                            'AQU_2019-03-29-8': 'female', 'AQU_2019-03-29-9': 'all', 'AQU_2019-03-30-1': 'female',\n                            'AQU_2019-03-30-2': 'female', 'AQU_2019-03-30-3': 'all', 'AQU_2019-03-30-4': 'all',\n                            'AQU_2019-03-30-5': 'female', 'AQU_2019-03-30-6': 'all', 'AQU_2019-03-30-7': 'female',\n                            'AQU_2019-03-30-8': 'all', 'AQU_2019-03-30-9': 'all', 'AQU_2019-03-30-10': 'all',\n                            'AQU_2019-03-31-1': 'female', 'AQU_2019-03-31-2': 'all', 'AQU_2019-03-31-3': 'female',\n                            'AQU_2019-03-31-4': 'all', 'AQU_2019-03-31-5': 'female', 'AQU_2019-03-31-6': 'all',\n                            'AQU_2019-03-31-7': 'female', 'AQU_2019-03-31-8': 'female', 'AQU_2019-03-31-9': 'female',\n                            'AQU_2019-04-05-1': 'all', 'AQU_2019-04-05-2': 'female', 'AQU_2019-04-05-3': 'female',\n                            'AQU_2019-04-05-4': 'female', 'AQU_2019-04-05-5': 'female', 'AQU_2019-04-05-6': 'all',\n                            'AQU_2019-04-05-7': 'all', 'AQU_2019-04-05-8': 'female', 'AQU_2019-04-05-9': 'female',\n                            'AQU_2019-04-06-1': 'all', 'AQU_2019-04-06-2': 'female', 'AQU_2019-04-06-3': 'all',\n                            'AQU_2019-04-06-4': 'all', 'AQU_2019-04-06-5': 'all', 'AQU_2019-04-06-6': 'all',\n                            'AQU_2019-04-06-7': 'all', 'AQU_2019-04-06-8': 'female', 'AQU_2019-04-06-9': 'all',\n                            'AQU_2019-04-06-10': 'all', 'AQU_2019-04-06-11': 'all', 'AQU_2019-04-07-1': 'female',\n                            'AQU_2019-04-07-2': 'female', 'AQU_2019-04-07-3': 'all', 'AQU_2019-04-07-4': 'all',\n                            'AQU_2019-04-07-5': 'all', 'AQU_2019-04-07-6': 'female', 'AQU_2019-04-07-7': 'all',\n                            'AQU_2019-04-07-8': 'female', 'AQU_2019-04-07-9': 'female', 'AQU_2019-04-10-1': 'all',\n                            'AQU_2019-04-10-2': 'all', 'AQU_2019-04-10-3': 'all', 'AQU_2019-04-10-4': 'female',\n                            'AQU_2019-04-10-5': 'all', 'AQU_2019-04-10-6': 'female', 'AQU_2019-04-10-7': 'female',\n                            'AQU_2019-04-10-8': 'female', 'AQU_2019-04-10-9': 'all', 'AQU_2019-04-11-1': 'all',\n                            'AQU_2019-04-11-2': 'female', 'AQU_2019-04-11-3': 'all', 'AQU_2019-04-11-4': 'female',\n                            'AQU_2019-04-11-5': 'all', 'AQU_2019-04-11-6': 'female', 'AQU_2019-04-11-7': 'all',\n                            'AQU_2019-04-11-8': 'female', 'AQU_2019-04-11-9': 'female', 'AQU_2019-04-12-1': 'female',\n                            'AQU_2019-04-12-2': 'all', 'AQU_2019-04-12-3': 'all', 'AQU_2019-04-12-4': 'all',\n                            'AQU_2019-04-12-5': 'all', 'AQU_2019-04-12-6': 'female', 'AQU_2019-04-12-7': 'all',\n                            'AQU_2019-04-12-8': 'all', 'AQU_2019-04-12-9': 'female', 'AQU_2019-04-13-1': 'all',\n                            'AQU_2019-04-13-2': 'female', 'AQU_2019-04-13-3': 'all', 'AQU_2019-04-13-4': 'all',\n                            'AQU_2019-04-13-5': 'female', 'AQU_2019-04-13-6': 'female', 'AQU_2019-04-13-7': 'female',\n                            'AQU_2019-04-13-8': 'female', 'AQU_2019-04-13-9': 'all', 'AQU_2019-04-14-1': 'all',\n                            'AQU_2019-04-14-2': 'female', 'AQU_2019-04-14-3': 'female', 'AQU_2019-04-14-4': 'all',\n                            'AQU_2019-04-14-5': 'all', 'AQU_2019-04-14-6': 'all', 'AQU_2019-04-14-7': 'all',\n                            'AQU_2019-04-14-8': 'female', 'AQU_2019-04-14-9': 'all', 'AQU_2019-04-17-1': 'female',\n                            'AQU_2019-04-17-2': 'all', 'AQU_2019-04-17-3': 'all', 'AQU_2019-04-17-4': 'female',\n                            'AQU_2019-04-17-5': 'all', 'AQU_2019-04-17-6': 'all', 'AQU_2019-04-17-7': 'all',\n                            'AQU_2019-04-17-8': 'female', 'AQU_2019-04-17-9': 'female', 'AQU_2019-04-18-1': 'female',\n                            'AQU_2019-04-18-2': 'female', 'AQU_2019-04-18-3': 'all', 'AQU_2019-04-18-4': 'female',\n                            'AQU_2019-04-18-5': 'all', 'AQU_2019-04-18-6': 'all', 'AQU_2019-04-18-7': 'all',\n                            'AQU_2019-04-18-8': 'all', 'AQU_2019-04-18-9': 'all', 'AQU_2019-04-19-1': 'all',\n                            'AQU_2019-04-19-2': 'female', 'AQU_2019-04-19-3': 'female', 'AQU_2019-04-19-4': 'female',\n                            'AQU_2019-04-19-5': 'female', 'AQU_2019-04-19-6': 'all', 'AQU_2019-04-19-7': 'all',\n                            'AQU_2019-04-19-8': 'all', 'AQU_2019-04-19-9': 'all', 'AQU_2019-04-20-1': 'all',\n                            'AQU_2019-04-20-2': 'all', 'AQU_2019-04-20-3': 'all', 'AQU_2019-04-20-4': 'female',\n                            'AQU_2019-04-20-5': 'all', 'AQU_2019-04-20-6': 'all', 'AQU_2019-04-20-7': 'all',\n                            'AQU_2019-04-20-8': 'female', 'AQU_2019-04-20-9': 'all', 'AQU_2019-11-01-1': 'female',\n                            'AQU_2019-11-01-2': 'female', 'AQU_2019-11-01-3': 'female', 'AQU_2019-11-01-4': 'all',\n                            'AQU_2019-11-01-5': 'female', 'AQU_2019-11-01-6': 'female', 'AQU_2019-11-01-7': 'female',\n                            'AQU_2019-11-01-8': 'female', 'AQU_2019-11-01-9': 'female', 'AQU_2019-11-01-10': 'female',\n                            'AQU_2019-11-02-1': 'female', 'AQU_2019-11-02-2': 'all', 'AQU_2019-11-02-3': 'all',\n                            'AQU_2019-11-02-4': 'all', 'AQU_2019-11-02-5': 'all', 'AQU_2019-11-02-6': 'all',\n                            'AQU_2019-11-02-7': 'all', 'AQU_2019-11-02-8': 'all', 'AQU_2019-11-02-9': 'female',\n                            'AQU_2019-11-02-10': 'all', 'AQU_2019-11-03-1': 'female', 'AQU_2019-11-03-2': 'all',\n                            'AQU_2019-11-03-3': 'all', 'AQU_2019-11-03-4': 'all', 'AQU_2019-11-03-5': 'female',\n                            'AQU_2019-11-03-6': 'all', 'AQU_2019-11-03-7': 'all', 'AQU_2019-11-03-8': 'female',\n                            'AQU_2019-11-03-9': 'all', 'AQU_2019-11-03-10': 'all', 'AQU_2019-11-07-1': 'female',\n                            'AQU_2019-11-07-2': 'female', 'AQU_2019-11-07-3': 'all', 'AQU_2019-11-07-4': 'all',\n                            'AQU_2019-11-07-5': 'female', 'AQU_2019-11-07-6': 'female', 'AQU_2019-11-07-7': 'female',\n                            'AQU_2019-11-07-8': 'female', 'AQU_2019-11-07-9': 'all', 'AQU_2019-11-08-1': 'female',\n                            'AQU_2019-11-08-2': 'all', 'AQU_2019-11-08-3': 'female', 'AQU_2019-11-08-4': 'all',\n                            'AQU_2019-11-08-5': 'female', 'AQU_2019-11-08-6': 'all', 'AQU_2019-11-08-7': 'all',\n                            'AQU_2019-11-08-8': 'all', 'AQU_2019-11-08-9': 'female', 'AQU_2019-11-09-1': 'female',\n                            'AQU_2019-11-09-2': 'female', 'AQU_2019-11-09-3': 'all', 'AQU_2019-11-09-4': 'all',\n                            'AQU_2019-11-09-5': 'female', 'AQU_2019-11-09-6': 'all', 'AQU_2019-11-09-7': 'female',\n                            'AQU_2019-11-09-8': 'all', 'AQU_2019-11-09-9': 'all', 'AQU_2019-11-09-10': 'all',\n                            'AQU_2019-11-10-1': 'all', 'AQU_2019-11-10-2': 'female', 'AQU_2019-11-10-3': 'all',\n                            'AQU_2019-11-10-4': 'all', 'AQU_2019-11-10-5': 'all', 'AQU_2019-11-10-6': 'female',\n                            'AQU_2019-11-10-7': 'all', 'AQU_2019-11-10-8': 'female', 'AQU_2019-11-10-9': 'female',\n                            'AQU_2019-11-10-10': 'all', 'AQU_2019-11-11-1': 'female', 'AQU_2019-11-11-2': 'female',\n                            'AQU_2019-11-11-3': 'all', 'AQU_2019-11-11-4': 'female', 'AQU_2019-11-11-5': 'all',\n                            'AQU_2019-11-11-6': 'all', 'AQU_2019-11-11-7': 'all', 'AQU_2019-11-11-8': 'all',\n                            'AQU_2019-11-11-9': 'female', 'AQU_2019-11-11-10': 'female', 'AQU_2019-11-14-1': 'all',\n                            'AQU_2019-11-14-2': 'female', 'AQU_2019-11-14-3': 'female', 'AQU_2019-11-14-4': 'all',\n                            'AQU_2019-11-14-5': 'female', 'AQU_2019-11-14-6': 'female', 'AQU_2019-11-14-7': 'all',\n                            'AQU_2019-11-14-8': 'all', 'AQU_2019-11-14-9': 'all', 'AQU_2019-11-15-1': 'all',\n                            'AQU_2019-11-15-2': 'female', 'AQU_2019-11-15-3': 'female', 'AQU_2019-11-15-4': 'female',\n                            'AQU_2019-11-15-5': 'female', 'AQU_2019-11-15-6': 'female', 'AQU_2019-11-15-7': 'female',\n                            'AQU_2019-11-15-8': 'female', 'AQU_2019-11-15-9': 'all', 'AQU_2019-11-15-10': 'female',\n                            'AQU_2019-11-16-1': 'all', 'AQU_2019-11-16-2': 'all', 'AQU_2019-11-16-3': 'all',\n                            'AQU_2019-11-16-4': 'all', 'AQU_2019-11-16-5': 'all', 'AQU_2019-11-16-6': 'all',\n                            'AQU_2019-11-16-7': 'female', 'AQU_2019-11-16-8': 'female', 'AQU_2019-11-16-9': 'female',\n                            'AQU_2019-11-16-10': 'female', 'AQU_2019-11-17-1': 'all', 'AQU_2019-11-17-2': 'female',\n                            'AQU_2019-11-17-3': 'all', 'AQU_2019-11-17-4': 'all', 'AQU_2019-11-17-5': 'all',\n                            'AQU_2019-11-17-6': 'all', 'AQU_2019-11-17-7': 'all', 'AQU_2019-11-17-8': 'female',\n                            'AQU_2019-11-17-9': 'all', 'AQU_2019-11-17-10': 'female', 'AQU_2019-11-20-1': 'all',\n                            'AQU_2019-11-20-2': 'all', 'AQU_2019-11-20-3': 'all', 'AQU_2019-11-20-4': 'female',\n                            'AQU_2019-11-20-5': 'all', 'AQU_2019-11-20-6': 'all', 'AQU_2019-11-20-7': 'all',\n                            'AQU_2019-11-20-8': 'all', 'AQU_2019-11-20-9': 'all', 'AQU_2019-11-21-1': 'female',\n                            'AQU_2019-11-21-2': 'female', 'AQU_2019-11-21-3': 'female', 'AQU_2019-11-21-4': 'all',\n                            'AQU_2019-11-21-5': 'female', 'AQU_2019-11-21-6': 'all', 'AQU_2019-11-21-7': 'female',\n                            'AQU_2019-11-21-8': 'female', 'AQU_2019-11-22-1': 'female', 'AQU_2019-11-22-2': 'all',\n                            'AQU_2019-11-22-3': 'female', 'AQU_2019-11-22-4': 'female', 'AQU_2019-11-22-5': 'all',\n                            'AQU_2019-11-22-6': 'all', 'AQU_2019-11-22-7': 'female', 'AQU_2019-11-22-8': 'all',\n                            'AQU_2019-11-23-1': 'all', 'AQU_2019-11-23-2': 'female', 'AQU_2019-11-23-3': 'female',\n                            'AQU_2019-11-23-4': 'all', 'AQU_2019-11-23-5': 'all', 'AQU_2019-11-23-6': 'all',\n                            'AQU_2019-11-23-7': 'all', 'AQU_2019-11-23-8': 'female', 'AQU_2019-11-23-9': 'all',\n                            'AQU_2019-11-23-10': 'all', 'AQU_2019-11-24-1': 'female', 'AQU_2019-11-24-2': 'all',\n                            'AQU_2019-11-24-3': 'all', 'AQU_2019-11-24-4': 'female', 'AQU_2019-11-24-5': 'all',\n                            'AQU_2019-11-24-6': 'all', 'AQU_2019-11-24-7': 'all', 'AQU_2019-11-24-8': 'all',\n                            'AQU_2019-11-24-9': 'all', 'AQU_2019-11-27-1': 'all', 'AQU_2019-11-27-2': 'female',\n                            'AQU_2019-11-27-3': 'female', 'AQU_2019-11-27-4': 'all', 'AQU_2019-11-27-5': 'female',\n                            'AQU_2019-11-27-6': 'all', 'AQU_2019-11-27-7': 'all', 'AQU_2019-11-27-8': 'female',\n                            'AQU_2019-11-27-9': 'all', 'AQU_2019-11-29-1': 'female', 'AQU_2019-11-29-2': 'all',\n                            'AQU_2019-11-29-3': 'female', 'AQU_2019-11-29-4': 'female', 'AQU_2019-11-29-5': 'female',\n                            'AQU_2019-11-29-6': 'female', 'AQU_2019-11-29-7': 'all', 'AQU_2019-11-29-8': 'female',\n                            'AQU_2019-11-29-9': 'all', 'AQU_2019-11-29-10': 'female', 'AQU_2019-11-30-1': 'female',\n                            'AQU_2019-11-30-2': 'all', 'AQU_2019-11-30-3': 'female', 'AQU_2019-11-30-4': 'all',\n                            'AQU_2019-11-30-5': 'all', 'AQU_2019-11-30-6': 'all', 'AQU_2019-11-30-7': 'all',\n                            'AQU_2019-11-30-8': 'all', 'AQU_2019-11-30-9': 'female', 'AQU_2019-11-30-10': 'all',\n                            'AQU_2019-12-01-1': 'female', 'AQU_2019-12-01-2': 'all', 'AQU_2019-12-01-3': 'all',\n                            'AQU_2019-12-01-4': 'all', 'AQU_2019-12-05-1': 'female', 'AQU_2019-12-05-2': 'all',\n                            'AQU_2019-12-05-3': 'female', 'AQU_2019-12-05-4': 'all', 'AQU_2019-12-05-5': 'all',\n                            'AQU_2019-12-05-6': 'all', 'AQU_2019-12-05-7': 'female', 'AQU_2019-12-05-8': 'all',\n                            'AQU_2019-12-05-9': 'all', 'AQU_2019-12-06-1': 'female', 'AQU_2019-12-06-2': 'all',\n                            'AQU_2019-12-06-3': 'female', 'AQU_2019-12-06-4': 'female', 'AQU_2019-12-06-5': 'female',\n                            'AQU_2019-12-06-6': 'all', 'AQU_2019-12-06-7': 'female', 'AQU_2019-12-06-8': 'female',\n                            'AQU_2019-12-06-9': 'all', 'AQU_2019-12-06-10': 'female', 'AQU_2019-12-07-1': 'all',\n                            'AQU_2019-12-07-2': 'female', 'AQU_2019-12-07-3': 'all', 'AQU_2019-12-07-4': 'female',\n                            'AQU_2019-12-07-5': 'all', 'AQU_2019-12-07-6': 'female', 'AQU_2019-12-07-7': 'all',\n                            'AQU_2019-12-07-8': 'female', 'AQU_2019-12-07-9': 'all', 'AQU_2019-12-07-10': 'all',\n                            'AQU_2019-12-08-1': 'female', 'AQU_2019-12-08-2': 'all', 'AQU_2019-12-08-3': 'all',\n                            'AQU_2019-12-08-4': 'female', 'AQU_2019-12-08-5': 'female', 'AQU_2019-12-08-6': 'all',\n                            'AQU_2019-12-08-7': 'female', 'AQU_2019-12-08-8': 'all', 'AQU_2019-12-08-9': 'all',\n                            'AQU_2019-12-08-10': 'female', 'AQU_2019-12-12-1': 'female', 'AQU_2019-12-12-2': 'all',\n                            'AQU_2019-12-12-3': 'all', 'AQU_2019-12-12-4': 'all', 'AQU_2019-12-12-5': 'female',\n                            'AQU_2019-12-12-6': 'female', 'AQU_2019-12-12-7': 'all', 'AQU_2019-12-12-8': 'all',\n                            'AQU_2019-12-13-1': 'female', 'AQU_2019-12-13-2': 'all', 'AQU_2019-12-13-3': 'female',\n                            'AQU_2019-12-13-4': 'female', 'AQU_2019-12-13-5': 'female', 'AQU_2019-12-13-6': 'female',\n                            'AQU_2019-12-13-7': 'all', 'AQU_2019-12-13-8': 'all', 'AQU_2019-12-14-1': 'all',\n                            'AQU_2019-12-14-2': 'female', 'AQU_2019-12-14-3': 'all', 'AQU_2019-12-14-4': 'all',\n                            'AQU_2019-12-14-5': 'all', 'AQU_2019-12-14-6': 'all', 'AQU_2019-12-14-7': 'all',\n                            'AQU_2019-12-14-8': 'all', 'AQU_2019-12-14-9': 'all', 'AQU_2019-12-15-1': 'female',\n                            'AQU_2019-12-15-2': 'female', 'AQU_2019-12-15-3': 'all', 'AQU_2019-12-15-4': 'all',\n                            'AQU_2019-12-15-5': 'all', 'AQU_2019-12-15-6': 'female', 'AQU_2019-12-15-7': 'female',\n                            'AQU_2019-12-15-8': 'female', 'AQU_2019-12-15-9': 'all', 'AQU_2019-12-20-1': 'female',\n                            'AQU_2019-12-20-2': 'female', 'AQU_2019-12-20-3': 'female', 'AQU_2019-12-20-4': 'female',\n                            'AQU_2019-12-20-5': 'all', 'AQU_2019-12-20-6': 'all', 'AQU_2019-12-20-7': 'female',\n                            'AQU_2019-12-20-8': 'all', 'AQU_2019-12-21-1': 'female', 'AQU_2019-12-21-2': 'all',\n                            'AQU_2019-12-21-3': 'all', 'AQU_2019-12-21-4': 'all', 'AQU_2019-12-21-5': 'all',\n                            'AQU_2019-12-21-6': 'all', 'AQU_2019-12-21-7': 'all', 'AQU_2019-12-21-8': 'all',\n                            'AQU_2019-12-21-9': 'female', 'AQU_2019-12-22-1': 'female', 'AQU_2019-12-22-2': 'female',\n                            'AQU_2019-12-22-3': 'female', 'AQU_2019-12-22-4': 'all', 'AQU_2019-12-22-5': 'female',\n                            'AQU_2019-12-22-6': 'female', 'AQU_2019-12-22-7': 'all', 'AQU_2019-12-22-8': 'female',\n                            'AQU_2019-12-22-9': 'all', 'AQU_2019-12-22-10': 'all', 'AQU_2019-12-28-1': 'female',\n                            'AQU_2019-12-28-2': 'all', 'AQU_2019-12-28-3': 'all', 'AQU_2019-12-28-4': 'all',\n                            'AQU_2019-12-28-5': 'female', 'AQU_2019-12-28-6': 'all', 'AQU_2019-12-28-7': 'all',\n                            'AQU_2019-12-28-8': 'female', 'AQU_2019-12-28-9': 'female', 'AQU_2019-12-29-1': 'all',\n                            'AQU_2019-12-29-2': 'female', 'AQU_2019-12-29-3': 'all', 'AQU_2019-12-29-4': 'all',\n                            'AQU_2019-12-29-5': 'all', 'AQU_2019-12-29-6': 'female', 'AQU_2019-12-29-7': 'all',\n                            'AQU_2019-12-29-8': 'female', 'AQU_2019-12-29-9': 'all', 'AQU_2019-12-30-1': 'all',\n                            'AQU_2019-12-30-2': 'all', 'AQU_2019-12-30-3': 'all', 'AQU_2019-12-30-4': 'female',\n                            'AQU_2019-12-30-5': 'all', 'AQU_2019-12-30-6': 'female', 'AQU_2019-12-30-7': 'all',\n                            'AQU_2019-12-30-8': 'female', 'AQU_2019-12-31-1': 'female', 'AQU_2019-12-31-2': 'female',\n                            'AQU_2019-12-31-3': 'all', 'AQU_2019-12-31-4': 'all', 'AQU_2019-12-31-5': 'all',\n                            'AQU_2019-12-31-6': 'all', 'AQU_2019-12-31-7': 'all', 'AQU_2019-12-31-8': 'all',\n                            'BEL_2019-04-26-1': 'all', 'BEL_2019-04-26-2': 'female', 'BEL_2019-04-26-3': 'female',\n                            'BEL_2019-04-26-4': 'female', 'BEL_2019-04-26-5': 'female', 'BEL_2019-04-26-6': 'female',\n                            'BEL_2019-04-26-7': 'female', 'BEL_2019-04-26-8': 'all', 'BEL_2019-04-26-9': 'female',\n                            'BEL_2019-04-27-1': 'all', 'BEL_2019-04-27-2': 'all', 'BEL_2019-04-27-3': 'all',\n                            'BEL_2019-04-27-4': 'female', 'BEL_2019-04-27-5': 'all', 'BEL_2019-04-27-6': 'all',\n                            'BEL_2019-04-27-7': 'all', 'BEL_2019-04-27-8': 'all', 'BEL_2019-04-27-9': 'all',\n                            'BEL_2019-04-27-10': 'all', 'BEL_2019-04-28-1': 'all', 'BEL_2019-04-28-2': 'all',\n                            'BEL_2019-04-28-3': 'all', 'BEL_2019-04-28-4': 'all', 'BEL_2019-04-28-5': 'female',\n                            'BEL_2019-04-28-6': 'female', 'BEL_2019-04-28-7': 'all', 'BEL_2019-04-28-8': 'female',\n                            'BEL_2019-04-28-9': 'female', 'BEL_2019-04-28-10': 'female', 'BEL_2019-05-02-1': 'female',\n                            'BEL_2019-05-02-2': 'all', 'BEL_2019-05-02-3': 'female', 'BEL_2019-05-02-4': 'female',\n                            'BEL_2019-05-02-5': 'female', 'BEL_2019-05-02-6': 'all', 'BEL_2019-05-02-7': 'female',\n                            'BEL_2019-05-02-8': 'all', 'BEL_2019-05-02-9': 'female', 'BEL_2019-05-03-1': 'female',\n                            'BEL_2019-05-03-2': 'female', 'BEL_2019-05-03-3': 'all', 'BEL_2019-05-03-4': 'female',\n                            'BEL_2019-05-04-1': 'all', 'BEL_2019-05-04-2': 'all', 'BEL_2019-05-04-3': 'all',\n                            'BEL_2019-05-04-4': 'female', 'BEL_2019-05-04-5': 'female', 'BEL_2019-05-04-6': 'all',\n                            'BEL_2019-05-04-7': 'all', 'BEL_2019-05-04-8': 'all', 'BEL_2019-05-04-9': 'all',\n                            'BEL_2019-05-04-10': 'all', 'BEL_2019-05-04-11': 'all', 'BEL_2019-05-04-12': 'female',\n                            'BEL_2019-05-05-1': 'all', 'BEL_2019-05-05-2': 'female', 'BEL_2019-05-05-3': 'female',\n                            'BEL_2019-05-05-4': 'female', 'BEL_2019-05-05-5': 'female', 'BEL_2019-05-05-6': 'female',\n                            'BEL_2019-05-05-7': 'all', 'BEL_2019-05-05-8': 'female', 'BEL_2019-05-05-9': 'female',\n                            'BEL_2019-05-09-1': 'female', 'BEL_2019-05-09-2': 'female', 'BEL_2019-05-09-3': 'all',\n                            'BEL_2019-05-09-4': 'all', 'BEL_2019-05-09-5': 'all', 'BEL_2019-05-09-6': 'female',\n                            'BEL_2019-05-09-7': 'all', 'BEL_2019-05-09-8': 'all', 'BEL_2019-05-09-9': 'female',\n                            'BEL_2019-05-10-1': 'female', 'BEL_2019-05-10-2': 'female', 'BEL_2019-05-10-3': 'all',\n                            'BEL_2019-05-10-4': 'all', 'BEL_2019-05-10-5': 'all', 'BEL_2019-05-10-6': 'female',\n                            'BEL_2019-05-10-7': 'all', 'BEL_2019-05-10-8': 'all', 'BEL_2019-05-10-9': 'all',\n                            'BEL_2019-05-11-1': 'female', 'BEL_2019-05-11-2': 'all', 'BEL_2019-05-11-3': 'female',\n                            'BEL_2019-05-11-4': 'all', 'BEL_2019-05-11-5': 'all', 'BEL_2019-05-11-6': 'all',\n                            'BEL_2019-05-11-7': 'female', 'BEL_2019-05-11-8': 'female', 'BEL_2019-05-11-9': 'all',\n                            'BEL_2019-05-11-10': 'all', 'BEL_2019-05-11-11': 'all', 'BEL_2019-05-12-1': 'all',\n                            'BEL_2019-05-12-2': 'all', 'BEL_2019-05-12-3': 'female', 'BEL_2019-05-12-4': 'all',\n                            'BEL_2019-05-12-5': 'all', 'BEL_2019-05-12-6': 'all', 'BEL_2019-05-12-7': 'female',\n                            'BEL_2019-05-12-8': 'all', 'BEL_2019-05-12-9': 'all', 'BEL_2019-05-16-1': 'female',\n                            'BEL_2019-05-16-2': 'female', 'BEL_2019-05-16-3': 'all', 'BEL_2019-05-16-4': 'female',\n                            'BEL_2019-05-16-5': 'all', 'BEL_2019-05-16-6': 'all', 'BEL_2019-05-16-7': 'all',\n                            'BEL_2019-05-16-8': 'all', 'BEL_2019-05-16-9': 'female', 'BEL_2019-05-17-1': 'all',\n                            'BEL_2019-05-17-2': 'all', 'BEL_2019-05-17-3': 'female', 'BEL_2019-05-17-4': 'all',\n                            'BEL_2019-05-17-5': 'all', 'BEL_2019-05-17-6': 'all', 'BEL_2019-05-17-7': 'all',\n                            'BEL_2019-05-17-8': 'all', 'BEL_2019-05-17-9': 'all', 'BEL_2019-05-18-1': 'female',\n                            'BEL_2019-05-18-2': 'female', 'BEL_2019-05-18-3': 'female', 'BEL_2019-05-18-4': 'all',\n                            'BEL_2019-05-18-5': 'all', 'BEL_2019-05-18-6': 'all', 'BEL_2019-05-18-7': 'female',\n                            'BEL_2019-05-18-8': 'all', 'BEL_2019-05-18-9': 'all', 'BEL_2019-05-18-10': 'female',\n                            'BEL_2019-05-18-11': 'female', 'BEL_2019-05-18-12': 'all', 'BEL_2019-05-19-1': 'all',\n                            'BEL_2019-05-19-2': 'all', 'BEL_2019-05-19-3': 'female', 'BEL_2019-05-19-4': 'female',\n                            'BEL_2019-05-19-5': 'female', 'BEL_2019-05-19-6': 'all', 'BEL_2019-05-19-7': 'all',\n                            'BEL_2019-05-19-8': 'female', 'BEL_2019-05-19-9': 'female', 'BEL_2019-05-23-1': 'female',\n                            'BEL_2019-05-23-2': 'female', 'BEL_2019-05-23-3': 'female', 'BEL_2019-05-23-4': 'all',\n                            'BEL_2019-05-23-5': 'all', 'BEL_2019-05-23-6': 'all', 'BEL_2019-05-23-7': 'female',\n                            'BEL_2019-05-23-8': 'all', 'BEL_2019-05-23-9': 'all', 'BEL_2019-05-24-1': 'all',\n                            'BEL_2019-05-24-2': 'all', 'BEL_2019-05-24-3': 'all', 'BEL_2019-05-24-4': 'all',\n                            'BEL_2019-05-24-5': 'all', 'BEL_2019-05-24-6': 'female', 'BEL_2019-05-24-7': 'female',\n                            'BEL_2019-05-24-8': 'female', 'BEL_2019-05-24-9': 'female', 'BEL_2019-05-25-1': 'all',\n                            'BEL_2019-05-25-2': 'all', 'BEL_2019-05-25-3': 'all', 'BEL_2019-05-25-4': 'female',\n                            'BEL_2019-05-25-5': 'female', 'BEL_2019-05-25-6': 'female', 'BEL_2019-05-25-7': 'female',\n                            'BEL_2019-05-25-8': 'female', 'BEL_2019-05-25-9': 'all', 'BEL_2019-05-25-10': 'all',\n                            'BEL_2019-05-26-1': 'all', 'BEL_2019-05-26-2': 'female', 'BEL_2019-05-26-3': 'female',\n                            'BEL_2019-05-26-4': 'female', 'BEL_2019-05-26-5': 'female', 'BEL_2019-05-26-6': 'all',\n                            'BEL_2019-05-26-7': 'female', 'BEL_2019-05-26-8': 'all', 'BEL_2019-05-26-9': 'all',\n                            'BEL_2019-05-27-1': 'all', 'BEL_2019-05-27-2': 'female', 'BEL_2019-05-27-3': 'all',\n                            'BEL_2019-05-27-4': 'female', 'BEL_2019-05-27-5': 'female', 'BEL_2019-05-27-6': 'female',\n                            'BEL_2019-05-27-7': 'female', 'BEL_2019-05-27-8': 'all', 'BEL_2019-05-27-9': 'all',\n                            'BEL_2019-05-27-10': 'all', 'BEL_2019-05-27-11': 'all', 'BEL_2019-05-30-1': 'female',\n                            'BEL_2019-05-30-2': 'all', 'BEL_2019-05-30-3': 'female', 'BEL_2019-05-30-4': 'female',\n                            'BEL_2019-05-30-5': 'all', 'BEL_2019-05-30-6': 'female', 'BEL_2019-05-30-7': 'female',\n                            'BEL_2019-05-30-8': 'all', 'BEL_2019-05-31-1': 'female', 'BEL_2019-05-31-2': 'all',\n                            'BEL_2019-05-31-3': 'all', 'BEL_2019-05-31-4': 'all', 'BEL_2019-05-31-5': 'female',\n                            'BEL_2019-05-31-6': 'all', 'BEL_2019-05-31-7': 'all', 'BEL_2019-05-31-8': 'all',\n                            'BEL_2019-05-31-9': 'all', 'BEL_2019-06-01-1': 'all', 'BEL_2019-06-01-2': 'female',\n                            'BEL_2019-06-01-3': 'all', 'BEL_2019-06-01-4': 'all', 'BEL_2019-06-01-5': 'female',\n                            'BEL_2019-06-01-6': 'all', 'BEL_2019-06-01-7': 'all', 'BEL_2019-06-01-8': 'all',\n                            'BEL_2019-06-01-9': 'female', 'BEL_2019-06-02-1': 'all', 'BEL_2019-06-02-2': 'female',\n                            'BEL_2019-06-02-3': 'all', 'BEL_2019-06-02-4': 'all', 'BEL_2019-06-02-5': 'female',\n                            'BEL_2019-06-02-6': 'all', 'BEL_2019-06-02-7': 'all', 'BEL_2019-06-02-8': 'all',\n                            'BEL_2019-06-02-9': 'female', 'BEL_2019-06-02-10': 'all', 'BEL_2019-06-06-1': 'all',\n                            'BEL_2019-06-06-2': 'all', 'BEL_2019-06-06-3': 'female', 'BEL_2019-06-06-4': 'female',\n                            'BEL_2019-06-06-5': 'female', 'BEL_2019-06-06-6': 'all', 'BEL_2019-06-06-7': 'female',\n                            'BEL_2019-06-06-8': 'female', 'BEL_2019-06-06-9': 'all', 'BEL_2019-06-07-1': 'all',\n                            'BEL_2019-06-07-2': 'female', 'BEL_2019-06-07-3': 'all', 'BEL_2019-06-07-4': 'all',\n                            'BEL_2019-06-07-5': 'female', 'BEL_2019-06-07-6': 'all', 'BEL_2019-06-07-7': 'all',\n                            'BEL_2019-06-07-8': 'all', 'BEL_2019-06-07-9': 'female', 'BEL_2019-06-07-10': 'all',\n                            'BEL_2019-06-07-11': 'female', 'BEL_2019-06-08-1': 'all', 'BEL_2019-06-08-2': 'all',\n                            'BEL_2019-06-08-3': 'all', 'BEL_2019-06-08-4': 'female', 'BEL_2019-06-08-5': 'female',\n                            'BEL_2019-06-08-6': 'all', 'BEL_2019-06-08-7': 'female', 'BEL_2019-06-08-8': 'all',\n                            'BEL_2019-06-08-9': 'all', 'BEL_2019-06-08-10': 'all', 'BEL_2019-06-08-11': 'all',\n                            'BEL_2019-06-08-12': 'all', 'BEL_2019-06-08-13': 'all', 'BEL_2019-06-09-1': 'female',\n                            'BEL_2019-06-09-2': 'all', 'BEL_2019-06-09-3': 'female', 'BEL_2019-06-09-4': 'female',\n                            'BEL_2019-06-09-5': 'all', 'BEL_2019-06-09-6': 'all', 'BEL_2019-06-09-7': 'all',\n                            'BEL_2019-06-09-8': 'all', 'BEL_2019-06-09-9': 'all', 'BEL_2019-06-09-10': 'all',\n                            'BEL_2019-06-12-1': 'all', 'BEL_2019-06-12-2': 'female', 'BEL_2019-06-12-3': 'female',\n                            'BEL_2019-06-12-4': 'all', 'BEL_2019-06-12-5': 'all', 'BEL_2019-06-12-6': 'female',\n                            'BEL_2019-06-12-7': 'all', 'BEL_2019-06-12-8': 'female', 'BEL_2019-06-12-9': 'all',\n                            'BEL_2019-06-13-1': 'all', 'BEL_2019-06-13-2': 'female', 'BEL_2019-06-13-3': 'all',\n                            'BEL_2019-06-13-4': 'female', 'BEL_2019-06-13-5': 'female', 'BEL_2019-06-13-6': 'all',\n                            'BEL_2019-06-13-7': 'female', 'BEL_2019-06-13-8': 'female', 'BEL_2019-06-13-9': 'female',\n                            'BEL_2019-06-14-1': 'female', 'BEL_2019-06-14-2': 'all', 'BEL_2019-06-14-3': 'all',\n                            'BEL_2019-06-14-4': 'all', 'BEL_2019-06-14-5': 'all', 'BEL_2019-06-14-6': 'all',\n                            'BEL_2019-06-14-7': 'all', 'BEL_2019-06-14-8': 'female', 'BEL_2019-06-14-9': 'female',\n                            'BEL_2019-06-15-1': 'all', 'BEL_2019-06-15-2': 'female', 'BEL_2019-06-15-3': 'female',\n                            'BEL_2019-06-15-4': 'all', 'BEL_2019-06-15-5': 'all', 'BEL_2019-06-15-6': 'female',\n                            'BEL_2019-06-15-7': 'all', 'BEL_2019-06-15-8': 'all', 'BEL_2019-06-15-9': 'female',\n                            'BEL_2019-06-15-10': 'all', 'BEL_2019-06-16-1': 'all', 'BEL_2019-06-16-2': 'female',\n                            'BEL_2019-06-16-3': 'all', 'BEL_2019-06-16-4': 'all', 'BEL_2019-06-16-5': 'all',\n                            'BEL_2019-06-16-6': 'female', 'BEL_2019-06-16-7': 'all', 'BEL_2019-06-16-8': 'all',\n                            'BEL_2019-06-16-9': 'all', 'BEL_2019-06-19-1': 'female', 'BEL_2019-06-19-2': 'female',\n                            'BEL_2019-06-19-3': 'female', 'BEL_2019-06-19-4': 'all', 'BEL_2019-06-19-5': 'all',\n                            'BEL_2019-06-19-6': 'all', 'BEL_2019-06-19-7': 'female', 'BEL_2019-06-19-8': 'all',\n                            'BEL_2019-06-19-9': 'all', 'BEL_2019-06-20-1': 'all', 'BEL_2019-06-20-2': 'female',\n                            'BEL_2019-06-20-3': 'all', 'BEL_2019-06-20-4': 'female', 'BEL_2019-06-20-5': 'female',\n                            'BEL_2019-06-20-6': 'female', 'BEL_2019-06-20-7': 'female', 'BEL_2019-06-20-8': 'all',\n                            'BEL_2019-06-20-9': 'female', 'BEL_2019-06-21-1': 'female', 'BEL_2019-06-21-2': 'all',\n                            'BEL_2019-06-21-3': 'all', 'BEL_2019-06-21-4': 'all', 'BEL_2019-06-21-5': 'female',\n                            'BEL_2019-06-21-6': 'all', 'BEL_2019-06-21-7': 'all', 'BEL_2019-06-21-8': 'female',\n                            'BEL_2019-06-21-9': 'all', 'BEL_2019-06-22-1': 'all', 'BEL_2019-06-22-2': 'all',\n                            'BEL_2019-06-22-3': 'female', 'BEL_2019-06-22-4': 'female', 'BEL_2019-06-22-5': 'all',\n                            'BEL_2019-06-22-6': 'all', 'BEL_2019-06-22-7': 'female', 'BEL_2019-06-22-8': 'all',\n                            'BEL_2019-06-22-9': 'female', 'BEL_2019-06-22-10': 'all', 'BEL_2019-06-23-1': 'female',\n                            'BEL_2019-06-23-2': 'female', 'BEL_2019-06-23-3': 'female', 'BEL_2019-06-23-4': 'female',\n                            'BEL_2019-06-23-5': 'female', 'BEL_2019-06-23-6': 'all', 'BEL_2019-06-23-7': 'all',\n                            'BEL_2019-06-23-8': 'all', 'BEL_2019-06-23-9': 'female', 'BEL_2019-06-26-1': 'all',\n                            'BEL_2019-06-26-2': 'all', 'BEL_2019-06-26-3': 'all', 'BEL_2019-06-26-4': 'all',\n                            'BEL_2019-06-26-5': 'all', 'BEL_2019-06-26-6': 'all', 'BEL_2019-06-26-7': 'female',\n                            'BEL_2019-06-26-8': 'female', 'BEL_2019-06-27-1': 'all', 'BEL_2019-06-27-2': 'female',\n                            'BEL_2019-06-27-3': 'all', 'BEL_2019-06-27-4': 'female', 'BEL_2019-06-27-5': 'all',\n                            'BEL_2019-06-27-6': 'female', 'BEL_2019-06-27-7': 'all', 'BEL_2019-06-27-8': 'all',\n                            'BEL_2019-06-27-9': 'female', 'BEL_2019-06-28-1': 'female', 'BEL_2019-06-28-2': 'all',\n                            'BEL_2019-06-28-3': 'all', 'BEL_2019-06-28-4': 'all', 'BEL_2019-06-28-5': 'all',\n                            'BEL_2019-06-28-6': 'all', 'BEL_2019-06-28-7': 'female', 'BEL_2019-06-28-8': 'all',\n                            'BEL_2019-06-28-9': 'all', 'BEL_2019-06-29-1': 'all', 'BEL_2019-06-29-2': 'all',\n                            'BEL_2019-06-29-3': 'all', 'BEL_2019-06-29-4': 'all', 'BEL_2019-06-29-5': 'all',\n                            'BEL_2019-06-29-6': 'all', 'BEL_2019-06-29-7': 'female', 'BEL_2019-06-29-8': 'female',\n                            'BEL_2019-06-29-9': 'female', 'BEL_2019-06-30-1': 'female', 'BEL_2019-06-30-2': 'female',\n                            'BEL_2019-06-30-3': 'all', 'BEL_2019-06-30-4': 'female', 'BEL_2019-06-30-5': 'all',\n                            'BEL_2019-06-30-6': 'all', 'BEL_2019-06-30-7': 'all', 'BEL_2019-06-30-8': 'all',\n                            'BEL_2019-07-03-1': 'female', 'BEL_2019-07-03-2': 'female', 'BEL_2019-07-03-3': 'all',\n                            'BEL_2019-07-03-4': 'female', 'BEL_2019-07-03-5': 'female', 'BEL_2019-07-03-6': 'all',\n                            'BEL_2019-07-03-7': 'all', 'BEL_2019-07-03-8': 'all', 'BEL_2019-07-04-1': 'all',\n                            'BEL_2019-07-04-2': 'all', 'BEL_2019-07-04-3': 'all', 'BEL_2019-07-04-4': 'all',\n                            'BEL_2019-07-04-5': 'all', 'BEL_2019-07-04-6': 'female', 'BEL_2019-07-04-7': 'all',\n                            'BEL_2019-07-04-8': 'all', 'BEL_2019-07-04-9': 'female', 'BEL_2019-07-05-1': 'female',\n                            'BEL_2019-07-05-2': 'female', 'BEL_2019-07-05-3': 'all', 'BEL_2019-07-05-4': 'all',\n                            'BEL_2019-07-05-5': 'all', 'BEL_2019-07-05-6': 'female', 'BEL_2019-07-05-7': 'female',\n                            'BEL_2019-07-05-8': 'female', 'BEL_2019-07-05-9': 'female', 'BEL_2019-07-06-1': 'female',\n                            'BEL_2019-07-06-2': 'all', 'BEL_2019-07-06-3': 'female', 'BEL_2019-07-06-4': 'female',\n                            'BEL_2019-07-06-5': 'all', 'BEL_2019-07-06-6': 'all', 'BEL_2019-07-06-7': 'female',\n                            'BEL_2019-07-06-8': 'all', 'BEL_2019-07-06-9': 'all', 'BEL_2019-07-06-10': 'all',\n                            'BEL_2019-07-06-11': 'female', 'BEL_2019-07-07-1': 'all', 'BEL_2019-07-07-2': 'all',\n                            'BEL_2019-07-07-3': 'all', 'BEL_2019-07-07-4': 'female', 'BEL_2019-07-07-5': 'female',\n                            'BEL_2019-07-07-6': 'all', 'BEL_2019-07-07-7': 'all', 'BEL_2019-07-07-8': 'all',\n                            'BEL_2019-07-07-9': 'female', 'BEL_2019-09-06-1': 'all', 'BEL_2019-09-06-2': 'female',\n                            'BEL_2019-09-06-3': 'female', 'BEL_2019-09-06-4': 'all', 'BEL_2019-09-06-5': 'female',\n                            'BEL_2019-09-06-6': 'female', 'BEL_2019-09-06-7': 'female', 'BEL_2019-09-06-8': 'female',\n                            'BEL_2019-09-07-1': 'female', 'BEL_2019-09-07-2': 'female', 'BEL_2019-09-07-3': 'all',\n                            'BEL_2019-09-07-4': 'all', 'BEL_2019-09-07-5': 'all', 'BEL_2019-09-07-6': 'female',\n                            'BEL_2019-09-07-7': 'all', 'BEL_2019-09-07-8': 'all', 'BEL_2019-09-07-9': 'female',\n                            'BEL_2019-09-07-10': 'all', 'BEL_2019-09-07-11': 'all', 'BEL_2019-09-08-1': 'all',\n                            'BEL_2019-09-08-2': 'female', 'BEL_2019-09-08-3': 'all', 'BEL_2019-09-08-4': 'all',\n                            'BEL_2019-09-08-5': 'all', 'BEL_2019-09-08-6': 'female', 'BEL_2019-09-08-7': 'female',\n                            'BEL_2019-09-08-8': 'all', 'BEL_2019-09-08-9': 'all', 'BEL_2019-09-11-1': 'all',\n                            'BEL_2019-09-11-2': 'all', 'BEL_2019-09-11-3': 'female', 'BEL_2019-09-11-4': 'female',\n                            'BEL_2019-09-11-5': 'female', 'BEL_2019-09-11-6': 'female', 'BEL_2019-09-11-7': 'female',\n                            'BEL_2019-09-11-8': 'female', 'BEL_2019-09-12-1': 'female', 'BEL_2019-09-12-2': 'all',\n                            'BEL_2019-09-12-3': 'all', 'BEL_2019-09-12-4': 'all', 'BEL_2019-09-12-5': 'all',\n                            'BEL_2019-09-12-6': 'all', 'BEL_2019-09-12-7': 'female', 'BEL_2019-09-12-8': 'female',\n                            'BEL_2019-09-13-1': 'all', 'BEL_2019-09-13-2': 'female', 'BEL_2019-09-13-3': 'female',\n                            'BEL_2019-09-13-4': 'female', 'BEL_2019-09-13-5': 'female', 'BEL_2019-09-13-6': 'all',\n                            'BEL_2019-09-13-7': 'female', 'BEL_2019-09-13-8': 'all', 'BEL_2019-09-14-1': 'all',\n                            'BEL_2019-09-14-2': 'all', 'BEL_2019-09-14-3': 'all', 'BEL_2019-09-14-4': 'female',\n                            'BEL_2019-09-14-5': 'all', 'BEL_2019-09-14-6': 'female', 'BEL_2019-09-14-7': 'female',\n                            'BEL_2019-09-14-8': 'female', 'BEL_2019-09-14-9': 'all', 'BEL_2019-09-14-10': 'female',\n                            'BEL_2019-09-14-11': 'female', 'BEL_2019-09-15-1': 'female', 'BEL_2019-09-15-2': 'all',\n                            'BEL_2019-09-15-3': 'female', 'BEL_2019-09-15-4': 'female', 'BEL_2019-09-15-5': 'female',\n                            'BEL_2019-09-15-6': 'all', 'BEL_2019-09-15-7': 'all', 'BEL_2019-09-15-8': 'all',\n                            'BEL_2019-09-15-9': 'all', 'BEL_2019-09-15-10': 'all', 'BEL_2019-09-18-1': 'all',\n                            'BEL_2019-09-18-2': 'all', 'BEL_2019-09-18-3': 'female', 'BEL_2019-09-18-4': 'female',\n                            'BEL_2019-09-18-5': 'all', 'BEL_2019-09-18-6': 'all', 'BEL_2019-09-18-7': 'female',\n                            'BEL_2019-09-18-8': 'all', 'BEL_2019-09-19-1': 'all', 'BEL_2019-09-19-2': 'all',\n                            'BEL_2019-09-19-3': 'all', 'BEL_2019-09-19-4': 'female', 'BEL_2019-09-19-5': 'female',\n                            'BEL_2019-09-19-6': 'all', 'BEL_2019-09-19-7': 'all', 'BEL_2019-09-19-8': 'female',\n                            'BEL_2019-09-20-1': 'female', 'BEL_2019-09-20-2': 'female', 'BEL_2019-09-20-3': 'all',\n                            'BEL_2019-09-20-4': 'female', 'BEL_2019-09-20-5': 'all', 'BEL_2019-09-20-6': 'female',\n                            'BEL_2019-09-20-7': 'all', 'BEL_2019-09-20-8': 'all', 'BEL_2019-09-21-1': 'all',\n                            'BEL_2019-09-21-2': 'female', 'BEL_2019-09-21-3': 'all', 'BEL_2019-09-21-4': 'all',\n                            'BEL_2019-09-21-5': 'all', 'BEL_2019-09-21-6': 'all', 'BEL_2019-09-21-7': 'female',\n                            'BEL_2019-09-21-8': 'female', 'BEL_2019-09-21-9': 'all', 'BEL_2019-09-21-10': 'all',\n                            'BEL_2019-09-21-11': 'female', 'BEL_2019-09-22-1': 'all', 'BEL_2019-09-22-2': 'female',\n                            'BEL_2019-09-22-3': 'female', 'BEL_2019-09-22-4': 'female', 'BEL_2019-09-22-5': 'female',\n                            'BEL_2019-09-22-6': 'female', 'BEL_2019-09-22-7': 'all', 'BEL_2019-09-22-8': 'female',\n                            'BEL_2019-09-22-9': 'female', 'BEL_2019-09-22-10': 'all', 'BEL_2019-09-25-1': 'female',\n                            'BEL_2019-09-25-2': 'all', 'BEL_2019-09-25-3': 'female', 'BEL_2019-09-25-4': 'all',\n                            'BEL_2019-09-25-5': 'all', 'BEL_2019-09-25-6': 'all', 'BEL_2019-09-25-7': 'all',\n                            'BEL_2019-09-25-8': 'female', 'BEL_2019-09-26-1': 'female', 'BEL_2019-09-26-2': 'all',\n                            'BEL_2019-09-26-3': 'all', 'BEL_2019-09-26-4': 'all', 'BEL_2019-09-26-5': 'all',\n                            'BEL_2019-09-26-6': 'female', 'BEL_2019-09-26-7': 'female', 'BEL_2019-09-26-8': 'all',\n                            'BEL_2019-09-27-1': 'all', 'BEL_2019-09-27-2': 'all', 'BEL_2019-09-27-3': 'female',\n                            'BEL_2019-09-27-4': 'female', 'BEL_2019-09-27-5': 'all', 'BEL_2019-09-27-6': 'all',\n                            'BEL_2019-09-27-7': 'female', 'BEL_2019-09-27-8': 'all', 'BEL_2019-09-28-1': 'female',\n                            'BEL_2019-09-28-2': 'all', 'BEL_2019-09-28-3': 'all', 'BEL_2019-09-28-4': 'all',\n                            'BEL_2019-09-28-5': 'female', 'BEL_2019-09-28-6': 'all', 'BEL_2019-09-28-7': 'female',\n                            'BEL_2019-09-28-8': 'female', 'BEL_2019-09-28-9': 'all', 'BEL_2019-09-28-10': 'all',\n                            'BEL_2019-09-28-11': 'all', 'BEL_2019-09-29-1': 'female', 'BEL_2019-09-29-2': 'all',\n                            'BEL_2019-09-29-3': 'female', 'BEL_2019-09-29-4': 'all', 'BEL_2019-09-29-5': 'female',\n                            'BEL_2019-09-29-6': 'female', 'BEL_2019-09-29-7': 'all', 'BEL_2019-09-29-8': 'female',\n                            'BEL_2019-09-29-9': 'all', 'BEL_2019-10-02-1': 'female', 'BEL_2019-10-02-2': 'female',\n                            'BEL_2019-10-02-3': 'all', 'BEL_2019-10-02-4': 'all', 'BEL_2019-10-02-5': 'all',\n                            'BEL_2019-10-02-6': 'all', 'BEL_2019-10-02-7': 'all', 'BEL_2019-10-02-8': 'female',\n                            'BEL_2019-10-03-1': 'all', 'BEL_2019-10-03-2': 'female', 'BEL_2019-10-03-3': 'all',\n                            'BEL_2019-10-03-4': 'female', 'BEL_2019-10-03-5': 'female', 'BEL_2019-10-03-6': 'female',\n                            'BEL_2019-10-03-7': 'all', 'BEL_2019-10-03-8': 'all', 'BEL_2019-10-04-1': 'all',\n                            'BEL_2019-10-04-2': 'female', 'BEL_2019-10-04-3': 'all', 'BEL_2019-10-04-4': 'all',\n                            'BEL_2019-10-04-5': 'all', 'BEL_2019-10-04-6': 'female', 'BEL_2019-10-04-7': 'female',\n                            'BEL_2019-10-04-8': 'all', 'BEL_2019-10-05-1': 'female', 'BEL_2019-10-05-2': 'all',\n                            'BEL_2019-10-05-3': 'female', 'BEL_2019-10-05-4': 'female', 'BEL_2019-10-05-5': 'all',\n                            'BEL_2019-10-05-6': 'female', 'BEL_2019-10-05-7': 'all', 'BEL_2019-10-05-8': 'all',\n                            'BEL_2019-10-05-9': 'all', 'BEL_2019-10-05-10': 'all', 'BEL_2019-10-05-11': 'all',\n                            'BEL_2019-10-06-1': 'female', 'BEL_2019-10-06-2': 'female', 'BEL_2019-10-06-3': 'all',\n                            'BEL_2019-10-06-4': 'all', 'BEL_2019-10-06-5': 'female', 'BEL_2019-10-06-6': 'female',\n                            'BEL_2019-10-06-7': 'all', 'BEL_2019-10-06-8': 'female', 'BEL_2019-10-06-9': 'female',\n                            'BEL_2019-10-06-10': 'all', 'BEL_2019-10-10-1': 'all', 'BEL_2019-10-10-2': 'all',\n                            'BEL_2019-10-10-3': 'all', 'BEL_2019-10-10-4': 'all', 'BEL_2019-10-10-5': 'female',\n                            'BEL_2019-10-10-6': 'all', 'BEL_2019-10-10-7': 'all', 'BEL_2019-10-10-8': 'female',\n                            'BEL_2019-10-11-1': 'all', 'BEL_2019-10-11-2': 'female', 'BEL_2019-10-11-3': 'female',\n                            'BEL_2019-10-11-4': 'female', 'BEL_2019-10-11-5': 'all', 'BEL_2019-10-11-6': 'all',\n                            'BEL_2019-10-11-7': 'female', 'BEL_2019-10-11-8': 'all', 'BEL_2019-10-12-1': 'female',\n                            'BEL_2019-10-12-2': 'female', 'BEL_2019-10-12-3': 'all', 'BEL_2019-10-12-4': 'female',\n                            'BEL_2019-10-12-5': 'all', 'BEL_2019-10-12-6': 'all', 'BEL_2019-10-12-7': 'female',\n                            'BEL_2019-10-12-8': 'all', 'BEL_2019-10-12-9': 'female', 'BEL_2019-10-12-10': 'all',\n                            'BEL_2019-10-13-1': 'female', 'BEL_2019-10-13-2': 'female', 'BEL_2019-10-13-3': 'female',\n                            'BEL_2019-10-13-4': 'all', 'BEL_2019-10-13-5': 'all', 'BEL_2019-10-13-6': 'female',\n                            'BEL_2019-10-13-7': 'all', 'BEL_2019-10-13-8': 'all', 'BEL_2019-10-13-9': 'female',\n                            'BEL_2019-10-14-1': 'all', 'BEL_2019-10-14-2': 'female', 'BEL_2019-10-14-3': 'female',\n                            'BEL_2019-10-14-4': 'female', 'BEL_2019-10-14-5': 'female', 'BEL_2019-10-14-6': 'female',\n                            'BEL_2019-10-14-7': 'all', 'BEL_2019-10-14-8': 'all', 'BEL_2019-10-14-9': 'all',\n                            'BEL_2019-10-16-1': 'female', 'BEL_2019-10-16-2': 'all', 'BEL_2019-10-16-3': 'all',\n                            'BEL_2019-10-16-4': 'all', 'BEL_2019-10-16-5': 'all', 'BEL_2019-10-16-6': 'female',\n                            'BEL_2019-10-16-7': 'female', 'BEL_2019-10-16-8': 'all', 'BEL_2019-10-18-1': 'all',\n                            'BEL_2019-10-18-2': 'female', 'BEL_2019-10-18-3': 'female', 'BEL_2019-10-18-4': 'all',\n                            'BEL_2019-10-18-5': 'female', 'BEL_2019-10-18-6': 'all', 'BEL_2019-10-18-7': 'all',\n                            'BEL_2019-10-18-8': 'female', 'BEL_2019-10-19-1': 'all', 'BEL_2019-10-19-2': 'female',\n                            'BEL_2019-10-19-3': 'female', 'BEL_2019-10-19-4': 'all', 'BEL_2019-10-19-5': 'all',\n                            'BEL_2019-10-19-6': 'all', 'BEL_2019-10-19-7': 'female', 'BEL_2019-10-19-8': 'all',\n                            'BEL_2019-10-19-9': 'female', 'BEL_2019-10-19-10': 'female', 'BEL_2019-10-19-11': 'all',\n                            'BEL_2019-10-20-1': 'all', 'BEL_2019-10-20-2': 'all', 'BEL_2019-10-20-3': 'female',\n                            'BEL_2019-10-20-4': 'female', 'BEL_2019-10-20-5': 'all', 'BEL_2019-10-20-6': 'female',\n                            'BEL_2019-10-20-7': 'all', 'BEL_2019-10-20-8': 'female', 'BEL_2019-10-20-9': 'female',\n                            'BEL_2019-10-20-10': 'female', 'BEL_2019-10-23-1': 'female', 'BEL_2019-10-23-2': 'all',\n                            'BEL_2019-10-23-3': 'all', 'BEL_2019-10-23-4': 'female', 'BEL_2019-10-23-5': 'all',\n                            'BEL_2019-10-23-6': 'female', 'BEL_2019-10-23-7': 'all', 'BEL_2019-10-23-8': 'female',\n                            'BEL_2019-10-24-1': 'all', 'BEL_2019-10-24-2': 'all', 'BEL_2019-10-24-3': 'all',\n                            'BEL_2019-10-24-4': 'female', 'BEL_2019-10-24-5': 'all', 'BEL_2019-10-24-6': 'all',\n                            'BEL_2019-10-24-7': 'female', 'BEL_2019-10-24-8': 'female', 'BEL_2019-10-25-1': 'female',\n                            'BEL_2019-10-25-2': 'female', 'BEL_2019-10-25-3': 'all', 'BEL_2019-10-25-4': 'female',\n                            'BEL_2019-10-25-5': 'female', 'BEL_2019-10-25-6': 'female', 'BEL_2019-10-25-7': 'all',\n                            'BEL_2019-10-25-8': 'all', 'BEL_2019-10-25-9': 'all', 'BEL_2019-10-26-1': 'all',\n                            'BEL_2019-10-26-2': 'all', 'BEL_2019-10-26-3': 'female', 'BEL_2019-10-26-4': 'all',\n                            'BEL_2019-10-26-5': 'all', 'BEL_2019-10-26-6': 'all', 'BEL_2019-10-26-7': 'female',\n                            'BEL_2019-10-26-8': 'all', 'BEL_2019-10-26-9': 'all', 'BEL_2019-10-26-10': 'female',\n                            'BEL_2019-10-27-1': 'all', 'SAR_2019-07-11-1': 'all', 'SAR_2019-07-11-2': 'all',\n                            'SAR_2019-07-11-3': 'all', 'SAR_2019-07-11-4': 'all', 'SAR_2019-07-11-5': 'female',\n                            'SAR_2019-07-11-6': 'all', 'SAR_2019-07-11-7': 'female', 'SAR_2019-07-11-8': 'female',\n                            'SAR_2019-07-11-9': 'all', 'SAR_2019-07-11-10': 'female', 'SAR_2019-07-12-1': 'all',\n                            'SAR_2019-07-12-2': 'all', 'SAR_2019-07-12-3': 'female', 'SAR_2019-07-12-4': 'all',\n                            'SAR_2019-07-12-5': 'female', 'SAR_2019-07-12-6': 'all', 'SAR_2019-07-12-7': 'female',\n                            'SAR_2019-07-12-8': 'all', 'SAR_2019-07-12-9': 'all', 'SAR_2019-07-12-10': 'female',\n                            'SAR_2019-07-13-1': 'female', 'SAR_2019-07-13-2': 'female', 'SAR_2019-07-13-3': 'all',\n                            'SAR_2019-07-13-4': 'all', 'SAR_2019-07-13-5': 'female', 'SAR_2019-07-13-6': 'all',\n                            'SAR_2019-07-13-7': 'all', 'SAR_2019-07-13-8': 'female', 'SAR_2019-07-13-9': 'female',\n                            'SAR_2019-07-13-10': 'all', 'SAR_2019-07-13-11': 'all', 'SAR_2019-07-14-1': 'female',\n                            'SAR_2019-07-14-2': 'all', 'SAR_2019-07-14-3': 'all', 'SAR_2019-07-14-4': 'all',\n                            'SAR_2019-07-14-5': 'female', 'SAR_2019-07-14-6': 'female', 'SAR_2019-07-14-7': 'all',\n                            'SAR_2019-07-14-8': 'female', 'SAR_2019-07-14-9': 'female', 'SAR_2019-07-14-10': 'all',\n                            'SAR_2019-07-17-1': 'all', 'SAR_2019-07-17-2': 'all', 'SAR_2019-07-17-3': 'all',\n                            'SAR_2019-07-17-4': 'all', 'SAR_2019-07-17-5': 'female', 'SAR_2019-07-17-6': 'female',\n                            'SAR_2019-07-17-7': 'all', 'SAR_2019-07-17-8': 'female', 'SAR_2019-07-17-9': 'female',\n                            'SAR_2019-07-17-10': 'female', 'SAR_2019-07-18-1': 'all', 'SAR_2019-07-18-2': 'all',\n                            'SAR_2019-07-18-3': 'female', 'SAR_2019-07-18-4': 'all', 'SAR_2019-07-18-5': 'all',\n                            'SAR_2019-07-18-6': 'female', 'SAR_2019-07-18-7': 'all', 'SAR_2019-07-18-8': 'all',\n                            'SAR_2019-07-18-9': 'all', 'SAR_2019-07-18-10': 'female', 'SAR_2019-07-19-1': 'all',\n                            'SAR_2019-07-19-2': 'female', 'SAR_2019-07-19-3': 'female', 'SAR_2019-07-19-4': 'all',\n                            'SAR_2019-07-19-5': 'female', 'SAR_2019-07-19-6': 'all', 'SAR_2019-07-19-7': 'all',\n                            'SAR_2019-07-19-8': 'all', 'SAR_2019-07-19-9': 'female', 'SAR_2019-07-19-10': 'all',\n                            'SAR_2019-07-21-1': 'all', 'SAR_2019-07-21-2': 'all', 'SAR_2019-07-21-3': 'all',\n                            'SAR_2019-07-21-4': 'female', 'SAR_2019-07-21-5': 'all', 'SAR_2019-07-21-6': 'female',\n                            'SAR_2019-07-21-7': 'female', 'SAR_2019-07-21-8': 'all', 'SAR_2019-07-21-9': 'all',\n                            'SAR_2019-07-21-10': 'all', 'SAR_2019-07-21-11': 'female', 'SAR_2019-07-21-12': 'all',\n                            'SAR_2019-07-21-13': 'female', 'SAR_2019-07-24-1': 'all', 'SAR_2019-07-24-2': 'all',\n                            'SAR_2019-07-24-3': 'female', 'SAR_2019-07-24-4': 'all', 'SAR_2019-07-24-5': 'all',\n                            'SAR_2019-07-24-6': 'all', 'SAR_2019-07-24-7': 'all', 'SAR_2019-07-24-8': 'female',\n                            'SAR_2019-07-24-9': 'female', 'SAR_2019-07-24-10': 'female', 'SAR_2019-07-25-1': 'all',\n                            'SAR_2019-07-25-2': 'female', 'SAR_2019-07-25-3': 'female', 'SAR_2019-07-25-4': 'all',\n                            'SAR_2019-07-26-1': 'female', 'SAR_2019-07-26-2': 'all', 'SAR_2019-07-26-3': 'all',\n                            'SAR_2019-07-26-4': 'female', 'SAR_2019-07-26-5': 'female', 'SAR_2019-07-26-6': 'female',\n                            'SAR_2019-07-26-7': 'female', 'SAR_2019-07-26-8': 'all', 'SAR_2019-07-26-9': 'all',\n                            'SAR_2019-07-26-10': 'all', 'SAR_2019-07-27-1': 'all', 'SAR_2019-07-27-2': 'female',\n                            'SAR_2019-07-27-3': 'all', 'SAR_2019-07-27-4': 'all', 'SAR_2019-07-27-5': 'all',\n                            'SAR_2019-07-27-6': 'female', 'SAR_2019-07-27-7': 'all', 'SAR_2019-07-27-8': 'all',\n                            'SAR_2019-07-27-9': 'all', 'SAR_2019-07-27-10': 'all', 'SAR_2019-07-27-11': 'all',\n                            'SAR_2019-07-27-12': 'all', 'SAR_2019-07-28-1': 'all', 'SAR_2019-07-28-2': 'all',\n                            'SAR_2019-07-28-3': 'all', 'SAR_2019-07-28-4': 'all', 'SAR_2019-07-28-5': 'all',\n                            'SAR_2019-07-28-6': 'all', 'SAR_2019-07-28-7': 'female', 'SAR_2019-07-28-8': 'female',\n                            'SAR_2019-07-28-9': 'all', 'SAR_2019-07-28-10': 'female', 'SAR_2019-07-28-11': 'all',\n                            'SAR_2019-07-28-12': 'female', 'SAR_2019-07-31-1': 'female', 'SAR_2019-07-31-2': 'female',\n                            'SAR_2019-07-31-3': 'female', 'SAR_2019-07-31-4': 'female', 'SAR_2019-07-31-5': 'female',\n                            'SAR_2019-07-31-6': 'female', 'SAR_2019-07-31-7': 'female', 'SAR_2019-07-31-8': 'female',\n                            'SAR_2019-07-31-9': 'female', 'SAR_2019-07-31-10': 'female', 'SAR_2019-08-01-1': 'all',\n                            'SAR_2019-08-01-2': 'female', 'SAR_2019-08-01-3': 'all', 'SAR_2019-08-01-4': 'female',\n                            'SAR_2019-08-01-5': 'female', 'SAR_2019-08-01-6': 'all', 'SAR_2019-08-01-7': 'female',\n                            'SAR_2019-08-01-8': 'female', 'SAR_2019-08-01-9': 'all', 'SAR_2019-08-01-10': 'all',\n                            'SAR_2019-08-02-1': 'all', 'SAR_2019-08-02-2': 'female', 'SAR_2019-08-02-3': 'female',\n                            'SAR_2019-08-02-4': 'all', 'SAR_2019-08-02-5': 'all', 'SAR_2019-08-02-6': 'all',\n                            'SAR_2019-08-02-7': 'all', 'SAR_2019-08-02-8': 'all', 'SAR_2019-08-02-9': 'female',\n                            'SAR_2019-08-02-10': 'female', 'SAR_2019-08-03-1': 'all', 'SAR_2019-08-03-2': 'all',\n                            'SAR_2019-08-03-3': 'all', 'SAR_2019-08-03-4': 'all', 'SAR_2019-08-03-5': 'all',\n                            'SAR_2019-08-03-6': 'all', 'SAR_2019-08-03-7': 'all', 'SAR_2019-08-03-8': 'female',\n                            'SAR_2019-08-03-9': 'all', 'SAR_2019-08-03-10': 'female', 'SAR_2019-08-03-11': 'all',\n                            'SAR_2019-08-04-1': 'female', 'SAR_2019-08-04-2': 'all', 'SAR_2019-08-04-3': 'all',\n                            'SAR_2019-08-04-4': 'female', 'SAR_2019-08-04-5': 'female', 'SAR_2019-08-04-6': 'all',\n                            'SAR_2019-08-04-7': 'all', 'SAR_2019-08-04-8': 'female', 'SAR_2019-08-04-9': 'all',\n                            'SAR_2019-08-04-10': 'female', 'SAR_2019-08-04-11': 'all', 'SAR_2019-08-07-1': 'female',\n                            'SAR_2019-08-07-2': 'all', 'SAR_2019-08-07-3': 'all', 'SAR_2019-08-07-4': 'female',\n                            'SAR_2019-08-07-5': 'female', 'SAR_2019-08-07-6': 'all', 'SAR_2019-08-07-7': 'all',\n                            'SAR_2019-08-07-8': 'all', 'SAR_2019-08-07-9': 'all', 'SAR_2019-08-07-10': 'female',\n                            'SAR_2019-08-08-1': 'female', 'SAR_2019-08-08-2': 'female', 'SAR_2019-08-08-3': 'all',\n                            'SAR_2019-08-08-4': 'all', 'SAR_2019-08-08-5': 'all', 'SAR_2019-08-08-6': 'female',\n                            'SAR_2019-08-08-7': 'all', 'SAR_2019-08-08-8': 'female', 'SAR_2019-08-08-9': 'all',\n                            'SAR_2019-08-08-10': 'all', 'SAR_2019-08-09-1': 'all', 'SAR_2019-08-09-2': 'all',\n                            'SAR_2019-08-09-3': 'all', 'SAR_2019-08-09-4': 'all', 'SAR_2019-08-09-5': 'all',\n                            'SAR_2019-08-09-6': 'female', 'SAR_2019-08-09-7': 'all', 'SAR_2019-08-09-8': 'female',\n                            'SAR_2019-08-09-9': 'all', 'SAR_2019-08-09-10': 'female', 'SAR_2019-08-10-1': 'all',\n                            'SAR_2019-08-10-2': 'all', 'SAR_2019-08-10-3': 'all', 'SAR_2019-08-10-4': 'all',\n                            'SAR_2019-08-10-5': 'all', 'SAR_2019-08-10-6': 'female', 'SAR_2019-08-10-7': 'all',\n                            'SAR_2019-08-10-8': 'all', 'SAR_2019-08-10-9': 'all', 'SAR_2019-08-10-10': 'female',\n                            'SAR_2019-08-10-11': 'all', 'SAR_2019-08-11-1': 'all', 'SAR_2019-08-11-2': 'all',\n                            'SAR_2019-08-11-3': 'female', 'SAR_2019-08-11-4': 'female', 'SAR_2019-08-11-5': 'female',\n                            'SAR_2019-08-11-6': 'female', 'SAR_2019-08-11-7': 'all', 'SAR_2019-08-11-8': 'female',\n                            'SAR_2019-08-11-9': 'female', 'SAR_2019-08-11-10': 'all', 'SAR_2019-08-14-1': 'all',\n                            'SAR_2019-08-14-2': 'all', 'SAR_2019-08-14-3': 'all', 'SAR_2019-08-14-4': 'all',\n                            'SAR_2019-08-14-5': 'female', 'SAR_2019-08-14-6': 'female', 'SAR_2019-08-14-7': 'female',\n                            'SAR_2019-08-14-8': 'all', 'SAR_2019-08-14-9': 'all', 'SAR_2019-08-14-10': 'female',\n                            'SAR_2019-08-15-1': 'female', 'SAR_2019-08-15-2': 'female', 'SAR_2019-08-15-3': 'all',\n                            'SAR_2019-08-15-4': 'all', 'SAR_2019-08-15-5': 'all', 'SAR_2019-08-15-6': 'all',\n                            'SAR_2019-08-15-7': 'female', 'SAR_2019-08-15-8': 'female', 'SAR_2019-08-15-9': 'female',\n                            'SAR_2019-08-16-1': 'all', 'SAR_2019-08-16-2': 'all', 'SAR_2019-08-16-3': 'all',\n                            'SAR_2019-08-16-4': 'female', 'SAR_2019-08-16-5': 'all', 'SAR_2019-08-16-6': 'female',\n                            'SAR_2019-08-16-7': 'all', 'SAR_2019-08-16-8': 'female', 'SAR_2019-08-16-9': 'all',\n                            'SAR_2019-08-16-10': 'all', 'SAR_2019-08-17-1': 'all', 'SAR_2019-08-17-2': 'female',\n                            'SAR_2019-08-17-3': 'all', 'SAR_2019-08-17-4': 'all', 'SAR_2019-08-17-5': 'all',\n                            'SAR_2019-08-17-6': 'all', 'SAR_2019-08-17-7': 'all', 'SAR_2019-08-17-8': 'female',\n                            'SAR_2019-08-17-9': 'female', 'SAR_2019-08-17-10': 'female', 'SAR_2019-08-17-11': 'female',\n                            'SAR_2019-08-18-1': 'all', 'SAR_2019-08-18-2': 'female', 'SAR_2019-08-18-3': 'female',\n                            'SAR_2019-08-18-4': 'female', 'SAR_2019-08-18-5': 'female', 'SAR_2019-08-18-6': 'female',\n                            'SAR_2019-08-18-7': 'all', 'SAR_2019-08-18-8': 'female', 'SAR_2019-08-18-9': 'female',\n                            'SAR_2019-08-18-10': 'female', 'SAR_2019-08-21-1': 'all', 'SAR_2019-08-21-2': 'female',\n                            'SAR_2019-08-21-3': 'all', 'SAR_2019-08-21-4': 'all', 'SAR_2019-08-21-5': 'female',\n                            'SAR_2019-08-21-6': 'all', 'SAR_2019-08-21-7': 'all', 'SAR_2019-08-21-8': 'female',\n                            'SAR_2019-08-21-9': 'all', 'SAR_2019-08-21-10': 'female', 'SAR_2019-08-22-1': 'all',\n                            'SAR_2019-08-22-2': 'all', 'SAR_2019-08-22-3': 'female', 'SAR_2019-08-22-4': 'all',\n                            'SAR_2019-08-22-5': 'female', 'SAR_2019-08-22-6': 'all', 'SAR_2019-08-22-7': 'female',\n                            'SAR_2019-08-22-8': 'all', 'SAR_2019-08-22-9': 'female', 'SAR_2019-08-22-10': 'all',\n                            'SAR_2019-08-23-1': 'female', 'SAR_2019-08-23-2': 'all', 'SAR_2019-08-23-3': 'female',\n                            'SAR_2019-08-23-4': 'all', 'SAR_2019-08-23-5': 'female', 'SAR_2019-08-23-6': 'all',\n                            'SAR_2019-08-23-7': 'female', 'SAR_2019-08-23-8': 'all', 'SAR_2019-08-23-9': 'all',\n                            'SAR_2019-08-23-10': 'all', 'SAR_2019-08-23-11': 'all', 'SAR_2019-08-24-1': 'all',\n                            'SAR_2019-08-24-2': 'all', 'SAR_2019-08-24-3': 'female', 'SAR_2019-08-24-4': 'all',\n                            'SAR_2019-08-24-5': 'all', 'SAR_2019-08-24-6': 'female', 'SAR_2019-08-24-7': 'all',\n                            'SAR_2019-08-24-8': 'female', 'SAR_2019-08-24-9': 'female', 'SAR_2019-08-24-10': 'all',\n                            'SAR_2019-08-24-11': 'all', 'SAR_2019-08-24-12': 'all', 'SAR_2019-08-24-13': 'female',\n                            'SAR_2019-08-25-1': 'female', 'SAR_2019-08-25-2': 'all', 'SAR_2019-08-25-3': 'all',\n                            'SAR_2019-08-25-4': 'female', 'SAR_2019-08-25-5': 'female', 'SAR_2019-08-25-6': 'all',\n                            'SAR_2019-08-25-7': 'female', 'SAR_2019-08-25-8': 'all', 'SAR_2019-08-25-9': 'all',\n                            'SAR_2019-08-25-10': 'female', 'SAR_2019-08-28-1': 'all', 'SAR_2019-08-28-2': 'female',\n                            'SAR_2019-08-28-3': 'female', 'SAR_2019-08-28-4': 'female', 'SAR_2019-08-28-5': 'female',\n                            'SAR_2019-08-28-6': 'all', 'SAR_2019-08-28-7': 'female', 'SAR_2019-08-28-8': 'all',\n                            'SAR_2019-08-28-9': 'all', 'SAR_2019-08-28-10': 'female', 'SAR_2019-08-29-1': 'female',\n                            'SAR_2019-08-29-2': 'all', 'SAR_2019-08-29-3': 'female', 'SAR_2019-08-29-4': 'all',\n                            'SAR_2019-08-29-5': 'all', 'SAR_2019-08-29-6': 'female', 'SAR_2019-08-29-7': 'female',\n                            'SAR_2019-08-29-8': 'all', 'SAR_2019-08-29-9': 'female', 'SAR_2019-08-29-10': 'female',\n                            'SAR_2019-08-30-1': 'all', 'SAR_2019-08-30-2': 'all', 'SAR_2019-08-30-3': 'all',\n                            'SAR_2019-08-30-4': 'all', 'SAR_2019-08-30-5': 'female', 'SAR_2019-08-30-6': 'all',\n                            'SAR_2019-08-30-7': 'female', 'SAR_2019-08-30-8': 'female', 'SAR_2019-08-30-9': 'all',\n                            'SAR_2019-08-30-10': 'all', 'SAR_2019-08-30-11': 'female', 'SAR_2019-08-31-1': 'all',\n                            'SAR_2019-08-31-2': 'all', 'SAR_2019-08-31-3': 'female', 'SAR_2019-08-31-4': 'all',\n                            'SAR_2019-08-31-5': 'all', 'SAR_2019-08-31-6': 'all', 'SAR_2019-08-31-7': 'all',\n                            'SAR_2019-08-31-8': 'all', 'SAR_2019-08-31-9': 'female', 'SAR_2019-08-31-10': 'female',\n                            'SAR_2019-08-31-11': 'all', 'SAR_2019-08-31-12': 'all', 'SAR_2019-09-01-1': 'all',\n                            'SAR_2019-09-01-2': 'female', 'SAR_2019-09-01-3': 'all', 'SAR_2019-09-01-4': 'female',\n                            'SAR_2019-09-01-5': 'all', 'SAR_2019-09-01-6': 'all', 'SAR_2019-09-01-7': 'female',\n                            'SAR_2019-09-01-8': 'female', 'SAR_2019-09-01-9': 'female', 'SAR_2019-09-01-10': 'female',\n                            'SAR_2019-09-01-11': 'female', 'SAR_2019-09-01-12': 'all', 'SAR_2019-09-02-1': 'all',\n                            'SAR_2019-09-02-2': 'all', 'SAR_2019-09-02-3': 'all', 'SAR_2019-09-02-4': 'all',\n                            'SAR_2019-09-02-5': 'all', 'SAR_2019-09-02-6': 'all', 'SAR_2019-09-02-7': 'all',\n                            'SAR_2019-09-02-8': 'female', 'SAR_2019-09-02-9': 'all', 'SAR_2019-09-02-10': 'all',\n                            'SAR_2019-09-02-11': 'all'},\n                     age = {'AQU_2019-01-01-1': 0, 'AQU_2019-01-01-2': 0, 'AQU_2019-01-01-3': 0, 'AQU_2019-01-01-4': 0,\n                            'AQU_2019-01-01-5': 0, 'AQU_2019-01-01-6': 0, 'AQU_2019-01-01-7': 0, 'AQU_2019-01-01-8': 0,\n                            'AQU_2019-01-01-9': 0, 'AQU_2019-01-04-1': 0, 'AQU_2019-01-04-2': 0, 'AQU_2019-01-04-3': 0,\n                            'AQU_2019-01-04-4': 0, 'AQU_2019-01-04-5': 0, 'AQU_2019-01-04-6': 0, 'AQU_2019-01-04-7': 0,\n                            'AQU_2019-01-04-8': 0, 'AQU_2019-01-05-1': 0, 'AQU_2019-01-05-2': 0, 'AQU_2019-01-05-3': 0,\n                            'AQU_2019-01-05-4': 0, 'AQU_2019-01-05-5': 0, 'AQU_2019-01-05-6': 0, 'AQU_2019-01-05-7': 0,\n                            'AQU_2019-01-05-8': 0, 'AQU_2019-01-05-9': 0, 'AQU_2019-01-06-1': 0, 'AQU_2019-01-06-2': 0,\n                            'AQU_2019-01-06-3': 0, 'AQU_2019-01-06-4': 0, 'AQU_2019-01-06-5': 0, 'AQU_2019-01-06-6': 0,\n                            'AQU_2019-01-06-7': 0, 'AQU_2019-01-06-8': 0, 'AQU_2019-01-10-1': 0, 'AQU_2019-01-10-2': 0,\n                            'AQU_2019-01-10-3': 0, 'AQU_2019-01-10-4': 0, 'AQU_2019-01-10-5': 0, 'AQU_2019-01-11-1': 0,\n                            'AQU_2019-01-11-2': 0, 'AQU_2019-01-11-3': 0, 'AQU_2019-01-11-4': 0, 'AQU_2019-01-11-5': 0,\n                            'AQU_2019-01-11-6': 0, 'AQU_2019-01-11-7': 0, 'AQU_2019-01-11-8': 0, 'AQU_2019-01-12-1': 0,\n                            'AQU_2019-01-12-2': 0, 'AQU_2019-01-12-3': 0, 'AQU_2019-01-12-4': 0, 'AQU_2019-01-12-5': 0,\n                            'AQU_2019-01-12-6': 0, 'AQU_2019-01-12-7': 0, 'AQU_2019-01-12-8': 0, 'AQU_2019-01-12-9': 0,\n                            'AQU_2019-01-13-1': 0, 'AQU_2019-01-13-2': 0, 'AQU_2019-01-13-3': 0, 'AQU_2019-01-13-4': 0,\n                            'AQU_2019-01-13-5': 0, 'AQU_2019-01-13-6': 0, 'AQU_2019-01-13-7': 0, 'AQU_2019-01-13-8': 0,\n                            'AQU_2019-01-18-1': 0, 'AQU_2019-01-18-2': 0, 'AQU_2019-01-18-3': 0, 'AQU_2019-01-18-4': 0,\n                            'AQU_2019-01-18-5': 0, 'AQU_2019-01-18-6': 0, 'AQU_2019-01-18-7': 0, 'AQU_2019-01-18-8': 0,\n                            'AQU_2019-01-19-1': 0, 'AQU_2019-01-19-2': 0, 'AQU_2019-01-19-3': 0, 'AQU_2019-01-19-4': 0,\n                            'AQU_2019-01-19-5': 0, 'AQU_2019-01-19-6': 0, 'AQU_2019-01-19-7': 0, 'AQU_2019-01-19-8': 0,\n                            'AQU_2019-01-19-9': 0, 'AQU_2019-01-20-1': 0, 'AQU_2019-01-20-2': 0, 'AQU_2019-01-20-3': 0,\n                            'AQU_2019-01-20-4': 0, 'AQU_2019-01-20-5': 0, 'AQU_2019-01-20-6': 0, 'AQU_2019-01-20-7': 0,\n                            'AQU_2019-01-20-8': 0, 'AQU_2019-01-25-1': 4, 'AQU_2019-01-25-2': 4, 'AQU_2019-01-25-3': 4,\n                            'AQU_2019-01-25-4': 4, 'AQU_2019-01-25-5': 4, 'AQU_2019-01-25-6': 3, 'AQU_2019-01-25-7': 4,\n                            'AQU_2019-01-25-8': 4, 'AQU_2019-01-25-9': 4, 'AQU_2019-01-26-1': 4, 'AQU_2019-01-26-2': 3,\n                            'AQU_2019-01-26-3': 3, 'AQU_2019-01-26-4': 3, 'AQU_2019-01-26-5': 3, 'AQU_2019-01-26-6': 4,\n                            'AQU_2019-01-26-7': 4, 'AQU_2019-01-26-8': 4, 'AQU_2019-01-26-9': 4, 'AQU_2019-01-26-10': 4,\n                            'AQU_2019-01-27-1': 4, 'AQU_2019-01-27-2': 4, 'AQU_2019-01-27-3': 3, 'AQU_2019-01-27-4': 4,\n                            'AQU_2019-01-27-5': 4, 'AQU_2019-01-27-6': 4, 'AQU_2019-01-27-7': 4, 'AQU_2019-01-27-8': 3,\n                            'AQU_2019-01-27-9': 3, 'AQU_2019-02-01-1': 4, 'AQU_2019-02-01-2': 4, 'AQU_2019-02-01-3': 4,\n                            'AQU_2019-02-01-4': 4, 'AQU_2019-02-01-5': 4, 'AQU_2019-02-01-6': 4, 'AQU_2019-02-01-7': 3,\n                            'AQU_2019-02-01-8': 4, 'AQU_2019-02-02-1': 4, 'AQU_2019-02-02-2': 3, 'AQU_2019-02-02-3': 4,\n                            'AQU_2019-02-02-4': 3, 'AQU_2019-02-02-5': 3, 'AQU_2019-02-02-6': 4, 'AQU_2019-02-02-7': 4,\n                            'AQU_2019-02-02-8': 4, 'AQU_2019-02-02-9': 3, 'AQU_2019-02-02-10': 4, 'AQU_2019-02-03-1': 4,\n                            'AQU_2019-02-03-2': 3, 'AQU_2019-02-03-3': 4, 'AQU_2019-02-03-4': 3, 'AQU_2019-02-03-5': 3,\n                            'AQU_2019-02-03-6': 3, 'AQU_2019-02-03-7': 4, 'AQU_2019-02-03-8': 3, 'AQU_2019-02-03-9': 4,\n                            'AQU_2019-02-07-1': 4, 'AQU_2019-02-07-2': 4, 'AQU_2019-02-07-3': 4, 'AQU_2019-02-07-4': 4,\n                            'AQU_2019-02-07-5': 3, 'AQU_2019-02-07-6': 4, 'AQU_2019-02-07-7': 4, 'AQU_2019-02-07-8': 4,\n                            'AQU_2019-02-08-1': 3, 'AQU_2019-02-08-2': 4, 'AQU_2019-02-08-3': 4, 'AQU_2019-02-08-4': 3,\n                            'AQU_2019-02-08-5': 3, 'AQU_2019-02-08-6': 4, 'AQU_2019-02-08-7': 4, 'AQU_2019-02-08-8': 3,\n                            'AQU_2019-02-09-1': 3, 'AQU_2019-02-09-2': 4, 'AQU_2019-02-09-3': 4, 'AQU_2019-02-09-4': 4,\n                            'AQU_2019-02-09-5': 4, 'AQU_2019-02-09-6': 3, 'AQU_2019-02-09-7': 3, 'AQU_2019-02-09-8': 3,\n                            'AQU_2019-02-09-9': 3, 'AQU_2019-02-10-1': 4, 'AQU_2019-02-10-2': 4, 'AQU_2019-02-10-3': 3,\n                            'AQU_2019-02-10-4': 4, 'AQU_2019-02-10-5': 3, 'AQU_2019-02-10-6': 4, 'AQU_2019-02-10-7': 4,\n                            'AQU_2019-02-10-8': 4, 'AQU_2019-02-15-1': 4, 'AQU_2019-02-15-2': 4, 'AQU_2019-02-15-3': 3,\n                            'AQU_2019-02-15-4': 3, 'AQU_2019-02-15-5': 4, 'AQU_2019-02-15-6': 3, 'AQU_2019-02-15-7': 4,\n                            'AQU_2019-02-15-8': 4, 'AQU_2019-02-16-1': 3, 'AQU_2019-02-16-2': 4, 'AQU_2019-02-16-3': 3,\n                            'AQU_2019-02-16-4': 3, 'AQU_2019-02-16-5': 4, 'AQU_2019-02-16-6': 4, 'AQU_2019-02-16-7': 4,\n                            'AQU_2019-02-16-8': 4, 'AQU_2019-02-16-9': 3, 'AQU_2019-02-17-1': 4, 'AQU_2019-02-17-2': 4,\n                            'AQU_2019-02-17-3': 3, 'AQU_2019-02-17-4': 4, 'AQU_2019-02-17-5': 3, 'AQU_2019-02-17-6': 3,\n                            'AQU_2019-02-17-7': 4, 'AQU_2019-02-17-8': 3, 'AQU_2019-02-18-1': 3, 'AQU_2019-02-18-2': 4,\n                            'AQU_2019-02-18-3': 4, 'AQU_2019-02-18-4': 4, 'AQU_2019-02-18-5': 3, 'AQU_2019-02-18-6': 4,\n                            'AQU_2019-02-18-7': 3, 'AQU_2019-02-18-8': 4, 'AQU_2019-02-18-9': 4, 'AQU_2019-02-21-1': 4,\n                            'AQU_2019-02-21-2': 3, 'AQU_2019-02-21-3': 4, 'AQU_2019-02-21-4': 3, 'AQU_2019-02-21-5': 4,\n                            'AQU_2019-02-21-6': 4, 'AQU_2019-02-21-7': 3, 'AQU_2019-02-21-8': 4, 'AQU_2019-02-22-1': 3,\n                            'AQU_2019-02-22-2': 4, 'AQU_2019-02-22-3': 3, 'AQU_2019-02-22-4': 3, 'AQU_2019-02-22-5': 4,\n                            'AQU_2019-02-22-6': 4, 'AQU_2019-02-22-7': 4, 'AQU_2019-02-22-8': 4, 'AQU_2019-02-23-1': 4,\n                            'AQU_2019-02-23-2': 3, 'AQU_2019-02-23-3': 4, 'AQU_2019-02-23-4': 3, 'AQU_2019-02-23-5': 4,\n                            'AQU_2019-02-23-6': 3, 'AQU_2019-02-23-7': 4, 'AQU_2019-02-23-8': 3, 'AQU_2019-02-23-9': 4,\n                            'AQU_2019-02-24-1': 3, 'AQU_2019-02-24-2': 4, 'AQU_2019-02-24-3': 4, 'AQU_2019-02-24-4': 4,\n                            'AQU_2019-02-24-5': 4, 'AQU_2019-02-24-6': 4, 'AQU_2019-02-24-7': 4, 'AQU_2019-02-24-8': 4,\n                            'AQU_2019-02-28-1': 4, 'AQU_2019-02-28-2': 4, 'AQU_2019-02-28-3': 3, 'AQU_2019-02-28-4': 3,\n                            'AQU_2019-02-28-5': 3, 'AQU_2019-02-28-6': 4, 'AQU_2019-02-28-7': 4, 'AQU_2019-02-28-8': 3,\n                            'AQU_2019-03-01-1': 3, 'AQU_2019-03-01-2': 4, 'AQU_2019-03-01-3': 3, 'AQU_2019-03-01-4': 3,\n                            'AQU_2019-03-01-5': 4, 'AQU_2019-03-01-6': 3, 'AQU_2019-03-01-7': 3, 'AQU_2019-03-01-8': 4,\n                            'AQU_2019-03-02-1': 3, 'AQU_2019-03-02-2': 4, 'AQU_2019-03-02-3': 4, 'AQU_2019-03-02-4': 3,\n                            'AQU_2019-03-02-5': 4, 'AQU_2019-03-02-6': 3, 'AQU_2019-03-02-7': 4, 'AQU_2019-03-02-8': 4,\n                            'AQU_2019-03-02-9': 4, 'AQU_2019-03-03-1': 3, 'AQU_2019-03-03-2': 3, 'AQU_2019-03-03-3': 4,\n                            'AQU_2019-03-03-4': 3, 'AQU_2019-03-03-5': 3, 'AQU_2019-03-03-6': 4, 'AQU_2019-03-03-7': 4,\n                            'AQU_2019-03-03-8': 4, 'AQU_2019-03-08-1': 3, 'AQU_2019-03-08-2': 4, 'AQU_2019-03-08-3': 3,\n                            'AQU_2019-03-08-4': 3, 'AQU_2019-03-08-5': 4, 'AQU_2019-03-08-6': 4, 'AQU_2019-03-08-7': 4,\n                            'AQU_2019-03-08-8': 3, 'AQU_2019-03-09-1': 3, 'AQU_2019-03-09-2': 4, 'AQU_2019-03-09-3': 3,\n                            'AQU_2019-03-09-4': 4, 'AQU_2019-03-09-5': 4, 'AQU_2019-03-09-6': 4, 'AQU_2019-03-09-7': 3,\n                            'AQU_2019-03-09-8': 4, 'AQU_2019-03-09-9': 4, 'AQU_2019-03-09-10': 3,\n                            'AQU_2019-03-09-11': 3, 'AQU_2019-03-10-1': 3, 'AQU_2019-03-10-2': 4, 'AQU_2019-03-10-3': 3,\n                            'AQU_2019-03-10-4': 4, 'AQU_2019-03-10-5': 4, 'AQU_2019-03-10-6': 3, 'AQU_2019-03-10-7': 4,\n                            'AQU_2019-03-10-8': 4, 'AQU_2019-03-10-9': 4, 'AQU_2019-03-15-1': 4, 'AQU_2019-03-15-2': 4,\n                            'AQU_2019-03-15-3': 3, 'AQU_2019-03-15-4': 3, 'AQU_2019-03-15-5': 4, 'AQU_2019-03-15-6': 3,\n                            'AQU_2019-03-15-7': 3, 'AQU_2019-03-15-8': 4, 'AQU_2019-03-15-9': 4, 'AQU_2019-03-16-1': 4,\n                            'AQU_2019-03-16-2': 3, 'AQU_2019-03-16-3': 4, 'AQU_2019-03-16-4': 4, 'AQU_2019-03-16-5': 3,\n                            'AQU_2019-03-16-6': 4, 'AQU_2019-03-16-7': 3, 'AQU_2019-03-16-8': 3, 'AQU_2019-03-16-9': 4,\n                            'AQU_2019-03-17-1': 4, 'AQU_2019-03-17-2': 3, 'AQU_2019-03-17-3': 3, 'AQU_2019-03-17-4': 3,\n                            'AQU_2019-03-17-5': 4, 'AQU_2019-03-17-6': 3, 'AQU_2019-03-17-7': 4, 'AQU_2019-03-17-8': 4,\n                            'AQU_2019-03-17-9': 3, 'AQU_2019-03-22-1': 4, 'AQU_2019-03-22-2': 3, 'AQU_2019-03-22-3': 4,\n                            'AQU_2019-03-22-4': 3, 'AQU_2019-03-22-5': 4, 'AQU_2019-03-22-6': 3, 'AQU_2019-03-22-7': 4,\n                            'AQU_2019-03-22-8': 4, 'AQU_2019-03-22-9': 3, 'AQU_2019-03-23-1': 4, 'AQU_2019-03-23-2': 4,\n                            'AQU_2019-03-23-3': 3, 'AQU_2019-03-23-4': 3, 'AQU_2019-03-23-5': 4, 'AQU_2019-03-23-6': 3,\n                            'AQU_2019-03-23-7': 4, 'AQU_2019-03-23-8': 3, 'AQU_2019-03-23-9': 4, 'AQU_2019-03-24-1': 4,\n                            'AQU_2019-03-24-2': 4, 'AQU_2019-03-24-3': 3, 'AQU_2019-03-24-4': 3, 'AQU_2019-03-24-5': 3,\n                            'AQU_2019-03-24-6': 3, 'AQU_2019-03-24-7': 4, 'AQU_2019-03-24-8': 4, 'AQU_2019-03-24-9': 3,\n                            'AQU_2019-03-29-1': 3, 'AQU_2019-03-29-2': 4, 'AQU_2019-03-29-3': 4, 'AQU_2019-03-29-4': 4,\n                            'AQU_2019-03-29-5': 3, 'AQU_2019-03-29-6': 3, 'AQU_2019-03-29-7': 4, 'AQU_2019-03-29-8': 3,\n                            'AQU_2019-03-29-9': 3, 'AQU_2019-03-30-1': 4, 'AQU_2019-03-30-2': 4, 'AQU_2019-03-30-3': 4,\n                            'AQU_2019-03-30-4': 4, 'AQU_2019-03-30-5': 4, 'AQU_2019-03-30-6': 4, 'AQU_2019-03-30-7': 4,\n                            'AQU_2019-03-30-8': 4, 'AQU_2019-03-30-9': 4, 'AQU_2019-03-30-10': 4, 'AQU_2019-03-31-1': 4,\n                            'AQU_2019-03-31-2': 3, 'AQU_2019-03-31-3': 4, 'AQU_2019-03-31-4': 3, 'AQU_2019-03-31-5': 4,\n                            'AQU_2019-03-31-6': 3, 'AQU_2019-03-31-7': 4, 'AQU_2019-03-31-8': 3, 'AQU_2019-03-31-9': 3,\n                            'AQU_2019-04-05-1': 3, 'AQU_2019-04-05-2': 3, 'AQU_2019-04-05-3': 3, 'AQU_2019-04-05-4': 3,\n                            'AQU_2019-04-05-5': 3, 'AQU_2019-04-05-6': 3, 'AQU_2019-04-05-7': 4, 'AQU_2019-04-05-8': 4,\n                            'AQU_2019-04-05-9': 3, 'AQU_2019-04-06-1': 3, 'AQU_2019-04-06-2': 3, 'AQU_2019-04-06-3': 3,\n                            'AQU_2019-04-06-4': 4, 'AQU_2019-04-06-5': 4, 'AQU_2019-04-06-6': 3, 'AQU_2019-04-06-7': 4,\n                            'AQU_2019-04-06-8': 3, 'AQU_2019-04-06-9': 4, 'AQU_2019-04-06-10': 3,\n                            'AQU_2019-04-06-11': 3, 'AQU_2019-04-07-1': 3, 'AQU_2019-04-07-2': 3, 'AQU_2019-04-07-3': 3,\n                            'AQU_2019-04-07-4': 3, 'AQU_2019-04-07-5': 4, 'AQU_2019-04-07-6': 3, 'AQU_2019-04-07-7': 3,\n                            'AQU_2019-04-07-8': 4, 'AQU_2019-04-07-9': 3, 'AQU_2019-04-10-1': 3, 'AQU_2019-04-10-2': 3,\n                            'AQU_2019-04-10-3': 4, 'AQU_2019-04-10-4': 3, 'AQU_2019-04-10-5': 4, 'AQU_2019-04-10-6': 3,\n                            'AQU_2019-04-10-7': 3, 'AQU_2019-04-10-8': 3, 'AQU_2019-04-10-9': 3, 'AQU_2019-04-11-1': 3,\n                            'AQU_2019-04-11-2': 3, 'AQU_2019-04-11-3': 3, 'AQU_2019-04-11-4': 3, 'AQU_2019-04-11-5': 3,\n                            'AQU_2019-04-11-6': 3, 'AQU_2019-04-11-7': 4, 'AQU_2019-04-11-8': 4, 'AQU_2019-04-11-9': 3,\n                            'AQU_2019-04-12-1': 3, 'AQU_2019-04-12-2': 3, 'AQU_2019-04-12-3': 4, 'AQU_2019-04-12-4': 3,\n                            'AQU_2019-04-12-5': 3, 'AQU_2019-04-12-6': 3, 'AQU_2019-04-12-7': 3, 'AQU_2019-04-12-8': 3,\n                            'AQU_2019-04-12-9': 3, 'AQU_2019-04-13-1': 4, 'AQU_2019-04-13-2': 3, 'AQU_2019-04-13-3': 3,\n                            'AQU_2019-04-13-4': 3, 'AQU_2019-04-13-5': 4, 'AQU_2019-04-13-6': 3, 'AQU_2019-04-13-7': 4,\n                            'AQU_2019-04-13-8': 4, 'AQU_2019-04-13-9': 3, 'AQU_2019-04-14-1': 3, 'AQU_2019-04-14-2': 3,\n                            'AQU_2019-04-14-3': 4, 'AQU_2019-04-14-4': 3, 'AQU_2019-04-14-5': 3, 'AQU_2019-04-14-6': 3,\n                            'AQU_2019-04-14-7': 3, 'AQU_2019-04-14-8': 3, 'AQU_2019-04-14-9': 3, 'AQU_2019-04-17-1': 2,\n                            'AQU_2019-04-17-2': 3, 'AQU_2019-04-17-3': 3, 'AQU_2019-04-17-4': 3, 'AQU_2019-04-17-5': 4,\n                            'AQU_2019-04-17-6': 3, 'AQU_2019-04-17-7': 3, 'AQU_2019-04-17-8': 4, 'AQU_2019-04-17-9': 3,\n                            'AQU_2019-04-18-1': 3, 'AQU_2019-04-18-2': 3, 'AQU_2019-04-18-3': 3, 'AQU_2019-04-18-4': 3,\n                            'AQU_2019-04-18-5': 3, 'AQU_2019-04-18-6': 3, 'AQU_2019-04-18-7': 4, 'AQU_2019-04-18-8': 3,\n                            'AQU_2019-04-18-9': 3, 'AQU_2019-04-19-1': 2, 'AQU_2019-04-19-2': 4, 'AQU_2019-04-19-3': 3,\n                            'AQU_2019-04-19-4': 4, 'AQU_2019-04-19-5': 3, 'AQU_2019-04-19-6': 4, 'AQU_2019-04-19-7': 4,\n                            'AQU_2019-04-19-8': 3, 'AQU_2019-04-19-9': 3, 'AQU_2019-04-20-1': 4, 'AQU_2019-04-20-2': 3,\n                            'AQU_2019-04-20-3': 3, 'AQU_2019-04-20-4': 3, 'AQU_2019-04-20-5': 3, 'AQU_2019-04-20-6': 3,\n                            'AQU_2019-04-20-7': 3, 'AQU_2019-04-20-8': 3, 'AQU_2019-04-20-9': 3, 'AQU_2019-11-01-1': 3,\n                            'AQU_2019-11-01-2': 2, 'AQU_2019-11-01-3': 3, 'AQU_2019-11-01-4': 3, 'AQU_2019-11-01-5': 3,\n                            'AQU_2019-11-01-6': 2, 'AQU_2019-11-01-7': 3, 'AQU_2019-11-01-8': 3, 'AQU_2019-11-01-9': 2,\n                            'AQU_2019-11-01-10': 3, 'AQU_2019-11-02-1': 3, 'AQU_2019-11-02-2': 2, 'AQU_2019-11-02-3': 3,\n                            'AQU_2019-11-02-4': 3, 'AQU_2019-11-02-5': 3, 'AQU_2019-11-02-6': 2, 'AQU_2019-11-02-7': 3,\n                            'AQU_2019-11-02-8': 3, 'AQU_2019-11-02-9': 3, 'AQU_2019-11-02-10': 2, 'AQU_2019-11-03-1': 2,\n                            'AQU_2019-11-03-2': 3, 'AQU_2019-11-03-3': 3, 'AQU_2019-11-03-4': 3, 'AQU_2019-11-03-5': 2,\n                            'AQU_2019-11-03-6': 3, 'AQU_2019-11-03-7': 3, 'AQU_2019-11-03-8': 3, 'AQU_2019-11-03-9': 2,\n                            'AQU_2019-11-03-10': 3, 'AQU_2019-11-07-1': 3, 'AQU_2019-11-07-2': 3, 'AQU_2019-11-07-3': 3,\n                            'AQU_2019-11-07-4': 2, 'AQU_2019-11-07-5': 3, 'AQU_2019-11-07-6': 3, 'AQU_2019-11-07-7': 3,\n                            'AQU_2019-11-07-8': 3, 'AQU_2019-11-07-9': 2, 'AQU_2019-11-08-1': 3, 'AQU_2019-11-08-2': 3,\n                            'AQU_2019-11-08-3': 2, 'AQU_2019-11-08-4': 3, 'AQU_2019-11-08-5': 2, 'AQU_2019-11-08-6': 3,\n                            'AQU_2019-11-08-7': 3, 'AQU_2019-11-08-8': 3, 'AQU_2019-11-08-9': 2, 'AQU_2019-11-09-1': 3,\n                            'AQU_2019-11-09-2': 3, 'AQU_2019-11-09-3': 3, 'AQU_2019-11-09-4': 3, 'AQU_2019-11-09-5': 2,\n                            'AQU_2019-11-09-6': 3, 'AQU_2019-11-09-7': 3, 'AQU_2019-11-09-8': 3, 'AQU_2019-11-09-9': 2,\n                            'AQU_2019-11-09-10': 2, 'AQU_2019-11-10-1': 2, 'AQU_2019-11-10-2': 3, 'AQU_2019-11-10-3': 3,\n                            'AQU_2019-11-10-4': 3, 'AQU_2019-11-10-5': 3, 'AQU_2019-11-10-6': 2, 'AQU_2019-11-10-7': 3,\n                            'AQU_2019-11-10-8': 3, 'AQU_2019-11-10-9': 2, 'AQU_2019-11-10-10': 3, 'AQU_2019-11-11-1': 3,\n                            'AQU_2019-11-11-2': 2, 'AQU_2019-11-11-3': 3, 'AQU_2019-11-11-4': 3, 'AQU_2019-11-11-5': 2,\n                            'AQU_2019-11-11-6': 3, 'AQU_2019-11-11-7': 3, 'AQU_2019-11-11-8': 2, 'AQU_2019-11-11-9': 3,\n                            'AQU_2019-11-11-10': 3, 'AQU_2019-11-14-1': 3, 'AQU_2019-11-14-2': 3, 'AQU_2019-11-14-3': 2,\n                            'AQU_2019-11-14-4': 2, 'AQU_2019-11-14-5': 3, 'AQU_2019-11-14-6': 3, 'AQU_2019-11-14-7': 3,\n                            'AQU_2019-11-14-8': 3, 'AQU_2019-11-14-9': 3, 'AQU_2019-11-15-1': 3, 'AQU_2019-11-15-2': 3,\n                            'AQU_2019-11-15-3': 2, 'AQU_2019-11-15-4': 3, 'AQU_2019-11-15-5': 3, 'AQU_2019-11-15-6': 2,\n                            'AQU_2019-11-15-7': 3, 'AQU_2019-11-15-8': 3, 'AQU_2019-11-15-9': 3, 'AQU_2019-11-15-10': 2,\n                            'AQU_2019-11-16-1': 3, 'AQU_2019-11-16-2': 2, 'AQU_2019-11-16-3': 3, 'AQU_2019-11-16-4': 2,\n                            'AQU_2019-11-16-5': 3, 'AQU_2019-11-16-6': 3, 'AQU_2019-11-16-7': 3, 'AQU_2019-11-16-8': 2,\n                            'AQU_2019-11-16-9': 3, 'AQU_2019-11-16-10': 3, 'AQU_2019-11-17-1': 3, 'AQU_2019-11-17-2': 3,\n                            'AQU_2019-11-17-3': 3, 'AQU_2019-11-17-4': 3, 'AQU_2019-11-17-5': 3, 'AQU_2019-11-17-6': 3,\n                            'AQU_2019-11-17-7': 2, 'AQU_2019-11-17-8': 3, 'AQU_2019-11-17-9': 2, 'AQU_2019-11-17-10': 2,\n                            'AQU_2019-11-20-1': 3, 'AQU_2019-11-20-2': 3, 'AQU_2019-11-20-3': 2, 'AQU_2019-11-20-4': 3,\n                            'AQU_2019-11-20-5': 3, 'AQU_2019-11-20-6': 2, 'AQU_2019-11-20-7': 3, 'AQU_2019-11-20-8': 3,\n                            'AQU_2019-11-20-9': 3, 'AQU_2019-11-21-1': 3, 'AQU_2019-11-21-2': 3, 'AQU_2019-11-21-3': 3,\n                            'AQU_2019-11-21-4': 3, 'AQU_2019-11-21-5': 3, 'AQU_2019-11-21-6': 3, 'AQU_2019-11-21-7': 3,\n                            'AQU_2019-11-21-8': 2, 'AQU_2019-11-22-1': 3, 'AQU_2019-11-22-2': 3, 'AQU_2019-11-22-3': 3,\n                            'AQU_2019-11-22-4': 2, 'AQU_2019-11-22-5': 3, 'AQU_2019-11-22-6': 3, 'AQU_2019-11-22-7': 3,\n                            'AQU_2019-11-22-8': 2, 'AQU_2019-11-23-1': 3, 'AQU_2019-11-23-2': 2, 'AQU_2019-11-23-3': 3,\n                            'AQU_2019-11-23-4': 3, 'AQU_2019-11-23-5': 3, 'AQU_2019-11-23-6': 2, 'AQU_2019-11-23-7': 3,\n                            'AQU_2019-11-23-8': 3, 'AQU_2019-11-23-9': 3, 'AQU_2019-11-23-10': 2, 'AQU_2019-11-24-1': 3,\n                            'AQU_2019-11-24-2': 3, 'AQU_2019-11-24-3': 3, 'AQU_2019-11-24-4': 3, 'AQU_2019-11-24-5': 3,\n                            'AQU_2019-11-24-6': 2, 'AQU_2019-11-24-7': 3, 'AQU_2019-11-24-8': 3, 'AQU_2019-11-24-9': 3,\n                            'AQU_2019-11-27-1': 2, 'AQU_2019-11-27-2': 3, 'AQU_2019-11-27-3': 3, 'AQU_2019-11-27-4': 3,\n                            'AQU_2019-11-27-5': 3, 'AQU_2019-11-27-6': 3, 'AQU_2019-11-27-7': 2, 'AQU_2019-11-27-8': 3,\n                            'AQU_2019-11-27-9': 3, 'AQU_2019-11-29-1': 3, 'AQU_2019-11-29-2': 3, 'AQU_2019-11-29-3': 2,\n                            'AQU_2019-11-29-4': 2, 'AQU_2019-11-29-5': 3, 'AQU_2019-11-29-6': 3, 'AQU_2019-11-29-7': 3,\n                            'AQU_2019-11-29-8': 3, 'AQU_2019-11-29-9': 3, 'AQU_2019-11-29-10': 2, 'AQU_2019-11-30-1': 2,\n                            'AQU_2019-11-30-2': 3, 'AQU_2019-11-30-3': 3, 'AQU_2019-11-30-4': 3, 'AQU_2019-11-30-5': 2,\n                            'AQU_2019-11-30-6': 3, 'AQU_2019-11-30-7': 3, 'AQU_2019-11-30-8': 3, 'AQU_2019-11-30-9': 3,\n                            'AQU_2019-11-30-10': 3, 'AQU_2019-12-01-1': 3, 'AQU_2019-12-01-2': 3, 'AQU_2019-12-01-3': 3,\n                            'AQU_2019-12-01-4': 2, 'AQU_2019-12-05-1': 3, 'AQU_2019-12-05-2': 3, 'AQU_2019-12-05-3': 2,\n                            'AQU_2019-12-05-4': 3, 'AQU_2019-12-05-5': 3, 'AQU_2019-12-05-6': 2, 'AQU_2019-12-05-7': 3,\n                            'AQU_2019-12-05-8': 3, 'AQU_2019-12-05-9': 2, 'AQU_2019-12-06-1': 3, 'AQU_2019-12-06-2': 3,\n                            'AQU_2019-12-06-3': 2, 'AQU_2019-12-06-4': 3, 'AQU_2019-12-06-5': 2, 'AQU_2019-12-06-6': 3,\n                            'AQU_2019-12-06-7': 3, 'AQU_2019-12-06-8': 3, 'AQU_2019-12-06-9': 2, 'AQU_2019-12-06-10': 3,\n                            'AQU_2019-12-07-1': 2, 'AQU_2019-12-07-2': 3, 'AQU_2019-12-07-3': 3, 'AQU_2019-12-07-4': 3,\n                            'AQU_2019-12-07-5': 2, 'AQU_2019-12-07-6': 3, 'AQU_2019-12-07-7': 2, 'AQU_2019-12-07-8': 2,\n                            'AQU_2019-12-07-9': 2, 'AQU_2019-12-07-10': 3, 'AQU_2019-12-08-1': 2, 'AQU_2019-12-08-2': 3,\n                            'AQU_2019-12-08-3': 2, 'AQU_2019-12-08-4': 3, 'AQU_2019-12-08-5': 2, 'AQU_2019-12-08-6': 3,\n                            'AQU_2019-12-08-7': 3, 'AQU_2019-12-08-8': 3, 'AQU_2019-12-08-9': 3, 'AQU_2019-12-08-10': 2,\n                            'AQU_2019-12-12-1': 2, 'AQU_2019-12-12-2': 3, 'AQU_2019-12-12-3': 3, 'AQU_2019-12-12-4': 3,\n                            'AQU_2019-12-12-5': 2, 'AQU_2019-12-12-6': 3, 'AQU_2019-12-12-7': 3, 'AQU_2019-12-12-8': 3,\n                            'AQU_2019-12-13-1': 3, 'AQU_2019-12-13-2': 3, 'AQU_2019-12-13-3': 3, 'AQU_2019-12-13-4': 3,\n                            'AQU_2019-12-13-5': 3, 'AQU_2019-12-13-6': 3, 'AQU_2019-12-13-7': 3, 'AQU_2019-12-13-8': 2,\n                            'AQU_2019-12-14-1': 3, 'AQU_2019-12-14-2': 2, 'AQU_2019-12-14-3': 3, 'AQU_2019-12-14-4': 3,\n                            'AQU_2019-12-14-5': 3, 'AQU_2019-12-14-6': 3, 'AQU_2019-12-14-7': 3, 'AQU_2019-12-14-8': 2,\n                            'AQU_2019-12-14-9': 2, 'AQU_2019-12-15-1': 3, 'AQU_2019-12-15-2': 3, 'AQU_2019-12-15-3': 2,\n                            'AQU_2019-12-15-4': 3, 'AQU_2019-12-15-5': 3, 'AQU_2019-12-15-6': 3, 'AQU_2019-12-15-7': 3,\n                            'AQU_2019-12-15-8': 2, 'AQU_2019-12-15-9': 3, 'AQU_2019-12-20-1': 3, 'AQU_2019-12-20-2': 3,\n                            'AQU_2019-12-20-3': 2, 'AQU_2019-12-20-4': 3, 'AQU_2019-12-20-5': 3, 'AQU_2019-12-20-6': 3,\n                            'AQU_2019-12-20-7': 3, 'AQU_2019-12-20-8': 3, 'AQU_2019-12-21-1': 2, 'AQU_2019-12-21-2': 3,\n                            'AQU_2019-12-21-3': 2, 'AQU_2019-12-21-4': 3, 'AQU_2019-12-21-5': 3, 'AQU_2019-12-21-6': 3,\n                            'AQU_2019-12-21-7': 3, 'AQU_2019-12-21-8': 3, 'AQU_2019-12-21-9': 2, 'AQU_2019-12-22-1': 2,\n                            'AQU_2019-12-22-2': 3, 'AQU_2019-12-22-3': 2, 'AQU_2019-12-22-4': 3, 'AQU_2019-12-22-5': 2,\n                            'AQU_2019-12-22-6': 3, 'AQU_2019-12-22-7': 3, 'AQU_2019-12-22-8': 3, 'AQU_2019-12-22-9': 3,\n                            'AQU_2019-12-22-10': 3, 'AQU_2019-12-28-1': 3, 'AQU_2019-12-28-2': 3, 'AQU_2019-12-28-3': 2,\n                            'AQU_2019-12-28-4': 3, 'AQU_2019-12-28-5': 3, 'AQU_2019-12-28-6': 2, 'AQU_2019-12-28-7': 3,\n                            'AQU_2019-12-28-8': 3, 'AQU_2019-12-28-9': 3, 'AQU_2019-12-29-1': 3, 'AQU_2019-12-29-2': 2,\n                            'AQU_2019-12-29-3': 2, 'AQU_2019-12-29-4': 3, 'AQU_2019-12-29-5': 2, 'AQU_2019-12-29-6': 3,\n                            'AQU_2019-12-29-7': 3, 'AQU_2019-12-29-8': 3, 'AQU_2019-12-29-9': 2, 'AQU_2019-12-30-1': 3,\n                            'AQU_2019-12-30-2': 2, 'AQU_2019-12-30-3': 3, 'AQU_2019-12-30-4': 3, 'AQU_2019-12-30-5': 3,\n                            'AQU_2019-12-30-6': 3, 'AQU_2019-12-30-7': 3, 'AQU_2019-12-30-8': 2, 'AQU_2019-12-31-1': 2,\n                            'AQU_2019-12-31-2': 3, 'AQU_2019-12-31-3': 2, 'AQU_2019-12-31-4': 3, 'AQU_2019-12-31-5': 3,\n                            'AQU_2019-12-31-6': 3, 'AQU_2019-12-31-7': 3, 'AQU_2019-12-31-8': 3, 'BEL_2019-04-26-1': 3,\n                            'BEL_2019-04-26-2': 3, 'BEL_2019-04-26-3': 3, 'BEL_2019-04-26-4': 3, 'BEL_2019-04-26-5': 3,\n                            'BEL_2019-04-26-6': 3, 'BEL_2019-04-26-7': 3, 'BEL_2019-04-26-8': 4, 'BEL_2019-04-26-9': 3,\n                            'BEL_2019-04-27-1': 3, 'BEL_2019-04-27-2': 3, 'BEL_2019-04-27-3': 3, 'BEL_2019-04-27-4': 3,\n                            'BEL_2019-04-27-5': 3, 'BEL_2019-04-27-6': 3, 'BEL_2019-04-27-7': 3, 'BEL_2019-04-27-8': 3,\n                            'BEL_2019-04-27-9': 4, 'BEL_2019-04-27-10': 3, 'BEL_2019-04-28-1': 3, 'BEL_2019-04-28-2': 4,\n                            'BEL_2019-04-28-3': 3, 'BEL_2019-04-28-4': 3, 'BEL_2019-04-28-5': 3, 'BEL_2019-04-28-6': 3,\n                            'BEL_2019-04-28-7': 3, 'BEL_2019-04-28-8': 3, 'BEL_2019-04-28-9': 4, 'BEL_2019-04-28-10': 3,\n                            'BEL_2019-05-02-1': 2, 'BEL_2019-05-02-2': 3, 'BEL_2019-05-02-3': 2, 'BEL_2019-05-02-4': 3,\n                            'BEL_2019-05-02-5': 3, 'BEL_2019-05-02-6': 3, 'BEL_2019-05-02-7': 3, 'BEL_2019-05-02-8': 4,\n                            'BEL_2019-05-02-9': 3, 'BEL_2019-05-03-1': 3, 'BEL_2019-05-03-2': 3, 'BEL_2019-05-03-3': 3,\n                            'BEL_2019-05-03-4': 3, 'BEL_2019-05-04-1': 3, 'BEL_2019-05-04-2': 3, 'BEL_2019-05-04-3': 3,\n                            'BEL_2019-05-04-4': 4, 'BEL_2019-05-04-5': 3, 'BEL_2019-05-04-6': 3, 'BEL_2019-05-04-7': 3,\n                            'BEL_2019-05-04-8': 3, 'BEL_2019-05-04-9': 3, 'BEL_2019-05-04-10': 4,\n                            'BEL_2019-05-04-11': 4, 'BEL_2019-05-04-12': 3, 'BEL_2019-05-05-1': 3,\n                            'BEL_2019-05-05-2': 3, 'BEL_2019-05-05-3': 3, 'BEL_2019-05-05-4': 3, 'BEL_2019-05-05-5': 3,\n                            'BEL_2019-05-05-6': 3, 'BEL_2019-05-05-7': 3, 'BEL_2019-05-05-8': 4, 'BEL_2019-05-05-9': 3,\n                            'BEL_2019-05-09-1': 3, 'BEL_2019-05-09-2': 2, 'BEL_2019-05-09-3': 3, 'BEL_2019-05-09-4': 3,\n                            'BEL_2019-05-09-5': 3, 'BEL_2019-05-09-6': 3, 'BEL_2019-05-09-7': 3, 'BEL_2019-05-09-8': 4,\n                            'BEL_2019-05-09-9': 3, 'BEL_2019-05-10-1': 3, 'BEL_2019-05-10-2': 3, 'BEL_2019-05-10-3': 3,\n                            'BEL_2019-05-10-4': 3, 'BEL_2019-05-10-5': 2, 'BEL_2019-05-10-6': 3, 'BEL_2019-05-10-7': 3,\n                            'BEL_2019-05-10-8': 3, 'BEL_2019-05-10-9': 3, 'BEL_2019-05-11-1': 4, 'BEL_2019-05-11-2': 3,\n                            'BEL_2019-05-11-3': 3, 'BEL_2019-05-11-4': 3, 'BEL_2019-05-11-5': 3, 'BEL_2019-05-11-6': 3,\n                            'BEL_2019-05-11-7': 4, 'BEL_2019-05-11-8': 3, 'BEL_2019-05-11-9': 4, 'BEL_2019-05-11-10': 4,\n                            'BEL_2019-05-11-11': 3, 'BEL_2019-05-12-1': 3, 'BEL_2019-05-12-2': 3, 'BEL_2019-05-12-3': 3,\n                            'BEL_2019-05-12-4': 3, 'BEL_2019-05-12-5': 3, 'BEL_2019-05-12-6': 3, 'BEL_2019-05-12-7': 3,\n                            'BEL_2019-05-12-8': 3, 'BEL_2019-05-12-9': 3, 'BEL_2019-05-16-1': 3, 'BEL_2019-05-16-2': 3,\n                            'BEL_2019-05-16-3': 3, 'BEL_2019-05-16-4': 3, 'BEL_2019-05-16-5': 3, 'BEL_2019-05-16-6': 3,\n                            'BEL_2019-05-16-7': 3, 'BEL_2019-05-16-8': 3, 'BEL_2019-05-16-9': 3, 'BEL_2019-05-17-1': 3,\n                            'BEL_2019-05-17-2': 3, 'BEL_2019-05-17-3': 3, 'BEL_2019-05-17-4': 3, 'BEL_2019-05-17-5': 3,\n                            'BEL_2019-05-17-6': 3, 'BEL_2019-05-17-7': 3, 'BEL_2019-05-17-8': 3, 'BEL_2019-05-17-9': 3,\n                            'BEL_2019-05-18-1': 3, 'BEL_2019-05-18-2': 3, 'BEL_2019-05-18-3': 3, 'BEL_2019-05-18-4': 3,\n                            'BEL_2019-05-18-5': 3, 'BEL_2019-05-18-6': 3, 'BEL_2019-05-18-7': 3, 'BEL_2019-05-18-8': 3,\n                            'BEL_2019-05-18-9': 3, 'BEL_2019-05-18-10': 3, 'BEL_2019-05-18-11': 3,\n                            'BEL_2019-05-18-12': 3, 'BEL_2019-05-19-1': 3, 'BEL_2019-05-19-2': 3, 'BEL_2019-05-19-3': 3,\n                            'BEL_2019-05-19-4': 3, 'BEL_2019-05-19-5': 3, 'BEL_2019-05-19-6': 3, 'BEL_2019-05-19-7': 3,\n                            'BEL_2019-05-19-8': 3, 'BEL_2019-05-19-9': 3, 'BEL_2019-05-23-1': 2, 'BEL_2019-05-23-2': 3,\n                            'BEL_2019-05-23-3': 3, 'BEL_2019-05-23-4': 3, 'BEL_2019-05-23-5': 3, 'BEL_2019-05-23-6': 3,\n                            'BEL_2019-05-23-7': 3, 'BEL_2019-05-23-8': 4, 'BEL_2019-05-23-9': 3, 'BEL_2019-05-24-1': 3,\n                            'BEL_2019-05-24-2': 3, 'BEL_2019-05-24-3': 3, 'BEL_2019-05-24-4': 3, 'BEL_2019-05-24-5': 3,\n                            'BEL_2019-05-24-6': 3, 'BEL_2019-05-24-7': 3, 'BEL_2019-05-24-8': 3, 'BEL_2019-05-24-9': 3,\n                            'BEL_2019-05-25-1': 2, 'BEL_2019-05-25-2': 3, 'BEL_2019-05-25-3': 3, 'BEL_2019-05-25-4': 3,\n                            'BEL_2019-05-25-5': 3, 'BEL_2019-05-25-6': 3, 'BEL_2019-05-25-7': 3, 'BEL_2019-05-25-8': 3,\n                            'BEL_2019-05-25-9': 3, 'BEL_2019-05-25-10': 3, 'BEL_2019-05-26-1': 3, 'BEL_2019-05-26-2': 3,\n                            'BEL_2019-05-26-3': 3, 'BEL_2019-05-26-4': 3, 'BEL_2019-05-26-5': 3, 'BEL_2019-05-26-6': 3,\n                            'BEL_2019-05-26-7': 3, 'BEL_2019-05-26-8': 3, 'BEL_2019-05-26-9': 3, 'BEL_2019-05-27-1': 3,\n                            'BEL_2019-05-27-2': 3, 'BEL_2019-05-27-3': 3, 'BEL_2019-05-27-4': 3, 'BEL_2019-05-27-5': 3,\n                            'BEL_2019-05-27-6': 3, 'BEL_2019-05-27-7': 3, 'BEL_2019-05-27-8': 3, 'BEL_2019-05-27-9': 3,\n                            'BEL_2019-05-27-10': 3, 'BEL_2019-05-27-11': 3, 'BEL_2019-05-30-1': 3,\n                            'BEL_2019-05-30-2': 3, 'BEL_2019-05-30-3': 3, 'BEL_2019-05-30-4': 2, 'BEL_2019-05-30-5': 3,\n                            'BEL_2019-05-30-6': 3, 'BEL_2019-05-30-7': 3, 'BEL_2019-05-30-8': 3, 'BEL_2019-05-31-1': 3,\n                            'BEL_2019-05-31-2': 2, 'BEL_2019-05-31-3': 3, 'BEL_2019-05-31-4': 3, 'BEL_2019-05-31-5': 3,\n                            'BEL_2019-05-31-6': 3, 'BEL_2019-05-31-7': 3, 'BEL_2019-05-31-8': 4, 'BEL_2019-05-31-9': 3,\n                            'BEL_2019-06-01-1': 3, 'BEL_2019-06-01-2': 3, 'BEL_2019-06-01-3': 3, 'BEL_2019-06-01-4': 3,\n                            'BEL_2019-06-01-5': 3, 'BEL_2019-06-01-6': 3, 'BEL_2019-06-01-7': 3, 'BEL_2019-06-01-8': 3,\n                            'BEL_2019-06-01-9': 3, 'BEL_2019-06-02-1': 3, 'BEL_2019-06-02-2': 3, 'BEL_2019-06-02-3': 3,\n                            'BEL_2019-06-02-4': 3, 'BEL_2019-06-02-5': 3, 'BEL_2019-06-02-6': 3, 'BEL_2019-06-02-7': 3,\n                            'BEL_2019-06-02-8': 3, 'BEL_2019-06-02-9': 3, 'BEL_2019-06-02-10': 3, 'BEL_2019-06-06-1': 3,\n                            'BEL_2019-06-06-2': 3, 'BEL_2019-06-06-3': 3, 'BEL_2019-06-06-4': 3, 'BEL_2019-06-06-5': 3,\n                            'BEL_2019-06-06-6': 3, 'BEL_2019-06-06-7': 2, 'BEL_2019-06-06-8': 4, 'BEL_2019-06-06-9': 3,\n                            'BEL_2019-06-07-1': 3, 'BEL_2019-06-07-2': 3, 'BEL_2019-06-07-3': 3, 'BEL_2019-06-07-4': 3,\n                            'BEL_2019-06-07-5': 4, 'BEL_2019-06-07-6': 4, 'BEL_2019-06-07-7': 2, 'BEL_2019-06-07-8': 4,\n                            'BEL_2019-06-07-9': 4, 'BEL_2019-06-07-10': 4, 'BEL_2019-06-07-11': 3,\n                            'BEL_2019-06-08-1': 3, 'BEL_2019-06-08-2': 3, 'BEL_2019-06-08-3': 3, 'BEL_2019-06-08-4': 4,\n                            'BEL_2019-06-08-5': 4, 'BEL_2019-06-08-6': 3, 'BEL_2019-06-08-7': 3, 'BEL_2019-06-08-8': 3,\n                            'BEL_2019-06-08-9': 3, 'BEL_2019-06-08-10': 4, 'BEL_2019-06-08-11': 3,\n                            'BEL_2019-06-08-12': 3, 'BEL_2019-06-08-13': 4, 'BEL_2019-06-09-1': 3,\n                            'BEL_2019-06-09-2': 3, 'BEL_2019-06-09-3': 3, 'BEL_2019-06-09-4': 3, 'BEL_2019-06-09-5': 3,\n                            'BEL_2019-06-09-6': 3, 'BEL_2019-06-09-7': 3, 'BEL_2019-06-09-8': 3, 'BEL_2019-06-09-9': 3,\n                            'BEL_2019-06-09-10': 3, 'BEL_2019-06-12-1': 3, 'BEL_2019-06-12-2': 3, 'BEL_2019-06-12-3': 2,\n                            'BEL_2019-06-12-4': 3, 'BEL_2019-06-12-5': 3, 'BEL_2019-06-12-6': 3, 'BEL_2019-06-12-7': 3,\n                            'BEL_2019-06-12-8': 3, 'BEL_2019-06-12-9': 3, 'BEL_2019-06-13-1': 3, 'BEL_2019-06-13-2': 3,\n                            'BEL_2019-06-13-3': 3, 'BEL_2019-06-13-4': 3, 'BEL_2019-06-13-5': 3, 'BEL_2019-06-13-6': 3,\n                            'BEL_2019-06-13-7': 3, 'BEL_2019-06-13-8': 3, 'BEL_2019-06-13-9': 3, 'BEL_2019-06-14-1': 3,\n                            'BEL_2019-06-14-2': 3, 'BEL_2019-06-14-3': 3, 'BEL_2019-06-14-4': 3, 'BEL_2019-06-14-5': 2,\n                            'BEL_2019-06-14-6': 3, 'BEL_2019-06-14-7': 3, 'BEL_2019-06-14-8': 3, 'BEL_2019-06-14-9': 3,\n                            'BEL_2019-06-15-1': 3, 'BEL_2019-06-15-2': 3, 'BEL_2019-06-15-3': 3, 'BEL_2019-06-15-4': 3,\n                            'BEL_2019-06-15-5': 3, 'BEL_2019-06-15-6': 3, 'BEL_2019-06-15-7': 3, 'BEL_2019-06-15-8': 3,\n                            'BEL_2019-06-15-9': 3, 'BEL_2019-06-15-10': 3, 'BEL_2019-06-16-1': 3, 'BEL_2019-06-16-2': 3,\n                            'BEL_2019-06-16-3': 3, 'BEL_2019-06-16-4': 3, 'BEL_2019-06-16-5': 3, 'BEL_2019-06-16-6': 3,\n                            'BEL_2019-06-16-7': 4, 'BEL_2019-06-16-8': 4, 'BEL_2019-06-16-9': 3, 'BEL_2019-06-19-1': 3,\n                            'BEL_2019-06-19-2': 3, 'BEL_2019-06-19-3': 3, 'BEL_2019-06-19-4': 3, 'BEL_2019-06-19-5': 3,\n                            'BEL_2019-06-19-6': 3, 'BEL_2019-06-19-7': 3, 'BEL_2019-06-19-8': 3, 'BEL_2019-06-19-9': 3,\n                            'BEL_2019-06-20-1': 3, 'BEL_2019-06-20-2': 3, 'BEL_2019-06-20-3': 3, 'BEL_2019-06-20-4': 3,\n                            'BEL_2019-06-20-5': 2, 'BEL_2019-06-20-6': 3, 'BEL_2019-06-20-7': 3, 'BEL_2019-06-20-8': 3,\n                            'BEL_2019-06-20-9': 3, 'BEL_2019-06-21-1': 3, 'BEL_2019-06-21-2': 2, 'BEL_2019-06-21-3': 3,\n                            'BEL_2019-06-21-4': 3, 'BEL_2019-06-21-5': 3, 'BEL_2019-06-21-6': 3, 'BEL_2019-06-21-7': 2,\n                            'BEL_2019-06-21-8': 3, 'BEL_2019-06-21-9': 3, 'BEL_2019-06-22-1': 3, 'BEL_2019-06-22-2': 3,\n                            'BEL_2019-06-22-3': 3, 'BEL_2019-06-22-4': 2, 'BEL_2019-06-22-5': 3, 'BEL_2019-06-22-6': 3,\n                            'BEL_2019-06-22-7': 3, 'BEL_2019-06-22-8': 3, 'BEL_2019-06-22-9': 3, 'BEL_2019-06-22-10': 3,\n                            'BEL_2019-06-23-1': 3, 'BEL_2019-06-23-2': 2, 'BEL_2019-06-23-3': 3, 'BEL_2019-06-23-4': 3,\n                            'BEL_2019-06-23-5': 3, 'BEL_2019-06-23-6': 2, 'BEL_2019-06-23-7': 3, 'BEL_2019-06-23-8': 3,\n                            'BEL_2019-06-23-9': 3, 'BEL_2019-06-26-1': 3, 'BEL_2019-06-26-2': 3, 'BEL_2019-06-26-3': 3,\n                            'BEL_2019-06-26-4': 3, 'BEL_2019-06-26-5': 3, 'BEL_2019-06-26-6': 2, 'BEL_2019-06-26-7': 3,\n                            'BEL_2019-06-26-8': 3, 'BEL_2019-06-27-1': 3, 'BEL_2019-06-27-2': 3, 'BEL_2019-06-27-3': 3,\n                            'BEL_2019-06-27-4': 3, 'BEL_2019-06-27-5': 3, 'BEL_2019-06-27-6': 3, 'BEL_2019-06-27-7': 3,\n                            'BEL_2019-06-27-8': 3, 'BEL_2019-06-27-9': 3, 'BEL_2019-06-28-1': 3, 'BEL_2019-06-28-2': 3,\n                            'BEL_2019-06-28-3': 3, 'BEL_2019-06-28-4': 2, 'BEL_2019-06-28-5': 3, 'BEL_2019-06-28-6': 3,\n                            'BEL_2019-06-28-7': 3, 'BEL_2019-06-28-8': 3, 'BEL_2019-06-28-9': 3, 'BEL_2019-06-29-1': 3,\n                            'BEL_2019-06-29-2': 3, 'BEL_2019-06-29-3': 3, 'BEL_2019-06-29-4': 3, 'BEL_2019-06-29-5': 3,\n                            'BEL_2019-06-29-6': 3, 'BEL_2019-06-29-7': 4, 'BEL_2019-06-29-8': 3, 'BEL_2019-06-29-9': 3,\n                            'BEL_2019-06-30-1': 3, 'BEL_2019-06-30-2': 3, 'BEL_2019-06-30-3': 3, 'BEL_2019-06-30-4': 2,\n                            'BEL_2019-06-30-5': 3, 'BEL_2019-06-30-6': 3, 'BEL_2019-06-30-7': 4, 'BEL_2019-06-30-8': 3,\n                            'BEL_2019-07-03-1': 3, 'BEL_2019-07-03-2': 3, 'BEL_2019-07-03-3': 3, 'BEL_2019-07-03-4': 3,\n                            'BEL_2019-07-03-5': 2, 'BEL_2019-07-03-6': 3, 'BEL_2019-07-03-7': 3, 'BEL_2019-07-03-8': 3,\n                            'BEL_2019-07-04-1': 3, 'BEL_2019-07-04-2': 3, 'BEL_2019-07-04-3': 3, 'BEL_2019-07-04-4': 3,\n                            'BEL_2019-07-04-5': 2, 'BEL_2019-07-04-6': 3, 'BEL_2019-07-04-7': 3, 'BEL_2019-07-04-8': 3,\n                            'BEL_2019-07-04-9': 3, 'BEL_2019-07-05-1': 3, 'BEL_2019-07-05-2': 3, 'BEL_2019-07-05-3': 3,\n                            'BEL_2019-07-05-4': 3, 'BEL_2019-07-05-5': 3, 'BEL_2019-07-05-6': 3, 'BEL_2019-07-05-7': 4,\n                            'BEL_2019-07-05-8': 3, 'BEL_2019-07-05-9': 3, 'BEL_2019-07-06-1': 3, 'BEL_2019-07-06-2': 3,\n                            'BEL_2019-07-06-3': 3, 'BEL_2019-07-06-4': 3, 'BEL_2019-07-06-5': 2, 'BEL_2019-07-06-6': 3,\n                            'BEL_2019-07-06-7': 3, 'BEL_2019-07-06-8': 3, 'BEL_2019-07-06-9': 3, 'BEL_2019-07-06-10': 4,\n                            'BEL_2019-07-06-11': 3, 'BEL_2019-07-07-1': 3, 'BEL_2019-07-07-2': 3, 'BEL_2019-07-07-3': 3,\n                            'BEL_2019-07-07-4': 3, 'BEL_2019-07-07-5': 3, 'BEL_2019-07-07-6': 3, 'BEL_2019-07-07-7': 3,\n                            'BEL_2019-07-07-8': 4, 'BEL_2019-07-07-9': 3, 'BEL_2019-09-06-1': 3, 'BEL_2019-09-06-2': 2,\n                            'BEL_2019-09-06-3': 3, 'BEL_2019-09-06-4': 2, 'BEL_2019-09-06-5': 3, 'BEL_2019-09-06-6': 3,\n                            'BEL_2019-09-06-7': 3, 'BEL_2019-09-06-8': 2, 'BEL_2019-09-07-1': 3, 'BEL_2019-09-07-2': 3,\n                            'BEL_2019-09-07-3': 3, 'BEL_2019-09-07-4': 3, 'BEL_2019-09-07-5': 2, 'BEL_2019-09-07-6': 3,\n                            'BEL_2019-09-07-7': 3, 'BEL_2019-09-07-8': 3, 'BEL_2019-09-07-9': 3, 'BEL_2019-09-07-10': 3,\n                            'BEL_2019-09-07-11': 3, 'BEL_2019-09-08-1': 3, 'BEL_2019-09-08-2': 3, 'BEL_2019-09-08-3': 3,\n                            'BEL_2019-09-08-4': 3, 'BEL_2019-09-08-5': 2, 'BEL_2019-09-08-6': 3, 'BEL_2019-09-08-7': 2,\n                            'BEL_2019-09-08-8': 3, 'BEL_2019-09-08-9': 3, 'BEL_2019-09-11-1': 2, 'BEL_2019-09-11-2': 3,\n                            'BEL_2019-09-11-3': 3, 'BEL_2019-09-11-4': 3, 'BEL_2019-09-11-5': 3, 'BEL_2019-09-11-6': 3,\n                            'BEL_2019-09-11-7': 3, 'BEL_2019-09-11-8': 3, 'BEL_2019-09-12-1': 3, 'BEL_2019-09-12-2': 3,\n                            'BEL_2019-09-12-3': 3, 'BEL_2019-09-12-4': 3, 'BEL_2019-09-12-5': 3, 'BEL_2019-09-12-6': 3,\n                            'BEL_2019-09-12-7': 3, 'BEL_2019-09-12-8': 3, 'BEL_2019-09-13-1': 3, 'BEL_2019-09-13-2': 2,\n                            'BEL_2019-09-13-3': 3, 'BEL_2019-09-13-4': 2, 'BEL_2019-09-13-5': 3, 'BEL_2019-09-13-6': 2,\n                            'BEL_2019-09-13-7': 3, 'BEL_2019-09-13-8': 3, 'BEL_2019-09-14-1': 3, 'BEL_2019-09-14-2': 3,\n                            'BEL_2019-09-14-3': 3, 'BEL_2019-09-14-4': 2, 'BEL_2019-09-14-5': 3, 'BEL_2019-09-14-6': 2,\n                            'BEL_2019-09-14-7': 2, 'BEL_2019-09-14-8': 3, 'BEL_2019-09-14-9': 3, 'BEL_2019-09-14-10': 3,\n                            'BEL_2019-09-14-11': 3, 'BEL_2019-09-15-1': 3, 'BEL_2019-09-15-2': 3, 'BEL_2019-09-15-3': 3,\n                            'BEL_2019-09-15-4': 2, 'BEL_2019-09-15-5': 3, 'BEL_2019-09-15-6': 3, 'BEL_2019-09-15-7': 3,\n                            'BEL_2019-09-15-8': 2, 'BEL_2019-09-15-9': 3, 'BEL_2019-09-15-10': 3, 'BEL_2019-09-18-1': 4,\n                            'BEL_2019-09-18-2': 2, 'BEL_2019-09-18-3': 3, 'BEL_2019-09-18-4': 3, 'BEL_2019-09-18-5': 3,\n                            'BEL_2019-09-18-6': 3, 'BEL_2019-09-18-7': 2, 'BEL_2019-09-18-8': 2, 'BEL_2019-09-19-1': 4,\n                            'BEL_2019-09-19-2': 3, 'BEL_2019-09-19-3': 3, 'BEL_2019-09-19-4': 3, 'BEL_2019-09-19-5': 2,\n                            'BEL_2019-09-19-6': 3, 'BEL_2019-09-19-7': 3, 'BEL_2019-09-19-8': 2, 'BEL_2019-09-20-1': 3,\n                            'BEL_2019-09-20-2': 3, 'BEL_2019-09-20-3': 2, 'BEL_2019-09-20-4': 3, 'BEL_2019-09-20-5': 3,\n                            'BEL_2019-09-20-6': 3, 'BEL_2019-09-20-7': 3, 'BEL_2019-09-20-8': 2, 'BEL_2019-09-21-1': 3,\n                            'BEL_2019-09-21-2': 3, 'BEL_2019-09-21-3': 3, 'BEL_2019-09-21-4': 2, 'BEL_2019-09-21-5': 3,\n                            'BEL_2019-09-21-6': 2, 'BEL_2019-09-21-7': 3, 'BEL_2019-09-21-8': 3, 'BEL_2019-09-21-9': 3,\n                            'BEL_2019-09-21-10': 3, 'BEL_2019-09-21-11': 3, 'BEL_2019-09-22-1': 3,\n                            'BEL_2019-09-22-2': 3, 'BEL_2019-09-22-3': 3, 'BEL_2019-09-22-4': 3, 'BEL_2019-09-22-5': 3,\n                            'BEL_2019-09-22-6': 2, 'BEL_2019-09-22-7': 3, 'BEL_2019-09-22-8': 3, 'BEL_2019-09-22-9': 3,\n                            'BEL_2019-09-22-10': 3, 'BEL_2019-09-25-1': 3, 'BEL_2019-09-25-2': 3, 'BEL_2019-09-25-3': 3,\n                            'BEL_2019-09-25-4': 3, 'BEL_2019-09-25-5': 3, 'BEL_2019-09-25-6': 3, 'BEL_2019-09-25-7': 3,\n                            'BEL_2019-09-25-8': 3, 'BEL_2019-09-26-1': 2, 'BEL_2019-09-26-2': 3, 'BEL_2019-09-26-3': 3,\n                            'BEL_2019-09-26-4': 3, 'BEL_2019-09-26-5': 3, 'BEL_2019-09-26-6': 2, 'BEL_2019-09-26-7': 3,\n                            'BEL_2019-09-26-8': 3, 'BEL_2019-09-27-1': 3, 'BEL_2019-09-27-2': 3, 'BEL_2019-09-27-3': 3,\n                            'BEL_2019-09-27-4': 2, 'BEL_2019-09-27-5': 2, 'BEL_2019-09-27-6': 3, 'BEL_2019-09-27-7': 3,\n                            'BEL_2019-09-27-8': 3, 'BEL_2019-09-28-1': 3, 'BEL_2019-09-28-2': 2, 'BEL_2019-09-28-3': 3,\n                            'BEL_2019-09-28-4': 3, 'BEL_2019-09-28-5': 2, 'BEL_2019-09-28-6': 2, 'BEL_2019-09-28-7': 3,\n                            'BEL_2019-09-28-8': 3, 'BEL_2019-09-28-9': 2, 'BEL_2019-09-28-10': 3,\n                            'BEL_2019-09-28-11': 3, 'BEL_2019-09-29-1': 3, 'BEL_2019-09-29-2': 3, 'BEL_2019-09-29-3': 3,\n                            'BEL_2019-09-29-4': 3, 'BEL_2019-09-29-5': 3, 'BEL_2019-09-29-6': 3, 'BEL_2019-09-29-7': 3,\n                            'BEL_2019-09-29-8': 2, 'BEL_2019-09-29-9': 3, 'BEL_2019-10-02-1': 3, 'BEL_2019-10-02-2': 3,\n                            'BEL_2019-10-02-3': 2, 'BEL_2019-10-02-4': 3, 'BEL_2019-10-02-5': 3, 'BEL_2019-10-02-6': 3,\n                            'BEL_2019-10-02-7': 3, 'BEL_2019-10-02-8': 3, 'BEL_2019-10-03-1': 2, 'BEL_2019-10-03-2': 2,\n                            'BEL_2019-10-03-3': 3, 'BEL_2019-10-03-4': 3, 'BEL_2019-10-03-5': 3, 'BEL_2019-10-03-6': 3,\n                            'BEL_2019-10-03-7': 3, 'BEL_2019-10-03-8': 2, 'BEL_2019-10-04-1': 3, 'BEL_2019-10-04-2': 2,\n                            'BEL_2019-10-04-3': 3, 'BEL_2019-10-04-4': 3, 'BEL_2019-10-04-5': 3, 'BEL_2019-10-04-6': 3,\n                            'BEL_2019-10-04-7': 3, 'BEL_2019-10-04-8': 2, 'BEL_2019-10-05-1': 3, 'BEL_2019-10-05-2': 2,\n                            'BEL_2019-10-05-3': 3, 'BEL_2019-10-05-4': 2, 'BEL_2019-10-05-5': 3, 'BEL_2019-10-05-6': 2,\n                            'BEL_2019-10-05-7': 2, 'BEL_2019-10-05-8': 3, 'BEL_2019-10-05-9': 3, 'BEL_2019-10-05-10': 2,\n                            'BEL_2019-10-05-11': 2, 'BEL_2019-10-06-1': 3, 'BEL_2019-10-06-2': 3, 'BEL_2019-10-06-3': 3,\n                            'BEL_2019-10-06-4': 3, 'BEL_2019-10-06-5': 2, 'BEL_2019-10-06-6': 2, 'BEL_2019-10-06-7': 2,\n                            'BEL_2019-10-06-8': 3, 'BEL_2019-10-06-9': 2, 'BEL_2019-10-06-10': 3, 'BEL_2019-10-10-1': 3,\n                            'BEL_2019-10-10-2': 3, 'BEL_2019-10-10-3': 3, 'BEL_2019-10-10-4': 3, 'BEL_2019-10-10-5': 3,\n                            'BEL_2019-10-10-6': 3, 'BEL_2019-10-10-7': 3, 'BEL_2019-10-10-8': 3, 'BEL_2019-10-11-1': 2,\n                            'BEL_2019-10-11-2': 3, 'BEL_2019-10-11-3': 3, 'BEL_2019-10-11-4': 2, 'BEL_2019-10-11-5': 3,\n                            'BEL_2019-10-11-6': 3, 'BEL_2019-10-11-7': 3, 'BEL_2019-10-11-8': 3, 'BEL_2019-10-12-1': 2,\n                            'BEL_2019-10-12-2': 3, 'BEL_2019-10-12-3': 3, 'BEL_2019-10-12-4': 3, 'BEL_2019-10-12-5': 3,\n                            'BEL_2019-10-12-6': 2, 'BEL_2019-10-12-7': 3, 'BEL_2019-10-12-8': 2, 'BEL_2019-10-12-9': 3,\n                            'BEL_2019-10-12-10': 3, 'BEL_2019-10-13-1': 3, 'BEL_2019-10-13-2': 3, 'BEL_2019-10-13-3': 3,\n                            'BEL_2019-10-13-4': 2, 'BEL_2019-10-13-5': 3, 'BEL_2019-10-13-6': 3, 'BEL_2019-10-13-7': 3,\n                            'BEL_2019-10-13-8': 3, 'BEL_2019-10-13-9': 3, 'BEL_2019-10-14-1': 3, 'BEL_2019-10-14-2': 3,\n                            'BEL_2019-10-14-3': 3, 'BEL_2019-10-14-4': 3, 'BEL_2019-10-14-5': 2, 'BEL_2019-10-14-6': 3,\n                            'BEL_2019-10-14-7': 3, 'BEL_2019-10-14-8': 3, 'BEL_2019-10-14-9': 3, 'BEL_2019-10-16-1': 3,\n                            'BEL_2019-10-16-2': 3, 'BEL_2019-10-16-3': 3, 'BEL_2019-10-16-4': 3, 'BEL_2019-10-16-5': 2,\n                            'BEL_2019-10-16-6': 3, 'BEL_2019-10-16-7': 3, 'BEL_2019-10-16-8': 3, 'BEL_2019-10-18-1': 3,\n                            'BEL_2019-10-18-2': 3, 'BEL_2019-10-18-3': 3, 'BEL_2019-10-18-4': 3, 'BEL_2019-10-18-5': 3,\n                            'BEL_2019-10-18-6': 3, 'BEL_2019-10-18-7': 3, 'BEL_2019-10-18-8': 3, 'BEL_2019-10-19-1': 3,\n                            'BEL_2019-10-19-2': 2, 'BEL_2019-10-19-3': 2, 'BEL_2019-10-19-4': 3, 'BEL_2019-10-19-5': 3,\n                            'BEL_2019-10-19-6': 3, 'BEL_2019-10-19-7': 3, 'BEL_2019-10-19-8': 2, 'BEL_2019-10-19-9': 3,\n                            'BEL_2019-10-19-10': 3, 'BEL_2019-10-19-11': 3, 'BEL_2019-10-20-1': 3,\n                            'BEL_2019-10-20-2': 2, 'BEL_2019-10-20-3': 3, 'BEL_2019-10-20-4': 3, 'BEL_2019-10-20-5': 3,\n                            'BEL_2019-10-20-6': 3, 'BEL_2019-10-20-7': 3, 'BEL_2019-10-20-8': 2, 'BEL_2019-10-20-9': 3,\n                            'BEL_2019-10-20-10': 3, 'BEL_2019-10-23-1': 3, 'BEL_2019-10-23-2': 3, 'BEL_2019-10-23-3': 3,\n                            'BEL_2019-10-23-4': 2, 'BEL_2019-10-23-5': 2, 'BEL_2019-10-23-6': 3, 'BEL_2019-10-23-7': 3,\n                            'BEL_2019-10-23-8': 2, 'BEL_2019-10-24-1': 2, 'BEL_2019-10-24-2': 2, 'BEL_2019-10-24-3': 3,\n                            'BEL_2019-10-24-4': 3, 'BEL_2019-10-24-5': 3, 'BEL_2019-10-24-6': 3, 'BEL_2019-10-24-7': 3,\n                            'BEL_2019-10-24-8': 2, 'BEL_2019-10-25-1': 2, 'BEL_2019-10-25-2': 2, 'BEL_2019-10-25-3': 3,\n                            'BEL_2019-10-25-4': 3, 'BEL_2019-10-25-5': 3, 'BEL_2019-10-25-6': 2, 'BEL_2019-10-25-7': 3,\n                            'BEL_2019-10-25-8': 3, 'BEL_2019-10-25-9': 3, 'BEL_2019-10-26-1': 2, 'BEL_2019-10-26-2': 2,\n                            'BEL_2019-10-26-3': 3, 'BEL_2019-10-26-4': 3, 'BEL_2019-10-26-5': 3, 'BEL_2019-10-26-6': 3,\n                            'BEL_2019-10-26-7': 3, 'BEL_2019-10-26-8': 3, 'BEL_2019-10-26-9': 2, 'BEL_2019-10-26-10': 3,\n                            'BEL_2019-10-27-1': 2, 'SAR_2019-07-11-1': 3, 'SAR_2019-07-11-2': 3, 'SAR_2019-07-11-3': 3,\n                            'SAR_2019-07-11-4': 3, 'SAR_2019-07-11-5': 2, 'SAR_2019-07-11-6': 3, 'SAR_2019-07-11-7': 3,\n                            'SAR_2019-07-11-8': 2, 'SAR_2019-07-11-9': 3, 'SAR_2019-07-11-10': 3, 'SAR_2019-07-12-1': 3,\n                            'SAR_2019-07-12-2': 3, 'SAR_2019-07-12-3': 3, 'SAR_2019-07-12-4': 3, 'SAR_2019-07-12-5': 2,\n                            'SAR_2019-07-12-6': 3, 'SAR_2019-07-12-7': 3, 'SAR_2019-07-12-8': 3, 'SAR_2019-07-12-9': 4,\n                            'SAR_2019-07-12-10': 3, 'SAR_2019-07-13-1': 3, 'SAR_2019-07-13-2': 3, 'SAR_2019-07-13-3': 2,\n                            'SAR_2019-07-13-4': 2, 'SAR_2019-07-13-5': 3, 'SAR_2019-07-13-6': 2, 'SAR_2019-07-13-7': 3,\n                            'SAR_2019-07-13-8': 3, 'SAR_2019-07-13-9': 3, 'SAR_2019-07-13-10': 3,\n                            'SAR_2019-07-13-11': 3, 'SAR_2019-07-14-1': 2, 'SAR_2019-07-14-2': 3, 'SAR_2019-07-14-3': 3,\n                            'SAR_2019-07-14-4': 2, 'SAR_2019-07-14-5': 3, 'SAR_2019-07-14-6': 3, 'SAR_2019-07-14-7': 3,\n                            'SAR_2019-07-14-8': 3, 'SAR_2019-07-14-9': 3, 'SAR_2019-07-14-10': 3, 'SAR_2019-07-17-1': 4,\n                            'SAR_2019-07-17-2': 2, 'SAR_2019-07-17-3': 3, 'SAR_2019-07-17-4': 3, 'SAR_2019-07-17-5': 2,\n                            'SAR_2019-07-17-6': 3, 'SAR_2019-07-17-7': 3, 'SAR_2019-07-17-8': 3, 'SAR_2019-07-17-9': 3,\n                            'SAR_2019-07-17-10': 2, 'SAR_2019-07-18-1': 3, 'SAR_2019-07-18-2': 2, 'SAR_2019-07-18-3': 2,\n                            'SAR_2019-07-18-4': 3, 'SAR_2019-07-18-5': 2, 'SAR_2019-07-18-6': 3, 'SAR_2019-07-18-7': 3,\n                            'SAR_2019-07-18-8': 3, 'SAR_2019-07-18-9': 3, 'SAR_2019-07-18-10': 3, 'SAR_2019-07-19-1': 3,\n                            'SAR_2019-07-19-2': 3, 'SAR_2019-07-19-3': 3, 'SAR_2019-07-19-4': 3, 'SAR_2019-07-19-5': 2,\n                            'SAR_2019-07-19-6': 3, 'SAR_2019-07-19-7': 3, 'SAR_2019-07-19-8': 4, 'SAR_2019-07-19-9': 3,\n                            'SAR_2019-07-19-10': 3, 'SAR_2019-07-21-1': 4, 'SAR_2019-07-21-2': 3, 'SAR_2019-07-21-3': 3,\n                            'SAR_2019-07-21-4': 3, 'SAR_2019-07-21-5': 3, 'SAR_2019-07-21-6': 3, 'SAR_2019-07-21-7': 2,\n                            'SAR_2019-07-21-8': 2, 'SAR_2019-07-21-9': 3, 'SAR_2019-07-21-10': 3,\n                            'SAR_2019-07-21-11': 4, 'SAR_2019-07-21-12': 3, 'SAR_2019-07-21-13': 3,\n                            'SAR_2019-07-24-1': 4, 'SAR_2019-07-24-2': 3, 'SAR_2019-07-24-3': 2, 'SAR_2019-07-24-4': 4,\n                            'SAR_2019-07-24-5': 3, 'SAR_2019-07-24-6': 2, 'SAR_2019-07-24-7': 3, 'SAR_2019-07-24-8': 3,\n                            'SAR_2019-07-24-9': 3, 'SAR_2019-07-24-10': 3, 'SAR_2019-07-25-1': 4, 'SAR_2019-07-25-2': 2,\n                            'SAR_2019-07-25-3': 3, 'SAR_2019-07-25-4': 3, 'SAR_2019-07-26-1': 3, 'SAR_2019-07-26-2': 2,\n                            'SAR_2019-07-26-3': 3, 'SAR_2019-07-26-4': 3, 'SAR_2019-07-26-5': 3, 'SAR_2019-07-26-6': 3,\n                            'SAR_2019-07-26-7': 3, 'SAR_2019-07-26-8': 3, 'SAR_2019-07-26-9': 3, 'SAR_2019-07-26-10': 3,\n                            'SAR_2019-07-27-1': 3, 'SAR_2019-07-27-2': 3, 'SAR_2019-07-27-3': 3, 'SAR_2019-07-27-4': 2,\n                            'SAR_2019-07-27-5': 3, 'SAR_2019-07-27-6': 3, 'SAR_2019-07-27-7': 2, 'SAR_2019-07-27-8': 3,\n                            'SAR_2019-07-27-9': 3, 'SAR_2019-07-27-10': 4, 'SAR_2019-07-27-11': 3,\n                            'SAR_2019-07-27-12': 3, 'SAR_2019-07-28-1': 2, 'SAR_2019-07-28-2': 3, 'SAR_2019-07-28-3': 3,\n                            'SAR_2019-07-28-4': 3, 'SAR_2019-07-28-5': 3, 'SAR_2019-07-28-6': 3, 'SAR_2019-07-28-7': 3,\n                            'SAR_2019-07-28-8': 3, 'SAR_2019-07-28-9': 4, 'SAR_2019-07-28-10': 3,\n                            'SAR_2019-07-28-11': 3, 'SAR_2019-07-28-12': 3, 'SAR_2019-07-31-1': 3,\n                            'SAR_2019-07-31-2': 3, 'SAR_2019-07-31-3': 2, 'SAR_2019-07-31-4': 3, 'SAR_2019-07-31-5': 2,\n                            'SAR_2019-07-31-6': 2, 'SAR_2019-07-31-7': 3, 'SAR_2019-07-31-8': 3, 'SAR_2019-07-31-9': 4,\n                            'SAR_2019-07-31-10': 3, 'SAR_2019-08-01-1': 2, 'SAR_2019-08-01-2': 4, 'SAR_2019-08-01-3': 2,\n                            'SAR_2019-08-01-4': 3, 'SAR_2019-08-01-5': 3, 'SAR_2019-08-01-6': 3, 'SAR_2019-08-01-7': 3,\n                            'SAR_2019-08-01-8': 3, 'SAR_2019-08-01-9': 3, 'SAR_2019-08-01-10': 3, 'SAR_2019-08-02-1': 3,\n                            'SAR_2019-08-02-2': 3, 'SAR_2019-08-02-3': 2, 'SAR_2019-08-02-4': 3, 'SAR_2019-08-02-5': 3,\n                            'SAR_2019-08-02-6': 3, 'SAR_2019-08-02-7': 3, 'SAR_2019-08-02-8': 4, 'SAR_2019-08-02-9': 3,\n                            'SAR_2019-08-02-10': 3, 'SAR_2019-08-03-1': 2, 'SAR_2019-08-03-2': 3, 'SAR_2019-08-03-3': 2,\n                            'SAR_2019-08-03-4': 4, 'SAR_2019-08-03-5': 3, 'SAR_2019-08-03-6': 3, 'SAR_2019-08-03-7': 4,\n                            'SAR_2019-08-03-8': 3, 'SAR_2019-08-03-9': 3, 'SAR_2019-08-03-10': 4,\n                            'SAR_2019-08-03-11': 3, 'SAR_2019-08-04-1': 2, 'SAR_2019-08-04-2': 3, 'SAR_2019-08-04-3': 3,\n                            'SAR_2019-08-04-4': 2, 'SAR_2019-08-04-5': 3, 'SAR_2019-08-04-6': 3, 'SAR_2019-08-04-7': 3,\n                            'SAR_2019-08-04-8': 3, 'SAR_2019-08-04-9': 3, 'SAR_2019-08-04-10': 2,\n                            'SAR_2019-08-04-11': 3, 'SAR_2019-08-07-1': 4, 'SAR_2019-08-07-2': 3, 'SAR_2019-08-07-3': 3,\n                            'SAR_2019-08-07-4': 3, 'SAR_2019-08-07-5': 2, 'SAR_2019-08-07-6': 3, 'SAR_2019-08-07-7': 3,\n                            'SAR_2019-08-07-8': 3, 'SAR_2019-08-07-9': 3, 'SAR_2019-08-07-10': 3, 'SAR_2019-08-08-1': 3,\n                            'SAR_2019-08-08-2': 3, 'SAR_2019-08-08-3': 3, 'SAR_2019-08-08-4': 3, 'SAR_2019-08-08-5': 2,\n                            'SAR_2019-08-08-6': 3, 'SAR_2019-08-08-7': 3, 'SAR_2019-08-08-8': 3, 'SAR_2019-08-08-9': 3,\n                            'SAR_2019-08-08-10': 3, 'SAR_2019-08-09-1': 3, 'SAR_2019-08-09-2': 3, 'SAR_2019-08-09-3': 3,\n                            'SAR_2019-08-09-4': 2, 'SAR_2019-08-09-5': 3, 'SAR_2019-08-09-6': 2, 'SAR_2019-08-09-7': 3,\n                            'SAR_2019-08-09-8': 3, 'SAR_2019-08-09-9': 3, 'SAR_2019-08-09-10': 3, 'SAR_2019-08-10-1': 3,\n                            'SAR_2019-08-10-2': 3, 'SAR_2019-08-10-3': 2, 'SAR_2019-08-10-4': 3, 'SAR_2019-08-10-5': 2,\n                            'SAR_2019-08-10-6': 3, 'SAR_2019-08-10-7': 2, 'SAR_2019-08-10-8': 2, 'SAR_2019-08-10-9': 3,\n                            'SAR_2019-08-10-10': 3, 'SAR_2019-08-10-11': 3, 'SAR_2019-08-11-1': 3,\n                            'SAR_2019-08-11-2': 4, 'SAR_2019-08-11-3': 2, 'SAR_2019-08-11-4': 3, 'SAR_2019-08-11-5': 3,\n                            'SAR_2019-08-11-6': 2, 'SAR_2019-08-11-7': 3, 'SAR_2019-08-11-8': 3, 'SAR_2019-08-11-9': 3,\n                            'SAR_2019-08-11-10': 3, 'SAR_2019-08-14-1': 4, 'SAR_2019-08-14-2': 2, 'SAR_2019-08-14-3': 3,\n                            'SAR_2019-08-14-4': 3, 'SAR_2019-08-14-5': 3, 'SAR_2019-08-14-6': 2, 'SAR_2019-08-14-7': 2,\n                            'SAR_2019-08-14-8': 3, 'SAR_2019-08-14-9': 3, 'SAR_2019-08-14-10': 3, 'SAR_2019-08-15-1': 3,\n                            'SAR_2019-08-15-2': 2, 'SAR_2019-08-15-3': 4, 'SAR_2019-08-15-4': 2, 'SAR_2019-08-15-5': 3,\n                            'SAR_2019-08-15-6': 3, 'SAR_2019-08-15-7': 3, 'SAR_2019-08-15-8': 3, 'SAR_2019-08-15-9': 3,\n                            'SAR_2019-08-16-1': 2, 'SAR_2019-08-16-2': 3, 'SAR_2019-08-16-3': 3, 'SAR_2019-08-16-4': 3,\n                            'SAR_2019-08-16-5': 3, 'SAR_2019-08-16-6': 3, 'SAR_2019-08-16-7': 4, 'SAR_2019-08-16-8': 3,\n                            'SAR_2019-08-16-9': 2, 'SAR_2019-08-16-10': 3, 'SAR_2019-08-17-1': 2, 'SAR_2019-08-17-2': 3,\n                            'SAR_2019-08-17-3': 3, 'SAR_2019-08-17-4': 3, 'SAR_2019-08-17-5': 3, 'SAR_2019-08-17-6': 3,\n                            'SAR_2019-08-17-7': 2, 'SAR_2019-08-17-8': 3, 'SAR_2019-08-17-9': 3, 'SAR_2019-08-17-10': 3,\n                            'SAR_2019-08-17-11': 3, 'SAR_2019-08-18-1': 3, 'SAR_2019-08-18-2': 3, 'SAR_2019-08-18-3': 2,\n                            'SAR_2019-08-18-4': 3, 'SAR_2019-08-18-5': 2, 'SAR_2019-08-18-6': 2, 'SAR_2019-08-18-7': 3,\n                            'SAR_2019-08-18-8': 3, 'SAR_2019-08-18-9': 4, 'SAR_2019-08-18-10': 3, 'SAR_2019-08-21-1': 4,\n                            'SAR_2019-08-21-2': 3, 'SAR_2019-08-21-3': 2, 'SAR_2019-08-21-4': 3, 'SAR_2019-08-21-5': 2,\n                            'SAR_2019-08-21-6': 2, 'SAR_2019-08-21-7': 3, 'SAR_2019-08-21-8': 3, 'SAR_2019-08-21-9': 3,\n                            'SAR_2019-08-21-10': 3, 'SAR_2019-08-22-1': 4, 'SAR_2019-08-22-2': 3, 'SAR_2019-08-22-3': 3,\n                            'SAR_2019-08-22-4': 3, 'SAR_2019-08-22-5': 2, 'SAR_2019-08-22-6': 2, 'SAR_2019-08-22-7': 3,\n                            'SAR_2019-08-22-8': 3, 'SAR_2019-08-22-9': 3, 'SAR_2019-08-22-10': 3, 'SAR_2019-08-23-1': 2,\n                            'SAR_2019-08-23-2': 3, 'SAR_2019-08-23-3': 3, 'SAR_2019-08-23-4': 2, 'SAR_2019-08-23-5': 3,\n                            'SAR_2019-08-23-6': 3, 'SAR_2019-08-23-7': 2, 'SAR_2019-08-23-8': 2, 'SAR_2019-08-23-9': 3,\n                            'SAR_2019-08-23-10': 3, 'SAR_2019-08-23-11': 3, 'SAR_2019-08-24-1': 3,\n                            'SAR_2019-08-24-2': 2, 'SAR_2019-08-24-3': 3, 'SAR_2019-08-24-4': 3, 'SAR_2019-08-24-5': 3,\n                            'SAR_2019-08-24-6': 3, 'SAR_2019-08-24-7': 3, 'SAR_2019-08-24-8': 3, 'SAR_2019-08-24-9': 3,\n                            'SAR_2019-08-24-10': 4, 'SAR_2019-08-24-11': 3, 'SAR_2019-08-24-12': 3,\n                            'SAR_2019-08-24-13': 3, 'SAR_2019-08-25-1': 2, 'SAR_2019-08-25-2': 3, 'SAR_2019-08-25-3': 3,\n                            'SAR_2019-08-25-4': 3, 'SAR_2019-08-25-5': 3, 'SAR_2019-08-25-6': 3, 'SAR_2019-08-25-7': 2,\n                            'SAR_2019-08-25-8': 3, 'SAR_2019-08-25-9': 3, 'SAR_2019-08-25-10': 3, 'SAR_2019-08-28-1': 4,\n                            'SAR_2019-08-28-2': 3, 'SAR_2019-08-28-3': 3, 'SAR_2019-08-28-4': 3, 'SAR_2019-08-28-5': 3,\n                            'SAR_2019-08-28-6': 2, 'SAR_2019-08-28-7': 2, 'SAR_2019-08-28-8': 3, 'SAR_2019-08-28-9': 2,\n                            'SAR_2019-08-28-10': 3, 'SAR_2019-08-29-1': 2, 'SAR_2019-08-29-2': 3, 'SAR_2019-08-29-3': 3,\n                            'SAR_2019-08-29-4': 3, 'SAR_2019-08-29-5': 3, 'SAR_2019-08-29-6': 3, 'SAR_2019-08-29-7': 2,\n                            'SAR_2019-08-29-8': 4, 'SAR_2019-08-29-9': 2, 'SAR_2019-08-29-10': 3, 'SAR_2019-08-30-1': 3,\n                            'SAR_2019-08-30-2': 3, 'SAR_2019-08-30-3': 3, 'SAR_2019-08-30-4': 4, 'SAR_2019-08-30-5': 4,\n                            'SAR_2019-08-30-6': 2, 'SAR_2019-08-30-7': 2, 'SAR_2019-08-30-8': 3, 'SAR_2019-08-30-9': 3,\n                            'SAR_2019-08-30-10': 4, 'SAR_2019-08-30-11': 3, 'SAR_2019-08-31-1': 2,\n                            'SAR_2019-08-31-2': 3, 'SAR_2019-08-31-3': 3, 'SAR_2019-08-31-4': 3, 'SAR_2019-08-31-5': 2,\n                            'SAR_2019-08-31-6': 3, 'SAR_2019-08-31-7': 2, 'SAR_2019-08-31-8': 2, 'SAR_2019-08-31-9': 3,\n                            'SAR_2019-08-31-10': 3, 'SAR_2019-08-31-11': 3, 'SAR_2019-08-31-12': 3,\n                            'SAR_2019-09-01-1': 2, 'SAR_2019-09-01-2': 3, 'SAR_2019-09-01-3': 3, 'SAR_2019-09-01-4': 3,\n                            'SAR_2019-09-01-5': 2, 'SAR_2019-09-01-6': 3, 'SAR_2019-09-01-7': 2, 'SAR_2019-09-01-8': 2,\n                            'SAR_2019-09-01-9': 3, 'SAR_2019-09-01-10': 3, 'SAR_2019-09-01-11': 2,\n                            'SAR_2019-09-01-12': 3, 'SAR_2019-09-02-1': 3, 'SAR_2019-09-02-2': 3, 'SAR_2019-09-02-3': 3,\n                            'SAR_2019-09-02-4': 3, 'SAR_2019-09-02-5': 3, 'SAR_2019-09-02-6': 2, 'SAR_2019-09-02-7': 3,\n                            'SAR_2019-09-02-8': 3, 'SAR_2019-09-02-9': 3, 'SAR_2019-09-02-10': 2,\n                            'SAR_2019-09-02-11': 3})\n","metadata":{"execution":{"iopub.status.busy":"2022-11-10T18:47:33.224454Z","iopub.execute_input":"2022-11-10T18:47:33.224867Z","iopub.status.idle":"2022-11-10T18:47:34.160738Z","shell.execute_reply.started":"2022-11-10T18:47:33.224834Z","shell.execute_reply":"2022-11-10T18:47:34.159499Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Class Providing Main Functionality","metadata":{}},{"cell_type":"code","source":"class DataEngineering:\n    \"\"\"\n    test\n    \"\"\"\n\n    def __init__(self, checkpoints: list = None, run_remaining: bool = True):\n        \"\"\"\n        test 1\n        \"\"\"\n        # Global DataFrames\n        self.df = pd.DataFrame()\n        self.df_selector = pd.DataFrame()\n        self.dfs = []\n        # Data directory structure\n        self.data_dir = '/kaggle'\n        self.data_dir_in = path.join(self.data_dir, 'input', 'big-data-derby-2022')\n        self.data_dir_out = path.join(self.data_dir, 'working', 'big-data-derby-2022')\n        if not path.isdir(self.data_dir_out):\n            mkdir(self.data_dir_out)\n        self.checkpoints_names = ['input', 'split', 'drop_indexes', 'drop_jockeys', 'pack',\n                                  'distances', 'accelerations', 'position', 'drafting', 'number_jockeys',\n                                  'line_up_position']\n        self.checkpoints_data_dirs: dict[str: str] = {}\n        for subdir in self.checkpoints_names:\n            self.checkpoints_data_dirs[subdir] = path.join(self.data_dir_out, subdir)\n        # Files\n        self.initial_data_file_csv = path.join(self.data_dir_in, 'nyra_2019_complete.csv')\n        self.initial_data_file_pkl = path.join(self.checkpoints_data_dirs['input'], 'nyra_2019_complete.pkl')\n        # self.racing_time_data = path.join(self.checkpoints_data_dirs['web_scrapping'], 'df_racing_time.pkl')\n        self.selector_data_file = path.join(self.data_dir_out, 'df_selector.pkl')\n        self.output_data_file = path.join(self.data_dir_out, 'df_data_engineering.pkl')\n        # self.features_raw_file = path.join(self.checkpoints_data_dirs['features_raw'], 'nyra_2019_features_raw.pkl')\n        # self.features_cleanup_file = path.join(self.checkpoints_data_dirs['features_cleanup'],\n        #                                        'nyra_2019_features_cleanup.pkl')\n        # Parameters\n        # set current checkpoint\n        if checkpoints is None:\n            checkpoints = self.checkpoints_names\n        self.current_checkpoint = checkpoints[0]\n        # set checkpoints to run\n        if run_remaining:\n            n = self.checkpoints_names.index(self.current_checkpoint)\n            self.checkpoints_to_run = self.checkpoints_names[n:]\n        else:\n            self.checkpoints_to_run = checkpoints\n        # Create checkpoints\n        self.checkpoints = {}\n        serialized_to = None\n        for cp_name in self.checkpoints_names:\n            checkpoint_dict = {'serialized to': serialized_to}\n            if serialized_to is None:\n                input_dir = self.data_dir_in\n            else:\n                input_dir = self.checkpoints_data_dirs[serialized_to]\n            checkpoint_dict['input dir'] = input_dir\n            checkpoint_dict['output dir'] = self.checkpoints_data_dirs[cp_name]\n            checkpoint_dict['post validation']: dict[str, int] = {}\n            serialized_to = cp_name\n            self.checkpoints[cp_name] = checkpoint_dict\n        # Start the execution\n        self.run_checkpoints()\n        self.process_output()\n\n    def checkpoint_pre_validation(self) -> bool:\n        checkpoint = self.checkpoints[self.current_checkpoint]\n        checkpoint_input_dir = checkpoint['input dir']\n        if not path.isdir(checkpoint_input_dir):\n            log(message = F'Input directory \"{checkpoint_input_dir}\" not found.', level = 'warning')\n            return False\n        else:\n            if len(listdir(checkpoint['input dir'])) == 0:\n                log(message = F'Input directory \"{checkpoint_input_dir}\" is empty.', level = 'warning')\n                return False\n        methods = inspect.getmembers(DataEngineering, predicate = inspect.isfunction)\n        checkpoint_manager_found = False\n        for name, _ in methods:\n            stop_name = False\n            stop_pre_validation = False\n            if name == 'checkpoint_' + self.current_checkpoint:\n                checkpoint_manager_found = True\n                stop_name = True\n            if name == 'checkpoint_' + self.current_checkpoint + '_pre_validation':\n                getattr(self, 'checkpoint_' + self.current_checkpoint + '_pre_validation')()\n                stop_pre_validation = True\n            if stop_name and stop_pre_validation:\n                break\n        if not checkpoint_manager_found:\n            log(message = F'Class method \"checkpoint_{self.current_checkpoint}\" not found.', level = 'warning')\n            return False\n        self.prepare_output_dir()\n        return True\n\n    def checkpoint_post_validation(self) -> bool:\n        checkpoint = self.checkpoints[self.current_checkpoint]\n        checkpoint_output_dir = checkpoint['output dir']\n        if not path.isdir(checkpoint_output_dir):\n            log(message = F'Output directory \"{checkpoint_output_dir}\" not found.', level = 'warning')\n            return False\n        else:\n            if len(listdir(checkpoint['output dir'])) == 0:\n                log(message = F'Output directory \"{checkpoint_output_dir}\" is empty.', level = 'warning')\n                return False\n        methods = inspect.getmembers(DataEngineering, predicate = inspect.isfunction)\n        for name, _ in methods:\n            if name == 'checkpoint_' + self.current_checkpoint + '_post_validation':\n                getattr(self, 'checkpoint_' + self.current_checkpoint + '_post_validation')()\n                break\n        return True\n\n    def run_checkpoints(self) -> None:\n        checkpoints_start_time = datetime.timestamp(datetime.now())\n        log(message = 'Starting processing the checkpoints.')\n        n = len(self.checkpoints_to_run)\n        i = 1\n        for checkpoint in self.checkpoints_to_run:\n            log(message = F'Checkpoint \"{checkpoint}\" has started.', level = 'info')\n            log(message = F'The pre-validation for checkpoint \"{checkpoint}\" has started.', level = 'info')\n            start_time = datetime.timestamp(datetime.now())\n            self.current_checkpoint = checkpoint\n            # checkpoint pre-validation\n            if self.checkpoint_pre_validation():\n                message = F'The pre-validation for checkpoint \"{checkpoint}\" has ended successfully in ' \\\n                          F'{datetime.timestamp(datetime.now()) - start_time:.2f} seconds.'\n                log(message = message, level = 'info')\n            else:\n                message = F'The pre-validation for checkpoint \"{checkpoint}\" has ended in error after ' \\\n                          F'{datetime.timestamp(datetime.now()) - start_time:.2f} seconds.'\n                log(message = message, level = 'error')\n            # run checkpoint\n            log(message = F'Starting processing the checkpoint \"{checkpoint}\" ({i}/{n}).')\n            start_time = datetime.timestamp(datetime.now())\n            getattr(self, 'checkpoint_' + self.current_checkpoint)()\n            message = F'Checkpoint \"{checkpoint}\" ({i}/{n}) has ended in ' \\\n                      F'{datetime.timestamp(datetime.now()) - start_time:.2f} seconds.'\n            log(message = message, level = 'info')\n            # checkpoint post-validation\n            log(message = F'The post-validation for checkpoint \"{checkpoint}\" has started.', level = 'info')\n            start_time = datetime.timestamp(datetime.now())\n            if self.checkpoint_post_validation():\n                message = F'The post-validation for checkpoint \"{checkpoint}\" has ended successfully in ' \\\n                          F'{datetime.timestamp(datetime.now()) - start_time:.2f} seconds.'\n                log(message = message, level = 'info')\n            else:\n                message = F'The post-validation for checkpoint \"{checkpoint}\" has ended in error after ' \\\n                          F'{datetime.timestamp(datetime.now()) - start_time:.2f} seconds.'\n                log(message = message, level = 'error')\n            i += 1\n        message = F'Checkpoints processed successfully in ' \\\n                  F'{datetime.timestamp(datetime.now()) - checkpoints_start_time:.2f} seconds.'\n        log(message = message, level = 'info')\n\n    def checkpoint_input_pre_validation(self) -> bool:\n        if not path.exists(self.initial_data_file_csv):\n            log(message = F'File \"{self.initial_data_file_csv}\" not found.', level = 'warning')\n            return False\n        self.prepare_output_dir()\n        return True\n\n    def checkpoint_input(self) -> None:\n        columns_names = ['track_id', 'race_date', 'race_number', 'program_number', 'trakus_index', 'latitude', \n                         'longitude', 'distance_id', 'course_type', 'track_condition', 'run_up_distance', \n                         'race_type', 'purse', 'post_time', 'weight_carried', 'jockey', 'odds', \n                         'position_at_finish']\n        self.df = pd.read_csv(self.initial_data_file_csv, low_memory = False, \n                              header = None, names = columns_names)\n        pd.to_pickle(self.df, self.initial_data_file_pkl)\n        df_shape = self.df.shape\n        self.checkpoints['input']['post validation']: {str: int} = {\n            'number of columns': int(df_shape[1]),\n            'number of rows': int(df_shape[0])\n        }\n\n    def checkpoint_input_post_validation(self) -> bool:\n        if not path.exists(self.initial_data_file_pkl):\n            log(message = F'File \"{self.initial_data_file_pkl}\" not found.', level = 'error')\n        df = pd.read_pickle(self.initial_data_file_pkl)\n        df_shape = df.shape\n        post_validation: dict[str, int] = self.checkpoints['input']['post validation']\n        try:\n            df_pkl_columns = post_validation['number of columns']\n        except KeyError:\n            df_pkl_columns = 0\n            log(message = F'Number of columns could not be found in config.', level = 'error')\n        try:\n            df_pkl_rows = post_validation['number of rows']\n        except KeyError:\n            df_pkl_rows = 0\n            log(message = F'Number of rows could not be found in config.', level = 'error')\n        if df_pkl_columns != df_shape[1]:\n            log(message = F'Number of columns read from CSV does not match with that saved in pickle.',\n                level = 'warning')\n            return False\n        if df_pkl_rows != df_shape[0]:\n            log(message = F'Number of rows read from CSV does not match with that saved in pickle.',\n                level = 'warning')\n            return False\n        return True\n\n    def checkpoint_web_scrapping_pre_validation(self) -> bool:\n        if not path.exists(self.initial_data_file_pkl):\n            log(message = F'File \"{self.initial_data_file_pkl}\" not found.', level = 'warning')\n            return False\n        self.prepare_output_dir()\n        return True\n\n    def checkpoint_web_scrapping(self) -> None:\n        def add_track_id_race_date(x):\n            selector = str(x['selector'])\n            sar = selector.split(\"_\")\n            track_id = sar[0].replace(\"AQU\", \"aqueduct\").replace(\"BEL\", \"belmont-park\").replace(\"SAR\", \"saratoga\")\n            return {'selector': selector, 'track_id': track_id, 'race_date': sar[1]}\n\n        def process_racing_date(x):\n            def get_race_number(item: str) -> int:\n                return int(item.split(\"Race #\")[1].split(\",\")[0].strip())\n\n            def get_race_time(item: str) -> float:\n                text_array = item.split(\":\")\n                minutes = text_array[-2].split(' ')[-1]\n                if minutes.strip(' ') == '':\n                    minutes = '0'\n                return int(minutes) * 60 + float(text_array[-1].replace('\\n', ''))\n\n            def get_horse_sex_age(item: str) -> {}:\n                sex_age = item.replace('<div class=\"col-lg-auto race-restrictions\">', '').replace('</div>', '')\n                sex_age = sex_age.split('|')\n                sex = sex_age[0].lstrip().rstrip()\n                if sex.lower().rfind('fillies') != -1 or sex.lower().rfind('mares') != -1:\n                    sex = 'female'\n                elif sex.lower().rfind('open') != -1:\n                    sex = 'all'\n                else:\n                    sex = 'male'\n                age = sex_age[1].lstrip().rstrip().split(' ')[0]\n                if age.lower().rfind('open') != -1:\n                    age = '0'\n                return {'sex': sex, 'age': age}\n\n            soup = BeautifulSoup(requests.get(x['url']).text, features = \"lxml\")\n            find_race = soup(text = re.compile('Race #'))\n            find_race = list(map(get_race_number, find_race))\n            find_time = soup(text = re.compile('Fractions'))\n            find_time = list(map(get_race_time, find_time))\n            if x['selector'] in ['SAR_2019-07-17', 'SAR_2019-08-21']:\n                find_time.insert(0, 0.0)\n            find_sex_age = [str(div) for div in soup.select('div.col-lg-auto.race-restrictions')]\n            find_sex_age = list(map(get_horse_sex_age, find_sex_age))\n            out_array = []\n            track_id = x['track_id'].replace(\"aqueduct\", \"AQU\").replace(\"belmont-park\", \"BEL\"). \\\n                replace(\"saratoga\", \"SAR\")\n            for i, seconds, sa in zip(find_race, find_time, find_sex_age):\n                out_array.append({'selector': x['selector'],\n                                  'track_id': track_id,\n                                  'race_date': x['race_date'],\n                                  'url': x['url'],\n                                  'race_number': i,\n                                  'racing_time': seconds,\n                                  'sex': sa['sex'],\n                                  'age': int(sa['age'])})\n            return out_array\n\n        if len(self.df) == 0:\n            self.df = pd.read_pickle(self.initial_data_file_pkl)\n        self.df.sort_values(by = ['track_id', 'race_date', 'race_number'], inplace = True, ignore_index = True)\n        self.df.reset_index(inplace = True, drop = True)\n        df_tmp = pd.DataFrame()\n        df_tmp['selector'] = self.df['track_id'] + '_' + self.df['race_date'].astype(str)\n        df_tmp = pd.DataFrame(pd.unique(df_tmp['selector']), columns = ['selector'])\n        df_tmp = pd.DataFrame.from_records(df_tmp.apply(add_track_id_race_date, axis = 1))\n        df_tmp['url'] = 'https://entries.horseracingnation.com/entries-results/' + \\\n                        df_tmp['track_id'] + '/' + \\\n                        df_tmp['race_date']\n\n        nested_array = df_tmp.apply(process_racing_date, axis = 1)\n        flattened_array = []\n        for list_item in nested_array:\n            for dict_item in list_item:\n                flattened_array.append(dict_item)\n        df_tmp = pd.DataFrame.from_records(flattened_array)\n        df_tmp.to_pickle(self.racing_time_data)\n\n    def checkpoint_split_pre_validation(self) -> bool:\n        if not path.exists(self.initial_data_file_pkl):\n            log(message = F'File {self.initial_data_file_pkl} does not exist.', level = 'warning')\n            return False\n        df_shape = self.df.shape\n        if df_shape[0] == 0 or df_shape[1] == 0:\n            self.df = pd.read_pickle(self.initial_data_file_pkl)\n        df_shape = self.df.shape\n        if df_shape[0] == 0 or df_shape[1] == 0:\n            log(message = F'DataFrame from pickle file has strange signature {str(df_shape)}.', level = 'warning')\n            return False\n        # if not path.exists(self.racing_time_data):\n        #     log(message = F'File {self.racing_time_data} does not exist.', level = 'warning')\n        #     return False\n        return True\n\n    def checkpoint_split(self) -> None:\n        def split_df(df) -> {}:\n            def split_by_track_id(track_id: str) -> []:\n                def split_by_race_date(race_date: str) -> []:\n                    def split_by_race_number(race_number: str) -> {}:\n                        id: str = F'{track_id}_{race_date}_{race_number}'\n                        df_tmp = df_race_number[df_race_number['race_number'] == race_number].copy()\n                        df_tmp.reset_index(inplace = True, drop = True)\n                        return {'key': id, 'value': df_tmp}\n\n                    df_race_number: pd.DataFrame = df_track_id[df_track_id['race_date'] == race_date].copy()\n                    df_race_number.reset_index(inplace = True, drop = True)\n                    unique_race_number = pd.unique(df_race_number['race_number']).tolist()\n                    return list(map(split_by_race_number, unique_race_number))\n\n                df_track_id: pd.DataFrame = df[df['track_id'] == track_id].copy()\n                df_track_id.reset_index(inplace = True, drop = True)\n                unique_race_date = pd.unique(df_track_id['race_date']).tolist()\n                return [item for sublist in list(map(split_by_race_date, unique_race_date)) for item in sublist]\n\n            unique_track_id = pd.unique(df['track_id']).tolist()\n            return [item for sublist in list(map(split_by_track_id, unique_track_id)) for item in sublist]\n\n        def add_time_sex_age(item):\n            global web_scrapping\n            [track_id, race_date, race_number] = item['key'].split('_')\n            index: str = F'{track_id}_{race_date}-{race_number}'\n            race_time = web_scrapping['racing_time'][index]\n            sex = web_scrapping['sex'][index]\n            age = web_scrapping['age'][index]\n            df_tmp: pd.DataFrame = item['value'].copy()\n            df_tmp_len = len(df_tmp)\n            df_tmp['race_time'] = np.full(shape = df_tmp_len, fill_value = race_time)\n            df_tmp['sex'] = np.full(shape = df_tmp_len, fill_value = sex)\n            df_tmp['age'] = np.full(shape = df_tmp_len, fill_value = age)\n            return {'key': item['key'], 'value': df_tmp.copy()}\n\n        self.df.sort_values(by = ['track_id', 'race_date', 'race_number', 'jockey', 'trakus_index'], inplace = True)\n        self.df.reset_index(inplace = True, drop = True)\n        self.dfs = split_df(self.df)\n        self.dfs = list(map(add_time_sex_age, self.dfs))\n        self.save_files()\n\n    def checkpoint_split_post_validation(self) -> bool:\n        return self.files_consistency()\n\n    def checkpoint_drop_indexes_pre_validation(self) -> bool:\n        return self.check_files()\n\n    def checkpoint_drop_indexes(self) -> None:\n        def drop_indexes(item):\n            df: pd.DataFrame = item['value']\n            df.sort_values(by = ['trakus_index'], inplace = True, ignore_index = True)\n            df.reset_index(inplace = True, drop = True)\n            trakus_index = round(df['race_time'].iat[0] * 4)\n            df = df[df['trakus_index'] <= trakus_index]\n            return {'key': item['key'], 'value': df.copy()}\n\n        self.dfs = list(map(drop_indexes, self.dfs))\n        self.save_files()\n\n    def checkpoint_drop_indexes_post_validation(self) -> bool:\n        return self.files_consistency()\n\n    def checkpoint_drop_jockeys_pre_validation(self) -> bool:\n        return self.check_files()\n\n    def checkpoint_drop_jockeys(self) -> None:\n        def drop_jockey(item: {}) -> {}:\n            def complete_dropout_jockey(jockey: str) -> pd.DataFrame:\n                def add_column(column: str) -> None:\n                    nonlocal df_dropout_jockey\n                    nonlocal row\n                    df_dropout_jockey.loc[:, column] = row[column].iat[0]\n\n                nonlocal df_dropout\n                max_ti_dropout: int = df_dropout.loc[df_dropout['jockey'] == jockey, 'trakus_index'].max()\n                df_dropout.loc[df_dropout['jockey'] == jockey, 'race_trakus_index'] = max_ti_dropout\n                row: pd.DataFrame = df_dropout[(df_dropout['jockey'] == jockey) &\n                                               (df_dropout['trakus_index'] == max_ti_dropout)].copy()\n                row.reset_index(inplace = True, drop = True)\n                missing_trakus_indexes: np.ndarray = np.arange(max_ti_dropout + 1, max_ti + 1).astype(int)\n                column_ti: list[str] = ['trakus_index']\n                df_dropout_jockey: pd.DataFrame = \\\n                    pd.DataFrame(data = missing_trakus_indexes.reshape(max_ti - max_ti_dropout, 1),\n                                 columns = column_ti)\n                columns_df_dropout: list[str] = list(df_dropout.columns)\n                columns: list[str] = list(set(columns_df_dropout) ^ set(column_ti))\n                _: list[None] = list(map(add_column, columns))\n                return df_dropout_jockey.copy()\n\n            df_tmp = item['value']\n            df_tmp.sort_values(by = ['trakus_index'], inplace = True, ignore_index = True)\n            df_tmp.reset_index(inplace = True, drop = True)\n            max_ti = df_tmp['trakus_index'].max()\n            df_tmp.loc[:, 'dropout'] = 0\n            df_tmp.loc[:, 'race_trakus_index'] = max_ti\n            a = list(df_tmp.loc[df_tmp['trakus_index'] == 1, 'jockey'])\n            b = list(df_tmp.loc[df_tmp['trakus_index'] == max_ti, 'jockey'])\n            diff = set(a) ^ set(b)\n            if len(list(diff)) != 0:\n                df_dropout: pd.DataFrame = df_tmp[df_tmp['jockey'].isin(diff)].copy()\n                df_dropout.reset_index(inplace = True, drop = True)\n                df_dropout.loc[:, 'dropout'] = 1\n                dropouts: list[pd.DataFrame] = list(map(complete_dropout_jockey, list(diff)))\n                dropouts.insert(0, df_dropout)\n                df_dropout = pd.concat(objs = dropouts, axis = 0)\n                df_tmp = df_tmp[~df_tmp['jockey'].isin(diff)]\n                df_tmp.reset_index(inplace = True, drop = True)\n                df: pd.DataFrame = pd.concat(objs = [df_tmp, df_dropout], axis = 0)\n                df.reset_index(inplace = True, drop = True)\n            else:\n                df: pd.DataFrame = df_tmp.copy()\n            return {'key': item['key'], 'value': df.copy()}\n\n        self.dfs = list(map(drop_jockey, self.dfs))\n        self.save_files()\n\n    def checkpoint_drop_jockeys_post_validation(self) -> bool:\n        return self.files_consistency()\n\n    def checkpoint_pack_pre_validation(self) -> bool:\n        return self.check_files()\n\n    def checkpoint_pack(self) -> None:\n        def process_dfs(dfs_item: dict) -> dict:\n            df = dfs_item['value']\n            df.sort_values(by = ['trakus_index'], inplace = True, ignore_index = True)\n            df.reset_index(inplace = True, drop = True)\n            df_tmp: pd.DataFrame = df[df['dropout'] == 0].copy()\n            ti_max: int = df_tmp['trakus_index'].max()\n            nr_jockeys: int = len(df_tmp.loc[df_tmp['trakus_index'] == 1, 'jockey'])\n            x: np.ndarray\n            y: np.ndarray\n            x, y, _, _ = compute_distance_numpy(long_diff = df_tmp['longitude'].to_numpy(),\n                                                lat_diff = df_tmp['latitude'].to_numpy())\n            x = x.reshape(ti_max, nr_jockeys).sum(axis = 1) / (2 * nr_jockeys * RE)\n            y = y.reshape(ti_max, nr_jockeys).sum(axis = 1) / (2 * nr_jockeys * RE)\n            longitude: np.ndarray = np.degrees(2 * np.arcsin(x)).astype(float)\n            latitude: np.ndarray = np.degrees(2 * np.arcsin(y)).astype(float)\n            trakus_index: np.ndarray = np.arange(1, ti_max + 1).astype(int)\n            jockey_name: np.ndarray = np.full(shape = ti_max, fill_value = 'pack').astype(str)\n            columns_pack: list[str] = ['trakus_index', 'jockey', 'longitude', 'latitude']\n            data: np.ndarray = np.concatenate([trakus_index.reshape(ti_max, 1),\n                                               jockey_name.reshape(ti_max, 1),\n                                               longitude.reshape(ti_max, 1),\n                                               latitude.reshape(ti_max, 1)], axis = 1)\n            df_pack: pd.DataFrame = pd.DataFrame(data = data,\n                                                 columns = columns_pack)\n            df_pack.reset_index(inplace = True, drop = True)\n            columns_df: np.ndarray[str] = df.columns.to_numpy(dtype = str)\n            columns: list[str] = list(set(list(columns_df)) ^ set(columns_pack))\n            for column_name in columns:\n                df_pack[column_name] = df[column_name].iat[0]\n            df = pd.concat(objs = [df, df_pack], axis = 0)\n            df.reset_index(inplace = True, drop = True)\n            return {'key': dfs_item['key'], 'value': df.copy()}\n\n        self.dfs = list(map(process_dfs, self.dfs))\n        self.save_files()\n\n    def checkpoint_pack_post_validation(self) -> bool:\n        return self.files_consistency()\n\n    def checkpoint_distances_pre_validation(self) -> bool:\n        return self.check_files()\n\n    def checkpoint_distances(self) -> None:\n        def process_df(item: dict) -> dict:\n            def compute_distance_by_jockey(jockey: str) -> pd.DataFrame:\n                df_jockeys: pd.DataFrame = df.copy()\n                df_jockey: pd.DataFrame = df_jockeys[df_jockeys['jockey'] == jockey].copy()\n                df_jockey.reset_index(inplace = True, drop = True)\n                df_pack: pd.DataFrame = df_jockeys[df_jockeys['jockey'] == 'pack'].copy()\n                df_pack.reset_index(inplace = True, drop = True)\n                if ref_jockey == 'pack':\n                    if ref_type == 'speed':\n                        x, y = decompose_numpy(axis_angle = df_jockey['alpha_abs_speed'].astype(float).to_numpy(),\n                                               direction_angle = df_pack['alpha_abs_speed'].astype(float).to_numpy(),\n                                               vector_magnitude = df_jockey['d_abs_speed'].astype(float).to_numpy())\n                        y_rel = y - df_pack['d_abs_speed'].to_numpy()\n                        n = x.size\n                        x = x.reshape(n, 1)\n                        y = y.reshape(n, 1)\n                        y_rel = y_rel.reshape(n, 1)\n                        distances: np.ndarray = np.concatenate((x, y, y_rel), axis = 1)\n                        columns: list[str] = ['x_decomp_speed', 'y_decomp_speed', 'y_rel_speed']\n                    else:\n                        x, y = decompose_numpy(axis_angle = df_jockey['alpha_rel_dist'].astype(float).to_numpy(),\n                                               direction_angle = df_pack['alpha_abs_speed'].astype(float).to_numpy(),\n                                               vector_magnitude = df_jockey['d_rel_dist'].astype(float).to_numpy())\n                        n = x.size\n                        x = x.reshape(n, 1)\n                        y = y.reshape(n, 1)\n                        distances: np.ndarray = np.concatenate((x, y), axis = 1)\n                        columns: list[str] = ['x_decomp_dist', 'y_decomp_dist']\n                else:\n                    if ref_type == 'speed':\n                        lat_diff: np.ndarray = \\\n                            df_jockey['latitude'][1:].to_numpy().astype(float) - \\\n                            df_jockey['latitude'][:-1].to_numpy().astype(float)\n                        long_diff: np.ndarray = \\\n                            df_jockey['longitude'][1:].to_numpy().astype(float) - \\\n                            df_jockey['longitude'][:-1].to_numpy().astype(float)\n                        columns: list[str] = ['x_abs_speed', 'y_abs_speed', 'd_abs_speed', 'alpha_abs_speed']\n                    else:\n                        lat_diff: np.ndarray = \\\n                            df_jockey['latitude'].to_numpy().astype(float) - \\\n                            df_pack['latitude'].to_numpy().astype(float)\n                        long_diff: np.ndarray = \\\n                            df_jockey['longitude'].to_numpy().astype(float) - \\\n                            df_pack['longitude'].to_numpy().astype(float)\n                        columns: list[str] = ['x_rel_dist', 'y_rel_dist', 'd_rel_dist', 'alpha_rel_dist']\n                    x, y, d, alpha = compute_distance_numpy(long_diff = long_diff, lat_diff = lat_diff)\n                    x = np.insert(x, 0, 0.0)\n                    y = np.insert(y, 0, 0.0)\n                    d = np.insert(d, 0, 0.0)\n                    alpha = np.insert(alpha, 0, 0.0)\n                    n = x.size\n                    x = x.reshape(n, 1)\n                    y = y.reshape(n, 1)\n                    d = d.reshape(n, 1)\n                    alpha = alpha.reshape(n, 1)\n                    distances: np.ndarray = np.concatenate((x, y, d, alpha), axis = 1)\n                df_distances = pd.DataFrame(data = distances, columns = columns)\n                df_jockey = pd.concat([df_jockey, df_distances], axis = 1)\n                return df_jockey.copy()\n\n            df: pd.DataFrame = item['value'].copy()\n            df = df.astype({'trakus_index': 'int'})\n            df.sort_values(by = ['jockey', 'trakus_index'], inplace = True, ignore_index = True)\n            df.reset_index(inplace = True, drop = True)\n            jockeys: np.ndarray = df.loc[df['trakus_index'] == 1, 'jockey'].astype(str).to_numpy()\n            for ref_type in ['speed', 'distance']:\n                for ref_jockey in ['self', 'pack']:\n                    dfs_list: list[pd.DataFrame] = list(map(compute_distance_by_jockey, jockeys))\n                    df = pd.concat(objs = dfs_list, ignore_index = True)\n                    df.reset_index(inplace = True, drop = True)\n            return {'key': item['key'], 'value': df.copy()}\n\n        self.dfs = list(map(process_df, self.dfs))\n        self.save_files()\n\n    def checkpoint_distances_post_validation(self) -> bool:\n        return self.files_consistency()\n\n    def checkpoint_accelerations_pre_validation(self) -> bool:\n        return self.check_files()\n\n    def checkpoint_accelerations(self) -> None:\n        def process_df(item: dict) -> dict:\n            def compute_acceleration_by_jockey(jockey: str) -> pd.DataFrame:\n                df_jockeys: pd.DataFrame = df.copy()\n                df_jockey: pd.DataFrame = df_jockeys[df_jockeys['jockey'] == jockey].copy()\n                df_jockey.reset_index(inplace = True, drop = True)\n                df_jockey.sort_values(by = ['trakus_index'], inplace = True, ignore_index = True)\n                df_jockey.reset_index(inplace = True, drop = True)\n                a: np.ndarray\n                alpha: np.ndarray\n                a, alpha = compute_speed_diff_numpy(v1_magnitudes = df_jockey['d_abs_speed'][:-1].to_numpy(),\n                                                    v1_angles = df_jockey['alpha_abs_speed'][:-1].to_numpy(),\n                                                    v2_magnitudes = df_jockey['d_abs_speed'][1:].to_numpy(),\n                                                    v2_angles = df_jockey['alpha_abs_speed'][1:].to_numpy())\n                a = np.insert(a, 0, 0.0)\n                alpha = np.insert(alpha, 0, 0.0)\n                df_jockey.loc[:, 'd_acceleration'] = a\n                df_jockey.loc[:, 'alpha_acceleration'] = alpha\n                return df_jockey.copy()\n\n            def decompose_acceleration_by_jockey(jockey: str) -> pd.DataFrame:\n                df_jockeys: pd.DataFrame = df.copy()\n                df_jockey: pd.DataFrame = df_jockeys[df_jockeys['jockey'] == jockey].copy()\n                df_jockey.reset_index(inplace = True, drop = True)\n                df_jockey.sort_values(by = ['trakus_index'], inplace = True, ignore_index = True)\n                df_jockey.reset_index(inplace = True, drop = True)\n                df_pack: pd.DataFrame = df_jockeys[df_jockeys['jockey'] == 'pack'].copy()\n                df_pack.reset_index(inplace = True, drop = True)\n                df_pack.sort_values(by = ['trakus_index'], inplace = True, ignore_index = True)\n                df_pack.reset_index(inplace = True, drop = True)\n                x: np.ndarray\n                y: np.ndarray\n                x, y = decompose_numpy(axis_angle = df_jockey['alpha_acceleration'].astype(float).to_numpy(),\n                                       direction_angle = df_pack['alpha_abs_speed'].astype(float).to_numpy(),\n                                       vector_magnitude = df_jockey['d_acceleration'].astype(float).to_numpy())\n                df_jockey.loc[:, 'x_decomp_acceleration'] = x\n                df_jockey.loc[:, 'y_decomp_acceleration'] = y\n                return df_jockey.copy()\n\n            df: pd.DataFrame = item['value'].copy()\n            df = df.astype({'trakus_index': 'int'})\n            df.sort_values(by = ['jockey', 'trakus_index'], inplace = True, ignore_index = True)\n            df.reset_index(inplace = True, drop = True)\n            jockeys: np.ndarray = df.loc[df['trakus_index'] == 1, 'jockey'].astype(str).to_numpy()\n            dfs_list: list[pd.DataFrame] = list(map(compute_acceleration_by_jockey, jockeys))\n            df = pd.concat(objs = dfs_list, ignore_index = True)\n            df.reset_index(inplace = True, drop = True)\n            dfs_list: list[pd.DataFrame] = list(map(decompose_acceleration_by_jockey, jockeys))\n            df = pd.concat(objs = dfs_list, ignore_index = True)\n            df.reset_index(inplace = True, drop = True)\n            return {'key': item['key'], 'value': df.copy()}\n\n        self.dfs = list(map(process_df, self.dfs))\n        self.save_files()\n\n    def checkpoint_accelerations_post_validation(self) -> bool:\n        return self.files_consistency()\n\n    def checkpoint_position_pre_validation(self) -> bool:\n        return self.check_files()\n\n    def checkpoint_position(self) -> None:\n        def process_df(item: dict) -> dict:\n            def find_final_trakus_index(jd_item: np.ndarray) -> pd.DataFrame:\n                jockey: str = jd_item[0]\n                dist: float = jd_item[1]\n                df_jockeys: pd.DataFrame = df.copy()\n                df_jockey: pd.DataFrame = df_jockeys[df_jockeys['jockey'] == jockey].copy()\n                df_jockey.reset_index(inplace = True, drop = True)\n                if df_jockey['dropout'].iat[0] == 0:\n                    df_jockey.sort_values(by = ['trakus_index'], inplace = True, ignore_index = True, ascending = False)\n                    df_jockey.reset_index(inplace = True, drop = True)\n                    y_decomp_dist_np: np.ndarray = np.abs(df_jockey['y_decomp_speed'].to_numpy())\n                    counter = 0\n                    while np.sum(y_decomp_dist_np[:counter]) < dist:\n                        counter += 1\n                    trakus_index_final = ti_max - counter\n                    df_jockey.loc[:, 'race_trakus_index'] = trakus_index_final\n                return df_jockey.copy()\n\n            def extract_final_stats(jockey: str) -> dict:\n                df_jockeys: pd.DataFrame = df.copy()\n                df_jockey: pd.DataFrame = df_jockeys[df_jockeys['jockey'] == jockey].copy()\n                df_jockey.reset_index(inplace = True, drop = True)\n                if df_jockey['dropout'].iat[0] == 0:\n                    race_ti: int = df_jockey['race_trakus_index'].iat[0]\n                    race_y_decomp_speed: float = df_jockey.loc[df_jockey['trakus_index'] == race_ti,\n                                                               'y_decomp_speed'].iat[0]\n                else:\n                    race_ti: int = df_jockey['race_trakus_index'].iat[0]\n                    race_y_decomp_speed: float = df_jockey.loc[df_jockey['trakus_index'] == race_ti,\n                                                               'y_decomp_speed'].iat[0]\n                    race_ti += 1000\n                return {'jockey': jockey, 'race_ti': race_ti, 'race_y_decomp_speed': race_y_decomp_speed}\n\n            def set_position(jp_item: np.ndarray) -> pd.DataFrame:\n                jockey: str = jp_item[0]\n                pos: int = jp_item[1]\n                df_jockeys: pd.DataFrame = df.copy()\n                df_jockey: pd.DataFrame = df_jockeys[df_jockeys['jockey'] == jockey].copy()\n                df_jockey.reset_index(inplace = True, drop = True)\n                pos_np: np.ndarray = np.full(shape = len(df_jockey), fill_value = pos)\n                df_jockey = pd.concat([df_jockey, pd.DataFrame(data = pos_np, columns = ['race_position'])],\n                                      axis = 1)\n                return df_jockey.copy()\n\n            df: pd.DataFrame = item['value']\n            # add final trakus_index\n            ti_max = df['trakus_index'].astype(int).max()\n            df_last = df[df['trakus_index'] == ti_max].copy()\n            df_last.reset_index(inplace = True, drop = True)\n            df_last.sort_values(by = ['y_decomp_dist'], inplace = True, ignore_index = True)\n            df_last.reset_index(inplace = True, drop = True)\n            n = len(df_last)\n            ys_min_abs = abs(float(df_last['y_decomp_dist'].iat[0]))\n            jockeys: np.ndarray = df_last['jockey'].astype(str).to_numpy()\n            ys: np.ndarray = df_last['y_decomp_dist'].astype(float).to_numpy() + ys_min_abs\n            np_list = np.concatenate((jockeys.reshape(n, 1), ys.reshape(n, 1)), axis = 1)\n            dfs_list: list[pd.DataFrame] = list(map(find_final_trakus_index, np_list))\n            df = pd.concat(objs = dfs_list, ignore_index = True)\n            df.reset_index(inplace = True, drop = True)\n            # add position\n            df_last = df[df['trakus_index'] == ti_max].copy()\n            df_last.reset_index(inplace = True, drop = True)\n            df_last = df_last[~ (df_last['jockey'] == 'pack')]\n            df_last.reset_index(inplace = True, drop = True)\n            jockeys: np.ndarray = df_last['jockey'].astype(str).to_numpy()\n            stats: list[dict[str, Union[int, float]]] = list(map(extract_final_stats, jockeys))\n            df_stats: pd.DataFrame = pd.DataFrame.from_records(data = stats)\n            df_stats.reset_index(inplace = True, drop = True)\n            df_stats.sort_values(by = ['race_ti', 'race_y_decomp_speed'], inplace = True, ignore_index = True,\n                                 ascending = [True, False])\n            df_stats.reset_index(inplace = True, drop = True)\n            jockeys: np.ndarray = df_stats['jockey'].astype(str).to_numpy()\n            jockeys = np.insert(jockeys, 0, 'pack')\n            n = jockeys.size\n            position: np.ndarray = np.array([x for x in range(0, n)])\n            np_list = np.concatenate((jockeys.reshape(n, 1), position.reshape(n, 1)), axis = 1)\n            dfs_list: list[pd.DataFrame] = list(map(set_position, np_list))\n            df = pd.concat(objs = dfs_list, ignore_index = True)\n            df.reset_index(inplace = True, drop = True)\n            return {'key': item['key'], 'value': df.copy()}\n\n        self.dfs = list(map(process_df, self.dfs))\n        self.save_files()\n\n    def checkpoint_position_post_validation(self) -> bool:\n        return self.files_consistency()\n\n    def checkpoint_drafting_pre_validation(self) -> bool:\n        return self.check_files()\n\n    def checkpoint_drafting(self) -> None:\n        def process_df(item: dict) -> dict:\n            def set_none(index: int) -> None:\n                nonlocal x\n                nonlocal y\n                x[index] = float(\"nan\")\n                y[index] = float(\"nan\")\n\n            def shift(_: int) -> None:\n                nonlocal x\n                nonlocal y\n                nonlocal z\n                none_indexes: np.ndarray = np.arange(m) * n\n                none_indexes = none_indexes.astype(int)\n                x = np.roll(x, 1)\n                y = np.roll(y, 1)\n                _: list[None] = list(map(set_none, none_indexes))\n                x_diff: np.ndarray = np.abs(x - x_static)\n                y_diff: np.ndarray = y - y_static\n                xy_drafting: np.ndarray = np.where((y_diff > 0) & (y_diff <= max_y) & (x_diff <= y_diff * tan_alpha),\n                                                   True, False)\n                z = np.where(z, True, np.where(np.isnan(x) | np.isnan(y), False, xy_drafting))\n\n            df: pd.DataFrame = item['value'].copy()\n            df.sort_values(by = ['trakus_index', 'y_decomp_dist'],\n                           inplace = True, ignore_index = True,\n                           ascending = [True, False])\n            df.reset_index(inplace = True, drop = True)\n            df_pack = df[df['jockey'] == 'pack'].copy()\n            df_pack.reset_index(inplace = True, drop = True)\n            df_pack['drafting'] = 0\n            df = df[~ (df['jockey'] == 'pack')]\n            df.reset_index(inplace = True, drop = True)\n            n: int = len(df.loc[df['trakus_index'] == 1, 'jockey'])\n            m: int = df_pack['trakus_index'].max()\n            y: np.ndarray = df['y_decomp_dist'].to_numpy()\n            y_static: np.ndarray = y.copy()\n            x: np.ndarray = df['x_decomp_dist'].to_numpy()\n            x_static: np.ndarray = x.copy()\n            z: np.ndarray = np.full_like(a = x_static, fill_value = False)\n            _: list[None] = list(map(shift, range(n)))\n            df['drafting'] = z.astype(int)\n            df = pd.concat([df, df_pack], axis = 0, ignore_index = True)\n            df.reset_index(inplace = True, drop = True)\n            return {'key': item['key'], 'value': df.copy()}\n\n        # max drafting occurs at 2.5 m in between horses on y_decomp_dist-axis and\n        # max drafting at y*tan(10 degrees) on x_decomp_dist-axis\n        max_y = 5.0\n        tan_alpha = math.tan(math.radians(10.0))\n        self.dfs = list(map(process_df, self.dfs))\n        self.save_files()\n\n    def checkpoint_drafting_post_validation(self) -> bool:\n        return self.files_consistency()\n\n    def checkpoint_number_jockeys_pre_validation(self) -> bool:\n        return self.check_files()\n\n    def checkpoint_number_jockeys(self) -> None:\n        def process_df(item: dict) -> dict:\n            df: pd.DataFrame = item['value'].copy()\n            df.sort_values(by = ['trakus_index'], inplace = True, ignore_index = True)\n            df.reset_index(inplace = True, drop = True)\n            n: int = len(df.loc[df['trakus_index'] == 1, 'jockey']) - 1\n            df.loc[:, 'number_jockeys'] = n\n            return {'key': item['key'], 'value': df.copy()}\n\n        self.dfs = list(map(process_df, self.dfs))\n        self.save_files()\n\n    def checkpoint_number_jockeys_post_validation(self) -> bool:\n        return self.files_consistency()\n\n    def checkpoint_line_up_position_pre_validation(self) -> bool:\n        return self.check_files()\n\n    def checkpoint_line_up_position(self) -> None:\n        def process_df(item: dict) -> dict:\n            df: pd.DataFrame = item['value'].copy()\n            df.sort_values(by = ['trakus_index', 'x_decomp_dist'], inplace = True, ignore_index = True,\n                           ascending = [True, False])\n            df.reset_index(inplace = True, drop = True)\n            jockeys: list[str] = df.loc[df['trakus_index'] == 1, 'jockey'].to_numpy()\n            jockeys = list(set(jockeys) ^ {'pack'})\n            for jockey, position in zip(jockeys, [x for x in range(1, len(jockeys)+1)]):\n                df.loc[df['jockey'] == jockey, 'line_up_position'] = position\n            df.loc[df['jockey'] == 'pack', 'line_up_position'] = 0\n            return {'key': item['key'], 'value': df.copy()}\n\n        self.dfs = list(map(process_df, self.dfs))\n        self.save_files()\n\n    def checkpoint_line_up_position_post_validation(self) -> bool:\n        return self.files_consistency()\n\n    def process_output(self) -> None:\n        def process_dfs(dfs_item: dict) -> pd.DataFrame:\n            return dfs_item['value'].copy()\n\n        dfs: list[pd.DataFrame] = list(map(process_dfs, self.dfs))\n        df: pd.DataFrame = pd.concat(objs = dfs, axis = 0, ignore_index = True)\n        df.reset_index(inplace = True, drop = True)\n        df.to_pickle(self.output_data_file)\n\n    def files_consistency(self) -> bool:\n        for x in self.dfs:\n            df_tmp = pd.read_pickle(path.join(self.checkpoints[self.current_checkpoint]['output dir'],\n                                              F'df_{x[\"key\"]}.pkl'))\n            df_shape_pkl = df_tmp.shape\n            df_shape_mem = x['value'].shape\n            if df_shape_mem != df_shape_pkl:\n                log(message = F'DataFrame shape inconsistency: memory ({df_shape_mem}) vs pickle ({df_shape_pkl}).',\n                    level = 'warning')\n                return False\n        return True\n\n    def check_files(self) -> bool:\n        if len(self.dfs) == 0:\n            self.load_files()\n        if len(self.df_selector) == 0:\n            log(message = F'File \"{self.selector_data_file}\" not found.', level = 'warning')\n            return False\n        if len(self.dfs) != self.df_selector['races_' +\n                                             self.checkpoints[self.current_checkpoint]['serialized to'] +\n                                             '_validation'].sum():\n            log(message = F'Some DataFrames are missing.', level = 'warning')\n            return False\n        return True\n\n    def prepare_output_dir(self) -> None:\n        location = self.checkpoints[self.current_checkpoint]['output dir']\n        if not path.isdir(location):\n            mkdir(location)\n        for filename in listdir(location):\n            data_path = path.join(location, filename)\n            if path.isfile(data_path):\n                remove(data_path)\n        if not path.isdir(location) or len(listdir(location)) != 0:\n            log(message = F'Output directory \"{location}\" cannot be used.', level = 'error')\n\n    def load_files(self) -> None:\n        input_dir = self.checkpoints[self.current_checkpoint]['input dir']\n        for file in listdir(input_dir):\n            location = path.join(input_dir, file)\n            key = file.replace('df_', '').replace('.pkl', '')\n            self.dfs.append({'key': key, 'value': pd.read_pickle(location)})\n        if path.exists(self.selector_data_file):\n            self.df_selector = pd.read_pickle(self.selector_data_file)\n\n    def save_files(self) -> None:\n        if len(self.df) != 0 and len(self.df_selector) == 0:\n            self.df_selector = pd.DataFrame()\n            self.df_selector['races'] = pd.unique(self.df[\"track_id\"].astype(str) + \"_\" +\n                                                  self.df[\"race_date\"].astype(str) + \"_\" +\n                                                  self.df[\"race_number\"].astype(str))\n        self.df_selector['races_' + self.current_checkpoint + '_validation'] = 0\n        for x in self.dfs:\n            x['value'].to_pickle(path.join(self.checkpoints[self.current_checkpoint]['output dir'],\n                                           F'df_{x[\"key\"]}.pkl'))\n            self.df_selector.loc[self.df_selector['races'] == x[\"key\"],\n                                 'races_' + self.current_checkpoint + '_validation'] = 1\n        self.df_selector['races_' + self.current_checkpoint + '_validation'].astype(int)\n        self.df_selector.to_pickle(self.selector_data_file)\n","metadata":{"execution":{"iopub.status.busy":"2022-11-10T17:00:58.178833Z","iopub.execute_input":"2022-11-10T17:00:58.179961Z","iopub.status.idle":"2022-11-10T17:00:58.520914Z","shell.execute_reply.started":"2022-11-10T17:00:58.179849Z","shell.execute_reply":"2022-11-10T17:00:58.519808Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Executing Data Engineering Pipeline","metadata":{}},{"cell_type":"code","source":"DataEngineering()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Features Extraction Pipeline","metadata":{}},{"cell_type":"markdown","source":"### Class Providing Main Functionality","metadata":{}},{"cell_type":"code","source":"class FeatureExtraction:\n\n    def __init__(self):\n        workdir: str = path.join('/kaggle', 'working', 'big-data-derby-2022')\n        log('Reading data phase has started.')\n        start_time = datetime.timestamp(datetime.now())\n        self.df_in: pd.DataFrame = pd.read_pickle(path.join(workdir, 'df_data_engineering.pkl'))\n        log(F'Reading data phase ended in {datetime.timestamp(datetime.now()) - start_time:.2f} seconds.')\n        self.df_out: pd.DataFrame = pd.DataFrame()\n        log('Preparation phase has started.')\n        start_time = datetime.timestamp(datetime.now())\n        self.prepare_df_in()\n        self.prepare_df_out()\n        log(F'Preparation phase ended in {datetime.timestamp(datetime.now()) - start_time:.2f} seconds.')\n        log('Set DataFrames has started.')\n        start_time = datetime.timestamp(datetime.now())\n        self.dfs_jockeys: dict[str, pd.DataFrame] = {}\n        self.jockey_ids: np.ndarray = np.array([])\n        self.dfs_packs: dict[str, pd.DataFrame] = {}\n        self.pack_ids: np.ndarray = np.array([])\n        self.dfs_path = path.join(workdir, 'fe_split')\n        self.set_dfs()\n        log(F'Set DataFrames phase ended in {datetime.timestamp(datetime.now()) - start_time:.2f} seconds.')\n        self.factor: float = 4.0   # number of trakus_index per second\n        log('Features creation phase has started.')\n        start_time = datetime.timestamp(datetime.now())\n        self.fill_data()\n        log(F'Features creation phase ended in {datetime.timestamp(datetime.now()) - start_time:.2f} seconds.')\n        log('Writing data phase has started.')\n        start_time = datetime.timestamp(datetime.now())\n        self.df_out.to_pickle(path.join(workdir, 'df_feature_engineering.pkl'))\n        log(F'Writing data phase ended in {datetime.timestamp(datetime.now()) - start_time:.2f} seconds.')\n        log('Embedding strings phase has started.')\n        start_time = datetime.timestamp(datetime.now())\n        self.mapping_path = path.join(workdir, 'mapping')\n        self.embedding_strings()\n        log(F'Embedding strings phase ended in {datetime.timestamp(datetime.now()) - start_time:.2f} seconds.')\n        log('Writing data for ML modelling phase has started.')\n        start_time = datetime.timestamp(datetime.now())\n        self.df_out.to_pickle(path.join(workdir, 'df_all_features.pkl'))\n        log(F'Writing data for ML modelling phase ended in {datetime.timestamp(datetime.now()) - start_time:.2f} ' +\n            'seconds.')\n\n    def prepare_df_in(self) -> None:\n        columns_dtypes: dict[str, str] = {'track_id': 'str', 'race_date': 'str', 'race_number': 'int',\n                                          'program_number': 'str', 'trakus_index': 'int', 'latitude': 'float',\n                                          'longitude': 'float', 'distance_id': 'int', 'course_type': 'str',\n                                          'track_condition': 'str', 'run_up_distance': 'int', 'race_type': 'str',\n                                          'purse': 'int', 'post_time': 'int', 'weight_carried': 'int', 'jockey': 'str',\n                                          'odds': 'int', 'race_time': 'float', 'sex': 'str', 'age': 'int',\n                                          'dropout': 'int', 'race_trakus_index': 'int', 'x_abs_speed': 'float',\n                                          'y_abs_speed': 'float', 'd_abs_speed': 'float', 'alpha_abs_speed': 'float',\n                                          'x_decomp_speed': 'float', 'y_decomp_speed': 'float', 'y_rel_speed': 'float',\n                                          'x_rel_dist': 'float', 'y_rel_dist': 'float', 'd_rel_dist': 'float',\n                                          'alpha_rel_dist': 'float', 'x_decomp_dist': 'float', 'y_decomp_dist': 'float',\n                                          'd_acceleration': 'float', 'alpha_acceleration': 'float',\n                                          'x_decomp_acceleration': 'float', 'y_decomp_acceleration': 'float',\n                                          'race_position': 'int', 'drafting': 'int', 'number_jockeys': 'int',\n                                          'line_up_position': 'int'}\n        self.df_in = self.df_in.astype(columns_dtypes)\n        self.df_in.reset_index(inplace = True, drop = True)\n        self.df_in['race_position'] = self.df_in['race_position'] + 50 * self.df_in['dropout']\n        # self.df_in = self.df_in[~ (self.df_in['jockey'] == 'pack')].copy()\n        self.df_in.loc[:, 'race_id'] = \\\n            self.df_in['track_id'] + '_' + self.df_in['race_date'] + '_' + self.df_in['race_number'].astype(str)\n        self.df_in.loc[:, 'jockey_id'] = self.df_in['race_id'] + '_' + self.df_in['jockey']\n        columns_dtypes['race_id'] = 'str'\n        columns_dtypes['jockey_id'] = 'str'\n        self.df_in = self.df_in.astype(columns_dtypes)\n        self.df_in.sort_values(by = ['jockey_id', 'trakus_index'], inplace = True, ignore_index = True)\n        self.df_in.reset_index(inplace = True, drop = True)\n\n    def prepare_df_out(self) -> None:\n        columns_dtype: dict[str, str] = \\\n            {'race_id': 'str', 'jockey_id': 'str', 'distance_id': 'int', 'course_type': 'str',\n             'track_condition': 'str', 'run_up_distance': 'int', 'race_type': 'str', 'purse': 'int', 'post_time': 'int',\n             'weight_carried': 'int', 'odds': 'int', 'race_time': 'float', 'sex': 'str', 'age': 'int',\n             'number_jockeys': 'int', 'race_position': 'int', 'line_up_position': 'int', 'track_id': 'str',\n             'race_number': 'int', 'jockey': 'str'}\n        specific_columns_dtype: dict[str, str] = \\\n            {'distance_overall': 'float', 'distance_extra_overall': 'float', 'distance_pack_relative_overall': 'float',\n             'distance_y_overall': 'float', 'distance_x_overall': 'float', 'distance_ahead_overall': 'float',\n             'distance_behind_overall': 'float', 'distance_inside_overall': 'float',\n             'distance_outside_overall': 'float', 'distance_drafting_overall': 'float',\n             'speed_average_overall': 'float', 'speed_minimum_overall': 'float',\n             'speed_maximum_overall': 'float', 'speed_variance_overall': 'float',\n             'acceleration_average_overall': 'float', 'acceleration_minimum_overall': 'float',\n             'acceleration_maximum_overall': 'float', 'acceleration_variance_overall': 'float',\n             'distance_first_20s': 'float', 'distance_pack_relative_first_20s': 'float',\n             'distance_y_first_20s': 'float', 'distance_x_first_20s': 'float', 'distance_ahead_first_20s': 'float',\n             'distance_behind_first_20s': 'float', 'distance_inside_first_20s': 'float',\n             'distance_outside_first_20s': 'float', 'distance_drafting_first_20s': 'float',\n             'speed_average_first_20s': 'float', 'speed_minimum_first_20s': 'float', 'speed_maximum_first_20s': 'float',\n             'speed_variance_first_20s': 'float', 'acceleration_average_first_20s': 'float',\n             'acceleration_minimum_first_20s': 'float', 'acceleration_maximum_first_20s': 'float',\n             'acceleration_variance_first_20s': 'float', 'distance_mid_race': 'float',\n             'distance_pack_relative_mid_race': 'float', 'distance_y_mid_race': 'float', 'distance_x_mid_race': 'float',\n             'distance_ahead_mid_race': 'float', 'distance_behind_mid_race': 'float',\n             'distance_inside_mid_race': 'float', 'distance_outside_mid_race': 'float',\n             'distance_drafting_mid_race': 'float', 'speed_average_mid_race': 'float',\n             'speed_minimum_mid_race': 'float', 'speed_maximum_mid_race': 'float', 'speed_variance_mid_race': 'float',\n             'acceleration_average_mid_race': 'float', 'acceleration_minimum_mid_race': 'float',\n             'acceleration_maximum_mid_race': 'float', 'acceleration_variance_mid_race': 'float',\n             'distance_final_20s': 'float', 'distance_pack_relative_final_20s': 'float',\n             'distance_y_final_20s': 'float', 'distance_x_final_20s': 'float', 'distance_ahead_final_20s': 'float',\n             'distance_behind_final_20s': 'float', 'distance_inside_final_20s': 'float',\n             'distance_outside_final_20s': 'float', 'distance_drafting_final_20s': 'float',\n             'speed_average_final_20s': 'float', 'speed_minimum_final_20s': 'float', 'speed_maximum_final_20s': 'float',\n             'speed_variance_final_20s': 'float', 'acceleration_average_final_20s': 'float',\n             'acceleration_minimum_final_20s': 'float', 'acceleration_maximum_final_20s': 'float',\n             'acceleration_variance_final_20s': 'float'}\n        df_initial: pd.DataFrame = self.df_in.loc[self.df_in['trakus_index'] == 1, list(columns_dtype.keys())].copy()\n        df_initial.reset_index(inplace = True, drop = True)\n        n: int = len(df_initial)\n        m: int = len(specific_columns_dtype)\n        fill_up_np: np.ndarray = np.full(shape = (n, m), fill_value = 0.0)\n        df_zeroes: pd.DataFrame = pd.DataFrame(data = fill_up_np, columns = list(specific_columns_dtype.keys()))\n        df_zeroes = df_zeroes.astype(specific_columns_dtype)\n        df_zeroes.reset_index(inplace = True, drop = True)\n        self.df_out = pd.concat(objs = [df_initial, df_zeroes], axis = 1)\n        columns_dtype.update(specific_columns_dtype)\n        self.df_out.astype(columns_dtype)\n        self.df_out = self.df_out[~ (self.df_out['jockey_id'].str.contains('pack'))].copy()\n        self.df_out.reset_index(inplace = True, drop = True)\n        self.df_out.set_index(keys = ['jockey_id'], inplace = True, drop = True)\n\n    def set_dfs(self):\n        def create_dfs(jockey_id: str) -> None:\n            df_tmp: pd.DataFrame = df.loc[[jockey_id]].copy()\n            df_tmp.reset_index(inplace = True)\n            df_tmp.set_index(keys = ['trakus_index'], inplace = True, drop = True)\n            if jockey_id.endswith('pack'):\n                self.dfs_packs[jockey_id] = df_tmp.copy()\n            else:\n                self.dfs_jockeys[jockey_id] = df_tmp.copy()\n            df_tmp.to_pickle(path.join(self.dfs_path, 'df_' + jockey_id + '.pkl'))\n\n        def read_dfs(jockey_id: str) -> None:\n            df_tmp: pd.DataFrame = pd.read_pickle(path.join(self.dfs_path, 'df_' + jockey_id + '.pkl'))\n            df_tmp.reset_index(inplace = True)\n            df_tmp.set_index(keys = ['trakus_index'], inplace = True, drop = True)\n            if jockey_id.endswith('pack'):\n                self.dfs_packs[jockey_id] = df_tmp.copy()\n            else:\n                self.dfs_jockeys[jockey_id] = df_tmp.copy()\n\n        split: bool = False\n        if len(self.dfs_jockeys) == 0:\n            if not path.isdir(self.dfs_path):\n                mkdir(self.dfs_path)\n                if len(listdir(self.dfs_path)) != 0:\n                    log(message = F'Output directory \"{self.dfs_path}\" cannot be used.', level = 'error')\n                split = True\n            else:\n                if len(listdir(self.dfs_path)) == 0:\n                    split = True\n        df = self.df_in.copy()\n        self.jockey_ids = pd.unique(df.loc[~ (df['jockey'] == 'pack'), 'jockey_id'])\n        self.pack_ids = pd.unique(df.loc[df['jockey'] == 'pack', 'jockey_id'])\n        df.sort_values(by = ['jockey_id', 'jockey', 'trakus_index'], inplace = True, ignore_index = True)\n        df.set_index(keys = ['jockey_id'], inplace = True, drop = True)\n        if split:\n            _: list = list(map(create_dfs, self.jockey_ids))\n            _: list = list(map(create_dfs, self.pack_ids))\n        else:\n            _: list = list(map(read_dfs, self.jockey_ids))\n            _: list = list(map(read_dfs, self.pack_ids))\n\n    def fill_data(self) -> None:\n        def main_loop(loop_item: (str, str, str)) -> None:\n            def distance_stats() -> None:\n                nonlocal df_pack\n                nonlocal df_jockey\n                self.df_out.loc[jockey_id, 'distance_' + interval] = df_jockey.loc[ti_min:ti_max, 'd_abs_speed'].sum()\n                if interval == 'overall':\n                    self.df_out.loc[jockey_id, 'distance_extra_' + interval] = \\\n                        self.df_out.loc[jockey_id, 'distance_overall'] - df_jockey.loc[1, 'distance_id'] * 2.012\n                self.df_out.loc[jockey_id, 'distance_pack_relative_' + interval] = \\\n                    df_jockey.loc[ti_min:ti_max, 'd_abs_speed'].sum() - \\\n                    df_pack.loc[ti_min_pack:ti_max_pack, 'd_abs_speed'].sum()\n                self.df_out.loc[jockey_id, 'distance_x_' + interval] = \\\n                    df_jockey.loc[ti_min:ti_max, 'x_decomp_speed'].abs().sum()\n                self.df_out.loc[jockey_id, 'distance_y_' + interval] = \\\n                    df_jockey.loc[ti_min:ti_max, 'y_decomp_speed'].abs().sum()\n                self.df_out.loc[jockey_id, 'distance_ahead_' + interval] = \\\n                    df_jockey.loc[ti_min:ti_max].loc[df_jockey['y_decomp_dist'] >= 0.0, 'd_abs_speed'].sum()\n                self.df_out.loc[jockey_id, 'distance_behind_' + interval] = \\\n                    df_jockey.loc[ti_min:ti_max].loc[df_jockey['y_decomp_dist'] < 0.0, 'd_abs_speed'].sum()\n                self.df_out.loc[jockey_id, 'distance_inside_' + interval] = \\\n                    df_jockey.loc[ti_min:ti_max].loc[df_jockey['x_decomp_dist'] < 0.0, 'd_abs_speed'].sum()\n                self.df_out.loc[jockey_id, 'distance_outside_' + interval] = \\\n                    df_jockey.loc[ti_min:ti_max].loc[df_jockey['x_decomp_dist'] >= 0.0, 'd_abs_speed'].sum()\n                self.df_out.loc[jockey_id, 'distance_drafting_' + interval] = \\\n                    df_jockey.loc[ti_min:ti_max].loc[df_jockey['drafting'] == 1, 'd_abs_speed'].sum()\n\n            def other_stats() -> None:\n                nonlocal df_jockey\n                nonlocal ti_min\n\n                if component == 'acceleration':\n                    target_in: str = 'd_acceleration'\n                    factor: float = self.factor * self.factor\n                else:\n                    target_in: str = 'd_abs_speed'\n                    factor: float = self.factor\n\n                self.df_out.loc[jockey_id, component + '_average_' + interval] = \\\n                    df_jockey.loc[ti_min:ti_max, target_in].mean() * factor\n                if ti_min == 1:\n                    ti_min = 2\n                self.df_out.loc[jockey_id, component + '_minimum_' + interval] = \\\n                    df_jockey.loc[ti_min:ti_max, target_in].min() * factor\n                if ti_min == 2:\n                    ti_min = 1\n                self.df_out.loc[jockey_id, component + '_maximum_' + interval] = \\\n                    df_jockey.loc[ti_min:ti_max, target_in].max() * factor\n                self.df_out.loc[jockey_id, component + '_variance_' + interval] = \\\n                    df_jockey.loc[ti_min:ti_max, target_in].var(ddof=0) * factor * factor\n\n            component: str\n            interval: str\n            jockey_id: str\n            jockey_id, component, interval = loop_item\n            df_jockey: pd.DataFrame = self.dfs_jockeys[jockey_id].copy()\n            pack_id: str = df_jockey['race_id'].iat[0] + '_pack'\n            df_pack: pd.DataFrame = self.dfs_packs[pack_id].copy()\n\n            if interval == 'overall':\n                ti_min: int = 1\n                ti_max: int = df_jockey.loc[1, 'race_trakus_index']\n                ti_min_pack: int = 1\n                ti_max_pack: int = df_pack.loc[1, 'race_trakus_index']\n            elif interval == 'first_20s':\n                ti_min: int = 1\n                ti_max: int = round(20 * self.factor)\n                ti_min_pack: int = 1\n                ti_max_pack: int = round(20 * self.factor)\n            elif interval == 'mid_race':\n                ti_min: int = round(20 * self.factor + 1)\n                ti_max: int = \\\n                    df_jockey.loc[1, 'race_trakus_index'] - round(20 * self.factor)\n                ti_min_pack: int = round(20 * self.factor + 1)\n                ti_max_pack: int = \\\n                    df_pack.loc[1, 'race_trakus_index'] - round(20 * self.factor)\n            elif interval == 'final_20s':\n                ti_min: int = \\\n                    df_jockey.loc[1, 'race_trakus_index'] - round(20 * self.factor + 1)\n                ti_max: int = df_jockey.loc[1, 'race_trakus_index']\n                ti_min_pack: int = \\\n                    df_pack.loc[1, 'race_trakus_index'] - round(20 * self.factor + 1)\n                ti_max_pack: int = df_pack.loc[1, 'race_trakus_index']\n            else:\n                ti_min: int = 1\n                ti_max: int = 1\n                ti_min_pack: int = 1\n                ti_max_pack: int = 1\n                log(message = F'Unknown interval \"{interval}\".', level = 'error')\n\n            if component == 'distance':\n                distance_stats()\n            elif component == 'speed' or component == 'acceleration':\n                other_stats()\n            else:\n                log(message = F'Unknown component \"{component}\".', level = 'error')\n\n        interval_list: list = ['overall', 'first_20s', 'mid_race', 'final_20s']\n        component_list: list = ['distance', 'speed', 'acceleration']\n        iteration_list: list = list(it.product(self.jockey_ids, component_list, interval_list))\n        _: list = list(map(main_loop, iteration_list))\n\n    def embedding_strings(self) -> None:\n        def process_column(column_name: str) -> None:\n            def map_keys(map_item: list) -> None:\n                key: str = map_item[0]\n                value: int = int(map_item[1])\n                self.df_out.loc[key, column_name] = value\n\n            column_raw_full_data: np.ndarray = self.df_out[column_name].to_numpy()\n            column_raw_data: np.ndarray = np.unique(column_raw_full_data)\n            column_embedded_data: np.ndarray = np.arange(1, column_raw_data.size + 1)\n            column_raw_data = column_raw_data.reshape(column_raw_data.size, 1)\n            column_embedded_data = column_embedded_data.reshape(column_raw_data.size, 1)\n            columns_data: np.ndarray = np.concatenate((column_raw_data, column_embedded_data), axis = 1)\n            df_tmp: pd.DataFrame = pd.DataFrame(data = columns_data, columns = ['keys', 'values'])\n            self.df_out.reset_index(inplace = True)\n            self.df_out.set_index(keys = [column_name], inplace = True, drop = True)\n            _: list = list(map(map_keys, columns_data))\n            self.df_out.reset_index(inplace = True, drop = True)\n            self.df_out[column_name] = self.df_out[column_name].astype(int)\n            self.df_out.set_index(keys = ['jockey_id'], inplace = True, drop = True)\n            df_tmp.to_pickle(path.join(self.mapping_path, 'df_mapping_' + column_name + '.pkl'))\n\n        if not path.isdir(self.mapping_path):\n            mkdir(self.mapping_path)\n        columns_dtype: dict[str, str] = \\\n            {'course_type': 'str', 'track_condition': 'str', 'race_type': 'str', 'sex': 'str', 'track_id': 'str',\n             'jockey': 'str'}\n        _: list = list(map(process_column, list(columns_dtype.keys())))\n        if not path.isdir(self.mapping_path) or len(listdir(self.mapping_path)) == 0:\n            log(message = F'Output directory \"{self.mapping_path}\" cannot be used.', level = 'error')\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Executing Features Extraction Pipeline","metadata":{}},{"cell_type":"code","source":"FeatureExtraction()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### ML Modelling","metadata":{}},{"cell_type":"markdown","source":"#### Utility Variables & Global Settings","metadata":{}},{"cell_type":"code","source":"# suppress the undesired warning\nnp.testing.suppress_warnings(forwarding_rule='always')\n","metadata":{"execution":{"iopub.status.busy":"2022-11-10T18:48:32.368432Z","iopub.execute_input":"2022-11-10T18:48:32.368933Z","iopub.status.idle":"2022-11-10T18:48:32.375123Z","shell.execute_reply.started":"2022-11-10T18:48:32.368893Z","shell.execute_reply":"2022-11-10T18:48:32.373792Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Class Providing Main Functionality","metadata":{}},{"cell_type":"code","source":"\nclass Modelling:\n    def __init__(self):\n        # input parameters\n        self._split_positions: list = [[-1], [-1]]\n        self._epochs: int = 15\n        self._batch_size: int = 10\n        self._verbose: int = 0\n        self._number_runs: int = 5\n        # computed parameters\n        self._input_size: int = 0\n        self._output_bias: np.ndarray = np.array([0.0])\n        self._class_imbalance: dict = {1: 0.5, 0: 0.5}\n        self._class_imbalance_factor: float = 1.0\n        self._class_imbalance_deviation: float = 0.1\n        self._selected_columns: list = []\n        self._model = None\n        self._model_fit_history = None   # history.params & history.history.keys()\n        self._model_evaluation = []\n        # private members\n        self._workdir: str = path.join('/kaggle', 'working', 'big-data-derby-2022')\n        self._selector_stats: dict = {}\n        self._correlation_distance: float = 1.0\n        self._correlation_clusters: dict = {}\n        self._train_dataset: pd.DataFrame = pd.DataFrame()\n        self._train_labels: pd.DataFrame = pd.DataFrame()\n        self._validation_dataset: pd.DataFrame = pd.DataFrame()\n        self._validation_labels: pd.DataFrame = pd.DataFrame()\n        self._test_dataset: pd.DataFrame = pd.DataFrame()\n        self._test_labels: pd.DataFrame = pd.DataFrame()\n        self._df_fo: pd.DataFrame = pd.DataFrame()\n        self._df_fos: pd.DataFrame = pd.DataFrame()\n        self._df: pd.DataFrame = pd.read_pickle(F'{self._workdir}/df_all_features.pkl')\n        self._df_working: pd.DataFrame = pd.DataFrame()\n        self._df_cluster_stats: pd.DataFrame = pd.DataFrame(columns = ['correlation_distance', 'cluster_id',\n                                                                       'leading_feature', 'cluster_size', 'mcc', 'loss'])\n        self._all_features: list = list(self._df.columns)\n        self._reindex_race_position()\n        self._clean_data()\n\n    # setter\n    def set_parameters(self, split_positions: list,\n                       epochs: int = 15,\n                       batch_size: int = 10,\n                       verbose: int = 0,\n                       number_runs: int = 5):\n        self._split_positions = split_positions\n        self._epochs = epochs\n        self._batch_size = batch_size\n        self._verbose = verbose\n        self._number_runs = number_runs\n        return self\n\n    # chain executor\n    def run(self):\n        self._select_race_position()\n        self._compute_selector_stats()\n        self._split_data()\n        checkpoint: dict = self._checkpoint()\n        bob_model: dict = self._model_controller()\n        self._all_features = {i: column for i, column in enumerate(self._train_dataset.columns)}\n        cluster_stats: dict = {'correlation_distance': -1.0, 'cluster_id': -1.0,\n                               'leading_feature': 'all', 'cluster_size': len(self._all_features),\n                               'mcc': bob_model['model_evaluation'][5], 'loss': bob_model['model_evaluation'][0]}\n        self._df_cluster_stats = \\\n            pd.concat([self._df_cluster_stats, pd.DataFrame(cluster_stats, index = [0])], axis = 0, ignore_index = True)\n        results: dict = self._feature_importance_controller()\n        cpl = self._split_positions[0]\n        cpl = [str(i) for i in cpl]\n        cpl = ''.join(cpl)\n        cnl = self._split_positions[1]\n        cnl = [str(i) for i in cnl]\n        cnl = ''.join(cnl)\n        for cd in results.keys():\n            if self._verbose > 0:\n                log(F'Correlation distance: {cd}')\n            df_fos: pd.DataFrame = results[cd]['df_fos']\n            features: np.ndarray = df_fos.loc[df_fos['score'] > 0, 'feature_name']\n            for feature in features:\n                cluster_key: int = self._train_dataset.columns.get_loc(feature)\n                selected_features: list = results[cd]['cc'][cluster_key]\n                dataset_columns: np.ndarray = np.array(list(self._train_dataset.columns))\n                selected_dataset_columns: list = dataset_columns[selected_features]\n                self._train_dataset = self._train_dataset[selected_dataset_columns].copy()\n                self._validation_dataset = self._validation_dataset[selected_dataset_columns].copy()\n                self._test_dataset = self._test_dataset[selected_dataset_columns].copy()\n                if self._verbose > 0:\n                    selected_dataset_columns_len = len(selected_dataset_columns)\n                    plural = 's'\n                    if selected_dataset_columns_len == 1:\n                        plural = ''\n                    log(F'[CD: {cd}] Cluster lead feature: {feature} ({selected_dataset_columns_len} member{plural})')\n                bob_model = self._model_controller()\n                self._prepare_dump(cd, results[cd], bob_model)\n                self._dump(F'{cpl}_{cnl}', cluster_key)\n                cluster_stats: dict = {'correlation_distance': cd, 'cluster_id': cluster_key,\n                                       'leading_feature': feature, 'cluster_size': len(selected_features),\n                                       'mcc': bob_model['model_evaluation'][5],\n                                       'loss': bob_model['model_evaluation'][0]}\n                self._df_cluster_stats = \\\n                    pd.concat([self._df_cluster_stats, pd.DataFrame(cluster_stats, index = [0])], axis = 0,\n                              ignore_index = True)\n                df_cluster_stats_dtypes: dict = {'correlation_distance': 'float', 'cluster_id': 'int',\n                                                 'leading_feature': 'str', 'cluster_size': 'int',\n                                                 'mcc': 'float', 'loss': 'float'}\n                self._df_cluster_stats = self._df_cluster_stats.astype(df_cluster_stats_dtypes)\n                if self._verbose > 0:\n                    log(F'[CD: {cd}] Best of Breed MCC: {bob_model[\"model_evaluation\"][5]:.4f}')\n                    log(F'[CD: {cd}] Best of Breed Loss: {bob_model[\"model_evaluation\"][0]:.4f}')\n                if self._verbose > 1:\n                    self._print_stats()\n                self._restore_to_checkpoint(checkpoint)\n        self.\\\n            _df_cluster_stats.to_pickle(path.join(self._workdir, F'{cpl}_{cnl}', 'df_cluster_stats.pkl'))\n        return self\n\n    def _checkpoint(self) -> dict:\n        return {'train_dataset': self._train_dataset, 'train_labels': self._train_labels,\n                'validation_dataset': self._validation_dataset, 'validation_labels': self._validation_labels,\n                'test_dataset': self._test_dataset, 'test_labels': self._test_labels}\n\n    def _restore_to_checkpoint(self, checkpoint: dict) -> None:\n        self._train_dataset = checkpoint['train_dataset']\n        self._train_labels = checkpoint['train_labels']\n        self._validation_dataset = checkpoint['validation_dataset']\n        self._validation_labels = checkpoint['validation_labels']\n        self._test_dataset = checkpoint['test_dataset']\n        self._test_labels = checkpoint['test_labels']\n\n    def _prepare_dump(self, correlation_distance, results, bob_model):\n        self._df_fo = results['df_fo']\n        self._df_fos = results['df_fos']\n        self._correlation_distance = correlation_distance\n        self._correlation_clusters = results['cc']\n        self._model_fit_history = bob_model['model_fit_history']\n        self._model_evaluation = bob_model['model_evaluation']\n        self._output_bias = bob_model['output_bias']\n        self._class_imbalance = bob_model['class_imbalance']\n\n    # save results and computed parameters\n    def _dump(self, location: str = '', cluster_key: int = 100) -> None:\n        relative_location = self._workdir\n        if not path.isdir(relative_location):\n            mkdir(relative_location)\n        if location != '':\n            relative_location = path.join(self._workdir, location)\n        if not path.isdir(relative_location):\n            mkdir(relative_location)\n        features_clusters = {'all_features': self._all_features,\n                             'correlation_clusters': self._correlation_clusters}\n        f = open(path.join(relative_location, F'correlations_{self._correlation_distance:.2f}.json'), 'w+')\n        f.write(json.dumps(features_clusters, indent = 4))\n        self._df_fo.to_pickle(path.join(relative_location, F'df_feature_order_{self._correlation_distance:.2f}.pkl'))\n        self._df_fos.to_pickle(path.join(relative_location,\n                                         F'df_feature_order_stats_{self._correlation_distance:.2f}.pkl'))\n        pd.DataFrame(self._model_fit_history.history).\\\n            to_pickle(path.join(relative_location,\n                                F'fit_history_history_{self._correlation_distance:.2f}_{cluster_key}.pkl'))\n        n: int = len(self._selector_stats)\n        keys: np.ndarray = np.array(list(self._selector_stats.keys())).reshape(n, 1)\n        values: np.ndarray = np.array(list(self._selector_stats.values())).reshape(n, 1)\n        data: np.ndarray = np.concatenate([keys, values], axis = 1)\n        columns: list[str] = ['selector', 'stats']\n        pd.DataFrame(data, columns = columns).\\\n            to_pickle(path.join(relative_location, 'selector_stats.pkl'))\n        file_names: list[str] = ['output_bias', 'fit_history_parameters', 'evaluation', 'class_imbalance']\n        members: list[np.ndarray] = [self._output_bias,\n                                     np.array(self._model_fit_history.params),\n                                     np.array(self._model_evaluation),\n                                     np.array(list(self._class_imbalance.values()))]\n        for file_name, member in zip(file_names, members):\n            np.save(path.join(relative_location, F'{file_name}_{self._correlation_distance:.2f}_{cluster_key}'), member)\n\n    @staticmethod\n    def _reset_backend():\n        K.clear_session()\n        tf.random.set_seed(42)\n        np.random.seed(42)\n\n    # private members\n    def _clean_data(self) -> None:\n        self._df.reset_index(inplace = True)\n        self._df.reset_index(inplace = True, drop = True)\n        self._add_selector()\n        cols_df: list[str] = list(self._df.columns)\n        # exclude_columns: list[str] = ['number_jockeys', 'odds', 'post_time', 'jockey', 'purse']\n        exclude_columns: list[str] = ['odds', 'post_time']\n        exclude_indexes: list[str] = ['jockey_id', 'race_id']\n        exclude_classes: list[str] = ['race_position']\n        exclude_selector: list[str] = ['selector']\n        excluded_all: list[list[str]] = [exclude_columns, exclude_indexes, exclude_classes, exclude_selector]\n        excluded_all: list[str] = sum(excluded_all, [])\n        selected_columns: list[str] = list(set(cols_df) ^ set(excluded_all))\n        df_classes: pd.DataFrame = self._df[exclude_classes].copy()\n        df_selector: pd.DataFrame = self._df[exclude_selector].copy()\n        df: pd.DataFrame = self._df[selected_columns].copy()\n        # get rid of NaNs when jockey drops out\n        imputer: SimpleImputer = SimpleImputer(missing_values = np.nan, strategy = 'constant', fill_value = 0.0)\n        np_vector: np.ndarray = imputer.fit_transform(df)\n        # scale the values to 0..1 range\n        scaler: MinMaxScaler = MinMaxScaler()\n        np_vector: np.ndarray = scaler.fit_transform(np_vector)\n        self._df = pd.DataFrame(np_vector, columns = selected_columns, dtype = float)\n        self._df = pd.concat([self._df, df_classes, df_selector], axis = 1)\n        self._df.sort_values(by = ['selector'], inplace = True, ignore_index = True)\n        self._df.reset_index(inplace = True, drop = True)\n        self._df_working = self._df.copy()\n\n    def _reindex_race_position(self) -> None:\n        # outside the first three positions, but not dropouts\n        self._df.loc[(self._df['race_position'] >= 4) & (self._df['race_position'] <= 15), 'race_position'] = 4\n        # everything else\n        self._df.loc[self._df['race_position'] > 15, 'race_position'] = 0\n\n    def _add_selector(self) -> None:\n        self._df.loc[:, 'selector'] = \\\n            self._df['race_position'].astype(str) + '-' + \\\n            self._df['distance_id'].astype(str) + '-' + \\\n            self._df['course_type'].astype(str) + '-' + \\\n            self._df['track_condition'].astype(str) + '-' + \\\n            self._df['race_type'].astype(str) + '-' + \\\n            self._df['track_id'].astype(str)\n\n    def _select_race_position(self) -> None:\n        df_local: pd.DataFrame = self._df_working.copy()\n        df_list: list = []\n        for i in range(2):\n            df: pd.DataFrame = df_local[df_local['race_position'].isin(self._split_positions[i])].copy()\n            df.reset_index(inplace = True, drop = True)\n            df.loc[:, 'race_position'] = 1 - i\n            df['selector'].replace(regex = {r'^(.*?)(-.*)$': Fr'{1 - i}\\g<2>'}, inplace = True)\n            df_list.append(df.copy())\n        df_concat: pd.DataFrame = pd.concat(df_list, axis = 0, ignore_index = True)\n        df_concat.reset_index(inplace = True, drop = True)\n        self._df_working = df_concat.copy()\n        self._df_working.sort_values(by = ['selector'], inplace = True, ignore_index = True)\n        self._df_working.reset_index(inplace = True, drop = True)\n\n    def _compute_selector_stats(self) -> None:\n        def counter(index: str) -> None:\n            selector_stats[index] = df.loc[index, 'race_position'].size\n\n        selector_stats: dict[str, int] = {}\n        df: pd.DataFrame = self._df_working.copy()\n        df.sort_values(by = ['selector'], inplace = True, ignore_index = True)\n        df.reset_index(inplace = True, drop = True)\n        selector: np.ndarray = pd.unique(df['selector'])\n        df.set_index(keys = ['selector'], inplace = True, drop = True)\n        _ = list(map(counter, selector))\n        df.reset_index(inplace = True)\n        self._selector_stats = selector_stats\n        df.sort_values(by = ['selector'], inplace = True, ignore_index = True)\n        df.reset_index(inplace = True, drop = True)\n        self._df_working = df\n\n    def _split_data(self) -> None:\n        def assign_split(index) -> None:\n            nonlocal train_dataset\n            nonlocal validation_dataset\n            nonlocal test_dataset\n            n: int = int(round(0.2 * selector_stats[index]))\n            m: int = int(round(0.4 * selector_stats[index]))\n            dataset: pd.DataFrame = df[df['selector'] == index].copy()\n            dataset.reset_index(inplace = True, drop = True)\n            if len(dataset) > 1 and n > 0:\n                train_dataset = pd.concat([train_dataset, dataset.iloc[:-m]], axis = 0, ignore_index = True)\n                validation_dataset = pd.concat([validation_dataset, dataset.iloc[-m:-n]], axis = 0, ignore_index = True)\n                test_dataset = pd.concat([test_dataset, dataset.iloc[-n:]], axis = 0, ignore_index = True)\n                validation_dataset.reset_index(inplace = True, drop = True)\n                test_dataset.reset_index(inplace = True, drop = True)\n            else:\n                train_dataset = pd.concat([train_dataset, dataset], axis = 0)\n            train_dataset.reset_index(inplace = True, drop = True)\n\n        df_tmp: pd.DataFrame = self._df_working.copy()\n        df_columns: list = list(df_tmp.columns)\n        df_np: np.ndarray = df_tmp.to_numpy()\n        np.random.seed(42)\n        np.random.shuffle(df_np)\n        df: pd.DataFrame = pd.DataFrame(df_np, columns = df_columns)\n        df.reset_index(inplace = True, drop = True)\n        selector_stats: dict[str, int] = self._selector_stats\n        train_dataset: pd.DataFrame = pd.DataFrame(columns = df.columns.tolist())\n        validation_dataset: pd.DataFrame = pd.DataFrame(columns = df.columns.tolist())\n        test_dataset: pd.DataFrame = pd.DataFrame(columns = df.columns.tolist())\n        _ = list(map(assign_split, selector_stats))\n        train_labels: pd.DataFrame = train_dataset[['race_position']].copy()\n        train_dataset = train_dataset.drop(columns = ['selector', 'race_position'], axis = 1)\n        validation_labels: pd.DataFrame = validation_dataset[['race_position']].copy()\n        validation_dataset = validation_dataset.drop(columns = ['selector', 'race_position'], axis = 1)\n        test_labels: pd.DataFrame = test_dataset[['race_position']].copy()\n        test_dataset = test_dataset.drop(columns = ['selector', 'race_position'], axis = 1)\n        self._train_dataset = train_dataset\n        self._train_labels = train_labels\n        self._validation_dataset = validation_dataset\n        self._validation_labels = validation_labels\n        self._test_dataset = test_dataset\n        self._test_labels = test_labels\n\n    def _cluster_features(self, correlation_distance: float = 1.0) -> tuple:\n        corr_dataset: pd.DataFrame = pd.concat([self._train_dataset, self._validation_dataset, self._test_dataset],\n                                               axis = 0, ignore_index = True)\n        corr_dataset.reset_index(inplace = True, drop = True)\n        # noinspection PyTypeChecker\n        corr = spearmanr(corr_dataset.to_numpy(dtype = float)).correlation\n        corr = (corr + corr.T) / 2\n        np.fill_diagonal(corr, 1)\n        distance_matrix = 1 - np.abs(corr)\n        dist_linkage = hierarchy.ward(squareform(distance_matrix))\n        cluster_ids = hierarchy.fcluster(dist_linkage, correlation_distance, criterion = \"distance\")\n        cluster_id_to_feature_ids = defaultdict(list)\n        correlation_clusters: dict = {}\n        for idx, cluster_id in enumerate(cluster_ids):\n            cluster_id_to_feature_ids[cluster_id].append(idx)\n        for v in cluster_id_to_feature_ids.values():\n            correlation_clusters[v[0]] = v\n        selected_features = [v[0] for v in cluster_id_to_feature_ids.values()]\n        dataset_columns: np.ndarray = np.array(list(corr_dataset.columns))\n        selected_dataset_columns: list = dataset_columns[selected_features]\n        return selected_dataset_columns, correlation_clusters\n\n    def _permutation_results(self, model: Any, selected_dataset_columns: list) -> Any:\n        perm_test_dataset: pd.DataFrame = pd.concat([self._validation_dataset, self._test_dataset],\n                                                    axis = 0, ignore_index = True)\n        perm_test_dataset.reset_index(inplace = True, drop = True)\n        perm_test_labels: pd.DataFrame = pd.concat([self._validation_labels, self._test_labels],\n                                                   axis = 0, ignore_index = True)\n        perm_test_labels.reset_index(inplace = True, drop = True)\n        perm_test_dataset_sel = perm_test_dataset[selected_dataset_columns].copy()\n        return permutation_importance(model,\n                                      perm_test_dataset_sel.to_numpy(dtype = float),\n                                      perm_test_labels['race_position'].to_numpy(dtype = int),\n                                      n_repeats = 10, random_state = 42, scoring = 'matthews_corrcoef')\n\n    def _feature_importance(self, correlation_distance: float = -1) -> tuple:\n        selected_dataset_columns, correlation_clusters = self._cluster_features(correlation_distance)\n        df_out: pd.DataFrame = pd.DataFrame()\n        for model_name in ['xgb', 'dtree', 'randf']:\n            np.random.seed(42)\n            if model_name == 'xgb':\n                model = XGBClassifier()\n                columns = ['feature_xgb', 'score_xgb']\n            elif model_name == 'dtree':\n                model = DecisionTreeClassifier(max_depth=20, random_state = np.random.seed(42))\n                columns = ['feature_dtree', 'score_dtree']\n            else:\n                model = RandomForestClassifier(max_depth=20, random_state = np.random.seed(42))\n                columns = ['feature_randf', 'score_randf']\n            model.fit(self._train_dataset[selected_dataset_columns].to_numpy(dtype = float),\n                      self._train_labels['race_position'].to_numpy(dtype = int))\n            result = self._permutation_results(model, selected_dataset_columns)\n            importance: np.ndarray = result.importances_mean\n            n = importance.size\n            importance_index = np.arange(n).reshape(n, 1)\n            importance = importance.reshape(n, 1)\n            importance_with_index = np.concatenate((importance_index, importance), axis = 1)\n            importance_with_index = importance_with_index[importance_with_index[:, 1].argsort()[::-1]]\n            df_out = pd.concat([df_out, pd.DataFrame(data = importance_with_index, columns = columns)], axis = 1)\n        columns_dtype: dict = {'feature_xgb': 'int', 'score_xgb': 'float',\n                               'feature_dtree': 'int', 'score_dtree': 'float',\n                               'feature_randf': 'int', 'score_randf': 'float', }\n        df_out = df_out.astype(columns_dtype)\n        df_fo: pd.DataFrame = pd.DataFrame()\n        for model_name in ['xgb', 'dtree', 'randf']:\n            df_fo.loc[:, 'feature_' + model_name] = df_out['feature_' + model_name]\n            df_fo.loc[:, 'feature_name_' + model_name] = \\\n                [selected_dataset_columns[int(i)] for i in df_out['feature_' + model_name]]\n            df_fo.loc[:, 'score_' + model_name] = df_out['score_' + model_name]\n        df_fo.reset_index(inplace = True)\n        df_fo_stats: pd.DataFrame = pd.DataFrame()\n        df_fo_stats['index'] = df_fo['index']\n        df_fo_stats['feature_name'] = [selected_dataset_columns[int(i)] for i in df_fo_stats['index']]\n        df_fo_stats['score'] = [(df_fo.loc[df_fo['feature_xgb'] == int(i), 'score_xgb'].iat[0] +\n                                 df_fo.loc[df_fo['feature_dtree'] == int(i), 'score_dtree'].iat[0] +\n                                 df_fo.loc[df_fo['feature_randf'] == int(i), 'score_randf'].iat[0]) / 3 for i in\n                                df_fo_stats['index']]\n        df_fo_stats['score'] = df_fo_stats['score'] / df_fo_stats['score'].sum()\n        df_fo_stats.sort_values(by = ['score'], inplace = True, ignore_index = True, ascending = False)\n        df_fo_stats.reset_index(inplace = True, drop = True)\n        return df_fo.copy(), df_fo_stats.copy(), correlation_clusters\n\n    def _feature_importance_controller(self) -> dict:\n        results: dict = {}\n        for cd in [0.0, 0.25, 0.5, 0.75, 1.0]:\n            df_fo, df_fos, cc = self._feature_importance(cd)\n            results[cd] = {'df_fo': df_fo, 'df_fos': df_fos, 'cc': cc}\n        return results\n\n    def _compute_class_imbalance(self) -> None:\n        bin_counts: list[int] = \\\n            [self._train_labels[self._train_labels['race_position'] == i].count().iat[0] for i in range(2)]\n        total_samples: int = len(self._train_labels['race_position'])\n        return_dict: dict[int, float] = {}\n        for i in range(1, -1, -1):\n            weight: float = total_samples / (2 * bin_counts[i])\n            if self._verbose > 1:\n                log(F'Class {i} has {bin_counts[i]} samples and a weight of {weight:.2f}.')\n            return_dict[i] = weight\n        self._output_bias: np.ndarray = np.log([bin_counts[1] / bin_counts[0]])\n        if self._verbose > 1:\n            log(F'Computed initial bias: {self._output_bias[0]}')\n        self._class_imbalance = return_dict\n        self._class_imbalance_factor = self._class_imbalance[0] / self._class_imbalance[1]\n\n    def _compute_input_size(self):\n        self._input_size: int = len(list(self._train_dataset.columns))\n\n    def _compile_model(self) -> keras.models.Sequential:\n        METRICS = [\n            keras.metrics.TruePositives(name = 'tp'),\n            keras.metrics.FalseNegatives(name = 'fn'),\n            keras.metrics.TrueNegatives(name = 'tn'),\n            keras.metrics.FalsePositives(name = 'fp'),\n        ]\n\n        model: keras.models.Sequential = keras.models.Sequential()\n        model.add(keras.layers.InputLayer(input_shape = self._input_size))\n        model.add(keras.layers.Dense(128, activation = 'relu'))\n        model.add(keras.layers.Dropout(0.25))\n        model.add(keras.layers.Dense(64, activation = 'relu'))\n        model.add(keras.layers.Dropout(0.25))\n        model.add(keras.layers.Dense(32, activation = 'relu'))\n        if 1 - self._class_imbalance_deviation < self._class_imbalance_factor < 1 + self._class_imbalance_deviation:\n            model.add(keras.layers.Dense(1, activation = 'sigmoid'))\n        else:\n            model.add(keras.layers.Dense(1, activation = 'sigmoid',\n                                         bias_initializer = keras.initializers.Constant(self._output_bias)))\n        model.compile(optimizer = tf.keras.optimizers.Adam(),\n                      loss = tf.keras.losses.BinaryCrossentropy(),\n                      metrics = METRICS)\n        return model\n\n    def _fit_model(self) -> None:\n        tf.random.set_seed(42)\n        verbose: int = 0\n        if self._verbose == 2:\n            verbose = 1\n        if 1 - self._class_imbalance_deviation < self._class_imbalance_factor < 1 + self._class_imbalance_deviation:\n            self._model_fit_history = self._model.fit(self._train_dataset.to_numpy(dtype = float),\n                                                      self._train_labels.to_numpy(dtype = float),\n                                                      epochs = self._epochs,\n                                                      batch_size = self._batch_size,\n                                                      validation_data = (\n                                                      self._validation_dataset.to_numpy(dtype = float),\n                                                      self._validation_labels.to_numpy(dtype = float)),\n                                                      shuffle = True,\n                                                      verbose = verbose)\n        else:\n            self._model_fit_history = self._model.fit(self._train_dataset.to_numpy(dtype = float),\n                                                      self._train_labels.to_numpy(dtype = float),\n                                                      epochs = self._epochs,\n                                                      batch_size = self._batch_size,\n                                                      validation_data = (\n                                                      self._validation_dataset.to_numpy(dtype = float),\n                                                      self._validation_labels.to_numpy(dtype = float)),\n                                                      class_weight = self._class_imbalance,\n                                                      shuffle = True,\n                                                      verbose = verbose)\n\n    def _evaluate_model(self) -> None:\n        self._model_evaluation = self._model.evaluate(self._test_dataset.to_numpy(dtype = float),\n                                                      self._test_labels.to_numpy(dtype = float),\n                                                      verbose = 0)\n\n    def _compute_mcc(self) -> None:\n        tp: Union[np.ndarray, float]\n        tn: Union[np.ndarray, float]\n        fp: Union[np.ndarray, float]\n        fn: Union[np.ndarray, float]\n        mcc: Union[np.ndarray, float]\n        for prefix in ['', 'val_']:\n            tp = np.array(self._model_fit_history.history[prefix + 'tp'])\n            tn = np.array(self._model_fit_history.history[prefix + 'tn'])\n            fp = np.array(self._model_fit_history.history[prefix + 'fp'])\n            fn = np.array(self._model_fit_history.history[prefix + 'fn'])\n            mcc = (tp * tn - fp * fn) / np.sqrt((tp + fp) * (tp + fn) * (tn + fp) * (tn + fn))\n            self._model_fit_history.history[prefix + 'mcc'] = mcc.tolist()\n\n        tp = self._model_evaluation[1]\n        tn = self._model_evaluation[3]\n        fp = self._model_evaluation[4]\n        fn = self._model_evaluation[2]\n        den = math.sqrt((tp + fp) * (tp + fn) * (tn + fp) * (tn + fn))\n        if den == 0:\n            mcc = 0.0\n        else:\n            mcc = (tp * tn - fp * fn) / den\n        self._model_evaluation.append(mcc)\n\n    def _model_info(self) -> dict:\n        return {'model_fit_history': self._model_fit_history, 'model_evaluation': self._model_evaluation,\n                'output_bias': self._output_bias, 'class_imbalance': self._class_imbalance}\n\n    def _model_controller(self) -> dict:\n        self._compute_input_size()\n        self._compute_class_imbalance()\n        bob_model: dict = self._model_info()\n        bob_model['class_imbalance'] = self._class_imbalance\n        bob_model['output_bias'] = self._output_bias\n        bob_model['model_fit_history'] = None\n        bob_model['model_evaluation'] = []\n        for _ in range(self._number_runs):\n            if len(bob_model['model_evaluation']) == 0:\n                old_mcc: float = -2.0\n            else:\n                old_mcc: float = bob_model['model_evaluation'][5]\n            self._reset_backend()\n            self._model = self._compile_model()\n            self._reset_backend()\n            self._fit_model()\n            self._reset_backend()\n            self._evaluate_model()\n            self._compute_mcc()\n            if old_mcc < self._model_evaluation[5]:\n                bob_model: dict = self._model_info()\n        return bob_model\n\n    def _print_stats(self) -> None:\n        for env, prefix in zip(['Training', 'Validation'], ['', 'val_']):\n            if env == 'Training':\n                log(F'{env} TP target: {self._train_labels[self._train_labels[\"race_position\"] == 1].count()[0]}')\n            else:\n                log(F'{env} TP target: '\n                    F'{self._validation_labels[self._validation_labels[\"race_position\"] == 1].count()[0]}')\n            log(F'{env} TP last: {int(self._model_fit_history.history[prefix + \"tp\"][-1])}')\n            log(F'{env} FN last: {int(self._model_fit_history.history[prefix + \"fn\"][-1])}')\n            if env == 'Training':\n                log(F'{env} TN target: {self._train_labels[self._train_labels[\"race_position\"] == 0].count()[0]}')\n            else:\n                log(F'{env} TN target: '\n                    F'{self._validation_labels[self._validation_labels[\"race_position\"] == 0].count()[0]}')\n            log(F'{env} TN last: {int(self._model_fit_history.history[prefix + \"tn\"][-1])}')\n            log(F'{env} FP last: {int(self._model_fit_history.history[prefix + \"fp\"][-1])}')\n            log(F'{env} MCC last: {self._model_fit_history.history[prefix + \"mcc\"][-1]}')\n            log(F'{env} Loss last: {self._model_fit_history.history[prefix + \"loss\"][-1]}')\n\n        log(F'Test TP target: {self._test_labels[self._test_labels[\"race_position\"] == 1].count()[0]}')\n        log(F'Test TP evaluated: {int(self._model_evaluation[1])}')\n        log(F'Test FN evaluated: {int(self._model_evaluation[2])}')\n        log(F'Test TN target: {self._test_labels[self._test_labels[\"race_position\"] == 0].count()[0]}')\n        log(F'Test TN evaluated: {int(self._model_evaluation[3])}')\n        log(F'Test FP evaluated: {int(self._model_evaluation[4])}')\n        log(F'Test MCC: {self._model_evaluation[5]}')\n        log(F'Test Loss: {self._model_evaluation[0]}')\n","metadata":{"execution":{"iopub.status.busy":"2022-11-10T18:58:25.349272Z","iopub.execute_input":"2022-11-10T18:58:25.349730Z","iopub.status.idle":"2022-11-10T18:58:25.935540Z","shell.execute_reply.started":"2022-11-10T18:58:25.349693Z","shell.execute_reply":"2022-11-10T18:58:25.934018Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Executing ML Modelling\n(The output is stored in \"results/cp-cn\" directory from working dirctory \"workdir\". The main results will be in the JSON file - \"correlations_x.xx.json\", where x.xx is the correlation distance - and \"df_cluster_stats.pkl\")","metadata":{}},{"cell_type":"code","source":"for cp in range(5):\n    for cn in range(5):\n        if cp != cn:\n            log(\"\")\n            log(\"=============\")\n            log(F\"= {cp}-{cn} split =\")\n            log(\"=============\")\n            start_time = datetime.timestamp(datetime.now())\n            modelling: Modelling = Modelling()\n            modelling.set_parameters(split_positions = [[cp], [cn]], epochs = 20, verbose = 1).run()\n            log(F'{cp}-{cn} split ended in {datetime.timestamp(datetime.now()) - start_time:.2f} seconds.')\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Working Directory","metadata":{}},{"cell_type":"code","source":"workdir = path.join('/kaggle', 'working', 'big-data-derby-2022')","metadata":{"execution":{"iopub.status.busy":"2022-11-10T17:35:20.067003Z","iopub.execute_input":"2022-11-10T17:35:20.067390Z","iopub.status.idle":"2022-11-10T17:35:20.073575Z","shell.execute_reply.started":"2022-11-10T17:35:20.067358Z","shell.execute_reply":"2022-11-10T17:35:20.072139Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Helper for World Record entries for Thoroughbred and American Quarter (Fig I1)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T17:26:00.113586Z","iopub.execute_input":"2022-11-10T17:26:00.115125Z","iopub.status.idle":"2022-11-10T17:26:00.124632Z","shell.execute_reply.started":"2022-11-10T17:26:00.115057Z","shell.execute_reply":"2022-11-10T17:26:00.122955Z"}}},{"cell_type":"code","source":"def first_degree_poly_fit(x, a, b):\n    return a + b*x\n\ndef inverse_first_degree_poly_fit(x, a, b):\n    return a + b/x\n\ndef second_degree_poly_fit(x, a, b, c):\n    return a + b*x + c*np.power(x, 2)\n\ndef inverse_second_degree_poly_fit(x, a, b, c):\n    return a + b/x + c/np.power(x, 2)\n\ndef third_degree_poly_fit(x, a, b, c, d):\n    return a + b*x + c*np.power(x, 2) + d*np.power(x, 3)\n\ndef fourth_degree_poly_fit(x, a, b, c, d, e):\n    return a + b*x + c*np.power(x, 2) + d*np.power(x, 3) + e*np.power(x, 4)\n\ndef fifth_degree_poly_fit(x, a, b, c, d, e, f):\n    return a + b*x + c*np.power(x, 2) + d*np.power(x, 3) + e*np.power(x, 4) + f*np.power(x, 4)\n\ndef asym_gaussian_fit(x, a, b, c):\n    return a*np.exp(-np.power((x-b)/c, 2))/(c*np.sqrt(2*np.pi))\n\nfit_functions = {'first_degree_poly': first_degree_poly_fit, \n                 'inverse_first_degree_poly': inverse_first_degree_poly_fit, \n                 'second_degree_poly': second_degree_poly_fit, \n                 'inverse_second_degree_poly': inverse_second_degree_poly_fit,\n                 'third_degree_poly': third_degree_poly_fit,\n                 'fourth_degree_poly': fourth_degree_poly_fit,\n                 'asym_gaussian': asym_gaussian_fit}\n\ndef call_fit(func, **kargs):\n    if func in fit_functions:\n        return globals()[func+'_fit'](**kargs)\n    raise KeyError(func)\n\n# data from sources\nxdata_1 = np.asarray([2, 4, 8, 9, 10, 12])\nydata_1 = np.asarray([20.57, 43.2, 91.23, 105, 117.8, 142.8])\nxdata_2_raw = [110, 220, 250, 300, 330, 350, 400, 440, 550, 770, 870, 1000]\nxdata_2 = np.asarray([x/220 for x in xdata_2_raw])\nydata_2 = np.asarray([6.770, 11.448, 12.588, 14.594, 15.859, 16.642, 18.613, 20.274, 26.033, 39.495, 43.029, 52.224])\nxdata_all = [xdata_1, xdata_2]\nydata_all = [ydata_1, ydata_2]\n\n# breed array\nbreed = ['Thoroughbread', 'American Quarter']\n\n# fitting functions for data based on breed\nmap_functions = {}\n\n# Thoroughbred data fitting functions\nmap_functions[breed[0]] = {'time': 'first_degree_poly', \n                           'speed': 'inverse_first_degree_poly', \n                           'acceleration': 'inverse_second_degree_poly'}\n\n# American Quarter data fitting functions\nmap_functions[breed[1]] = {'time': 'second_degree_poly', \n                           'speed': 'asym_gaussian', \n                           'acceleration': 'inverse_second_degree_poly'}\n\n# plotting function for world records\ndef plot_world_records():\n    fig, axes = plt.subplots(3, 2, figsize=(15, 15), sharex=True)\n    xrange = [x for x in range(1, 22)]\n    plt.setp(axes, xticks=xrange, xticklabels=xrange)\n    new_xdata = np.asarray(xrange)\n    fitted_params_thoroughbred = {}\n    for j in [0, 1]:\n        xdata = xdata_all[j]\n        ydata = ydata_all[j]\n        df = pd.DataFrame()\n        df['distance (furlongs)'] = xdata\n        df['time (s)'] = ydata\n        df['speed (m/s)'] = 201.2 * df['distance (furlongs)'] / df['time (s)']\n        df['acceleration (m/s^2)'] = df['speed (m/s)'] / df['time (s)']\n        params = {}\n        cov = {}\n        se = {}\n        columns = df.columns.values.tolist()\n        for k in range(1, len(columns)):\n            key = columns[k].split()[0]\n            fit_xdata = xdata\n            fit_ydata = df[columns[k]].to_numpy()\n            params, cov = curve_fit(fit_functions[map_functions[breed[j]][key]], \n                                    fit_xdata, \n                                    fit_ydata)\n            se = np.sqrt(np.diag(cov))\n            if j == 0:\n                if key == 'time':\n                    fitted_params_thoroughbred[key] = \\\n                        F\"({params[0]:.2f} \\u00B1 {se[0]:.2f}) + \" + \\\n                        F\"( ({params[1]:.2f} \\u00B1 {se[1]:.2f}) \\u00D7 (number of furlongs) )\"\n                elif key == 'speed':\n                    fitted_params_thoroughbred[key] = \\\n                        F\"({params[0]:.2f} \\u00B1 {se[0]:.2f}) + \" + \\\n                        F\"( ({params[1]:.2f} \\u00B1 {se[1]:.2f}) / (number of furlongs) )\"\n                else:\n                    fitted_params_thoroughbred[key] = \\\n                        F\"({params[0]:.2f} \\u00B1 {se[0]:.2f}) + \" + \\\n                        F\"( ({params[1]:.2f} \\u00B1 {se[1]:.2f}) \\u00D7 (number of furlongs) ) + \" + \\\n                        F\"( ({params[2]:.2f} \\u00B1 {se[2]:.2f}) \\u00D7 ( (number of furlongs)^2 ) )\"\n            new_ydata = []\n            for i in [-1, 0, 1]:\n                kargs = {'x': new_xdata}\n                for l in range(len(params)):\n                    if se[l] == float(\"inf\"):\n                        se[l] = 0\n                    kargs[chr(97+l)] = params[l] + i*se[l]\n                new_ydata.append(call_fit(map_functions[breed[j]][key], **kargs))\n            # race data\n            axes[len(axes[j]) - k - 2, j].plot(df['distance (furlongs)'], df[columns[k]], 'o', label='data', color='black')\n            # fit\n            axes[len(axes[j]) - k - 2, j].plot(new_xdata, new_ydata[1], '-', label='fit', color='grey')\n            # errors\n            axes[len(axes[j]) - k - 2, j].fill_between(new_xdata, new_ydata[0], new_ydata[2], alpha=0.2, label='errors', color='grey')\n            if j == 0:\n                axes[len(axes[j]) - k - 2, j].set_ylabel(columns[k], fontsize=14, loc='center')\n            axes[len(axes[j]) - k - 2, j].legend(loc='upper right')\n            axes[len(axes[j]) - k - 2, j].grid(True)\n            if j == 1:\n                axes[len(axes[j]) - k - 2, j].sharey(axes[len(axes[j]) - k - 2, 0])\n            if j == 1:\n                axes[k-1, j].tick_params(axis='y', labelcolor='none', which='both', top=False, bottom=False, left=False, right=False)\n            if j == 1 and k == 1:\n                axes[len(axes[j]) - k - 2, j].set_ylim(0, 290)\n            if j == 1 and k == 2:\n                axes[len(axes[j]) - k - 2, j].set_ylim(14)\n        axes[0, j].set_title(breed[j], fontsize=18, y=1.05)\n        axes[len(axes[j]), j].tick_params(axis='x', labelrotation=90)\n    plt.subplots_adjust(hspace=0, wspace=0)\n    fig.suptitle('World Records', fontsize=24, y=0.95)\n    fig.text(0.5, 0.07, 'distance (furlong)', ha='center', fontsize=14)\n    plt.show()\n    print(F'Fitted mean capabilities for best of breed Thoroughbred horses:')\n    for key in fitted_params_thoroughbred:\n        print(F' > {key}: {fitted_params_thoroughbred[key]}')\n    print()\n    display_markdown('See ***World Record Data*** from **References** chapter.', raw = True)\n","metadata":{"execution":{"iopub.status.busy":"2022-11-10T17:27:34.777315Z","iopub.execute_input":"2022-11-10T17:27:34.777725Z","iopub.status.idle":"2022-11-10T17:27:34.819325Z","shell.execute_reply.started":"2022-11-10T17:27:34.777689Z","shell.execute_reply":"2022-11-10T17:27:34.817903Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Helper for dataset validation against World Record entries (Fig I2)","metadata":{}},{"cell_type":"code","source":"def validation_against_world_records():\n    global workdir\n    df = pd.read_pickle(path.join(workdir, 'df_all_features.pkl'))\n    df1 = pd.DataFrame()\n    df1['distance'] = np.unique(df['distance_id'].to_numpy()/100)\n    df1['time'] = -6.27 + 12.11 * df1['distance']\n    df1['speed'] = 16.84 + 7.1 / df1['distance']\n    df1['acceleration'] = -0.03 + 1.77 / df1['distance'] + 0.52 / (df1['distance'] * df1['distance'])\n\n    fig, axes = plt.subplots(3, 1, figsize=(15, 15), sharex = True)\n\n    # acceleration\n    axes[0].plot(df['distance_id']/100, 2.012*df['distance_id']/(df['race_time']*df['race_time']), '.', label='data', color='black')\n    axes[0].plot(df1['distance'], df1['acceleration'], '-', label='world record', color='grey', alpha=0.2)\n    axes[0].set_ylabel('acceleration (m/$\\mathregular{s^2}$)', fontsize=14, loc='center')\n    axes[0].legend(loc='upper right')\n\n    # speed\n    axes[1].plot(df['distance_id']/100, 2.012*df['distance_id']/df['race_time'], '.', label='data', color='black')\n    axes[1].plot(df1['distance'], df1['speed'], '-', label='world record', color='grey', alpha=0.2)\n    axes[1].set_ylabel('speed (m/s)', fontsize=14, loc='center')\n    axes[1].legend(loc='upper right')\n\n    # time\n    axes[2].plot(df['distance_id']/100, df['race_time'], '.', label='data', color='black')\n    axes[2].plot(df1['distance'], df1['time'], '-', label='world record', color='grey', alpha=0.2)\n    axes[2].set_ylabel('time (s)', fontsize=14, loc='center')\n    axes[2].legend(loc='upper right')\n\n    plt.subplots_adjust(hspace=0, wspace=0)\n    fig.suptitle('Validation against World Records', fontsize=24, y=0.92)\n    fig.text(0.5, 0.07, 'distance (furlong)', ha='center', fontsize=14)\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-11-10T17:28:11.442749Z","iopub.execute_input":"2022-11-10T17:28:11.443426Z","iopub.status.idle":"2022-11-10T17:28:11.463284Z","shell.execute_reply.started":"2022-11-10T17:28:11.443381Z","shell.execute_reply":"2022-11-10T17:28:11.461786Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Helper for visualizing the drag power  (Fig I3)","metadata":{}},{"cell_type":"code","source":"def drag_power():\n    v_min = 4\n    v_max = 18\n    vms = [x/10 for x in range(10*v_min, 10*v_max + 1, 2)]\n    vkh = [3.6*y for y in vms]\n    pkw = [0.645*y*y*y/1000 for y in vms]\n    php = [0.645*y*y*y/745.5 for y in vms]\n    fig, ax11 = plt.subplots()\n\n    ax12 = ax11.twinx()\n    ax22 = ax11.twiny()\n    \n    ax11.plot(vms, pkw, 'black')\n    ax12.plot(vms, php, 'black')\n    ax22.plot(vkh, pkw, 'black')\n\n    ax11.set_xlabel('Speed (m/s)')\n    ax11.set_ylabel('Required Power (kW)')\n    ax12.set_ylabel('Required Power (hp)')\n    ax22.set_xlabel('Speed (km/h)')\n    \n    ax11.grid(True)\n\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-11-10T17:28:43.173603Z","iopub.execute_input":"2022-11-10T17:28:43.174359Z","iopub.status.idle":"2022-11-10T17:28:43.186326Z","shell.execute_reply.started":"2022-11-10T17:28:43.174306Z","shell.execute_reply":"2022-11-10T17:28:43.184629Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Helper for visualizing the positions vs. race stats  (Fig I4)","metadata":{}},{"cell_type":"code","source":"def position_stats():\n    global workdir\n    df = pd.read_pickle(path.join(workdir, 'df_all_features.pkl'))\n    df.reset_index(inplace = True, drop = True)\n    df_mapping_jockey = pd.read_pickle(path.join(workdir, 'mapping', 'df_mapping_jockey.pkl'))\n    plt.rcParams[\"font.size\"] = 12\n    fig, axes = plt.subplots(4, 1, figsize=(24, 16), sharex=True)\n    df_tmp = df.loc[df['race_id'] == 'AQU_2019-01-01_1', ['race_position', 'distance_overall', 'distance_drafting_overall', \n                                                          'speed_average_overall', 'speed_maximum_overall', 'jockey']]\n    df_tmp.sort_values(by=['race_position'], inplace=True, ignore_index=True)\n    df_tmp.reset_index(inplace=True, drop=True)\n    np_jockey = pd.unique(df_tmp['jockey'])\n    # np_trakus_index = np.unique(df_tmp['trakus_index'].to_numpy())\n    colors = ['#ff0000', '#ff8000', '#ffff00', '#80ff00', '#00ff00', '#00ff80', \n              '#00ffff', '#0080ff', '#0000ff', '#8000ff', '#ff00ff', '#ff0080']\n    index = 0\n    max_position = 0\n    min_y = [10000.0 for _ in range(0, len(axes))]\n    max_y = [0.0 for _ in range(0, len(axes))]\n    ylabels = ['Distance (m)', 'Average Speed (m/s)', 'Maximum Speed (m/s)', 'Distance Drafting (m)']\n    for jockey in np_jockey:\n        jockey_name = df_mapping_jockey.loc[df_mapping_jockey['values'] == jockey, 'keys'].iat[0]\n        position = df_tmp.loc[df_tmp['jockey'] == jockey, 'race_position'].iat[0]\n        if position > max_position:\n            max_position = position\n        distance = df_tmp.loc[df_tmp['jockey'] == jockey, 'distance_overall'].iat[0]\n        speed = df_tmp.loc[df_tmp['jockey'] == jockey, 'speed_average_overall'].iat[0]\n        speed_max = df_tmp.loc[df_tmp['jockey'] == jockey, 'speed_maximum_overall'].iat[0]\n        drafting = df_tmp.loc[df_tmp['jockey'] == jockey, 'distance_drafting_overall'].iat[0]\n        for i in range(0, len(axes)):\n            if ylabels[i] == 'Distance (m)':\n                y = distance\n            elif ylabels[i] == 'Average Speed (m/s)':\n                y = speed\n            elif ylabels[i] == 'Maximum Speed (m/s)':\n                y = speed_max\n            else:\n                y = drafting\n            if y > max_y[i]:\n                max_y[i] = y\n            if y < min_y[i]:\n                min_y[i] = y\n            axes[i].bar(position, y, color=colors[index], label=jockey_name)\n        index += 1\n    xrange = [x for x in range(1, max_position + 1)]\n    plt.setp(axes, xticks=xrange, xticklabels=xrange)\n    for i in range(0, len(axes)):\n        axes[i].legend(loc='upper right')\n        axes[i].grid(True)\n        stop = False\n        factor = 1\n        while not stop:\n            step = round((round(factor*max_y[i]) - round(factor*min_y[i]) + 1) / 10)\n            if step < 1:\n                factor *= 10\n            else:\n                stop = True\n        yrange = [round(y/factor, 2) for y in range(round(factor*min_y[i]), round(factor*max_y[i]) + 1, step)]\n        if i == len(axes) - 1:\n            yrange = [round(y/factor, 2) for y in range(round(factor*min_y[i]), round(factor*max_y[i]) + step + 1, step)]\n        axes[i].set_ylim(round(min_y[i], 2) - 1/factor, round(max_y[i], 2) + 1/factor)\n        plt.setp(axes[i], yticks=yrange, yticklabels=yrange)\n        axes[i].set_ylabel(ylabels[i], fontsize=14, loc='center')\n    axes[len(axes) - 1].set_xlabel('Final Position', fontsize=14, loc='center')\n    axes[len(axes) - 1].xaxis.set_label_coords(.95, -.075)\n    \n    plt.subplots_adjust(hspace=0)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T17:43:18.111871Z","iopub.execute_input":"2022-11-10T17:43:18.112344Z","iopub.status.idle":"2022-11-10T17:43:18.138091Z","shell.execute_reply.started":"2022-11-10T17:43:18.112308Z","shell.execute_reply":"2022-11-10T17:43:18.137023Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Helper for visualizing the race stats (Fig I5)","metadata":{}},{"cell_type":"code","source":"def race_stats():\n    global workdir\n    df = pd.read_pickle(path.join(workdir, 'line_up_position', 'df_AQU_2019-01-01_1.pkl'))\n    fig, axes = plt.subplots(6, 1, figsize=(24, 24), sharex=True)\n    df_tmp = df[['trakus_index', \n                 'race_position', \n                 'x_decomp_dist', \n                 'y_decomp_dist', \n                 'x_rel_dist',\n                 'y_rel_dist',\n                 'x_decomp_speed', \n                 'y_decomp_speed', \n                 'd_abs_speed', \n                 'd_rel_dist', \n                 'y_rel_speed', \n                 'jockey', \n                 'race_trakus_index']].copy()\n    df_tmp.sort_values(by=['trakus_index', 'race_position'], inplace=True, ignore_index=True)\n    df_tmp.reset_index(inplace=True, drop=True)\n    np_jockey = pd.unique(df_tmp['jockey'])\n    np_trakus_index = np.unique(df_tmp['trakus_index'].to_numpy())\n    colors = ['#ff0000', '#ff8000', '#ffff00', '#80ff00', '#00ff00', '#00ff80', '#00ffff', '#0080ff', '#0000ff', '#8000ff', '#ff00ff', '#ff0080']\n    index = 0\n    max_gen = [0.0 for _ in range(0, len(axes))]\n    max_y_old = max_gen.copy()\n    max_y = max_gen.copy()\n    min_y_old = max_gen.copy()\n    min_y = max_gen.copy()\n    mean_y = max_gen.copy()\n    std_y = max_gen.copy()\n    columns = ['x_decomp_dist', 'y_decomp_dist', 'x_decomp_speed', 'y_decomp_speed', 'd_abs_speed', 'relative_speed']\n    ylabel = ['Distance Spread Width (m)', 'Distance Spread Length (m)', 'Speed Spread Width (m/s)', 'Speed Spread Length (m/s)', \n              'Speed (m/s)', 'Speed Relative to CM (m/s)']\n    max_trakus_index = df_tmp['race_trakus_index'].min()\n    df_jockey = df_tmp[df_tmp['jockey'] == 'pack'].copy()\n    speed_group = 4*df_jockey.loc[df_jockey['trakus_index'] <= max_trakus_index, 'd_abs_speed'].to_numpy()\n    distances_group = df_jockey.loc[df_jockey['trakus_index'] <= max_trakus_index, 'd_abs_speed'].cumsum().to_numpy()\n    for jockey in np_jockey:\n        if jockey == 'pack':\n            continue\n        df_jockey = df_tmp[(df_tmp['jockey'] == jockey) & (df_tmp['trakus_index'] <= max_trakus_index)].copy()\n        df_jockey = df_jockey.drop(columns=['race_position', 'jockey'])\n        df_jockey.reset_index(inplace=True, drop=True)\n        df_jockey['distance'] = distances_group\n        max_distance = df_jockey['distance'].max()\n        for i in range(0, len(axes)):\n            speed_factor = 1\n            if i > 1:\n                speed_factor = 4\n            if columns[i] == 'relative_speed':\n                df_jockey_column = speed_factor * df_jockey['d_abs_speed']\n                relative_speed = np.subtract(df_jockey_column.to_numpy(), speed_group)\n                axes[i].plot(df_jockey['distance'], relative_speed, color=colors[index], label=jockey)\n                axes[i].axhline(np.sum(relative_speed)/max_trakus_index, color=colors[index], lw=3, alpha=0.5)\n                max_y[i] = np.amax(relative_speed)\n                min_y[i] = np.amin(relative_speed)\n                mean_y[i] += np.mean(relative_speed)\n                std_y[i] += np.std(relative_speed)\n            else:\n                df_jockey_column = speed_factor * df_jockey[columns[i]]\n                axes[i].plot(df_jockey['distance'], df_jockey_column, color=colors[index], label=jockey)\n                max_y[i] = df_jockey_column.max()\n                min_y[i] = df_jockey_column.min()\n                mean_y[i] += df_jockey_column.mean()\n                std_y[i] += df_jockey_column.std()\n            if max_y[i] > max_y_old[i]:\n                max_y_old[i] = max_y[i]\n            if min_y[i] < min_y_old[i]:\n                min_y_old[i] = min_y[i]\n        index += 1\n    step = round(max_distance / 20)\n    xrange = [x for x in range(0, round(max_distance) + 1, step)]\n    plt.setp(axes, xticks=xrange, xticklabels=xrange)\n    alpha = 1.0\n    for i in range(0, len(axes)):\n        axes[i].set_xlim(0, round(max_distance) + 1)\n        axes[i].legend(loc='lower right')\n        axes[i].grid(True)\n        stop = False\n        factor_scale = 0.5\n        factor_std = 4\n        if columns[i] == 'relative_speed':\n            factor_std = 4\n        min_y_new = (mean_y[i] - factor_std*std_y[i])/np_jockey.size\n        max_y_new = (mean_y[i] + factor_std*std_y[i])/np_jockey.size\n        while not stop:\n            step = round((round(factor_scale*max_y_new) - round(factor_scale*min_y_new) + 1) / 10)\n            if step < 1:\n                factor_scale *= 10\n            else:\n                stop = True\n        yrange = [round(y/factor_scale, 2) for y in range(round(factor_scale*min_y_new), round(factor_scale*max_y_new) + 1, step)]\n        axes[i].set_ylim(round(min_y_new, 2) - 1/factor_scale, round(max_y_new, 2) + 1/factor_scale)\n        plt.setp(axes[i], yticks=yrange, yticklabels=yrange)\n        axes[i].set_ylabel(ylabel[i], fontsize=14, loc='center')\n    axes[len(axes)-1].set_xlabel('Distance (m)', fontsize=14, loc='right')\n    axes[len(axes)-1].xaxis.set_label_coords(.95, -.075)\n    \n    plt.subplots_adjust(hspace=0)\n","metadata":{"execution":{"iopub.status.busy":"2022-11-10T17:47:18.226060Z","iopub.execute_input":"2022-11-10T17:47:18.226650Z","iopub.status.idle":"2022-11-10T17:47:18.258378Z","shell.execute_reply.started":"2022-11-10T17:47:18.226607Z","shell.execute_reply":"2022-11-10T17:47:18.257272Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Helper for visualizing all stats based on position (Fig R1, Fig R2, Fig R3, Fig R4, Fig R5)","metadata":{}},{"cell_type":"code","source":"def position_all_stats(include = None):\n    global workdir\n    # load data\n    df = pd.read_pickle(path.join(workdir, 'df_all_features.pkl'))\n    df.reset_index(inplace = True, drop = True)\n    df_mapping_jockey = pd.read_pickle(path.join(workdir, 'mapping', 'df_mapping_jockey.pkl'))\n    # clean data\n    df.reset_index(inplace = True, drop = True)\n    cols_df = list(df.columns)\n    exclude_columns = ['odds', 'post_time']\n    exclude_indexes = ['race_id']\n    exclude_non_tech = ['distance_id', 'run_up_distance', 'purse', 'post_time', 'odds', 'race_time', \n                        'age', 'number_jockeys', 'race_number', 'course_type', 'track_condition', \n                        'race_type', 'sex', 'track_id', 'jockey']\n    excluded_all = [exclude_columns, exclude_indexes, exclude_non_tech]\n    excluded_all = sum(excluded_all, [])\n    selected_columns = list(set(cols_df) ^ set(excluded_all))\n    if include is None:\n        exclude_patterns = ['overall', 'first_20s', 'mid_race', 'final_20s']\n        for pattern in exclude_patterns:\n            selected_columns = [x for x in selected_columns if len(re.findall(Fr'{pattern}', x)) == 0]\n    else:\n        selected_columns = [x for x in selected_columns if len(re.findall(Fr'{include}', x)) > 0]\n        selected_columns.append('race_position')\n    # outside the first three positions, but not the dropouts\n    df.loc[(df['race_position'] >= 4) & (df['race_position'] <= 15), 'race_position'] = 4\n    # dropouts\n    df.loc[df['race_position'] > 15, 'race_position'] = 0\n    # create a technical dataset\n    df_tmp = df[selected_columns].copy()\n    df_tmp.sort_values(by = ['race_position'], inplace = True, ignore_index = True)\n    df_tmp.reset_index(inplace = True, drop = True)\n    imputer = SimpleImputer(missing_values = np.nan, strategy = 'constant', fill_value = 0.0)\n    np_vector = imputer.fit_transform(df_tmp)\n    df_tmp = pd.DataFrame(np_vector, columns = selected_columns, dtype = float)\n    df_tmp.set_index(keys = ['race_position'], inplace = True, drop = True)\n    positions = ['1', '2', '3', '4', '0']\n    ylabels = list(set(selected_columns) ^ {'race_position'})\n    ylabels.sort(reverse = True)\n    colors = ['#ff0000', '#ff8000', '#ffff00', '#80ff00', '#00ff00', '#00ff80', \n              '#00ffff', '#0080ff', '#0000ff', '#8000ff', '#ff00ff', '#ff0080']\n    # set fig parameters\n    plt.rcParams[\"font.size\"] = 8\n    fig, axes = plt.subplots(len(ylabels), 1, figsize=(24, 3 * len(ylabels)), sharex=True)\n    index = 0\n    min_y = [10000.0 for _ in range(0, len(axes))]\n    max_y = [0.0 for _ in range(0, len(axes))]\n    # main loop\n    for position in positions:\n        for i in range(0, len(axes)):\n            y = df_tmp.loc[int(position), ylabels[i]].mean()\n            if y > max_y[i]:\n                max_y[i] = y\n            if y < min_y[i]:\n                min_y[i] = y\n            axes[i].bar(position, y, color=colors[index], label=F'Position {position}')\n        index += 1\n    # plotting cosmetics\n    plt.setp(axes, xticks=positions, xticklabels=positions)\n    for i in range(0, len(axes)):\n        axes[i].legend(loc='upper right')\n        axes[i].grid(True)\n        stop = False\n        factor = 1\n        while not stop:\n            step = round((round(factor*max_y[i]) - round(factor*min_y[i]) + 1) / 10)\n            if step < 1:\n                factor *= 10\n            else:\n                stop = True\n            if max_y[i] == min_y[i]:\n                stop = True\n                max_y[i] = 1.0\n                step = 1\n        yrange = [round(y/factor, 2) for y in range(round(factor*min_y[i]), round(factor*max_y[i]) + 1, step)]\n        if i == len(axes):\n            yrange = [round(y/factor, 2) for y in range(round(factor*min_y[i]), round(factor*(max_y[i]+1)) + step + 1, step)]\n        axes[i].set_ylim(round(min_y[i], 2) - 1/factor, round(max_y[i], 2) + 1/factor)\n        plt.setp(axes[i], yticks=yrange, yticklabels=yrange)\n        axes[i].set_ylabel(ylabels[i], fontsize=10, loc='center')\n    axes[len(axes) - 1].set_xlabel('Final Position', fontsize=10, loc='center')\n    axes[len(axes) - 1].xaxis.set_label_coords(.95, -.075)\n    \n    plt.subplots_adjust(hspace=0)\n","metadata":{"execution":{"iopub.status.busy":"2022-11-10T17:54:15.687409Z","iopub.execute_input":"2022-11-10T17:54:15.688258Z","iopub.status.idle":"2022-11-10T17:54:15.729045Z","shell.execute_reply.started":"2022-11-10T17:54:15.688178Z","shell.execute_reply":"2022-11-10T17:54:15.727256Z"},"trusted":true},"execution_count":null,"outputs":[]}]}