├── .gitignore ├── LICENSE ├── README.md └── samples ├── python ├── code │ ├── iris │ │ ├── iris_score.py │ │ ├── iris_train.py │ │ ├── model.pkl │ │ └── readme.md │ └── newsgroup │ │ ├── conda_dependencies.yml │ │ ├── data │ │ ├── 20news-bydate_py3.pkz │ │ ├── conda_dependencies.yml │ │ ├── data │ │ │ └── 20news-bydate_py3.pkz │ │ ├── model.pkl │ │ ├── pythonclient.py │ │ ├── schema.json │ │ ├── score.py │ │ └── train.py │ │ ├── model.pkl │ │ ├── pythonclient.py │ │ ├── schema.json │ │ ├── score.py │ │ └── train.py └── tutorials │ └── realtime │ └── digit_classification.ipynb └── spark └── tutorials ├── datasets └── housing.csv └── realtime └── realtimewebservices.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .coverage.* 42 | .cache 43 | nosetests.xml 44 | coverage.xml 45 | *,cover 46 | .hypothesis/ 47 | 48 | # Translations 49 | *.mo 50 | *.pot 51 | 52 | # Django stuff: 53 | *.log 54 | local_settings.py 55 | 56 | # Flask stuff: 57 | instance/ 58 | .webassets-cache 59 | 60 | # Scrapy stuff: 61 | .scrapy 62 | 63 | # Sphinx documentation 64 | docs/_build/ 65 | 66 | # PyBuilder 67 | target/ 68 | 69 | # IPython Notebook 70 | .ipynb_checkpoints 71 | 72 | # pyenv 73 | .python-version 74 | 75 | # celery beat schedule file 76 | celerybeat-schedule 77 | 78 | # dotenv 79 | .env 80 | 81 | # virtualenv 82 | venv/ 83 | ENV/ 84 | 85 | # Spyder project settings 86 | .spyderproject 87 | 88 | # Rope project settings 89 | .ropeproject 90 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 ritwik20 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > **NOTE** This content is no longer maintained. Visit the [Azure Machine Learning Notebook](https://github.com/Azure/MachineLearningNotebooks) project for sample Jupyter notebooks for ML and deep learning with Azure Machine Learning. 2 | -------------------------------------------------------------------------------- /samples/python/code/iris/iris_score.py: -------------------------------------------------------------------------------- 1 | # This script generates the schema file 2 | # and holds the init and run functions needed to 3 | # operationalize the Iris Classification sample 4 | # Prepare the web service definition by authoring 5 | # init() and run() functions. Test the functions 6 | # before deploying the web service. 7 | def init(): 8 | from sklearn.externals import joblib 9 | 10 | # load the model file 11 | global model 12 | model = joblib.load('model.pkl') 13 | 14 | def run(input_df): 15 | import json 16 | 17 | pred = model.predict(input_df) 18 | return json.dumps(str(pred[0])) 19 | 20 | def main(): 21 | from azureml.api.schema.dataTypes import DataTypes 22 | from azureml.api.schema.sampleDefinition import SampleDefinition 23 | from azureml.api.realtime.services import generate_schema 24 | import pandas 25 | 26 | df = pandas.DataFrame(data=[[3.0, 3.6, 1.3, 0.25]], columns=['sepal length', 'sepal width','petal length','petal width']) 27 | 28 | # Test the functions' output 29 | init() 30 | input1 = pandas.DataFrame([[3.0, 3.6, 1.3, 0.25]]) 31 | print("Result: " + run(input1)) 32 | 33 | inputs = {"input_df": SampleDefinition(DataTypes.PANDAS, df)} 34 | # The prepare statement writes the scoring file (main.py) and 35 | # the schema file (service_schema.json) the the output folder. 36 | generate_schema(run_func=run, inputs=inputs, filepath='service_schema.json') 37 | print("Schema generated") 38 | 39 | if __name__ == "__main__": 40 | main() 41 | -------------------------------------------------------------------------------- /samples/python/code/iris/iris_train.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | import sys 3 | 4 | from sklearn.datasets import load_iris 5 | from sklearn.linear_model import LogisticRegression 6 | 7 | print('Python version: {}'.format(sys.version)) 8 | 9 | # load Iris dataset 10 | iris = load_iris() 11 | print ('Iris dataset shape: {}'.format(iris.data.shape)) 12 | 13 | # load features and labels 14 | X, Y = iris.data, iris.target 15 | 16 | # change regularization rate and you will likely get a different accuracy. 17 | reg = 0.01 18 | 19 | print("Regularization rate is {}".format(reg)) 20 | 21 | # train a logistic regression model 22 | clf1 = LogisticRegression(C=1/reg).fit(X, Y) 23 | print(clf1) 24 | 25 | accuracy = clf1.score(X, Y) 26 | print("Accuracy is {}".format(accuracy)) 27 | 28 | # serialize the model on disk in the special 'outputs' folder 29 | print("Export the model to model.pkl") 30 | f = open('model.pkl', 'wb') 31 | pickle.dump(clf1, f) 32 | f.close() 33 | 34 | # load the model back into memory 35 | print("Import the model from model.pkl") 36 | f2 = open('model.pkl', 'rb') 37 | clf2 = pickle.load(f2) 38 | 39 | # predict a new sample 40 | X_new = [[3.0, 3.6, 1.3, 0.25]] 41 | print ('New sample: {}'.format(X_new)) 42 | pred = clf2.predict(X_new) 43 | print('Predicted class is {}'.format(pred)) 44 | -------------------------------------------------------------------------------- /samples/python/code/iris/model.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/Machine-Learning-Operationalization/587796b8ebf9fa1077a6f2e1f76a942e1f454c79/samples/python/code/iris/model.pkl -------------------------------------------------------------------------------- /samples/python/code/iris/readme.md: -------------------------------------------------------------------------------- 1 | 2 | # Iris sample 3 | 4 | This sample demonstrates how to train and save a model and deploy it as a web service on your local machine. 5 | The model is created using the [Iris dataset](http://scikit-learn.org/stable/auto_examples/datasets/plot_iris_dataset.html). 6 | 7 | Steps: 8 | 9 | 1. Set up your environment 10 | 2. Train and save the model 11 | 3. Generate the schema 12 | 4. Create web service 13 | 5. Run web service 14 | 15 | ## Set up your environment 16 | 17 | The steps in the sample are intended to be performed on a machine running Windows 10. 18 | 19 | To setup your environment for operationalization your local machine, see [Installing the operationalization stack on Windows 10 or Windows Server](https://github.com/Azure/Machine-Learning-Operationalization/blob/master/documentation/install-on-windows.md). 20 | 21 | ### Set up the machine learning operationalization environment 22 | 23 | At the command line enter the following to create a local operationalization environment. 24 | 25 | ``` 26 | az ml env setup -n -l 27 | ``` 28 | 29 | ## Use python to train and save the model 30 | 31 | From the sample folder, download the ```iris_train.py``` training file. 32 | Change to your projects folder and train the model by entering the following command. 33 | ``` 34 | python iris_train.py 35 | ``` 36 | ## Generate the schema 37 | Run the iris_score.py file using the Python command to create a schema file service_schema.json: 38 | 39 | ``` 40 | python iris_score.py 41 | ``` 42 | 43 | ## Create the web service 44 | 45 | Next, download the iris_scory.py scoring file. 46 | Enter the following command to create the web service on your local machine. 47 | ``` 48 | az ml service create realtime -f iris_score.py --model-file model.pkl -s service_schema.json -n irisservice1 -r python 49 | ``` 50 | ## Run the service 51 | 52 | ``` 53 | az ml service run realtime -i -d "{\"input_df\": [{\"sepal length\": 3.0, \"sepal width\": 3.6, \"petal width\": 1.3, \"petal length\":0.25}]}" 54 | ``` 55 | 56 | If you encounter difficulties, see the [Troubleshooting Guide](https://github.com/Azure/Machine-Learning-Operationalization/blob/master/documentation/troubleshooting.md). 57 | -------------------------------------------------------------------------------- /samples/python/code/newsgroup/conda_dependencies.yml: -------------------------------------------------------------------------------- 1 | dependencies: 2 | - scikit-learn 3 | -------------------------------------------------------------------------------- /samples/python/code/newsgroup/data/20news-bydate_py3.pkz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/Machine-Learning-Operationalization/587796b8ebf9fa1077a6f2e1f76a942e1f454c79/samples/python/code/newsgroup/data/20news-bydate_py3.pkz -------------------------------------------------------------------------------- /samples/python/code/newsgroup/data/conda_dependencies.yml: -------------------------------------------------------------------------------- 1 | dependencies: 2 | - scikit-learn 3 | -------------------------------------------------------------------------------- /samples/python/code/newsgroup/data/data/20news-bydate_py3.pkz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/Machine-Learning-Operationalization/587796b8ebf9fa1077a6f2e1f76a942e1f454c79/samples/python/code/newsgroup/data/data/20news-bydate_py3.pkz -------------------------------------------------------------------------------- /samples/python/code/newsgroup/data/model.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/Machine-Learning-Operationalization/587796b8ebf9fa1077a6f2e1f76a942e1f454c79/samples/python/code/newsgroup/data/model.pkl -------------------------------------------------------------------------------- /samples/python/code/newsgroup/data/pythonclient.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import json 3 | 4 | data = "{\"doc_text\": \"OpenGL on the GPU is fast\"}" 5 | body = str.encode(json.dumps(data)) 6 | 7 | url = 'http://127.0.0.1:32769/score' 8 | headers = {'Content-Type':'application/json'} 9 | 10 | resp = requests.post(url, data, headers=headers) 11 | print(resp.text) -------------------------------------------------------------------------------- /samples/python/code/newsgroup/data/schema.json: -------------------------------------------------------------------------------- 1 | {"input": {"doc_text": {"internal": "gANjYXp1cmVtbC5hcGkuc2NoZW1hLnB5dGhvblV0aWwKUHl0aG9uU2NoZW1hCnEAKYFxAX1xAlgJAAAAZGF0YV90eXBlcQNjYnVpbHRpbnMKc3RyCnEEc2Iu", "swagger": {"type": "string", "example": "SUVs are very popular"}, "type": 0}}} -------------------------------------------------------------------------------- /samples/python/code/newsgroup/data/score.py: -------------------------------------------------------------------------------- 1 | # Score.py file 2 | # Must be included when deploying the model using the Azure ML CLIs 3 | # Requires init and run functions to be defined. 4 | # Run this file "python score.py" to generate a schema for the web service 5 | 6 | def init(): 7 | from sklearn.externals import joblib 8 | # load the saved model file 9 | global model 10 | model = joblib.load('model.pkl') 11 | 12 | def run(doc_text): 13 | #Load the library 14 | from sklearn.datasets import fetch_20newsgroups 15 | 16 | #Load the same categories as used in training sample 17 | categories = ['comp.graphics', 'rec.autos','sci.med', 'misc.forsale'] 18 | #Load the newsgroups from data folder 19 | twenty_train = fetch_20newsgroups(data_home='./data',subset='train',categories=categories, shuffle=True, random_state=42) 20 | 21 | doc_input = [doc_text] 22 | predicted_category = '' 23 | 24 | #Get prediction using the loaded model 25 | predicted = model.predict(doc_input) 26 | 27 | #Get the category 28 | for doc, category in zip(doc_input, predicted): 29 | predicted_category = twenty_train.target_names[category] 30 | 31 | # Return the result 32 | return predicted_category 33 | 34 | def main(): 35 | # Load the Azure ML libraries to generate a schema 36 | from azureml.api.schema.dataTypes import DataTypes 37 | from azureml.api.schema.sampleDefinition import SampleDefinition 38 | from azureml.api.realtime.services import generate_schema 39 | 40 | # Test the init and run functions using test data 41 | test_doc_text = "OpenGL on the GPU is fast" 42 | init() 43 | category = run(test_doc_text) 44 | print(category) 45 | 46 | # Generate the schema file (schema.json) 47 | inputs = {"doc_text": SampleDefinition(DataTypes.STANDARD, test_doc_text)} 48 | generate_schema(run_func=run, inputs=inputs, filepath='schema.json') 49 | 50 | if __name__ == "__main__": 51 | main() -------------------------------------------------------------------------------- /samples/python/code/newsgroup/data/train.py: -------------------------------------------------------------------------------- 1 | # Training file based on the scikit learn example: Working With Text Data 2 | # http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html#loading-the-20-newsgroups-dataset 3 | 4 | from sklearn.naive_bayes import MultinomialNB 5 | from sklearn.datasets import fetch_20newsgroups 6 | from sklearn.feature_extraction.text import CountVectorizer 7 | from sklearn.feature_extraction.text import TfidfTransformer 8 | from sklearn.pipeline import Pipeline 9 | import pickle 10 | 11 | categories = ['comp.graphics', 'rec.autos','sci.med', 'misc.forsale'] 12 | twenty_train = fetch_20newsgroups(data_home='./data',subset='train',categories=categories, shuffle=True, random_state=42) 13 | 14 | count_vect = CountVectorizer() 15 | X_train_counts = count_vect.fit_transform(twenty_train.data) 16 | 17 | text_clf = Pipeline([('vect', CountVectorizer()), 18 | ('tfidf', TfidfTransformer()), 19 | ('clf', MultinomialNB()), 20 | ]) 21 | 22 | text_clf.fit(twenty_train.data, twenty_train.target) 23 | 24 | import numpy as np 25 | twenty_test = fetch_20newsgroups(subset='test',categories=categories, shuffle=True, random_state=42) 26 | docs_test = twenty_test.data 27 | predicted = text_clf.predict(docs_test) 28 | np.mean(predicted == twenty_test.target) 29 | 30 | #Save the model to file 31 | print("Export the model to model.pkl") 32 | f = open('model.pkl', 'wb') 33 | pickle.dump(text_clf, f) 34 | f.close() 35 | 36 | docs_new = ["GPU is faster than CPU"] 37 | predicted = text_clf.predict(docs_test) 38 | for doc, category in zip(docs_new, predicted): 39 | print('%r => %s' % (doc, twenty_train.target_names[category])) -------------------------------------------------------------------------------- /samples/python/code/newsgroup/model.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/Machine-Learning-Operationalization/587796b8ebf9fa1077a6f2e1f76a942e1f454c79/samples/python/code/newsgroup/model.pkl -------------------------------------------------------------------------------- /samples/python/code/newsgroup/pythonclient.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import json 3 | 4 | data = "{\"doc_text\": \"OpenGL on the GPU is fast\"}" 5 | body = str.encode(json.dumps(data)) 6 | 7 | url = 'http://127.0.0.1:32769/score' 8 | api_key = 'your service key'   9 | headers = {'Content-Type':'application/json', 'Authorization':('Bearer '+ api_key)}  10 | 11 | resp = requests.post(url, data, headers=headers) 12 | print(resp.text) 13 | -------------------------------------------------------------------------------- /samples/python/code/newsgroup/schema.json: -------------------------------------------------------------------------------- 1 | {"input": {"doc_text": {"internal": "gANjYXp1cmVtbC5hcGkuc2NoZW1hLnB5dGhvblV0aWwKUHl0aG9uU2NoZW1hCnEAKYFxAX1xAlgJAAAAZGF0YV90eXBlcQNjYnVpbHRpbnMKc3RyCnEEc2Iu", "swagger": {"type": "string", "example": "SUVs are very popular"}, "type": 0}}} -------------------------------------------------------------------------------- /samples/python/code/newsgroup/score.py: -------------------------------------------------------------------------------- 1 | # Score.py file 2 | # Must be included when deploying the model using the Azure ML CLIs 3 | # Requires init and run functions to be defined. 4 | # Run this file "python score.py" to generate a schema for the web service 5 | 6 | def init(): 7 | from sklearn.externals import joblib 8 | # load the saved model file 9 | global model 10 | model = joblib.load('model.pkl') 11 | 12 | def run(doc_text): 13 | #Load the library 14 | from sklearn.datasets import fetch_20newsgroups 15 | 16 | #Load the same categories as used in training sample 17 | categories = ['comp.graphics', 'rec.autos','sci.med', 'misc.forsale'] 18 | #Load the newsgroups from data folder 19 | twenty_train = fetch_20newsgroups(data_home='./data',subset='train',categories=categories, shuffle=True, random_state=42) 20 | 21 | doc_input = [doc_text] 22 | predicted_category = '' 23 | 24 | #Get prediction using the loaded model 25 | predicted = model.predict(doc_input) 26 | 27 | #Get the category 28 | for doc, category in zip(doc_input, predicted): 29 | predicted_category = twenty_train.target_names[category] 30 | 31 | # Return the result 32 | return predicted_category 33 | 34 | def main(): 35 | # Load the Azure ML libraries to generate a schema 36 | from azureml.api.schema.dataTypes import DataTypes 37 | from azureml.api.schema.sampleDefinition import SampleDefinition 38 | from azureml.api.realtime.services import generate_schema 39 | 40 | # Test the init and run functions using test data 41 | test_doc_text = "SUVs are very popular" 42 | init() 43 | category = run(test_doc_text) 44 | print(category) 45 | 46 | # Generate the schema file (schema.json) 47 | inputs = {"doc_text": SampleDefinition(DataTypes.STANDARD, test_doc_text)} 48 | generate_schema(run_func=run, inputs=inputs, filepath='./outputs/schema.json') 49 | 50 | if __name__ == "__main__": 51 | main() 52 | -------------------------------------------------------------------------------- /samples/python/code/newsgroup/train.py: -------------------------------------------------------------------------------- 1 | # Training file based on the scikit learn example: Working With Text Data 2 | # http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html#loading-the-20-newsgroups-dataset 3 | 4 | from sklearn.naive_bayes import MultinomialNB 5 | from sklearn.datasets import fetch_20newsgroups 6 | from sklearn.feature_extraction.text import CountVectorizer 7 | from sklearn.feature_extraction.text import TfidfTransformer 8 | from sklearn.pipeline import Pipeline 9 | import pickle 10 | 11 | categories = ['comp.graphics', 'rec.autos','sci.med', 'misc.forsale'] 12 | #Running this will copy the file to the home directory. Will take a couple of minuts to download the first time. 13 | twenty_train = fetch_20newsgroups(data_home='./data',subset='train',categories=categories, shuffle=True, random_state=42) 14 | 15 | count_vect = CountVectorizer() 16 | X_train_counts = count_vect.fit_transform(twenty_train.data) 17 | 18 | text_clf = Pipeline([('vect', CountVectorizer()), 19 | ('tfidf', TfidfTransformer()), 20 | ('clf', MultinomialNB()), 21 | ]) 22 | 23 | text_clf.fit(twenty_train.data, twenty_train.target) 24 | 25 | import numpy as np 26 | twenty_test = fetch_20newsgroups(subset='test',categories=categories, shuffle=True, random_state=42) 27 | docs_test = twenty_test.data 28 | predicted = text_clf.predict(docs_test) 29 | np.mean(predicted == twenty_test.target) 30 | 31 | #Save the model to file 32 | print("Export the model to model.pkl") 33 | f = open('./outputs/model.pkl', 'wb') 34 | pickle.dump(text_clf, f) 35 | f.close() 36 | 37 | docs_new = ["SUVs are very popular"] 38 | predicted = text_clf.predict(docs_test) 39 | for doc, category in zip(docs_new, predicted): 40 | print('%r => %s' % (doc, twenty_train.target_names[category])) -------------------------------------------------------------------------------- /samples/python/tutorials/realtime/digit_classification.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "deletable": true, 7 | "editable": true 8 | }, 9 | "source": [ 10 | "# Building your first AzureML web service using Python \n", 11 | "\n", 12 | "This tutorial demonstrates how to deploy a machine learning model built using Python and scikit-learn. \n", 13 | "\n", 14 | "The tutorial uses the digits dataset that is part of the [scikit-learn distribution](http://scikit-learn.org/stable/tutorial/basic/tutorial.html).\n", 15 | "\n", 16 | "In the tutorial, you will load a dataset, train a model on the dataset, and then publish a\n", 17 | "realtime scoring API for the model.\n", 18 | "\n", 19 | "To complete this tutorial:\n", 20 | "\n", 21 | "* Sign in to your DSVM.\n", 22 | "* Copy this notebook to a folder on the DSVM.\n", 23 | "* In a browser, open https://<your dsvm ip address>:<port> and sign into the Jupyter server.\n", 24 | " * On a Linux DSVM the port is typically 8000\n", 25 | " * On a Windows DSVM the port is typically 9999\n", 26 | "* In Jupyter, navigate to the folder and open the notebook.\n" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 47, 32 | "metadata": { 33 | "collapsed": true, 34 | "deletable": true, 35 | "editable": true 36 | }, 37 | "outputs": [], 38 | "source": [ 39 | "# Import Azure ML API SDK. The SDK is installed implicitly with the latest\n", 40 | "# version of the CLI in your default python environment\n", 41 | "from azureml.api.schema.dataTypes import DataTypes\n", 42 | "from azureml.api.schema.sampleDefinition import SampleDefinition\n", 43 | "from azureml.api.realtime.services import generate_schema" 44 | ] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "execution_count": 48, 49 | "metadata": { 50 | "collapsed": false, 51 | "deletable": true, 52 | "editable": true 53 | }, 54 | "outputs": [ 55 | { 56 | "name": "stdout", 57 | "output_type": "stream", 58 | "text": [ 59 | "[[ 0. 0. 5. ..., 0. 0. 0.]\n", 60 | " [ 0. 0. 0. ..., 10. 0. 0.]\n", 61 | " [ 0. 0. 0. ..., 16. 9. 0.]\n", 62 | " ..., \n", 63 | " [ 0. 0. 1. ..., 6. 0. 0.]\n", 64 | " [ 0. 0. 2. ..., 12. 0. 0.]\n", 65 | " [ 0. 0. 10. ..., 12. 1. 0.]]\n" 66 | ] 67 | } 68 | ], 69 | "source": [ 70 | "# Read in the digits dataset\n", 71 | "from sklearn import datasets\n", 72 | "digits = datasets.load_digits()\n", 73 | "print(digits.data)" 74 | ] 75 | }, 76 | { 77 | "cell_type": "markdown", 78 | "metadata": { 79 | "deletable": true, 80 | "editable": true 81 | }, 82 | "source": [ 83 | "## Train your model\n", 84 | "\n", 85 | "The task is to predict which digit an image represents in the digits dataset. There are samples of each of the 10 possible classes (the digits zero through nine) on which you *fit* an estimator to predict the classes to which unseen samples belong." 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": 49, 91 | "metadata": { 92 | "collapsed": false, 93 | "deletable": true, 94 | "editable": true 95 | }, 96 | "outputs": [ 97 | { 98 | "data": { 99 | "text/plain": [ 100 | "SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0,\n", 101 | " decision_function_shape=None, degree=3, gamma=0.001, kernel='rbf',\n", 102 | " max_iter=-1, probability=False, random_state=None, shrinking=True,\n", 103 | " tol=0.001, verbose=False)" 104 | ] 105 | }, 106 | "execution_count": 49, 107 | "metadata": {}, 108 | "output_type": "execute_result" 109 | } 110 | ], 111 | "source": [ 112 | "# Train an SVM classifier\n", 113 | "from sklearn import svm\n", 114 | "clf = svm.SVC(gamma=0.001, C=100.)\n", 115 | "clf.fit(digits.data[:-1], digits.target[:-1])" 116 | ] 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": 50, 121 | "metadata": { 122 | "collapsed": false, 123 | "deletable": true, 124 | "editable": true 125 | }, 126 | "outputs": [ 127 | { 128 | "data": { 129 | "text/plain": [ 130 | "8" 131 | ] 132 | }, 133 | "execution_count": 50, 134 | "metadata": {}, 135 | "output_type": "execute_result" 136 | } 137 | ], 138 | "source": [ 139 | "# Predict new inputs\n", 140 | "clf.predict(digits.data[-1:])[0]" 141 | ] 142 | }, 143 | { 144 | "cell_type": "markdown", 145 | "metadata": { 146 | "deletable": true, 147 | "editable": true 148 | }, 149 | "source": [ 150 | "### Save your model\n", 151 | "\n", 152 | "Once you have a model that performs well, you can package it into a scoring service. To prepare for this, save your model locally. You then use the Joblib library to pickle the model." 153 | ] 154 | }, 155 | { 156 | "cell_type": "code", 157 | "execution_count": 51, 158 | "metadata": { 159 | "collapsed": false, 160 | "deletable": true, 161 | "editable": true 162 | }, 163 | "outputs": [ 164 | { 165 | "name": "stdout", 166 | "output_type": "stream", 167 | "text": [ 168 | "Model saved\n" 169 | ] 170 | } 171 | ], 172 | "source": [ 173 | "# Save model\n", 174 | "from sklearn.externals import joblib\n", 175 | "import os\n", 176 | "if not os.path.exists('sklearn'):\n", 177 | " os.makedirs('sklearn')\n", 178 | "joblib.dump(clf, 'sklearn/model.pkl')\n", 179 | "print(\"Model saved\")" 180 | ] 181 | }, 182 | { 183 | "cell_type": "markdown", 184 | "metadata": { 185 | "deletable": true, 186 | "editable": true 187 | }, 188 | "source": [ 189 | "## Authoring a Realtime Web Service\n", 190 | "\n", 191 | "In this section, you create and deploy a realtime web service that scores the model you saved above. \n", 192 | "\n", 193 | "### Define the ```init``` and ```run``` functions create the ```score.py```\n", 194 | "\n", 195 | "Start by defining your ```init``` and ```run``` functions in the cell below. \n", 196 | "\n", 197 | "The ```init``` function initializes the web service, loading in any data or models that it needs to score your inputs. In the example below, it loads the trained model.\n", 198 | "\n", 199 | "The ```run``` function defines what is executed on a scoring call. In this simple example, the service loads the json input as an array, and returns the prediction." 200 | ] 201 | }, 202 | { 203 | "cell_type": "code", 204 | "execution_count": 52, 205 | "metadata": { 206 | "collapsed": false, 207 | "deletable": true, 208 | "editable": true 209 | }, 210 | "outputs": [ 211 | { 212 | "name": "stdout", 213 | "output_type": "stream", 214 | "text": [ 215 | "Overwriting score.py\n" 216 | ] 217 | } 218 | ], 219 | "source": [ 220 | "%%writefile score.py\n", 221 | "# The init and run functions will load and score your input using the saved model.\n", 222 | "# The score.py file will be included in the web service deployment package.\n", 223 | "def init(): \n", 224 | " # read in the model file\n", 225 | " from sklearn.externals import joblib\n", 226 | " global model\n", 227 | " model = joblib.load('sklearn/model.pkl')\n", 228 | " \n", 229 | "def run(input_array):\n", 230 | " try:\n", 231 | " if (input_array.shape != (1, 64)):\n", 232 | " return 'Bad input: Expecting a json encoded list of lists of shape (1,64).'\n", 233 | " else:\n", 234 | " pred = model.predict(input_array)[0]\n", 235 | " return int(pred)\n", 236 | " except Exception as e:\n", 237 | " return (str(e))" 238 | ] 239 | }, 240 | { 241 | "cell_type": "markdown", 242 | "metadata": { 243 | "deletable": true, 244 | "editable": true 245 | }, 246 | "source": [ 247 | "### Test the ```init``` and ```run``` functions\n", 248 | "\n", 249 | "Before publishing the web service, you can test the init and run functions in the notebook by running the the following cell." 250 | ] 251 | }, 252 | { 253 | "cell_type": "code", 254 | "execution_count": 53, 255 | "metadata": { 256 | "collapsed": false, 257 | "deletable": true, 258 | "editable": true 259 | }, 260 | "outputs": [ 261 | { 262 | "data": { 263 | "text/plain": [ 264 | "8" 265 | ] 266 | }, 267 | "execution_count": 53, 268 | "metadata": {}, 269 | "output_type": "execute_result" 270 | } 271 | ], 272 | "source": [ 273 | "import score\n", 274 | "score.init()\n", 275 | "score.run(digits.data[-1:])" 276 | ] 277 | }, 278 | { 279 | "cell_type": "markdown", 280 | "metadata": { 281 | "deletable": true, 282 | "editable": true 283 | }, 284 | "source": [ 285 | "### Create Web Service Schema" 286 | ] 287 | }, 288 | { 289 | "cell_type": "markdown", 290 | "metadata": { 291 | "deletable": true, 292 | "editable": true 293 | }, 294 | "source": [ 295 | "Using the \"generate_schema\" function below creates a schema JSON file for the web service. Using a schema file when creating the web service creates a Swagger document." 296 | ] 297 | }, 298 | { 299 | "cell_type": "code", 300 | "execution_count": 55, 301 | "metadata": { 302 | "collapsed": false, 303 | "deletable": true, 304 | "editable": true 305 | }, 306 | "outputs": [ 307 | { 308 | "data": { 309 | "text/plain": [ 310 | "{'input': {'input_array': {'internal': 'gANjYXp1cmUubWwuYXBpLnNjaGVtYS5udW1weVV0aWwKTnVtcHlTY2hlbWEKcQApgXEBfXECKFgFAAAAc2hhcGVxA0sBS0CGcQRYCQAAAGRhdGFfdHlwZXEFY251bXB5CmR0eXBlCnEGWAIAAABmOHEHSwBLAYdxCFJxCShLA1gBAAAAPHEKTk5OSv////9K/////0sAdHELYnViLg==',\n", 311 | " 'swagger': {'example': [[0.0,\n", 312 | " 0.0,\n", 313 | " 10.0,\n", 314 | " 14.0,\n", 315 | " 8.0,\n", 316 | " 1.0,\n", 317 | " 0.0,\n", 318 | " 0.0,\n", 319 | " 0.0,\n", 320 | " 2.0,\n", 321 | " 16.0,\n", 322 | " 14.0,\n", 323 | " 6.0,\n", 324 | " 1.0,\n", 325 | " 0.0,\n", 326 | " 0.0,\n", 327 | " 0.0,\n", 328 | " 0.0,\n", 329 | " 15.0,\n", 330 | " 15.0,\n", 331 | " 8.0,\n", 332 | " 15.0,\n", 333 | " 0.0,\n", 334 | " 0.0,\n", 335 | " 0.0,\n", 336 | " 0.0,\n", 337 | " 5.0,\n", 338 | " 16.0,\n", 339 | " 16.0,\n", 340 | " 10.0,\n", 341 | " 0.0,\n", 342 | " 0.0,\n", 343 | " 0.0,\n", 344 | " 0.0,\n", 345 | " 12.0,\n", 346 | " 15.0,\n", 347 | " 15.0,\n", 348 | " 12.0,\n", 349 | " 0.0,\n", 350 | " 0.0,\n", 351 | " 0.0,\n", 352 | " 4.0,\n", 353 | " 16.0,\n", 354 | " 6.0,\n", 355 | " 4.0,\n", 356 | " 16.0,\n", 357 | " 6.0,\n", 358 | " 0.0,\n", 359 | " 0.0,\n", 360 | " 8.0,\n", 361 | " 16.0,\n", 362 | " 10.0,\n", 363 | " 8.0,\n", 364 | " 16.0,\n", 365 | " 8.0,\n", 366 | " 0.0,\n", 367 | " 0.0,\n", 368 | " 1.0,\n", 369 | " 8.0,\n", 370 | " 12.0,\n", 371 | " 14.0,\n", 372 | " 12.0,\n", 373 | " 1.0,\n", 374 | " 0.0]],\n", 375 | " 'items': {'items': {'format': 'double', 'type': 'number'},\n", 376 | " 'type': 'array'},\n", 377 | " 'type': 'array'},\n", 378 | " 'type': 1}}}" 379 | ] 380 | }, 381 | "execution_count": 55, 382 | "metadata": {}, 383 | "output_type": "execute_result" 384 | } 385 | ], 386 | "source": [ 387 | "# Define the input dataframe and create the schema\n", 388 | "dataarray = digits.data[-1:]\n", 389 | "inputs = {\"input_array\": SampleDefinition(DataTypes.NUMPY, dataarray)}\n", 390 | "generate_schema(run_func=score.run, inputs=inputs, filepath='service_schema.json')" 391 | ] 392 | }, 393 | { 394 | "cell_type": "markdown", 395 | "metadata": { 396 | "deletable": true, 397 | "editable": true 398 | }, 399 | "source": [ 400 | "### 4. Use the CLI to deploy and manage your web service\n", 401 | "\n", 402 | "Use the following commands to set up an environment and account to deploy the web service. For more info, see the Getting Started Guide and the CLI Command Reference. You can use -h flag at the end of the commands for command help.\n", 403 | "\n", 404 | "#### Local deployment to your machine\n", 405 | "\n", 406 | "After setting up the local environment, use the following commands to create the web service (Sklearn folder contains the model):\n", 407 | "\n", 408 | "```\n", 409 | "az ml env local\n", 410 | "az ml service create realtime -f score.py -m ../sklearn -s service_schema.json -n mydigitservice -r python\n", 411 | "```\n", 412 | "\n", 413 | "#### Deployment to a cluster (for production)\n", 414 | "\n", 415 | "**Pre-requisites:**\n", 416 | "\n", 417 | "* Create the environment (you need to do this once per environment e.g. dev or prod)\n", 418 | "\n", 419 | "```\n", 420 | "az ml env setup -c -n --location \n", 421 | "```\n", 422 | "* Create a Model Management account (one time setup)\n", 423 | "\n", 424 | "```\n", 425 | "az ml account modelmanagement create --location -n -g \n", 426 | "```\n", 427 | "\n", 428 | "* Set the Model Management account\n", 429 | "\n", 430 | "```\n", 431 | "az ml account modelmanagement set -n -g \n", 432 | "```\n", 433 | "\n", 434 | "* Set the environment. The cluster name is the name used in step 1 above. The resource group name was the output of the same process and would be in the command window when the setup process is completed.\n", 435 | "\n", 436 | "```\n", 437 | "az ml env set -n -g \n", 438 | "```\n", 439 | "\n", 440 | "**Create and deploy the web service**\n", 441 | "\n", 442 | "To create and run the web service on the ACS cluster:\n", 443 | "\n", 444 | "```\n", 445 | "az ml service create realtime -f score.py --model-file ../sklearn -s service_schema.json -n mydigitsservice -r python\n", 446 | "```\n", 447 | "\n", 448 | "To test the web service, run the following command with a sample data input. Use the service id from the above create call as the input for the -i parameter.\n", 449 | "\n", 450 | "```\n", 451 | "az ml service run realtime -i -d \"{\\\"input_array\\\": [[0.0, 0.0, 10.0, 14.0, 8.0, 1.0, 0.0, 0.0, 0.0, 2.0, 16.0, 14.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 15.0, 15.0, 8.0, 15.0, 0.0, 0.0, 0.0, 0.0, 5.0, 16.0, 16.0, 10.0, 0.0, 0.0, 0.0, 0.0, 12.0, 15.0, 15.0, 12.0, 0.0, 0.0, 0.0, 4.0, 16.0, 6.0, 4.0, 16.0, 6.0, 0.0, 0.0, 8.0, 16.0, 10.0, 8.0, 16.0, 8.0, 0.0, 0.0, 1.0, 8.0, 12.0, 14.0, 12.0, 1.0, 0.0]]}\"\n", 452 | "```\n", 453 | "\n", 454 | "To get the sample input data for the test call, use the following command:\n", 455 | "\n", 456 | "```\n", 457 | "az ml service show realtime -i \n", 458 | "```" 459 | ] 460 | }, 461 | { 462 | "cell_type": "code", 463 | "execution_count": null, 464 | "metadata": { 465 | "collapsed": true, 466 | "deletable": true, 467 | "editable": true 468 | }, 469 | "outputs": [], 470 | "source": [] 471 | } 472 | ], 473 | "metadata": { 474 | "anaconda-cloud": {}, 475 | "kernelspec": { 476 | "display_name": "Python 3", 477 | "language": "python", 478 | "name": "python3" 479 | }, 480 | "language_info": { 481 | "codemirror_mode": { 482 | "name": "ipython", 483 | "version": 3 484 | }, 485 | "file_extension": ".py", 486 | "mimetype": "text/x-python", 487 | "name": "python", 488 | "nbconvert_exporter": "python", 489 | "pygments_lexer": "ipython3", 490 | "version": "3.5.2" 491 | } 492 | }, 493 | "nbformat": 4, 494 | "nbformat_minor": 1 495 | } 496 | -------------------------------------------------------------------------------- /samples/spark/tutorials/datasets/housing.csv: -------------------------------------------------------------------------------- 1 | CRIM,ZN,INDUS,CHAS,NOX,RM,AGE,DIS,RAD,TAX,PTRATIO,LSTAT,MEDV 2 | 0.00632,18,2.31,0,0.538,6.575,65.2,4.09,1,296,15.3,4.98,24 3 | 0.02731,0,7.07,0,0.469,6.421,78.9,4.9671,2,242,17.8,9.14,21.6 4 | 0.02729,0,7.07,0,0.469,7.185,61.1,4.9671,2,242,17.8,4.03,34.7 5 | 0.03237,0,2.18,0,0.458,6.998,45.8,6.0622,3,222,18.7,2.94,33.4 6 | 0.06905,0,2.18,0,0.458,7.147,54.2,6.0622,3,222,18.7,5.33,36.2 7 | 0.02985,0,2.18,0,0.458,6.43,58.7,6.0622,3,222,18.7,5.21,28.7 8 | 0.08829,12.5,7.87,0,0.524,6.012,66.6,5.5605,5,311,15.2,12.43,22.9 9 | 0.14455,12.5,7.87,0,0.524,6.172,96.1,5.9505,5,311,15.2,19.15,27.1 10 | 0.21124,12.5,7.87,0,0.524,5.631,100,6.0821,5,311,15.2,29.93,16.5 11 | 0.17004,12.5,7.87,0,0.524,6.004,85.9,6.5921,5,311,15.2,17.1,18.9 12 | 0.22489,12.5,7.87,0,0.524,6.377,94.3,6.3467,5,311,15.2,20.45,15 13 | 0.11747,12.5,7.87,0,0.524,6.009,82.9,6.2267,5,311,15.2,13.27,18.9 14 | 0.09378,12.5,7.87,0,0.524,5.889,39,5.4509,5,311,15.2,15.71,21.7 15 | 0.62976,0,8.14,0,0.538,5.949,61.8,4.7075,4,307,21,8.26,20.4 16 | 0.63796,0,8.14,0,0.538,6.096,84.5,4.4619,4,307,21,10.26,18.2 17 | 0.62739,0,8.14,0,0.538,5.834,56.5,4.4986,4,307,21,8.47,19.9 18 | 1.05393,0,8.14,0,0.538,5.935,29.3,4.4986,4,307,21,6.58,23.1 19 | 0.7842,0,8.14,0,0.538,5.99,81.7,4.2579,4,307,21,14.67,17.5 20 | 0.80271,0,8.14,0,0.538,5.456,36.6,3.7965,4,307,21,11.69,20.2 21 | 0.7258,0,8.14,0,0.538,5.727,69.5,3.7965,4,307,21,11.28,18.2 22 | 1.25179,0,8.14,0,0.538,5.57,98.1,3.7979,4,307,21,21.02,13.6 23 | 0.85204,0,8.14,0,0.538,5.965,89.2,4.0123,4,307,21,13.83,19.6 24 | 1.23247,0,8.14,0,0.538,6.142,91.7,3.9769,4,307,21,18.72,15.2 25 | 0.98843,0,8.14,0,0.538,5.813,100,4.0952,4,307,21,19.88,14.5 26 | 0.75026,0,8.14,0,0.538,5.924,94.1,4.3996,4,307,21,16.3,15.6 27 | 0.84054,0,8.14,0,0.538,5.599,85.7,4.4546,4,307,21,16.51,13.9 28 | 0.67191,0,8.14,0,0.538,5.813,90.3,4.682,4,307,21,14.81,16.6 29 | 0.95577,0,8.14,0,0.538,6.047,88.8,4.4534,4,307,21,17.28,14.8 30 | 0.77299,0,8.14,0,0.538,6.495,94.4,4.4547,4,307,21,12.8,18.4 31 | 1.00245,0,8.14,0,0.538,6.674,87.3,4.239,4,307,21,11.98,21 32 | 1.13081,0,8.14,0,0.538,5.713,94.1,4.233,4,307,21,22.6,12.7 33 | 1.35472,0,8.14,0,0.538,6.072,100,4.175,4,307,21,13.04,14.5 34 | 1.38799,0,8.14,0,0.538,5.95,82,3.99,4,307,21,27.71,13.2 35 | 1.15172,0,8.14,0,0.538,5.701,95,3.7872,4,307,21,18.35,13.1 36 | 1.61282,0,8.14,0,0.538,6.096,96.9,3.7598,4,307,21,20.34,13.5 37 | 0.06417,0,5.96,0,0.499,5.933,68.2,3.3603,5,279,19.2,9.68,18.9 38 | 0.09744,0,5.96,0,0.499,5.841,61.4,3.3779,5,279,19.2,11.41,20 39 | 0.08014,0,5.96,0,0.499,5.85,41.5,3.9342,5,279,19.2,8.77,21 40 | 0.17505,0,5.96,0,0.499,5.966,30.2,3.8473,5,279,19.2,10.13,24.7 41 | 0.02763,75,2.95,0,0.428,6.595,21.8,5.4011,3,252,18.3,4.32,30.8 42 | 0.03359,75,2.95,0,0.428,7.024,15.8,5.4011,3,252,18.3,1.98,34.9 43 | 0.12744,0,6.91,0,0.448,6.77,2.9,5.7209,3,233,17.9,4.84,26.6 44 | 0.1415,0,6.91,0,0.448,6.169,6.6,5.7209,3,233,17.9,5.81,25.3 45 | 0.15936,0,6.91,0,0.448,6.211,6.5,5.7209,3,233,17.9,7.44,24.7 46 | 0.12269,0,6.91,0,0.448,6.069,40,5.7209,3,233,17.9,9.55,21.2 47 | 0.17142,0,6.91,0,0.448,5.682,33.8,5.1004,3,233,17.9,10.21,19.3 48 | 0.18836,0,6.91,0,0.448,5.786,33.3,5.1004,3,233,17.9,14.15,20 49 | 0.22927,0,6.91,0,0.448,6.03,85.5,5.6894,3,233,17.9,18.8,16.6 50 | 0.25387,0,6.91,0,0.448,5.399,95.3,5.87,3,233,17.9,30.81,14.4 51 | 0.21977,0,6.91,0,0.448,5.602,62,6.0877,3,233,17.9,16.2,19.4 52 | 0.08873,21,5.64,0,0.439,5.963,45.7,6.8147,4,243,16.8,13.45,19.7 53 | 0.04337,21,5.64,0,0.439,6.115,63,6.8147,4,243,16.8,9.43,20.5 54 | 0.0536,21,5.64,0,0.439,6.511,21.1,6.8147,4,243,16.8,5.28,25 55 | 0.04981,21,5.64,0,0.439,5.998,21.4,6.8147,4,243,16.8,8.43,23.4 56 | 0.0136,75,4,0,0.41,5.888,47.6,7.3197,3,469,21.1,14.8,18.9 57 | 0.01311,90,1.22,0,0.403,7.249,21.9,8.6966,5,226,17.9,4.81,35.4 58 | 0.02055,85,0.74,0,0.41,6.383,35.7,9.1876,2,313,17.3,5.77,24.7 59 | 0.01432,100,1.32,0,0.411,6.816,40.5,8.3248,5,256,15.1,3.95,31.6 60 | 0.15445,25,5.13,0,0.453,6.145,29.2,7.8148,8,284,19.7,6.86,23.3 61 | 0.10328,25,5.13,0,0.453,5.927,47.2,6.932,8,284,19.7,9.22,19.6 62 | 0.14932,25,5.13,0,0.453,5.741,66.2,7.2254,8,284,19.7,13.15,18.7 63 | 0.17171,25,5.13,0,0.453,5.966,93.4,6.8185,8,284,19.7,14.44,16 64 | 0.11027,25,5.13,0,0.453,6.456,67.8,7.2255,8,284,19.7,6.73,22.2 65 | 0.1265,25,5.13,0,0.453,6.762,43.4,7.9809,8,284,19.7,9.5,25 66 | 0.01951,17.5,1.38,0,0.4161,7.104,59.5,9.2229,3,216,18.6,8.05,33 67 | 0.03584,80,3.37,0,0.398,6.29,17.8,6.6115,4,337,16.1,4.67,23.5 68 | 0.04379,80,3.37,0,0.398,5.787,31.1,6.6115,4,337,16.1,10.24,19.4 69 | 0.05789,12.5,6.07,0,0.409,5.878,21.4,6.498,4,345,18.9,8.1,22 70 | 0.13554,12.5,6.07,0,0.409,5.594,36.8,6.498,4,345,18.9,13.09,17.4 71 | 0.12816,12.5,6.07,0,0.409,5.885,33,6.498,4,345,18.9,8.79,20.9 72 | 0.08826,0,10.81,0,0.413,6.417,6.6,5.2873,4,305,19.2,6.72,24.2 73 | 0.15876,0,10.81,0,0.413,5.961,17.5,5.2873,4,305,19.2,9.88,21.7 74 | 0.09164,0,10.81,0,0.413,6.065,7.8,5.2873,4,305,19.2,5.52,22.8 75 | 0.19539,0,10.81,0,0.413,6.245,6.2,5.2873,4,305,19.2,7.54,23.4 76 | 0.07896,0,12.83,0,0.437,6.273,6,4.2515,5,398,18.7,6.78,24.1 77 | 0.09512,0,12.83,0,0.437,6.286,45,4.5026,5,398,18.7,8.94,21.4 78 | 0.10153,0,12.83,0,0.437,6.279,74.5,4.0522,5,398,18.7,11.97,20 79 | 0.08707,0,12.83,0,0.437,6.14,45.8,4.0905,5,398,18.7,10.27,20.8 80 | 0.05646,0,12.83,0,0.437,6.232,53.7,5.0141,5,398,18.7,12.34,21.2 81 | 0.08387,0,12.83,0,0.437,5.874,36.6,4.5026,5,398,18.7,9.1,20.3 82 | 0.04113,25,4.86,0,0.426,6.727,33.5,5.4007,4,281,19,5.29,28 83 | 0.04462,25,4.86,0,0.426,6.619,70.4,5.4007,4,281,19,7.22,23.9 84 | 0.03659,25,4.86,0,0.426,6.302,32.2,5.4007,4,281,19,6.72,24.8 85 | 0.03551,25,4.86,0,0.426,6.167,46.7,5.4007,4,281,19,7.51,22.9 86 | 0.05059,0,4.49,0,0.449,6.389,48,4.7794,3,247,18.5,9.62,23.9 87 | 0.05735,0,4.49,0,0.449,6.63,56.1,4.4377,3,247,18.5,6.53,26.6 88 | 0.05188,0,4.49,0,0.449,6.015,45.1,4.4272,3,247,18.5,12.86,22.5 89 | 0.07151,0,4.49,0,0.449,6.121,56.8,3.7476,3,247,18.5,8.44,22.2 90 | 0.0566,0,3.41,0,0.489,7.007,86.3,3.4217,2,270,17.8,5.5,23.6 91 | 0.05302,0,3.41,0,0.489,7.079,63.1,3.4145,2,270,17.8,5.7,28.7 92 | 0.04684,0,3.41,0,0.489,6.417,66.1,3.0923,2,270,17.8,8.81,22.6 93 | 0.03932,0,3.41,0,0.489,6.405,73.9,3.0921,2,270,17.8,8.2,22 94 | 0.04203,28,15.04,0,0.464,6.442,53.6,3.6659,4,270,18.2,8.16,22.9 95 | 0.02875,28,15.04,0,0.464,6.211,28.9,3.6659,4,270,18.2,6.21,25 96 | 0.04294,28,15.04,0,0.464,6.249,77.3,3.615,4,270,18.2,10.59,20.6 97 | 0.12204,0,2.89,0,0.445,6.625,57.8,3.4952,2,276,18,6.65,28.4 98 | 0.11504,0,2.89,0,0.445,6.163,69.6,3.4952,2,276,18,11.34,21.4 99 | 0.12083,0,2.89,0,0.445,8.069,76,3.4952,2,276,18,4.21,38.7 100 | 0.08187,0,2.89,0,0.445,7.82,36.9,3.4952,2,276,18,3.57,43.8 101 | 0.0686,0,2.89,0,0.445,7.416,62.5,3.4952,2,276,18,6.19,33.2 102 | 0.14866,0,8.56,0,0.52,6.727,79.9,2.7778,5,384,20.9,9.42,27.5 103 | 0.11432,0,8.56,0,0.52,6.781,71.3,2.8561,5,384,20.9,7.67,26.5 104 | 0.22876,0,8.56,0,0.52,6.405,85.4,2.7147,5,384,20.9,10.63,18.6 105 | 0.21161,0,8.56,0,0.52,6.137,87.4,2.7147,5,384,20.9,13.44,19.3 106 | 0.1396,0,8.56,0,0.52,6.167,90,2.421,5,384,20.9,12.33,20.1 107 | 0.13262,0,8.56,0,0.52,5.851,96.7,2.1069,5,384,20.9,16.47,19.5 108 | 0.1712,0,8.56,0,0.52,5.836,91.9,2.211,5,384,20.9,18.66,19.5 109 | 0.13117,0,8.56,0,0.52,6.127,85.2,2.1224,5,384,20.9,14.09,20.4 110 | 0.12802,0,8.56,0,0.52,6.474,97.1,2.4329,5,384,20.9,12.27,19.8 111 | 0.26363,0,8.56,0,0.52,6.229,91.2,2.5451,5,384,20.9,15.55,19.4 112 | 0.10793,0,8.56,0,0.52,6.195,54.4,2.7778,5,384,20.9,13,21.7 113 | 0.10084,0,10.01,0,0.547,6.715,81.6,2.6775,6,432,17.8,10.16,22.8 114 | 0.12329,0,10.01,0,0.547,5.913,92.9,2.3534,6,432,17.8,16.21,18.8 115 | 0.22212,0,10.01,0,0.547,6.092,95.4,2.548,6,432,17.8,17.09,18.7 116 | 0.14231,0,10.01,0,0.547,6.254,84.2,2.2565,6,432,17.8,10.45,18.5 117 | 0.17134,0,10.01,0,0.547,5.928,88.2,2.4631,6,432,17.8,15.76,18.3 118 | 0.13158,0,10.01,0,0.547,6.176,72.5,2.7301,6,432,17.8,12.04,21.2 119 | 0.15098,0,10.01,0,0.547,6.021,82.6,2.7474,6,432,17.8,10.3,19.2 120 | 0.13058,0,10.01,0,0.547,5.872,73.1,2.4775,6,432,17.8,15.37,20.4 121 | 0.14476,0,10.01,0,0.547,5.731,65.2,2.7592,6,432,17.8,13.61,19.3 122 | 0.06899,0,25.65,0,0.581,5.87,69.7,2.2577,2,188,19.1,14.37,22 123 | 0.07165,0,25.65,0,0.581,6.004,84.1,2.1974,2,188,19.1,14.27,20.3 124 | 0.09299,0,25.65,0,0.581,5.961,92.9,2.0869,2,188,19.1,17.93,20.5 125 | 0.15038,0,25.65,0,0.581,5.856,97,1.9444,2,188,19.1,25.41,17.3 126 | 0.09849,0,25.65,0,0.581,5.879,95.8,2.0063,2,188,19.1,17.58,18.8 127 | 0.16902,0,25.65,0,0.581,5.986,88.4,1.9929,2,188,19.1,14.81,21.4 128 | 0.38735,0,25.65,0,0.581,5.613,95.6,1.7572,2,188,19.1,27.26,15.7 129 | 0.25915,0,21.89,0,0.624,5.693,96,1.7883,4,437,21.2,17.19,16.2 130 | 0.32543,0,21.89,0,0.624,6.431,98.8,1.8125,4,437,21.2,15.39,18 131 | 0.88125,0,21.89,0,0.624,5.637,94.7,1.9799,4,437,21.2,18.34,14.3 132 | 0.34006,0,21.89,0,0.624,6.458,98.9,2.1185,4,437,21.2,12.6,19.2 133 | 1.19294,0,21.89,0,0.624,6.326,97.7,2.271,4,437,21.2,12.26,19.6 134 | 0.59005,0,21.89,0,0.624,6.372,97.9,2.3274,4,437,21.2,11.12,23 135 | 0.32982,0,21.89,0,0.624,5.822,95.4,2.4699,4,437,21.2,15.03,18.4 136 | 0.97617,0,21.89,0,0.624,5.757,98.4,2.346,4,437,21.2,17.31,15.6 137 | 0.55778,0,21.89,0,0.624,6.335,98.2,2.1107,4,437,21.2,16.96,18.1 138 | 0.32264,0,21.89,0,0.624,5.942,93.5,1.9669,4,437,21.2,16.9,17.4 139 | 0.35233,0,21.89,0,0.624,6.454,98.4,1.8498,4,437,21.2,14.59,17.1 140 | 0.2498,0,21.89,0,0.624,5.857,98.2,1.6686,4,437,21.2,21.32,13.3 141 | 0.54452,0,21.89,0,0.624,6.151,97.9,1.6687,4,437,21.2,18.46,17.8 142 | 0.2909,0,21.89,0,0.624,6.174,93.6,1.6119,4,437,21.2,24.16,14 143 | 1.62864,0,21.89,0,0.624,5.019,100,1.4394,4,437,21.2,34.41,14.4 144 | 3.32105,0,19.58,1,0.871,5.403,100,1.3216,5,403,14.7,26.82,13.4 145 | 4.0974,0,19.58,0,0.871,5.468,100,1.4118,5,403,14.7,26.42,15.6 146 | 2.77974,0,19.58,0,0.871,4.903,97.8,1.3459,5,403,14.7,29.29,11.8 147 | 2.37934,0,19.58,0,0.871,6.13,100,1.4191,5,403,14.7,27.8,13.8 148 | 2.15505,0,19.58,0,0.871,5.628,100,1.5166,5,403,14.7,16.65,15.6 149 | 2.36862,0,19.58,0,0.871,4.926,95.7,1.4608,5,403,14.7,29.53,14.6 150 | 2.33099,0,19.58,0,0.871,5.186,93.8,1.5296,5,403,14.7,28.32,17.8 151 | 2.73397,0,19.58,0,0.871,5.597,94.9,1.5257,5,403,14.7,21.45,15.4 152 | 1.6566,0,19.58,0,0.871,6.122,97.3,1.618,5,403,14.7,14.1,21.5 153 | 1.49632,0,19.58,0,0.871,5.404,100,1.5916,5,403,14.7,13.28,19.6 154 | 1.12658,0,19.58,1,0.871,5.012,88,1.6102,5,403,14.7,12.12,15.3 155 | 2.14918,0,19.58,0,0.871,5.709,98.5,1.6232,5,403,14.7,15.79,19.4 156 | 1.41385,0,19.58,1,0.871,6.129,96,1.7494,5,403,14.7,15.12,17 157 | 3.53501,0,19.58,1,0.871,6.152,82.6,1.7455,5,403,14.7,15.02,15.6 158 | 2.44668,0,19.58,0,0.871,5.272,94,1.7364,5,403,14.7,16.14,13.1 159 | 1.22358,0,19.58,0,0.605,6.943,97.4,1.8773,5,403,14.7,4.59,41.3 160 | 1.34284,0,19.58,0,0.605,6.066,100,1.7573,5,403,14.7,6.43,24.3 161 | 1.42502,0,19.58,0,0.871,6.51,100,1.7659,5,403,14.7,7.39,23.3 162 | 1.27346,0,19.58,1,0.605,6.25,92.6,1.7984,5,403,14.7,5.5,27 163 | 1.46336,0,19.58,0,0.605,7.489,90.8,1.9709,5,403,14.7,1.73,50 164 | 1.83377,0,19.58,1,0.605,7.802,98.2,2.0407,5,403,14.7,1.92,50 165 | 1.51902,0,19.58,1,0.605,8.375,93.9,2.162,5,403,14.7,3.32,50 166 | 2.24236,0,19.58,0,0.605,5.854,91.8,2.422,5,403,14.7,11.64,22.7 167 | 2.924,0,19.58,0,0.605,6.101,93,2.2834,5,403,14.7,9.81,25 168 | 2.01019,0,19.58,0,0.605,7.929,96.2,2.0459,5,403,14.7,3.7,50 169 | 1.80028,0,19.58,0,0.605,5.877,79.2,2.4259,5,403,14.7,12.14,23.8 170 | 2.3004,0,19.58,0,0.605,6.319,96.1,2.1,5,403,14.7,11.1,23.8 171 | 2.44953,0,19.58,0,0.605,6.402,95.2,2.2625,5,403,14.7,11.32,22.3 172 | 1.20742,0,19.58,0,0.605,5.875,94.6,2.4259,5,403,14.7,14.43,17.4 173 | 2.3139,0,19.58,0,0.605,5.88,97.3,2.3887,5,403,14.7,12.03,19.1 174 | 0.13914,0,4.05,0,0.51,5.572,88.5,2.5961,5,296,16.6,14.69,23.1 175 | 0.09178,0,4.05,0,0.51,6.416,84.1,2.6463,5,296,16.6,9.04,23.6 176 | 0.08447,0,4.05,0,0.51,5.859,68.7,2.7019,5,296,16.6,9.64,22.6 177 | 0.06664,0,4.05,0,0.51,6.546,33.1,3.1323,5,296,16.6,5.33,29.4 178 | 0.07022,0,4.05,0,0.51,6.02,47.2,3.5549,5,296,16.6,10.11,23.2 179 | 0.05425,0,4.05,0,0.51,6.315,73.4,3.3175,5,296,16.6,6.29,24.6 180 | 0.06642,0,4.05,0,0.51,6.86,74.4,2.9153,5,296,16.6,6.92,29.9 181 | 0.0578,0,2.46,0,0.488,6.98,58.4,2.829,3,193,17.8,5.04,37.2 182 | 0.06588,0,2.46,0,0.488,7.765,83.3,2.741,3,193,17.8,7.56,39.8 183 | 0.06888,0,2.46,0,0.488,6.144,62.2,2.5979,3,193,17.8,9.45,36.2 184 | 0.09103,0,2.46,0,0.488,7.155,92.2,2.7006,3,193,17.8,4.82,37.9 185 | 0.10008,0,2.46,0,0.488,6.563,95.6,2.847,3,193,17.8,5.68,32.5 186 | 0.08308,0,2.46,0,0.488,5.604,89.8,2.9879,3,193,17.8,13.98,26.4 187 | 0.06047,0,2.46,0,0.488,6.153,68.8,3.2797,3,193,17.8,13.15,29.6 188 | 0.05602,0,2.46,0,0.488,7.831,53.6,3.1992,3,193,17.8,4.45,50 189 | 0.07875,45,3.44,0,0.437,6.782,41.1,3.7886,5,398,15.2,6.68,32 190 | 0.12579,45,3.44,0,0.437,6.556,29.1,4.5667,5,398,15.2,4.56,29.8 191 | 0.0837,45,3.44,0,0.437,7.185,38.9,4.5667,5,398,15.2,5.39,34.9 192 | 0.09068,45,3.44,0,0.437,6.951,21.5,6.4798,5,398,15.2,5.1,37 193 | 0.06911,45,3.44,0,0.437,6.739,30.8,6.4798,5,398,15.2,4.69,30.5 194 | 0.08664,45,3.44,0,0.437,7.178,26.3,6.4798,5,398,15.2,2.87,36.4 195 | 0.02187,60,2.93,0,0.401,6.8,9.9,6.2196,1,265,15.6,5.03,31.1 196 | 0.01439,60,2.93,0,0.401,6.604,18.8,6.2196,1,265,15.6,4.38,29.1 197 | 0.01381,80,0.46,0,0.422,7.875,32,5.6484,4,255,14.4,2.97,50 198 | 0.04011,80,1.52,0,0.404,7.287,34.1,7.309,2,329,12.6,4.08,33.3 199 | 0.04666,80,1.52,0,0.404,7.107,36.6,7.309,2,329,12.6,8.61,30.3 200 | 0.03768,80,1.52,0,0.404,7.274,38.3,7.309,2,329,12.6,6.62,34.6 201 | 0.0315,95,1.47,0,0.403,6.975,15.3,7.6534,3,402,17,4.56,34.9 202 | 0.01778,95,1.47,0,0.403,7.135,13.9,7.6534,3,402,17,4.45,32.9 203 | 0.03445,82.5,2.03,0,0.415,6.162,38.4,6.27,2,348,14.7,7.43,24.1 204 | 0.02177,82.5,2.03,0,0.415,7.61,15.7,6.27,2,348,14.7,3.11,42.3 205 | 0.0351,95,2.68,0,0.4161,7.853,33.2,5.118,4,224,14.7,3.81,48.5 206 | 0.02009,95,2.68,0,0.4161,8.034,31.9,5.118,4,224,14.7,2.88,50 207 | 0.13642,0,10.59,0,0.489,5.891,22.3,3.9454,4,277,18.6,10.87,22.6 208 | 0.22969,0,10.59,0,0.489,6.326,52.5,4.3549,4,277,18.6,10.97,24.4 209 | 0.25199,0,10.59,0,0.489,5.783,72.7,4.3549,4,277,18.6,18.06,22.5 210 | 0.13587,0,10.59,1,0.489,6.064,59.1,4.2392,4,277,18.6,14.66,24.4 211 | 0.43571,0,10.59,1,0.489,5.344,100,3.875,4,277,18.6,23.09,20 212 | 0.17446,0,10.59,1,0.489,5.96,92.1,3.8771,4,277,18.6,17.27,21.7 213 | 0.37578,0,10.59,1,0.489,5.404,88.6,3.665,4,277,18.6,23.98,19.3 214 | 0.21719,0,10.59,1,0.489,5.807,53.8,3.6526,4,277,18.6,16.03,22.4 215 | 0.14052,0,10.59,0,0.489,6.375,32.3,3.9454,4,277,18.6,9.38,28.1 216 | 0.28955,0,10.59,0,0.489,5.412,9.8,3.5875,4,277,18.6,29.55,23.7 217 | 0.19802,0,10.59,0,0.489,6.182,42.4,3.9454,4,277,18.6,9.47,25 218 | 0.0456,0,13.89,1,0.55,5.888,56,3.1121,5,276,16.4,13.51,23.3 219 | 0.07013,0,13.89,0,0.55,6.642,85.1,3.4211,5,276,16.4,9.69,28.7 220 | 0.11069,0,13.89,1,0.55,5.951,93.8,2.8893,5,276,16.4,17.92,21.5 221 | 0.11425,0,13.89,1,0.55,6.373,92.4,3.3633,5,276,16.4,10.5,23 222 | 0.35809,0,6.2,1,0.507,6.951,88.5,2.8617,8,307,17.4,9.71,26.7 223 | 0.40771,0,6.2,1,0.507,6.164,91.3,3.048,8,307,17.4,21.46,21.7 224 | 0.62356,0,6.2,1,0.507,6.879,77.7,3.2721,8,307,17.4,9.93,27.5 225 | 0.6147,0,6.2,0,0.507,6.618,80.8,3.2721,8,307,17.4,7.6,30.1 226 | 0.31533,0,6.2,0,0.504,8.266,78.3,2.8944,8,307,17.4,4.14,44.8 227 | 0.52693,0,6.2,0,0.504,8.725,83,2.8944,8,307,17.4,4.63,50 228 | 0.38214,0,6.2,0,0.504,8.04,86.5,3.2157,8,307,17.4,3.13,37.6 229 | 0.41238,0,6.2,0,0.504,7.163,79.9,3.2157,8,307,17.4,6.36,31.6 230 | 0.29819,0,6.2,0,0.504,7.686,17,3.3751,8,307,17.4,3.92,46.7 231 | 0.44178,0,6.2,0,0.504,6.552,21.4,3.3751,8,307,17.4,3.76,31.5 232 | 0.537,0,6.2,0,0.504,5.981,68.1,3.6715,8,307,17.4,11.65,24.3 233 | 0.46296,0,6.2,0,0.504,7.412,76.9,3.6715,8,307,17.4,5.25,31.7 234 | 0.57529,0,6.2,0,0.507,8.337,73.3,3.8384,8,307,17.4,2.47,41.7 235 | 0.33147,0,6.2,0,0.507,8.247,70.4,3.6519,8,307,17.4,3.95,48.3 236 | 0.44791,0,6.2,1,0.507,6.726,66.5,3.6519,8,307,17.4,8.05,29 237 | 0.33045,0,6.2,0,0.507,6.086,61.5,3.6519,8,307,17.4,10.88,24 238 | 0.52058,0,6.2,1,0.507,6.631,76.5,4.148,8,307,17.4,9.54,25.1 239 | 0.51183,0,6.2,0,0.507,7.358,71.6,4.148,8,307,17.4,4.73,31.5 240 | 0.08244,30,4.93,0,0.428,6.481,18.5,6.1899,6,300,16.6,6.36,23.7 241 | 0.09252,30,4.93,0,0.428,6.606,42.2,6.1899,6,300,16.6,7.37,23.3 242 | 0.11329,30,4.93,0,0.428,6.897,54.3,6.3361,6,300,16.6,11.38,22 243 | 0.10612,30,4.93,0,0.428,6.095,65.1,6.3361,6,300,16.6,12.4,20.1 244 | 0.1029,30,4.93,0,0.428,6.358,52.9,7.0355,6,300,16.6,11.22,22.2 245 | 0.12757,30,4.93,0,0.428,6.393,7.8,7.0355,6,300,16.6,5.19,23.7 246 | 0.20608,22,5.86,0,0.431,5.593,76.5,7.9549,7,330,19.1,12.5,17.6 247 | 0.19133,22,5.86,0,0.431,5.605,70.2,7.9549,7,330,19.1,18.46,18.5 248 | 0.33983,22,5.86,0,0.431,6.108,34.9,8.0555,7,330,19.1,9.16,24.3 249 | 0.19657,22,5.86,0,0.431,6.226,79.2,8.0555,7,330,19.1,10.15,20.5 250 | 0.16439,22,5.86,0,0.431,6.433,49.1,7.8265,7,330,19.1,9.52,24.5 251 | 0.19073,22,5.86,0,0.431,6.718,17.5,7.8265,7,330,19.1,6.56,26.2 252 | 0.1403,22,5.86,0,0.431,6.487,13,7.3967,7,330,19.1,5.9,24.4 253 | 0.21409,22,5.86,0,0.431,6.438,8.9,7.3967,7,330,19.1,3.59,24.8 254 | 0.08221,22,5.86,0,0.431,6.957,6.8,8.9067,7,330,19.1,3.53,29.6 255 | 0.36894,22,5.86,0,0.431,8.259,8.4,8.9067,7,330,19.1,3.54,42.8 256 | 0.04819,80,3.64,0,0.392,6.108,32,9.2203,1,315,16.4,6.57,21.9 257 | 0.03548,80,3.64,0,0.392,5.876,19.1,9.2203,1,315,16.4,9.25,20.9 258 | 0.01538,90,3.75,0,0.394,7.454,34.2,6.3361,3,244,15.9,3.11,44 259 | 0.61154,20,3.97,0,0.647,8.704,86.9,1.801,5,264,13,5.12,50 260 | 0.66351,20,3.97,0,0.647,7.333,100,1.8946,5,264,13,7.79,36 261 | 0.65665,20,3.97,0,0.647,6.842,100,2.0107,5,264,13,6.9,30.1 262 | 0.54011,20,3.97,0,0.647,7.203,81.8,2.1121,5,264,13,9.59,33.8 263 | 0.53412,20,3.97,0,0.647,7.52,89.4,2.1398,5,264,13,7.26,43.1 264 | 0.52014,20,3.97,0,0.647,8.398,91.5,2.2885,5,264,13,5.91,48.8 265 | 0.82526,20,3.97,0,0.647,7.327,94.5,2.0788,5,264,13,11.25,31 266 | 0.55007,20,3.97,0,0.647,7.206,91.6,1.9301,5,264,13,8.1,36.5 267 | 0.76162,20,3.97,0,0.647,5.56,62.8,1.9865,5,264,13,10.45,22.8 268 | 0.7857,20,3.97,0,0.647,7.014,84.6,2.1329,5,264,13,14.79,30.7 269 | 0.57834,20,3.97,0,0.575,8.297,67,2.4216,5,264,13,7.44,50 270 | 0.5405,20,3.97,0,0.575,7.47,52.6,2.872,5,264,13,3.16,43.5 271 | 0.09065,20,6.96,1,0.464,5.92,61.5,3.9175,3,223,18.6,13.65,20.7 272 | 0.29916,20,6.96,0,0.464,5.856,42.1,4.429,3,223,18.6,13,21.1 273 | 0.16211,20,6.96,0,0.464,6.24,16.3,4.429,3,223,18.6,6.59,25.2 274 | 0.1146,20,6.96,0,0.464,6.538,58.7,3.9175,3,223,18.6,7.73,24.4 275 | 0.22188,20,6.96,1,0.464,7.691,51.8,4.3665,3,223,18.6,6.58,35.2 276 | 0.05644,40,6.41,1,0.447,6.758,32.9,4.0776,4,254,17.6,3.53,32.4 277 | 0.09604,40,6.41,0,0.447,6.854,42.8,4.2673,4,254,17.6,2.98,32 278 | 0.10469,40,6.41,1,0.447,7.267,49,4.7872,4,254,17.6,6.05,33.2 279 | 0.06127,40,6.41,1,0.447,6.826,27.6,4.8628,4,254,17.6,4.16,33.1 280 | 0.07978,40,6.41,0,0.447,6.482,32.1,4.1403,4,254,17.6,7.19,29.1 281 | 0.21038,20,3.33,0,0.4429,6.812,32.2,4.1007,5,216,14.9,4.85,35.1 282 | 0.03578,20,3.33,0,0.4429,7.82,64.5,4.6947,5,216,14.9,3.76,45.4 283 | 0.03705,20,3.33,0,0.4429,6.968,37.2,5.2447,5,216,14.9,4.59,35.4 284 | 0.06129,20,3.33,1,0.4429,7.645,49.7,5.2119,5,216,14.9,3.01,46 285 | 0.01501,90,1.21,1,0.401,7.923,24.8,5.885,1,198,13.6,3.16,50 286 | 0.00906,90,2.97,0,0.4,7.088,20.8,7.3073,1,285,15.3,7.85,32.2 287 | 0.01096,55,2.25,0,0.389,6.453,31.9,7.3073,1,300,15.3,8.23,22 288 | 0.01965,80,1.76,0,0.385,6.23,31.5,9.0892,1,241,18.2,12.93,20.1 289 | 0.03871,52.5,5.32,0,0.405,6.209,31.3,7.3172,6,293,16.6,7.14,23.2 290 | 0.0459,52.5,5.32,0,0.405,6.315,45.6,7.3172,6,293,16.6,7.6,22.3 291 | 0.04297,52.5,5.32,0,0.405,6.565,22.9,7.3172,6,293,16.6,9.51,24.8 292 | 0.03502,80,4.95,0,0.411,6.861,27.9,5.1167,4,245,19.2,3.33,28.5 293 | 0.07886,80,4.95,0,0.411,7.148,27.7,5.1167,4,245,19.2,3.56,37.3 294 | 0.03615,80,4.95,0,0.411,6.63,23.4,5.1167,4,245,19.2,4.7,27.9 295 | 0.08265,0,13.92,0,0.437,6.127,18.4,5.5027,4,289,16,8.58,23.9 296 | 0.08199,0,13.92,0,0.437,6.009,42.3,5.5027,4,289,16,10.4,21.7 297 | 0.12932,0,13.92,0,0.437,6.678,31.1,5.9604,4,289,16,6.27,28.6 298 | 0.05372,0,13.92,0,0.437,6.549,51,5.9604,4,289,16,7.39,27.1 299 | 0.14103,0,13.92,0,0.437,5.79,58,6.32,4,289,16,15.84,20.3 300 | 0.06466,70,2.24,0,0.4,6.345,20.1,7.8278,5,358,14.8,4.97,22.5 301 | 0.05561,70,2.24,0,0.4,7.041,10,7.8278,5,358,14.8,4.74,29 302 | 0.04417,70,2.24,0,0.4,6.871,47.4,7.8278,5,358,14.8,6.07,24.8 303 | 0.03537,34,6.09,0,0.433,6.59,40.4,5.4917,7,329,16.1,9.5,22 304 | 0.09266,34,6.09,0,0.433,6.495,18.4,5.4917,7,329,16.1,8.67,26.4 305 | 0.1,34,6.09,0,0.433,6.982,17.7,5.4917,7,329,16.1,4.86,33.1 306 | 0.05515,33,2.18,0,0.472,7.236,41.1,4.022,7,222,18.4,6.93,36.1 307 | 0.05479,33,2.18,0,0.472,6.616,58.1,3.37,7,222,18.4,8.93,28.4 308 | 0.07503,33,2.18,0,0.472,7.42,71.9,3.0992,7,222,18.4,6.47,33.4 309 | 0.04932,33,2.18,0,0.472,6.849,70.3,3.1827,7,222,18.4,7.53,28.2 310 | 0.49298,0,9.9,0,0.544,6.635,82.5,3.3175,4,304,18.4,4.54,22.8 311 | 0.3494,0,9.9,0,0.544,5.972,76.7,3.1025,4,304,18.4,9.97,20.3 312 | 2.63548,0,9.9,0,0.544,4.973,37.8,2.5194,4,304,18.4,12.64,16.1 313 | 0.79041,0,9.9,0,0.544,6.122,52.8,2.6403,4,304,18.4,5.98,22.1 314 | 0.26169,0,9.9,0,0.544,6.023,90.4,2.834,4,304,18.4,11.72,19.4 315 | 0.26938,0,9.9,0,0.544,6.266,82.8,3.2628,4,304,18.4,7.9,21.6 316 | 0.3692,0,9.9,0,0.544,6.567,87.3,3.6023,4,304,18.4,9.28,23.8 317 | 0.25356,0,9.9,0,0.544,5.705,77.7,3.945,4,304,18.4,11.5,16.2 318 | 0.31827,0,9.9,0,0.544,5.914,83.2,3.9986,4,304,18.4,18.33,17.8 319 | 0.24522,0,9.9,0,0.544,5.782,71.7,4.0317,4,304,18.4,15.94,19.8 320 | 0.40202,0,9.9,0,0.544,6.382,67.2,3.5325,4,304,18.4,10.36,23.1 321 | 0.47547,0,9.9,0,0.544,6.113,58.8,4.0019,4,304,18.4,12.73,21 322 | 0.1676,0,7.38,0,0.493,6.426,52.3,4.5404,5,287,19.6,7.2,23.8 323 | 0.18159,0,7.38,0,0.493,6.376,54.3,4.5404,5,287,19.6,6.87,23.1 324 | 0.35114,0,7.38,0,0.493,6.041,49.9,4.7211,5,287,19.6,7.7,20.4 325 | 0.28392,0,7.38,0,0.493,5.708,74.3,4.7211,5,287,19.6,11.74,18.5 326 | 0.34109,0,7.38,0,0.493,6.415,40.1,4.7211,5,287,19.6,6.12,25 327 | 0.19186,0,7.38,0,0.493,6.431,14.7,5.4159,5,287,19.6,5.08,24.6 328 | 0.30347,0,7.38,0,0.493,6.312,28.9,5.4159,5,287,19.6,6.15,23 329 | 0.24103,0,7.38,0,0.493,6.083,43.7,5.4159,5,287,19.6,12.79,22.2 330 | 0.06617,0,3.24,0,0.46,5.868,25.8,5.2146,4,430,16.9,9.97,19.3 331 | 0.06724,0,3.24,0,0.46,6.333,17.2,5.2146,4,430,16.9,7.34,22.6 332 | 0.04544,0,3.24,0,0.46,6.144,32.2,5.8736,4,430,16.9,9.09,19.8 333 | 0.05023,35,6.06,0,0.4379,5.706,28.4,6.6407,1,304,16.9,12.43,17.1 334 | 0.03466,35,6.06,0,0.4379,6.031,23.3,6.6407,1,304,16.9,7.83,19.4 335 | 0.05083,0,5.19,0,0.515,6.316,38.1,6.4584,5,224,20.2,5.68,22.2 336 | 0.03738,0,5.19,0,0.515,6.31,38.5,6.4584,5,224,20.2,6.75,20.7 337 | 0.03961,0,5.19,0,0.515,6.037,34.5,5.9853,5,224,20.2,8.01,21.1 338 | 0.03427,0,5.19,0,0.515,5.869,46.3,5.2311,5,224,20.2,9.8,19.5 339 | 0.03041,0,5.19,0,0.515,5.895,59.6,5.615,5,224,20.2,10.56,18.5 340 | 0.03306,0,5.19,0,0.515,6.059,37.3,4.8122,5,224,20.2,8.51,20.6 341 | 0.05497,0,5.19,0,0.515,5.985,45.4,4.8122,5,224,20.2,9.74,19 342 | 0.06151,0,5.19,0,0.515,5.968,58.5,4.8122,5,224,20.2,9.29,18.7 343 | 0.01301,35,1.52,0,0.442,7.241,49.3,7.0379,1,284,15.5,5.49,32.7 344 | 0.02498,0,1.89,0,0.518,6.54,59.7,6.2669,1,422,15.9,8.65,16.5 345 | 0.02543,55,3.78,0,0.484,6.696,56.4,5.7321,5,370,17.6,7.18,23.9 346 | 0.03049,55,3.78,0,0.484,6.874,28.1,6.4654,5,370,17.6,4.61,31.2 347 | 0.03113,0,4.39,0,0.442,6.014,48.5,8.0136,3,352,18.8,10.53,17.5 348 | 0.06162,0,4.39,0,0.442,5.898,52.3,8.0136,3,352,18.8,12.67,17.2 349 | 0.0187,85,4.15,0,0.429,6.516,27.7,8.5353,4,351,17.9,6.36,23.1 350 | 0.01501,80,2.01,0,0.435,6.635,29.7,8.344,4,280,17,5.99,24.5 351 | 0.02899,40,1.25,0,0.429,6.939,34.5,8.7921,1,335,19.7,5.89,26.6 352 | 0.06211,40,1.25,0,0.429,6.49,44.4,8.7921,1,335,19.7,5.98,22.9 353 | 0.0795,60,1.69,0,0.411,6.579,35.9,10.7103,4,411,18.3,5.49,24.1 354 | 0.07244,60,1.69,0,0.411,5.884,18.5,10.7103,4,411,18.3,7.79,18.6 355 | 0.01709,90,2.02,0,0.41,6.728,36.1,12.1265,5,187,17,4.5,30.1 356 | 0.04301,80,1.91,0,0.413,5.663,21.9,10.5857,4,334,22,8.05,18.2 357 | 0.10659,80,1.91,0,0.413,5.936,19.5,10.5857,4,334,22,5.57,20.6 358 | 8.98296,0,18.1,1,0.77,6.212,97.4,2.1222,24,666,20.2,17.6,17.8 359 | 3.8497,0,18.1,1,0.77,6.395,91,2.5052,24,666,20.2,13.27,21.7 360 | 5.20177,0,18.1,1,0.77,6.127,83.4,2.7227,24,666,20.2,11.48,22.7 361 | 4.26131,0,18.1,0,0.77,6.112,81.3,2.5091,24,666,20.2,12.67,22.6 362 | 4.54192,0,18.1,0,0.77,6.398,88,2.5182,24,666,20.2,7.79,25 363 | 3.83684,0,18.1,0,0.77,6.251,91.1,2.2955,24,666,20.2,14.19,19.9 364 | 3.67822,0,18.1,0,0.77,5.362,96.2,2.1036,24,666,20.2,10.19,20.8 365 | 4.22239,0,18.1,1,0.77,5.803,89,1.9047,24,666,20.2,14.64,16.8 366 | 3.47428,0,18.1,1,0.718,8.78,82.9,1.9047,24,666,20.2,5.29,21.9 367 | 4.55587,0,18.1,0,0.718,3.561,87.9,1.6132,24,666,20.2,7.12,27.5 368 | 3.69695,0,18.1,0,0.718,4.963,91.4,1.7523,24,666,20.2,14,21.9 369 | 13.5222,0,18.1,0,0.631,3.863,100,1.5106,24,666,20.2,13.33,23.1 370 | 4.89822,0,18.1,0,0.631,4.97,100,1.3325,24,666,20.2,3.26,50 371 | 5.66998,0,18.1,1,0.631,6.683,96.8,1.3567,24,666,20.2,3.73,50 372 | 6.53876,0,18.1,1,0.631,7.016,97.5,1.2024,24,666,20.2,2.96,50 373 | 9.2323,0,18.1,0,0.631,6.216,100,1.1691,24,666,20.2,9.53,50 374 | 8.26725,0,18.1,1,0.668,5.875,89.6,1.1296,24,666,20.2,8.88,50 375 | 11.1081,0,18.1,0,0.668,4.906,100,1.1742,24,666,20.2,34.77,13.8 376 | 18.4982,0,18.1,0,0.668,4.138,100,1.137,24,666,20.2,37.97,13.8 377 | 19.6091,0,18.1,0,0.671,7.313,97.9,1.3163,24,666,20.2,13.44,15 378 | 15.288,0,18.1,0,0.671,6.649,93.3,1.3449,24,666,20.2,23.24,13.9 379 | 9.82349,0,18.1,0,0.671,6.794,98.8,1.358,24,666,20.2,21.24,13.3 380 | 23.6482,0,18.1,0,0.671,6.38,96.2,1.3861,24,666,20.2,23.69,13.1 381 | 17.8667,0,18.1,0,0.671,6.223,100,1.3861,24,666,20.2,21.78,10.2 382 | 88.9762,0,18.1,0,0.671,6.968,91.9,1.4165,24,666,20.2,17.21,10.4 383 | 15.8744,0,18.1,0,0.671,6.545,99.1,1.5192,24,666,20.2,21.08,10.9 384 | 9.18702,0,18.1,0,0.7,5.536,100,1.5804,24,666,20.2,23.6,11.3 385 | 7.99248,0,18.1,0,0.7,5.52,100,1.5331,24,666,20.2,24.56,12.3 386 | 20.0849,0,18.1,0,0.7,4.368,91.2,1.4395,24,666,20.2,30.63,8.8 387 | 16.8118,0,18.1,0,0.7,5.277,98.1,1.4261,24,666,20.2,30.81,7.2 388 | 24.3938,0,18.1,0,0.7,4.652,100,1.4672,24,666,20.2,28.28,10.5 389 | 22.5971,0,18.1,0,0.7,5,89.5,1.5184,24,666,20.2,31.99,7.4 390 | 14.3337,0,18.1,0,0.7,4.88,100,1.5895,24,666,20.2,30.62,10.2 391 | 8.15174,0,18.1,0,0.7,5.39,98.9,1.7281,24,666,20.2,20.85,11.5 392 | 6.96215,0,18.1,0,0.7,5.713,97,1.9265,24,666,20.2,17.11,15.1 393 | 5.29305,0,18.1,0,0.7,6.051,82.5,2.1678,24,666,20.2,18.76,23.2 394 | 11.5779,0,18.1,0,0.7,5.036,97,1.77,24,666,20.2,25.68,9.7 395 | 8.64476,0,18.1,0,0.693,6.193,92.6,1.7912,24,666,20.2,15.17,13.8 396 | 13.3598,0,18.1,0,0.693,5.887,94.7,1.7821,24,666,20.2,16.35,12.7 397 | 8.71675,0,18.1,0,0.693,6.471,98.8,1.7257,24,666,20.2,17.12,13.1 398 | 5.87205,0,18.1,0,0.693,6.405,96,1.6768,24,666,20.2,19.37,12.5 399 | 7.67202,0,18.1,0,0.693,5.747,98.9,1.6334,24,666,20.2,19.92,8.5 400 | 38.3518,0,18.1,0,0.693,5.453,100,1.4896,24,666,20.2,30.59,5 401 | 9.91655,0,18.1,0,0.693,5.852,77.8,1.5004,24,666,20.2,29.97,6.3 402 | 25.0461,0,18.1,0,0.693,5.987,100,1.5888,24,666,20.2,26.77,5.6 403 | 14.2362,0,18.1,0,0.693,6.343,100,1.5741,24,666,20.2,20.32,7.2 404 | 9.59571,0,18.1,0,0.693,6.404,100,1.639,24,666,20.2,20.31,12.1 405 | 24.8017,0,18.1,0,0.693,5.349,96,1.7028,24,666,20.2,19.77,8.3 406 | 41.5292,0,18.1,0,0.693,5.531,85.4,1.6074,24,666,20.2,27.38,8.5 407 | 67.9208,0,18.1,0,0.693,5.683,100,1.4254,24,666,20.2,22.98,5 408 | 20.7162,0,18.1,0,0.659,4.138,100,1.1781,24,666,20.2,23.34,11.9 409 | 11.9511,0,18.1,0,0.659,5.608,100,1.2852,24,666,20.2,12.13,27.9 410 | 7.40389,0,18.1,0,0.597,5.617,97.9,1.4547,24,666,20.2,26.4,17.2 411 | 14.4383,0,18.1,0,0.597,6.852,100,1.4655,24,666,20.2,19.78,27.5 412 | 51.1358,0,18.1,0,0.597,5.757,100,1.413,24,666,20.2,10.11,15 413 | 14.0507,0,18.1,0,0.597,6.657,100,1.5275,24,666,20.2,21.22,17.2 414 | 18.811,0,18.1,0,0.597,4.628,100,1.5539,24,666,20.2,34.37,17.9 415 | 28.6558,0,18.1,0,0.597,5.155,100,1.5894,24,666,20.2,20.08,16.3 416 | 45.7461,0,18.1,0,0.693,4.519,100,1.6582,24,666,20.2,36.98,7 417 | 18.0846,0,18.1,0,0.679,6.434,100,1.8347,24,666,20.2,29.05,7.2 418 | 10.8342,0,18.1,0,0.679,6.782,90.8,1.8195,24,666,20.2,25.79,7.5 419 | 25.9406,0,18.1,0,0.679,5.304,89.1,1.6475,24,666,20.2,26.64,10.4 420 | 73.5341,0,18.1,0,0.679,5.957,100,1.8026,24,666,20.2,20.62,8.8 421 | 11.8123,0,18.1,0,0.718,6.824,76.5,1.794,24,666,20.2,22.74,8.4 422 | 11.0874,0,18.1,0,0.718,6.411,100,1.8589,24,666,20.2,15.02,16.7 423 | 7.02259,0,18.1,0,0.718,6.006,95.3,1.8746,24,666,20.2,15.7,14.2 424 | 12.0482,0,18.1,0,0.614,5.648,87.6,1.9512,24,666,20.2,14.1,20.8 425 | 7.05042,0,18.1,0,0.614,6.103,85.1,2.0218,24,666,20.2,23.29,13.4 426 | 8.79212,0,18.1,0,0.584,5.565,70.6,2.0635,24,666,20.2,17.16,11.7 427 | 15.8603,0,18.1,0,0.679,5.896,95.4,1.9096,24,666,20.2,24.39,8.3 428 | 12.2472,0,18.1,0,0.584,5.837,59.7,1.9976,24,666,20.2,15.69,10.2 429 | 37.6619,0,18.1,0,0.679,6.202,78.7,1.8629,24,666,20.2,14.52,10.9 430 | 7.36711,0,18.1,0,0.679,6.193,78.1,1.9356,24,666,20.2,21.52,11 431 | 9.33889,0,18.1,0,0.679,6.38,95.6,1.9682,24,666,20.2,24.08,9.5 432 | 8.49213,0,18.1,0,0.584,6.348,86.1,2.0527,24,666,20.2,17.64,14.5 433 | 10.0623,0,18.1,0,0.584,6.833,94.3,2.0882,24,666,20.2,19.69,14.1 434 | 6.44405,0,18.1,0,0.584,6.425,74.8,2.2004,24,666,20.2,12.03,16.1 435 | 5.58107,0,18.1,0,0.713,6.436,87.9,2.3158,24,666,20.2,16.22,14.3 436 | 13.9134,0,18.1,0,0.713,6.208,95,2.2222,24,666,20.2,15.17,11.7 437 | 11.1604,0,18.1,0,0.74,6.629,94.6,2.1247,24,666,20.2,23.27,13.4 438 | 14.4208,0,18.1,0,0.74,6.461,93.3,2.0026,24,666,20.2,18.05,9.6 439 | 15.1772,0,18.1,0,0.74,6.152,100,1.9142,24,666,20.2,26.45,8.7 440 | 13.6781,0,18.1,0,0.74,5.935,87.9,1.8206,24,666,20.2,34.02,8.4 441 | 9.39063,0,18.1,0,0.74,5.627,93.9,1.8172,24,666,20.2,22.88,12.8 442 | 22.0511,0,18.1,0,0.74,5.818,92.4,1.8662,24,666,20.2,22.11,10.5 443 | 9.72418,0,18.1,0,0.74,6.406,97.2,2.0651,24,666,20.2,19.52,17.1 444 | 5.66637,0,18.1,0,0.74,6.219,100,2.0048,24,666,20.2,16.59,18.4 445 | 9.96654,0,18.1,0,0.74,6.485,100,1.9784,24,666,20.2,18.85,15.4 446 | 12.8023,0,18.1,0,0.74,5.854,96.6,1.8956,24,666,20.2,23.79,10.8 447 | 10.6718,0,18.1,0,0.74,6.459,94.8,1.9879,24,666,20.2,23.98,11.8 448 | 6.28807,0,18.1,0,0.74,6.341,96.4,2.072,24,666,20.2,17.79,14.9 449 | 9.92485,0,18.1,0,0.74,6.251,96.6,2.198,24,666,20.2,16.44,12.6 450 | 9.32909,0,18.1,0,0.713,6.185,98.7,2.2616,24,666,20.2,18.13,14.1 451 | 7.52601,0,18.1,0,0.713,6.417,98.3,2.185,24,666,20.2,19.31,13 452 | 6.71772,0,18.1,0,0.713,6.749,92.6,2.3236,24,666,20.2,17.44,13.4 453 | 5.44114,0,18.1,0,0.713,6.655,98.2,2.3552,24,666,20.2,17.73,15.2 454 | 5.09017,0,18.1,0,0.713,6.297,91.8,2.3682,24,666,20.2,17.27,16.1 455 | 8.24809,0,18.1,0,0.713,7.393,99.3,2.4527,24,666,20.2,16.74,17.8 456 | 9.51363,0,18.1,0,0.713,6.728,94.1,2.4961,24,666,20.2,18.71,14.9 457 | 4.75237,0,18.1,0,0.713,6.525,86.5,2.4358,24,666,20.2,18.13,14.1 458 | 4.66883,0,18.1,0,0.713,5.976,87.9,2.5806,24,666,20.2,19.01,12.7 459 | 8.20058,0,18.1,0,0.713,5.936,80.3,2.7792,24,666,20.2,16.94,13.5 460 | 7.75223,0,18.1,0,0.713,6.301,83.7,2.7831,24,666,20.2,16.23,14.9 461 | 6.80117,0,18.1,0,0.713,6.081,84.4,2.7175,24,666,20.2,14.7,20 462 | 4.81213,0,18.1,0,0.713,6.701,90,2.5975,24,666,20.2,16.42,16.4 463 | 3.69311,0,18.1,0,0.713,6.376,88.4,2.5671,24,666,20.2,14.65,17.7 464 | 6.65492,0,18.1,0,0.713,6.317,83,2.7344,24,666,20.2,13.99,19.5 465 | 5.82115,0,18.1,0,0.713,6.513,89.9,2.8016,24,666,20.2,10.29,20.2 466 | 7.83932,0,18.1,0,0.655,6.209,65.4,2.9634,24,666,20.2,13.22,21.4 467 | 3.1636,0,18.1,0,0.655,5.759,48.2,3.0665,24,666,20.2,14.13,19.9 468 | 3.77498,0,18.1,0,0.655,5.952,84.7,2.8715,24,666,20.2,17.15,19 469 | 4.42228,0,18.1,0,0.584,6.003,94.5,2.5403,24,666,20.2,21.32,19.1 470 | 15.5757,0,18.1,0,0.58,5.926,71,2.9084,24,666,20.2,18.13,19.1 471 | 13.0751,0,18.1,0,0.58,5.713,56.7,2.8237,24,666,20.2,14.76,20.1 472 | 4.34879,0,18.1,0,0.58,6.167,84,3.0334,24,666,20.2,16.29,19.9 473 | 4.03841,0,18.1,0,0.532,6.229,90.7,3.0993,24,666,20.2,12.87,19.6 474 | 3.56868,0,18.1,0,0.58,6.437,75,2.8965,24,666,20.2,14.36,23.2 475 | 4.64689,0,18.1,0,0.614,6.98,67.6,2.5329,24,666,20.2,11.66,29.8 476 | 8.05579,0,18.1,0,0.584,5.427,95.4,2.4298,24,666,20.2,18.14,13.8 477 | 6.39312,0,18.1,0,0.584,6.162,97.4,2.206,24,666,20.2,24.1,13.3 478 | 4.87141,0,18.1,0,0.614,6.484,93.6,2.3053,24,666,20.2,18.68,16.7 479 | 15.0234,0,18.1,0,0.614,5.304,97.3,2.1007,24,666,20.2,24.91,12 480 | 10.233,0,18.1,0,0.614,6.185,96.7,2.1705,24,666,20.2,18.03,14.6 481 | 14.3337,0,18.1,0,0.614,6.229,88,1.9512,24,666,20.2,13.11,21.4 482 | 5.82401,0,18.1,0,0.532,6.242,64.7,3.4242,24,666,20.2,10.74,23 483 | 5.70818,0,18.1,0,0.532,6.75,74.9,3.3317,24,666,20.2,7.74,23.7 484 | 5.73116,0,18.1,0,0.532,7.061,77,3.4106,24,666,20.2,7.01,25 485 | 2.81838,0,18.1,0,0.532,5.762,40.3,4.0983,24,666,20.2,10.42,21.8 486 | 2.37857,0,18.1,0,0.583,5.871,41.9,3.724,24,666,20.2,13.34,20.6 487 | 3.67367,0,18.1,0,0.583,6.312,51.9,3.9917,24,666,20.2,10.58,21.2 488 | 5.69175,0,18.1,0,0.583,6.114,79.8,3.5459,24,666,20.2,14.98,19.1 489 | 4.83567,0,18.1,0,0.583,5.905,53.2,3.1523,24,666,20.2,11.45,20.6 490 | 0.15086,0,27.74,0,0.609,5.454,92.7,1.8209,4,711,20.1,18.06,15.2 491 | 0.18337,0,27.74,0,0.609,5.414,98.3,1.7554,4,711,20.1,23.97,7 492 | 0.20746,0,27.74,0,0.609,5.093,98,1.8226,4,711,20.1,29.68,8.1 493 | 0.10574,0,27.74,0,0.609,5.983,98.8,1.8681,4,711,20.1,18.07,13.6 494 | 0.11132,0,27.74,0,0.609,5.983,83.5,2.1099,4,711,20.1,13.35,20.1 495 | 0.17331,0,9.69,0,0.585,5.707,54,2.3817,6,391,19.2,12.01,21.8 496 | 0.27957,0,9.69,0,0.585,5.926,42.6,2.3817,6,391,19.2,13.59,24.5 497 | 0.17899,0,9.69,0,0.585,5.67,28.8,2.7986,6,391,19.2,17.6,23.1 498 | 0.2896,0,9.69,0,0.585,5.39,72.9,2.7986,6,391,19.2,21.14,19.7 499 | 0.26838,0,9.69,0,0.585,5.794,70.6,2.8927,6,391,19.2,14.1,18.3 500 | 0.23912,0,9.69,0,0.585,6.019,65.3,2.4091,6,391,19.2,12.92,21.2 501 | 0.17783,0,9.69,0,0.585,5.569,73.5,2.3999,6,391,19.2,15.1,17.5 502 | 0.22438,0,9.69,0,0.585,6.027,79.7,2.4982,6,391,19.2,14.33,16.8 503 | 0.06263,0,11.93,0,0.573,6.593,69.1,2.4786,1,273,21,9.67,22.4 504 | 0.04527,0,11.93,0,0.573,6.12,76.7,2.2875,1,273,21,9.08,20.6 505 | 0.06076,0,11.93,0,0.573,6.976,91,2.1675,1,273,21,5.64,23.9 506 | 0.10959,0,11.93,0,0.573,6.794,89.3,2.3889,1,273,21,6.48,22 507 | 0.04741,0,11.93,0,0.573,6.03,80.8,2.505,1,273,21,7.88,11.9 508 | -------------------------------------------------------------------------------- /samples/spark/tutorials/realtime/realtimewebservices.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "deletable": true, 7 | "editable": true 8 | }, 9 | "source": [ 10 | "## Building your first AzureML Spark web service\n", 11 | "\n", 12 | "In this tutorial, we will walk you through loading a dataset, exploring\n", 13 | "its features, training a model on the dataset, and then publishing a\n", 14 | "realtime scoring API for the model.\n", 15 | "\n", 16 | "First, let's read in the Boston Housing Price dataset. We have placed a copy in your azureml/datasets folder." 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 25, 22 | "metadata": { 23 | "collapsed": false, 24 | "deletable": true, 25 | "editable": true 26 | }, 27 | "outputs": [], 28 | "source": [ 29 | "# Import Azure ML API SDK. The SDK is installed implicitly with the latest\n", 30 | "# version of the CLI in your default python environment\n", 31 | "from azureml.api.schema.dataTypes import DataTypes\n", 32 | "from azureml.api.schema.sampleDefinition import SampleDefinition\n", 33 | "from azureml.api.realtime.services import generate_schema" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": null, 39 | "metadata": { 40 | "collapsed": false, 41 | "deletable": true, 42 | "editable": true, 43 | "scrolled": true 44 | }, 45 | "outputs": [], 46 | "source": [ 47 | "# Read in the housing price dataset\n", 48 | "df2 = spark.read.csv(\"../datasets/housing.csv\", header=True, inferSchema=True)\n", 49 | "df2.show()\n", 50 | "df2.printSchema()" 51 | ] 52 | }, 53 | { 54 | "cell_type": "markdown", 55 | "metadata": { 56 | "deletable": true, 57 | "editable": true 58 | }, 59 | "source": [ 60 | "### Train your model\n", 61 | "\n", 62 | "Using Spark's ML library, we can train a gradient boosted tree regressor for our data to produce a model that can predict median values of houses in Boston. Once we have trained the model, we can then evaluate it for quality using the root mean squared error metric." 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 27, 68 | "metadata": { 69 | "collapsed": true, 70 | "deletable": true, 71 | "editable": true 72 | }, 73 | "outputs": [], 74 | "source": [ 75 | "# Train a boosted decision tree regressor\n", 76 | "from pyspark.ml.feature import RFormula\n", 77 | "from pyspark.ml.regression import GBTRegressor\n", 78 | "from pyspark.ml.pipeline import Pipeline\n", 79 | "import numpy as np\n", 80 | "formula = RFormula(formula=\"MEDV~.\")\n", 81 | "gbt = GBTRegressor()\n", 82 | "pipeline = Pipeline(stages=[formula, gbt]).fit(df2)" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 28, 88 | "metadata": { 89 | "collapsed": false, 90 | "deletable": true, 91 | "editable": true 92 | }, 93 | "outputs": [ 94 | { 95 | "name": "stdout", 96 | "output_type": "stream", 97 | "text": [ 98 | "R^2 error = 0.9776138989970254\n" 99 | ] 100 | } 101 | ], 102 | "source": [ 103 | "# Evaluate scores\n", 104 | "scores = pipeline.transform(df2)\n", 105 | "from pyspark.ml.evaluation import RegressionEvaluator\n", 106 | "print(\"R^2 error = \" + str(RegressionEvaluator(metricName=\"r2\").evaluate(scores)))" 107 | ] 108 | }, 109 | { 110 | "cell_type": "markdown", 111 | "metadata": { 112 | "deletable": true, 113 | "editable": true 114 | }, 115 | "source": [ 116 | "### Save your model and schema\n", 117 | "\n", 118 | "Once you have a model that performs well, you can package it into a scoring service. To prepare for this, save your model and dataset schema locally first." 119 | ] 120 | }, 121 | { 122 | "cell_type": "code", 123 | "execution_count": 29, 124 | "metadata": { 125 | "collapsed": false, 126 | "deletable": true, 127 | "editable": true 128 | }, 129 | "outputs": [ 130 | { 131 | "name": "stdout", 132 | "output_type": "stream", 133 | "text": [ 134 | "Model saved\n" 135 | ] 136 | } 137 | ], 138 | "source": [ 139 | "# Save model\n", 140 | "pipeline.write().overwrite().save(\"housing.model\")\n", 141 | "print(\"Model saved\")" 142 | ] 143 | }, 144 | { 145 | "cell_type": "markdown", 146 | "metadata": { 147 | "deletable": true, 148 | "editable": true 149 | }, 150 | "source": [ 151 | "## Authoring a Realtime Web service\n", 152 | "\n", 153 | "In this section, we show you how to author a realtime web service that scores the model you saved above. \n", 154 | "\n", 155 | "### 1. Define ```init``` and ```run``` and create the ```score.py``` file\n", 156 | "\n", 157 | "We start by defining our ```init``` and ```run``` functions in the cell below. Then write them to the score.py file. This file will load the model, perform the prediction, and return the result.\n", 158 | "\n", 159 | "The ```init``` function initializes your web service, loading in any data or models that you need to score your inputs. In the example below, we load in the trained model. This command is run when the Docker contianer containing your service initializes.\n", 160 | "\n", 161 | "The ```run``` function defines what is executed on a scoring call. In our simple example, we simply load in the input as a data frame, and run our pipeline on the input, and return the prediction. \n", 162 | "\n", 163 | "The %%writefile command will save the score.py file." 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": 30, 169 | "metadata": { 170 | "collapsed": false, 171 | "deletable": true, 172 | "editable": true 173 | }, 174 | "outputs": [ 175 | { 176 | "name": "stdout", 177 | "output_type": "stream", 178 | "text": [ 179 | "Overwriting score.py\n" 180 | ] 181 | } 182 | ], 183 | "source": [ 184 | "%%writefile score.py\n", 185 | "\n", 186 | "def init():\n", 187 | " # read in the model file\n", 188 | " from pyspark.ml import PipelineModel\n", 189 | " global pipeline\n", 190 | " pipeline = PipelineModel.load(\"housing.model\")\n", 191 | " \n", 192 | "def run(input_df):\n", 193 | " response = ''\n", 194 | " \n", 195 | " try:\n", 196 | " #Get prediction results for the dataframe\n", 197 | " score = pipeline.transform(input_df)\n", 198 | " predictions = score.collect()\n", 199 | "\n", 200 | " #Get each scored result\n", 201 | " for pred in predictions:\n", 202 | " response += str(pred['prediction']) + \",\"\n", 203 | " # Remove the last comma\n", 204 | " response = response[:-1]\n", 205 | " except Exception as e:\n", 206 | " return (str(e))\n", 207 | " \n", 208 | " # Return results\n", 209 | " return response" 210 | ] 211 | }, 212 | { 213 | "cell_type": "markdown", 214 | "metadata": { 215 | "deletable": true, 216 | "editable": true 217 | }, 218 | "source": [ 219 | "### Create Schema\n", 220 | "\n", 221 | "Create a schema for the input to the web service." 222 | ] 223 | }, 224 | { 225 | "cell_type": "code", 226 | "execution_count": 31, 227 | "metadata": { 228 | "collapsed": true, 229 | "deletable": true, 230 | "editable": true 231 | }, 232 | "outputs": [], 233 | "source": [ 234 | "# Define the input data frame\n", 235 | "inputs = {\"input_df\": SampleDefinition(DataTypes.SPARK, df2.drop(\"MEDV\"))}" 236 | ] 237 | }, 238 | { 239 | "cell_type": "markdown", 240 | "metadata": { 241 | "deletable": true, 242 | "editable": true 243 | }, 244 | "source": [ 245 | "### Create schema file\n", 246 | "\n", 247 | "Generate the schema file. This will be used to create a Swagger file for your web service which can be used to discover its input and sample data when calling it." 248 | ] 249 | }, 250 | { 251 | "cell_type": "code", 252 | "execution_count": 32, 253 | "metadata": { 254 | "collapsed": false, 255 | "deletable": true, 256 | "editable": true 257 | }, 258 | "outputs": [ 259 | { 260 | "data": { 261 | "text/plain": [ 262 | "{'input': {'input_df': {'internal': {'fields': [{'metadata': {},\n", 263 | " 'name': 'CRIM',\n", 264 | " 'nullable': True,\n", 265 | " 'type': 'double'},\n", 266 | " {'metadata': {}, 'name': 'ZN', 'nullable': True, 'type': 'double'},\n", 267 | " {'metadata': {}, 'name': 'INDUS', 'nullable': True, 'type': 'double'},\n", 268 | " {'metadata': {}, 'name': 'CHAS', 'nullable': True, 'type': 'integer'},\n", 269 | " {'metadata': {}, 'name': 'NOX', 'nullable': True, 'type': 'double'},\n", 270 | " {'metadata': {}, 'name': 'RM', 'nullable': True, 'type': 'double'},\n", 271 | " {'metadata': {}, 'name': 'AGE', 'nullable': True, 'type': 'double'},\n", 272 | " {'metadata': {}, 'name': 'DIS', 'nullable': True, 'type': 'double'},\n", 273 | " {'metadata': {}, 'name': 'RAD', 'nullable': True, 'type': 'integer'},\n", 274 | " {'metadata': {}, 'name': 'TAX', 'nullable': True, 'type': 'integer'},\n", 275 | " {'metadata': {}, 'name': 'PTRATIO', 'nullable': True, 'type': 'double'},\n", 276 | " {'metadata': {}, 'name': 'LSTAT', 'nullable': True, 'type': 'double'}],\n", 277 | " 'type': 'struct'},\n", 278 | " 'swagger': {'example': [{'AGE': 65.2,\n", 279 | " 'CHAS': 0,\n", 280 | " 'CRIM': 0.00632,\n", 281 | " 'DIS': 4.09,\n", 282 | " 'INDUS': 2.31,\n", 283 | " 'LSTAT': 4.98,\n", 284 | " 'NOX': 0.538,\n", 285 | " 'PTRATIO': 15.3,\n", 286 | " 'RAD': 1,\n", 287 | " 'RM': 6.575,\n", 288 | " 'TAX': 296,\n", 289 | " 'ZN': 18.0},\n", 290 | " {'AGE': 78.9,\n", 291 | " 'CHAS': 0,\n", 292 | " 'CRIM': 0.02731,\n", 293 | " 'DIS': 4.9671,\n", 294 | " 'INDUS': 7.07,\n", 295 | " 'LSTAT': 9.14,\n", 296 | " 'NOX': 0.469,\n", 297 | " 'PTRATIO': 17.8,\n", 298 | " 'RAD': 2,\n", 299 | " 'RM': 6.421,\n", 300 | " 'TAX': 242,\n", 301 | " 'ZN': 0.0},\n", 302 | " {'AGE': 61.1,\n", 303 | " 'CHAS': 0,\n", 304 | " 'CRIM': 0.02729,\n", 305 | " 'DIS': 4.9671,\n", 306 | " 'INDUS': 7.07,\n", 307 | " 'LSTAT': 4.03,\n", 308 | " 'NOX': 0.469,\n", 309 | " 'PTRATIO': 17.8,\n", 310 | " 'RAD': 2,\n", 311 | " 'RM': 7.185,\n", 312 | " 'TAX': 242,\n", 313 | " 'ZN': 0.0}],\n", 314 | " 'items': {'properties': {'AGE': {'format': 'double', 'type': 'number'},\n", 315 | " 'CHAS': {'format': 'int32', 'type': 'integer'},\n", 316 | " 'CRIM': {'format': 'double', 'type': 'number'},\n", 317 | " 'DIS': {'format': 'double', 'type': 'number'},\n", 318 | " 'INDUS': {'format': 'double', 'type': 'number'},\n", 319 | " 'LSTAT': {'format': 'double', 'type': 'number'},\n", 320 | " 'NOX': {'format': 'double', 'type': 'number'},\n", 321 | " 'PTRATIO': {'format': 'double', 'type': 'number'},\n", 322 | " 'RAD': {'format': 'int32', 'type': 'integer'},\n", 323 | " 'RM': {'format': 'double', 'type': 'number'},\n", 324 | " 'TAX': {'format': 'int32', 'type': 'integer'},\n", 325 | " 'ZN': {'format': 'double', 'type': 'number'}},\n", 326 | " 'type': 'object'},\n", 327 | " 'type': 'array'},\n", 328 | " 'type': 2}}}" 329 | ] 330 | }, 331 | "execution_count": 32, 332 | "metadata": {}, 333 | "output_type": "execute_result" 334 | } 335 | ], 336 | "source": [ 337 | "import score\n", 338 | "generate_schema(run_func=score.run, inputs=inputs, filepath='service_schema.json')" 339 | ] 340 | }, 341 | { 342 | "cell_type": "markdown", 343 | "metadata": { 344 | "deletable": true, 345 | "editable": true 346 | }, 347 | "source": [ 348 | "### 3. Test ```init``` and ```run```\n", 349 | "\n", 350 | "We can then test the ```init``` and ```run``` functions right here in the notebook, before we decide to actually publish a web service." 351 | ] 352 | }, 353 | { 354 | "cell_type": "code", 355 | "execution_count": 33, 356 | "metadata": { 357 | "collapsed": false, 358 | "deletable": true, 359 | "editable": true 360 | }, 361 | "outputs": [ 362 | { 363 | "name": "stdout", 364 | "output_type": "stream", 365 | "text": [ 366 | "18.687468518340438,19.21096852021207,24.48585095195574\n" 367 | ] 368 | } 369 | ], 370 | "source": [ 371 | "# Create the sample input dataframe\n", 372 | "input_data = [[0.00632, 18.0, 2.31, 0, 0.538, 6.575, 65.2, 4.09, 1, 296, 15.3, 4.98, 24.0],[0.00632, 59.0, 2.31, 0, 0.538, 6.575, 65.2, 4.09, 1, 296, 15.3, 4.98, 24.0],[0.00332, 76.0, 2.31, 0, 0.538, 6.575, 65.2, 4.09, 1, 296, 15.3, 4.98, 12.0]]\n", 373 | "df = spark.createDataFrame(input_data, [\"CRIM\", \"ZN\", \"INDUS\", \"CHAS\", \"NOX\", \"RM\", \"AGE\", \"DIS\", \"RAD\", \"TAX\", \"PTRATIO\", \"B\", \"LSTAT\"])\n", 374 | "\n", 375 | "#Call the run function to score using the model\n", 376 | "score.init() #Score file imported above\n", 377 | "print(score.run(df))" 378 | ] 379 | }, 380 | { 381 | "cell_type": "markdown", 382 | "metadata": { 383 | "deletable": true, 384 | "editable": true 385 | }, 386 | "source": [ 387 | "### 4. Use the CLI to deploy and manage your web service\n", 388 | "\n", 389 | "#### Pre-requisites\n", 390 | "\n", 391 | "Use the following commands to set up an environment and account to run the web service. For more info, see the Getting Started Guide and the CLI Command Reference. You can use -h flag at the end of the commands for command help.\n", 392 | "\n", 393 | "* Create the environment (you need to do this once per environment e.g. dev or prod)\n", 394 | "\n", 395 | "```\n", 396 | "az ml env setup -c -n --location \n", 397 | "```\n", 398 | "* Create a Model Management account (one time setup)\n", 399 | "\n", 400 | "```\n", 401 | "az ml account modelmanagement create --location -n -g --sku-instances 1 --sku-name S1\n", 402 | "```\n", 403 | "\n", 404 | "* Set the Model Management account\n", 405 | "\n", 406 | "```\n", 407 | "az ml account modelmanagement set -n -g \n", 408 | "```\n", 409 | "\n", 410 | "* Set the environment. The cluster name is the name used in step 1 above. The resource group name was the output of the same process and would be in the command window when the setup process is completed.\n", 411 | "\n", 412 | "```\n", 413 | "az ml env set -n -g \n", 414 | "```\n", 415 | "\n", 416 | "#### Deploy your web service\n", 417 | "\n", 418 | "Switch to a bash shell, and run the following commands to deploy your service and run it.\n", 419 | "\n", 420 | "Enter the path where the notebook and other files are saved. Your actual path may be different from this example.\n", 421 | "```\n", 422 | "cd ~/notebooks/azureml/spark/realtime/\n", 423 | "```\n", 424 | "This assumes that you saved your model locally.\n", 425 | "```\n", 426 | "az ml service create realtime --model-file housing.model -f score.py -n housingservice -s service_schema.json -r spark-py\n", 427 | "```\n", 428 | "This command will return the sample run command with sample data. \n", 429 | "You can get the Service Id from the output of the create command above.\n", 430 | "```\n", 431 | "az ml service show realtime -i \n", 432 | "```\n", 433 | "Call the web service to get a prediction\n", 434 | "```\n", 435 | "az ml service run realtime -i -d \"{\\\"input_df\\\": [{\\\"CRIM\\\": 0.00632, \\\"RM\\\": 6.575, \\\"TAX\\\": 296, \\\"NOX\\\": 0.538, \\\"PTRATIO\\\": 15.3, \\\"LSTAT\\\": 4.98, \\\"CHAS\\\": 0, \\\"DIS\\\": 4.09, \\\"INDUS\\\": 2.31, \\\"RAD\\\": 1, \\\"ZN\\\": 18.0, \\\"AGE\\\": 65.2}]}\"\n", 436 | "```\n", 437 | "Prediction result:\n", 438 | "\n", 439 | "{'result': '24.27495913312397'}" 440 | ] 441 | }, 442 | { 443 | "cell_type": "code", 444 | "execution_count": null, 445 | "metadata": { 446 | "collapsed": true 447 | }, 448 | "outputs": [], 449 | "source": [] 450 | } 451 | ], 452 | "metadata": { 453 | "anaconda-cloud": {}, 454 | "kernelspec": { 455 | "display_name": "Python 3 Spark - local", 456 | "language": "python", 457 | "name": "spark-3-python" 458 | }, 459 | "language_info": { 460 | "codemirror_mode": { 461 | "name": "ipython", 462 | "version": 3 463 | }, 464 | "file_extension": ".py", 465 | "mimetype": "text/x-python", 466 | "name": "python", 467 | "nbconvert_exporter": "python", 468 | "pygments_lexer": "ipython3", 469 | "version": "3.5.2" 470 | } 471 | }, 472 | "nbformat": 4, 473 | "nbformat_minor": 1 474 | } 475 | --------------------------------------------------------------------------------