diff --git a/Jenkinsfile_train b/Jenkinsfile_train index 47bf9b6..7d05c39 100644 --- a/Jenkinsfile_train +++ b/Jenkinsfile_train @@ -20,8 +20,14 @@ pipeline { sh "python3 sacred_exp.py" } } + stage("Run MLFlow training"){ + steps { + sh "python3 ml_model.py ${verbose} ${epochs}" + } + } stage('Save trained model files') { steps{ + archiveArtifacts 'movies_on_streaming_platforms_model/**' archiveArtifacts 'sacred_file/**' archiveArtifacts 'linear_regression.h5' } diff --git a/ml_model.py b/ml_model.py new file mode 100644 index 0000000..d8954cf --- /dev/null +++ b/ml_model.py @@ -0,0 +1,54 @@ +import pandas as pd +import numpy as np +import tensorflow as tf +import os.path + +import mlflow +import sys + +from tensorflow import keras +from tensorflow.keras import layers +from tensorflow.keras.layers.experimental import preprocessing + +arguments = sys.argv[1:] + +verbose = int(arguments[0]) +epochs = int(arguments[1]) + + # Wczytanie danych +train_data = pd.read_csv("./MoviesOnStreamingPlatforms_updated.train") +test_data = pd.read_csv("./MoviesOnStreamingPlatforms_updated.test") + +# Stworzenie modelu +columns_to_use = ['Year', 'Runtime', 'Netflix'] +train_X = tf.convert_to_tensor(train_data[columns_to_use]) +train_Y = tf.convert_to_tensor(train_data[["IMDb"]]) + +test_X = tf.convert_to_tensor(test_data[columns_to_use]) +test_Y = tf.convert_to_tensor(test_data[["IMDb"]]) + +normalizer = preprocessing.Normalization(input_shape=[3,]) +normalizer.adapt(train_X) + +model = keras.Sequential([ + keras.Input(shape=(len(columns_to_use),)), + normalizer, + layers.Dense(30, activation='relu'), + layers.Dense(10, activation='relu'), + layers.Dense(25, activation='relu'), + layers.Dense(1) +]) + +model.compile(loss='mean_absolute_error', + optimizer=tf.keras.optimizers.Adam(0.001), + metrics=[tf.keras.metrics.RootMeanSquaredError()]) + +model.fit(train_X, train_Y, verbose=verbose, epochs=epochs) + +signature = mlflow.models.signature.infer_signature(train_X.numpy(), model.predict(train_X.numpy())) +input_data = test_X + +with mlflow.start_run(): + mlflow.keras.save_model(model, "movies_on_streaming_platforms_model", input_example=input_data.numpy(), signature=signature) + + diff --git a/mlruns/0/724dc0d672664057b760fe5f18801036/meta.yaml b/mlruns/0/724dc0d672664057b760fe5f18801036/meta.yaml new file mode 100644 index 0000000..89380dc --- /dev/null +++ b/mlruns/0/724dc0d672664057b760fe5f18801036/meta.yaml @@ -0,0 +1,15 @@ +artifact_uri: file:///Volumes/seagate/ium_434704/mlruns/0/724dc0d672664057b760fe5f18801036/artifacts +end_time: 1621772380826 +entry_point_name: '' +experiment_id: '0' +lifecycle_stage: active +name: '' +run_id: 724dc0d672664057b760fe5f18801036 +run_uuid: 724dc0d672664057b760fe5f18801036 +source_name: '' +source_type: 4 +source_version: '' +start_time: 1621772379167 +status: 3 +tags: [] +user_id: wj diff --git a/mlruns/0/724dc0d672664057b760fe5f18801036/tags/mlflow.source.git.commit b/mlruns/0/724dc0d672664057b760fe5f18801036/tags/mlflow.source.git.commit new file mode 100644 index 0000000..f31c988 --- /dev/null +++ b/mlruns/0/724dc0d672664057b760fe5f18801036/tags/mlflow.source.git.commit @@ -0,0 +1 @@ +b82917a5d90e071de9b67f2b6648be0353c54b62 \ No newline at end of file diff --git a/mlruns/0/724dc0d672664057b760fe5f18801036/tags/mlflow.source.name b/mlruns/0/724dc0d672664057b760fe5f18801036/tags/mlflow.source.name new file mode 100644 index 0000000..87f4742 --- /dev/null +++ b/mlruns/0/724dc0d672664057b760fe5f18801036/tags/mlflow.source.name @@ -0,0 +1 @@ +ml_model.py \ No newline at end of file diff --git a/mlruns/0/724dc0d672664057b760fe5f18801036/tags/mlflow.source.type b/mlruns/0/724dc0d672664057b760fe5f18801036/tags/mlflow.source.type new file mode 100644 index 0000000..0c2c1fe --- /dev/null +++ b/mlruns/0/724dc0d672664057b760fe5f18801036/tags/mlflow.source.type @@ -0,0 +1 @@ +LOCAL \ No newline at end of file diff --git a/mlruns/0/724dc0d672664057b760fe5f18801036/tags/mlflow.user b/mlruns/0/724dc0d672664057b760fe5f18801036/tags/mlflow.user new file mode 100644 index 0000000..1fa4079 --- /dev/null +++ b/mlruns/0/724dc0d672664057b760fe5f18801036/tags/mlflow.user @@ -0,0 +1 @@ +wj \ No newline at end of file diff --git a/movies_on_streaming_platforms_model/MLmodel b/movies_on_streaming_platforms_model/MLmodel new file mode 100644 index 0000000..9a8b98e --- /dev/null +++ b/movies_on_streaming_platforms_model/MLmodel @@ -0,0 +1,20 @@ +flavors: + keras: + data: data + keras_module: tensorflow.keras + keras_version: 2.5.0 + save_format: tf + python_function: + data: data + env: conda.yaml + loader_module: mlflow.keras + python_version: 3.9.1 +saved_input_example_info: + artifact_path: input_example.json + format: tf-serving + type: ndarray +signature: + inputs: '[{"type": "tensor", "tensor-spec": {"dtype": "float64", "shape": [-1, 3]}}]' + outputs: '[{"type": "tensor", "tensor-spec": {"dtype": "float32", "shape": [-1, + 1]}}]' +utc_time_created: '2021-05-23 12:19:39.663838' diff --git a/movies_on_streaming_platforms_model/conda.yaml b/movies_on_streaming_platforms_model/conda.yaml new file mode 100644 index 0000000..17949eb --- /dev/null +++ b/movies_on_streaming_platforms_model/conda.yaml @@ -0,0 +1,10 @@ +channels: +- defaults +- conda-forge +dependencies: +- python=3.9.1 +- pip +- pip: + - mlflow + - tensorflow==2.5.0-rc1 +name: mlflow-env diff --git a/movies_on_streaming_platforms_model/data/keras_module.txt b/movies_on_streaming_platforms_model/data/keras_module.txt new file mode 100644 index 0000000..2c73dfd --- /dev/null +++ b/movies_on_streaming_platforms_model/data/keras_module.txt @@ -0,0 +1 @@ +tensorflow.keras \ No newline at end of file diff --git a/movies_on_streaming_platforms_model/data/model/keras_metadata.pb b/movies_on_streaming_platforms_model/data/model/keras_metadata.pb new file mode 100644 index 0000000..2cd9b0a --- /dev/null +++ b/movies_on_streaming_platforms_model/data/model/keras_metadata.pb @@ -0,0 +1,9 @@ + +,root"_tf_keras_sequential*,{"name": "sequential", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "Sequential", "config": {"name": "sequential", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 3]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_1"}}, {"class_name": "Normalization", "config": {"name": "normalization", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 3]}, "dtype": "float32", "axis": {"class_name": "__tuple__", "items": [-1]}}}, {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 30, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 10, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 25, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_3", "trainable": true, "dtype": "float32", "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}]}, "shared_object_id": 14, "build_input_shape": {"class_name": "TensorShape", "items": [null, 3]}, "is_graph_network": true, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 3]}, "float32", "input_1"]}, "keras_version": "2.5.0", "backend": "tensorflow", "model_config": {"class_name": "Sequential", "config": {"name": "sequential", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 3]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_1"}, "shared_object_id": 0}, {"class_name": "Normalization", "config": {"name": "normalization", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 3]}, "dtype": "float32", "axis": {"class_name": "__tuple__", "items": [-1]}}, "shared_object_id": 1}, {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 30, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 2}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 3}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 4}, {"class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 10, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 5}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 6}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 7}, {"class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 25, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 8}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 9}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 10}, {"class_name": "Dense", "config": {"name": "dense_3", "trainable": true, "dtype": "float32", "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 11}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 12}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 13}]}}, "training_config": {"loss": "mean_absolute_error", "metrics": [[{"class_name": "RootMeanSquaredError", "config": {"name": "root_mean_squared_error", "dtype": "float32"}, "shared_object_id": 15}]], "weighted_metrics": null, "loss_weights": null, "optimizer_config": {"class_name": "Adam", "config": {"name": "Adam", "learning_rate": 0.0010000000474974513, "decay": 0.0, "beta_1": 0.8999999761581421, "beta_2": 0.9990000128746033, "epsilon": 1e-07, "amsgrad": false}}}}2 +root.layer_with_weights-0"_tf_keras_layer*{"name": "normalization", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, 3]}, "stateful": true, "must_restore_from_config": true, "class_name": "Normalization", "config": {"name": "normalization", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 3]}, "dtype": "float32", "axis": {"class_name": "__tuple__", "items": [-1]}}, "shared_object_id": 1, "build_input_shape": [null, 3]}2 +root.layer_with_weights-1"_tf_keras_layer*{"name": "dense", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 30, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 2}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 3}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 4, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 3}}, "shared_object_id": 16}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 3]}}2 +root.layer_with_weights-2"_tf_keras_layer*{"name": "dense_1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 10, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 5}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 6}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 7, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 30}}, "shared_object_id": 17}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 30]}}2 +root.layer_with_weights-3"_tf_keras_layer*{"name": "dense_2", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 25, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 8}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 9}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 10, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 10}}, "shared_object_id": 18}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 10]}}2 +root.layer_with_weights-4"_tf_keras_layer*{"name": "dense_3", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_3", "trainable": true, "dtype": "float32", "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 11}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 12}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 13, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 25}}, "shared_object_id": 19}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 25]}}2 +Jroot.keras_api.metrics.0"_tf_keras_metric*{"class_name": "Mean", "name": "loss", "dtype": "float32", "config": {"name": "loss", "dtype": "float32"}, "shared_object_id": 20}2 +Kroot.keras_api.metrics.1"_tf_keras_metric*{"class_name": "RootMeanSquaredError", "name": "root_mean_squared_error", "dtype": "float32", "config": {"name": "root_mean_squared_error", "dtype": "float32"}, "shared_object_id": 15}2 \ No newline at end of file diff --git a/movies_on_streaming_platforms_model/data/model/saved_model.pb b/movies_on_streaming_platforms_model/data/model/saved_model.pb new file mode 100644 index 0000000..195fa6c Binary files /dev/null and b/movies_on_streaming_platforms_model/data/model/saved_model.pb differ diff --git a/movies_on_streaming_platforms_model/data/model/variables/variables.data-00000-of-00001 b/movies_on_streaming_platforms_model/data/model/variables/variables.data-00000-of-00001 new file mode 100644 index 0000000..4c4d9d5 Binary files /dev/null and b/movies_on_streaming_platforms_model/data/model/variables/variables.data-00000-of-00001 differ diff --git a/movies_on_streaming_platforms_model/data/model/variables/variables.index b/movies_on_streaming_platforms_model/data/model/variables/variables.index new file mode 100644 index 0000000..70e9425 Binary files /dev/null and b/movies_on_streaming_platforms_model/data/model/variables/variables.index differ diff --git a/movies_on_streaming_platforms_model/data/save_format.txt b/movies_on_streaming_platforms_model/data/save_format.txt new file mode 100644 index 0000000..439ab29 --- /dev/null +++ b/movies_on_streaming_platforms_model/data/save_format.txt @@ -0,0 +1 @@ +tf \ No newline at end of file diff --git a/movies_on_streaming_platforms_model/input_example.json b/movies_on_streaming_platforms_model/input_example.json new file mode 100644 index 0000000..64a4e35 --- /dev/null +++ b/movies_on_streaming_platforms_model/input_example.json @@ -0,0 +1 @@ +{"inputs": [[2015.0, 0.3333333333333333, 0.0], [2018.0, 0.4417670682730923, 0.0], [2018.0, 0.3253012048192771, 0.0], [2012.0, 0.3172690763052208, 0.0], [2002.0, 0.3654618473895582, 0.0], [2001.0, 0.4538152610441767, 1.0], [1980.0, 0.3734939759036144, 0.0], [2016.0, 0.4257028112449799, 0.0], [2020.0, 0.3815261044176706, 1.0], [2011.0, 0.3172690763052208, 0.0], [1992.0, 0.4417670682730923, 0.0], [2013.0, 0.3694779116465863, 0.0], [2006.0, 0.3775100401606425, 0.0], [2017.0, 0.2771084337349397, 0.0], [2017.0, 0.3293172690763052, 1.0], [2003.0, 0.3493975903614457, 0.0], [2018.0, 0.5502008032128514, 1.0], [1975.0, 0.4658634538152609, 0.0], [2004.0, 0.3534136546184738, 1.0], [2014.0, 0.3975903614457831, 0.0], [2019.0, 0.3052208835341365, 0.0], [1992.0, 0.3574297188755019, 0.0], [1995.0, 0.4176706827309236, 0.0], [2007.0, 0.570281124497992, 0.0], [2011.0, 0.3815261044176706, 0.0], [2018.0, 0.2891566265060241, 0.0], [2014.0, 0.3654618473895582, 0.0], [1972.0, 0.3734939759036144, 0.0], [2014.0, 0.3654618473895582, 0.0], [2015.0, 0.2971887550200803, 0.0], [2019.0, 0.3574297188755019, 0.0], [2017.0, 0.36144578313253, 1.0], [2018.0, 0.3373493975903614, 0.0], [2017.0, 0.3493975903614457, 1.0], [2017.0, 0.3493975903614457, 0.0], [2010.0, 0.4618473895582329, 1.0], [1998.0, 0.3574297188755019, 1.0], [2019.0, 0.3413654618473895, 1.0], [2011.0, 0.4337349397590361, 1.0], [2017.0, 0.3493975903614457, 0.0], [2014.0, 0.5220883534136546, 1.0], [2007.0, 0.3574297188755019, 0.0], [1995.0, 0.3815261044176706, 0.0], [2016.0, 0.5502008032128514, 1.0], [1992.0, 0.4257028112449799, 1.0], [2019.0, 0.3694779116465863, 0.0], [2000.0, 0.3052208835341365, 0.0], [2014.0, 0.3052208835341365, 0.0], [2017.0, 0.4337349397590361, 0.0], [2001.0, 0.4497991967871486, 1.0], [2012.0, 0.3253012048192771, 1.0], [2015.0, 0.3453815261044176, 0.0], [2014.0, 0.502008032128514, 0.0], [2016.0, 0.3855421686746987, 1.0], [1998.0, 0.4377510040160642, 1.0], [2010.0, 0.4417670682730923, 0.0], [1998.0, 0.285140562248996, 1.0], [2018.0, 0.4216867469879518, 0.0], [1996.0, 0.3132530120481927, 0.0], [1975.0, 0.3855421686746987, 0.0], [2014.0, 0.321285140562249, 1.0], [2010.0, 0.4136546184738955, 1.0], [2019.0, 0.3453815261044176, 1.0], [2015.0, 0.3373493975903614, 0.0], [2017.0, 0.3132530120481927, 0.0], [2017.0, 0.4096385542168674, 0.0], [2010.0, 0.3694779116465863, 1.0], [2003.0, 0.5301204819277108, 0.0], [2013.0, 0.6787148594377509, 1.0], [1984.0, 0.4377510040160642, 0.0], [2016.0, 0.3293172690763052, 0.0], [2018.0, 0.3333333333333333, 0.0], [2016.0, 0.3253012048192771, 0.0], [1995.0, 0.3654618473895582, 0.0], [2000.0, 0.4337349397590361, 0.0], [2009.0, 0.6385542168674698, 1.0], [2008.0, 0.8112449799196786, 1.0], [2004.0, 0.3012048192771084, 1.0], [2018.0, 0.3775100401606425, 0.0], [2013.0, 0.3373493975903614, 0.0], [1974.0, 0.4096385542168674, 0.0], [1985.0, 0.3293172690763052, 0.0], [2008.0, 0.4176706827309236, 0.0], [2016.0, 0.3574297188755019, 0.0], [2018.0, 0.4417670682730923, 0.0], [2009.0, 0.3333333333333333, 0.0], [2016.0, 0.3493975903614457, 0.0], [2012.0, 0.3855421686746987, 1.0], [1983.0, 0.3534136546184738, 0.0], [2019.0, 0.3734939759036144, 0.0], [1970.0, 0.2690763052208835, 0.0], [1989.0, 0.4658634538152609, 1.0], [2018.0, 0.5542168674698794, 1.0], [1998.0, 0.4337349397590361, 0.0], [2017.0, 0.5140562248995983, 0.0], [2002.0, 0.3534136546184738, 0.0], [1986.0, 0.3815261044176706, 0.0], [1993.0, 0.3694779116465863, 0.0], [1998.0, 0.2891566265060241, 0.0], [2015.0, 0.3534136546184738, 1.0], [2016.0, 0.4779116465863453, 0.0], [2002.0, 0.5582329317269076, 0.0], [2014.0, 0.3253012048192771, 0.0], [2016.0, 0.5461847389558232, 0.0], [1978.0, 0.3775100401606425, 0.0], [2019.0, 0.393574297188755, 0.0], [2009.0, 0.5060240963855421, 1.0], [2008.0, 0.3734939759036144, 0.0], [1999.0, 0.4257028112449799, 0.0], [1997.0, 0.4056224899598393, 0.0], [2006.0, 0.4979919678714859, 0.0], [2006.0, 0.4257028112449799, 0.0], [2018.0, 0.4457831325301204, 0.0], [2015.0, 0.3092369477911646, 0.0], [2016.0, 0.3333333333333333, 0.0], [1969.0, 0.3493975903614457, 0.0], [2006.0, 0.3815261044176706, 1.0], [2015.0, 0.3172690763052208, 0.0], [1962.0, 0.4176706827309236, 0.0], [2012.0, 0.3373493975903614, 0.0], [1978.0, 0.3373493975903614, 0.0], [2017.0, 0.3775100401606425, 1.0], [2017.0, 0.2730923694779116, 0.0], [1995.0, 0.4016064257028112, 0.0], [2012.0, 0.36144578313253, 0.0], [2012.0, 0.3574297188755019, 1.0], [1990.0, 0.429718875502008, 1.0], [2009.0, 0.3012048192771084, 0.0], [2018.0, 0.5140562248995983, 0.0], [2013.0, 0.2811244979919678, 0.0], [2013.0, 0.36144578313253, 0.0], [2014.0, 0.4096385542168674, 1.0], [2015.0, 0.3694779116465863, 0.0], [1993.0, 0.3293172690763052, 0.0], [1985.0, 0.3333333333333333, 0.0], [1987.0, 0.3654618473895582, 0.0], [2013.0, 0.3333333333333333, 0.0], [2001.0, 0.3253012048192771, 0.0], [1980.0, 0.2971887550200803, 0.0], [2019.0, 0.393574297188755, 0.0], [2015.0, 0.3574297188755019, 0.0], [2014.0, 0.4457831325301204, 1.0], [1981.0, 0.3534136546184738, 1.0], [2011.0, 0.3253012048192771, 0.0], [2014.0, 0.4377510040160642, 0.0], [2005.0, 0.3493975903614457, 0.0], [1972.0, 0.3574297188755019, 0.0], [2004.0, 0.3574297188755019, 1.0], [2004.0, 0.3975903614457831, 0.0], [2010.0, 0.3453815261044176, 0.0], [1984.0, 0.3333333333333333, 0.0], [2010.0, 0.4899598393574297, 0.0], [1985.0, 0.3172690763052208, 0.0], [2010.0, 0.4377510040160642, 1.0], [2001.0, 0.3052208835341365, 0.0], [2014.0, 0.3574297188755019, 0.0], [2014.0, 0.2891566265060241, 1.0], [2005.0, 0.2811244979919678, 1.0], [1982.0, 0.3373493975903614, 0.0], [2018.0, 0.3373493975903614, 1.0], [2016.0, 0.3132530120481927, 0.0], [2019.0, 0.3333333333333333, 0.0], [2014.0, 0.3293172690763052, 1.0], [2013.0, 0.3012048192771084, 1.0], [1972.0, 0.3815261044176706, 0.0], [1987.0, 0.3253012048192771, 0.0], [2014.0, 0.2650602409638554, 0.0], [2018.0, 0.3975903614457831, 1.0], [2005.0, 0.3975903614457831, 0.0], [1982.0, 0.4216867469879518, 1.0], [1986.0, 0.2971887550200803, 0.0], [1985.0, 0.502008032128514, 0.0], [2007.0, 0.3493975903614457, 0.0], [2017.0, 0.4497991967871486, 0.0], [1995.0, 0.3373493975903614, 0.0], [2001.0, 0.3373493975903614, 0.0], [2009.0, 0.3132530120481927, 0.0], [2013.0, 0.3493975903614457, 0.0], [2017.0, 0.285140562248996, 1.0], [2014.0, 0.4337349397590361, 0.0], [2011.0, 0.4337349397590361, 0.0], [2008.0, 0.3574297188755019, 0.0], [2017.0, 0.4216867469879518, 1.0], [1996.0, 0.393574297188755, 0.0], [2016.0, 0.3815261044176706, 0.0], [2018.0, 0.3493975903614457, 1.0], [2012.0, 0.5622489959839357, 1.0], [2017.0, 0.4016064257028112, 0.0], [2002.0, 0.2891566265060241, 0.0], [1976.0, 0.3855421686746987, 0.0], [1996.0, 0.4497991967871486, 0.0], [2009.0, 0.2971887550200803, 0.0], [2012.0, 0.2771084337349397, 0.0], [1981.0, 0.3534136546184738, 0.0], [2006.0, 0.3293172690763052, 0.0], [2014.0, 0.3734939759036144, 0.0], [2006.0, 0.5622489959839357, 0.0], [2018.0, 0.3493975903614457, 0.0], [1984.0, 0.3333333333333333, 0.0], [1990.0, 0.3895582329317268, 0.0], [2001.0, 0.3172690763052208, 0.0], [1999.0, 0.3975903614457831, 1.0], [1971.0, 0.3413654618473895, 0.0], [2014.0, 0.3574297188755019, 0.0], [2009.0, 0.36144578313253, 0.0], [1977.0, 0.3855421686746987, 0.0], [2011.0, 0.3775100401606425, 0.0], [2017.0, 0.3253012048192771, 0.0], [2010.0, 0.3975903614457831, 0.0], [1996.0, 0.3574297188755019, 1.0], [2017.0, 0.3172690763052208, 0.0], [2015.0, 0.3132530120481927, 0.0], [2013.0, 0.3534136546184738, 1.0], [2011.0, 0.3373493975903614, 0.0], [2014.0, 0.4016064257028112, 1.0], [2010.0, 0.3172690763052208, 0.0], [2000.0, 0.3975903614457831, 0.0], [2004.0, 0.3815261044176706, 0.0], [2014.0, 0.3574297188755019, 0.0], [2011.0, 0.3293172690763052, 1.0], [2014.0, 0.3815261044176706, 1.0], [2017.0, 0.3333333333333333, 1.0], [2017.0, 0.3052208835341365, 1.0], [2016.0, 0.4377510040160642, 0.0], [1981.0, 0.2570281124497992, 0.0], [2006.0, 0.2730923694779116, 0.0], [2009.0, 0.4738955823293173, 1.0], [1979.0, 0.2690763052208835, 1.0], [1989.0, 0.2891566265060241, 0.0], [2014.0, 0.3132530120481927, 1.0], [2008.0, 0.2891566265060241, 0.0], [1981.0, 0.3895582329317268, 0.0], [2012.0, 0.4859437751004015, 0.0], [2005.0, 0.2449799196787148, 1.0], [2018.0, 0.3895582329317268, 0.0], [1994.0, 0.4337349397590361, 0.0], [2002.0, 0.3734939759036144, 0.0], [2011.0, 0.321285140562249, 1.0], [1997.0, 0.4176706827309236, 1.0], [1961.0, 0.2730923694779116, 0.0], [2018.0, 0.3534136546184738, 1.0], [2010.0, 0.3333333333333333, 0.0], [2016.0, 0.4056224899598393, 1.0], [2018.0, 0.4899598393574297, 1.0], [2014.0, 0.321285140562249, 0.0], [1995.0, 0.36144578313253, 1.0], [2018.0, 0.3333333333333333, 1.0], [2018.0, 0.36144578313253, 0.0], [1976.0, 0.3172690763052208, 0.0], [2018.0, 0.3855421686746987, 0.0], [1955.0, 0.3815261044176706, 0.0], [2009.0, 0.4176706827309236, 1.0], [2010.0, 0.3253012048192771, 0.0], [2007.0, 0.3574297188755019, 0.0], [1996.0, 0.3293172690763052, 0.0], [2017.0, 0.4979919678714859, 1.0], [2009.0, 0.393574297188755, 0.0], [2013.0, 0.3333333333333333, 0.0], [2014.0, 0.4538152610441767, 0.0], [2012.0, 0.3172690763052208, 1.0], [2019.0, 0.3413654618473895, 1.0], [2011.0, 0.3855421686746987, 0.0], [2007.0, 0.3092369477911646, 1.0], [2011.0, 0.3654618473895582, 0.0], [2002.0, 0.3453815261044176, 0.0], [2017.0, 0.5301204819277108, 0.0], [2006.0, 0.4136546184738955, 0.0], [2013.0, 0.4497991967871486, 1.0], [2001.0, 0.4016064257028112, 0.0], [2004.0, 0.3534136546184738, 0.0], [2017.0, 0.36144578313253, 1.0], [2008.0, 0.4497991967871486, 1.0], [2000.0, 0.2811244979919678, 1.0], [2017.0, 0.0441767068273092, 0.0], [2014.0, 0.4979919678714859, 0.0], [2017.0, 0.3172690763052208, 1.0], [2013.0, 0.3253012048192771, 0.0], [2002.0, 0.2610441767068273, 0.0], [2017.0, 0.3333333333333333, 1.0], [2012.0, 0.5301204819277108, 0.0], [1984.0, 0.3815261044176706, 0.0], [1995.0, 0.3172690763052208, 0.0], [2016.0, 0.4899598393574297, 1.0], [2008.0, 0.4136546184738955, 0.0], [2010.0, 0.3855421686746987, 0.0], [2016.0, 0.3333333333333333, 1.0], [2009.0, 0.3092369477911646, 0.0], [2012.0, 0.4417670682730923, 0.0], [2008.0, 0.6224899598393574, 1.0], [1987.0, 0.3012048192771084, 0.0], [2008.0, 0.3975903614457831, 1.0], [1985.0, 0.393574297188755, 0.0], [1986.0, 0.3775100401606425, 0.0], [2007.0, 0.3534136546184738, 0.0], [2017.0, 0.3975903614457831, 0.0], [1959.0, 0.3293172690763052, 0.0], [2005.0, 0.3975903614457831, 0.0], [2012.0, 0.3815261044176706, 0.0], [2006.0, 0.4377510040160642, 0.0], [1996.0, 0.4337349397590361, 0.0], [2016.0, 0.3253012048192771, 1.0], [2015.0, 0.3855421686746987, 0.0], [2004.0, 0.7269076305220883, 0.0], [2011.0, 0.2771084337349397, 1.0], [2003.0, 0.36144578313253, 0.0], [2014.0, 0.3333333333333333, 0.0], [2013.0, 0.3694779116465863, 0.0], [1985.0, 0.5100401606425702, 0.0], [2018.0, 0.3654618473895582, 1.0], [1971.0, 0.321285140562249, 0.0], [2000.0, 0.3012048192771084, 0.0], [2017.0, 0.393574297188755, 0.0], [1974.0, 0.4779116465863453, 0.0], [2018.0, 0.3895582329317268, 0.0], [2010.0, 0.3574297188755019, 0.0], [2018.0, 0.4216867469879518, 1.0], [2009.0, 0.3172690763052208, 0.0], [2008.0, 0.3172690763052208, 0.0], [2008.0, 0.3413654618473895, 1.0], [2017.0, 0.321285140562249, 0.0], [2015.0, 0.3815261044176706, 1.0], [1979.0, 0.3453815261044176, 0.0], [2012.0, 0.3373493975903614, 0.0], [1985.0, 0.4216867469879518, 0.0], [2005.0, 0.3373493975903614, 0.0], [2009.0, 0.429718875502008, 0.0], [2015.0, 0.3895582329317268, 1.0], [2016.0, 0.2891566265060241, 1.0], [2013.0, 0.321285140562249, 0.0], [2017.0, 0.4698795180722891, 0.0], [1992.0, 0.4979919678714859, 0.0]]} \ No newline at end of file