1# Copyright (c) 2015 Amazon.com, Inc. or its affiliates.  All Rights Reserved
2#
3# Permission is hereby granted, free of charge, to any person obtaining a
4# copy of this software and associated documentation files (the
5# "Software"), to deal in the Software without restriction, including
6# without limitation the rights to use, copy, modify, merge, publish, dis-
7# tribute, sublicense, and/or sell copies of the Software, and to permit
8# persons to whom the Software is furnished to do so, subject to the fol-
9# lowing conditions:
10#
11# The above copyright notice and this permission notice shall be included
12# in all copies or substantial portions of the Software.
13#
14# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
16# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
17# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20# IN THE SOFTWARE.
21#
22
23import boto
24from boto.compat import json, urlsplit
25from boto.connection import AWSQueryConnection
26from boto.regioninfo import RegionInfo
27from boto.exception import JSONResponseError
28from boto.machinelearning import exceptions
29
30
31class MachineLearningConnection(AWSQueryConnection):
32    """
33    Definition of the public APIs exposed by Amazon Machine Learning
34    """
35    APIVersion = "2014-12-12"
36    AuthServiceName = 'machinelearning'
37    DefaultRegionName = "us-east-1"
38    DefaultRegionEndpoint = "machinelearning.us-east-1.amazonaws.com"
39    ServiceName = "MachineLearning"
40    TargetPrefix = "AmazonML_20141212"
41    ResponseError = JSONResponseError
42
43    _faults = {
44        "InternalServerException": exceptions.InternalServerException,
45        "LimitExceededException": exceptions.LimitExceededException,
46        "ResourceNotFoundException": exceptions.ResourceNotFoundException,
47        "IdempotentParameterMismatchException": exceptions.IdempotentParameterMismatchException,
48        "PredictorNotMountedException": exceptions.PredictorNotMountedException,
49        "InvalidInputException": exceptions.InvalidInputException,
50    }
51
52
53    def __init__(self, **kwargs):
54        region = kwargs.pop('region', None)
55        if not region:
56            region = RegionInfo(self, self.DefaultRegionName,
57                                self.DefaultRegionEndpoint)
58
59        if 'host' not in kwargs or kwargs['host'] is None:
60            kwargs['host'] = region.endpoint
61
62        super(MachineLearningConnection, self).__init__(**kwargs)
63        self.region = region
64        self.auth_region_name = self.region.name
65
66    def _required_auth_capability(self):
67        return ['hmac-v4']
68
69    def create_batch_prediction(self, batch_prediction_id, ml_model_id,
70                                batch_prediction_data_source_id, output_uri,
71                                batch_prediction_name=None):
72        """
73        Generates predictions for a group of observations. The
74        observations to process exist in one or more data files
75        referenced by a `DataSource`. This operation creates a new
76        `BatchPrediction`, and uses an `MLModel` and the data files
77        referenced by the `DataSource` as information sources.
78
79        `CreateBatchPrediction` is an asynchronous operation. In
80        response to `CreateBatchPrediction`, Amazon Machine Learning
81        (Amazon ML) immediately returns and sets the `BatchPrediction`
82        status to `PENDING`. After the `BatchPrediction` completes,
83        Amazon ML sets the status to `COMPLETED`.
84
85        You can poll for status updates by using the
86        GetBatchPrediction operation and checking the `Status`
87        parameter of the result. After the `COMPLETED` status appears,
88        the results are available in the location specified by the
89        `OutputUri` parameter.
90
91        :type batch_prediction_id: string
92        :param batch_prediction_id: A user-supplied ID that uniquely identifies
93            the `BatchPrediction`.
94
95        :type batch_prediction_name: string
96        :param batch_prediction_name: A user-supplied name or description of
97            the `BatchPrediction`. `BatchPredictionName` can only use the UTF-8
98            character set.
99
100        :type ml_model_id: string
101        :param ml_model_id: The ID of the `MLModel` that will generate
102            predictions for the group of observations.
103
104        :type batch_prediction_data_source_id: string
105        :param batch_prediction_data_source_id: The ID of the `DataSource` that
106            points to the group of observations to predict.
107
108        :type output_uri: string
109        :param output_uri: The location of an Amazon Simple Storage Service
110            (Amazon S3) bucket or directory to store the batch prediction
111            results. The following substrings are not allowed in the s3 key
112            portion of the "outputURI" field: ':', '//', '/./', '/../'.
113        Amazon ML needs permissions to store and retrieve the logs on your
114            behalf. For information about how to set permissions, see the
115            `Amazon Machine Learning Developer Guide`_.
116
117        """
118        params = {
119            'BatchPredictionId': batch_prediction_id,
120            'MLModelId': ml_model_id,
121            'BatchPredictionDataSourceId': batch_prediction_data_source_id,
122            'OutputUri': output_uri,
123        }
124        if batch_prediction_name is not None:
125            params['BatchPredictionName'] = batch_prediction_name
126        return self.make_request(action='CreateBatchPrediction',
127                                 body=json.dumps(params))
128
129    def create_data_source_from_rds(self, data_source_id, rds_data, role_arn,
130                                    data_source_name=None,
131                                    compute_statistics=None):
132        """
133        Creates a `DataSource` object from an ` Amazon Relational
134        Database Service`_ (Amazon RDS). A `DataSource` references
135        data that can be used to perform CreateMLModel,
136        CreateEvaluation, or CreateBatchPrediction operations.
137
138        `CreateDataSourceFromRDS` is an asynchronous operation. In
139        response to `CreateDataSourceFromRDS`, Amazon Machine Learning
140        (Amazon ML) immediately returns and sets the `DataSource`
141        status to `PENDING`. After the `DataSource` is created and
142        ready for use, Amazon ML sets the `Status` parameter to
143        `COMPLETED`. `DataSource` in `COMPLETED` or `PENDING` status
144        can only be used to perform CreateMLModel, CreateEvaluation,
145        or CreateBatchPrediction operations.
146
147        If Amazon ML cannot accept the input source, it sets the
148        `Status` parameter to `FAILED` and includes an error message
149        in the `Message` attribute of the GetDataSource operation
150        response.
151
152        :type data_source_id: string
153        :param data_source_id: A user-supplied ID that uniquely identifies the
154            `DataSource`. Typically, an Amazon Resource Number (ARN) becomes
155            the ID for a `DataSource`.
156
157        :type data_source_name: string
158        :param data_source_name: A user-supplied name or description of the
159            `DataSource`.
160
161        :type rds_data: dict
162        :param rds_data:
163        The data specification of an Amazon RDS `DataSource`:
164
165
166        + DatabaseInformation -
167
168            + `DatabaseName ` - Name of the Amazon RDS database.
169            + ` InstanceIdentifier ` - Unique identifier for the Amazon RDS
170                  database instance.
171
172        + DatabaseCredentials - AWS Identity and Access Management (IAM)
173              credentials that are used to connect to the Amazon RDS database.
174        + ResourceRole - Role (DataPipelineDefaultResourceRole) assumed by an
175              Amazon Elastic Compute Cloud (EC2) instance to carry out the copy
176              task from Amazon RDS to Amazon S3. For more information, see `Role
177              templates`_ for data pipelines.
178        + ServiceRole - Role (DataPipelineDefaultRole) assumed by the AWS Data
179              Pipeline service to monitor the progress of the copy task from
180              Amazon RDS to Amazon Simple Storage Service (S3). For more
181              information, see `Role templates`_ for data pipelines.
182        + SecurityInfo - Security information to use to access an Amazon RDS
183              instance. You need to set up appropriate ingress rules for the
184              security entity IDs provided to allow access to the Amazon RDS
185              instance. Specify a [ `SubnetId`, `SecurityGroupIds`] pair for a
186              VPC-based Amazon RDS instance.
187        + SelectSqlQuery - Query that is used to retrieve the observation data
188              for the `Datasource`.
189        + S3StagingLocation - Amazon S3 location for staging RDS data. The data
190              retrieved from Amazon RDS using `SelectSqlQuery` is stored in this
191              location.
192        + DataSchemaUri - Amazon S3 location of the `DataSchema`.
193        + DataSchema - A JSON string representing the schema. This is not
194              required if `DataSchemaUri` is specified.
195        + DataRearrangement - A JSON string representing the splitting
196              requirement of a `Datasource`. Sample - ` "{\"randomSeed\":\"some-
197              random-seed\",
198              \"splitting\":{\"percentBegin\":10,\"percentEnd\":60}}"`
199
200        :type role_arn: string
201        :param role_arn: The role that Amazon ML assumes on behalf of the user
202            to create and activate a data pipeline in the users account and
203            copy data (using the `SelectSqlQuery`) query from Amazon RDS to
204            Amazon S3.
205
206        :type compute_statistics: boolean
207        :param compute_statistics: The compute statistics for a `DataSource`.
208            The statistics are generated from the observation data referenced
209            by a `DataSource`. Amazon ML uses the statistics internally during
210            an `MLModel` training. This parameter must be set to `True` if the
211            ``DataSource `` needs to be used for `MLModel` training.
212
213        """
214        params = {
215            'DataSourceId': data_source_id,
216            'RDSData': rds_data,
217            'RoleARN': role_arn,
218        }
219        if data_source_name is not None:
220            params['DataSourceName'] = data_source_name
221        if compute_statistics is not None:
222            params['ComputeStatistics'] = compute_statistics
223        return self.make_request(action='CreateDataSourceFromRDS',
224                                 body=json.dumps(params))
225
226    def create_data_source_from_redshift(self, data_source_id, data_spec,
227                                         role_arn, data_source_name=None,
228                                         compute_statistics=None):
229        """
230        Creates a `DataSource` from `Amazon Redshift`_. A `DataSource`
231        references data that can be used to perform either
232        CreateMLModel, CreateEvaluation or CreateBatchPrediction
233        operations.
234
235        `CreateDataSourceFromRedshift` is an asynchronous operation.
236        In response to `CreateDataSourceFromRedshift`, Amazon Machine
237        Learning (Amazon ML) immediately returns and sets the
238        `DataSource` status to `PENDING`. After the `DataSource` is
239        created and ready for use, Amazon ML sets the `Status`
240        parameter to `COMPLETED`. `DataSource` in `COMPLETED` or
241        `PENDING` status can only be used to perform CreateMLModel,
242        CreateEvaluation, or CreateBatchPrediction operations.
243
244        If Amazon ML cannot accept the input source, it sets the
245        `Status` parameter to `FAILED` and includes an error message
246        in the `Message` attribute of the GetDataSource operation
247        response.
248
249        The observations should exist in the database hosted on an
250        Amazon Redshift cluster and should be specified by a
251        `SelectSqlQuery`. Amazon ML executes ` Unload`_ command in
252        Amazon Redshift to transfer the result set of `SelectSqlQuery`
253        to `S3StagingLocation.`
254
255        After the `DataSource` is created, it's ready for use in
256        evaluations and batch predictions. If you plan to use the
257        `DataSource` to train an `MLModel`, the `DataSource` requires
258        another item -- a recipe. A recipe describes the observation
259        variables that participate in training an `MLModel`. A recipe
260        describes how each input variable will be used in training.
261        Will the variable be included or excluded from training? Will
262        the variable be manipulated, for example, combined with
263        another variable or split apart into word combinations? The
264        recipe provides answers to these questions. For more
265        information, see the Amazon Machine Learning Developer Guide.
266
267        :type data_source_id: string
268        :param data_source_id: A user-supplied ID that uniquely identifies the
269            `DataSource`.
270
271        :type data_source_name: string
272        :param data_source_name: A user-supplied name or description of the
273            `DataSource`.
274
275        :type data_spec: dict
276        :param data_spec:
277        The data specification of an Amazon Redshift `DataSource`:
278
279
280        + DatabaseInformation -
281
282            + `DatabaseName ` - Name of the Amazon Redshift database.
283            + ` ClusterIdentifier ` - Unique ID for the Amazon Redshift cluster.
284
285        + DatabaseCredentials - AWS Identity abd Access Management (IAM)
286              credentials that are used to connect to the Amazon Redshift
287              database.
288        + SelectSqlQuery - Query that is used to retrieve the observation data
289              for the `Datasource`.
290        + S3StagingLocation - Amazon Simple Storage Service (Amazon S3)
291              location for staging Amazon Redshift data. The data retrieved from
292              Amazon Relational Database Service (Amazon RDS) using
293              `SelectSqlQuery` is stored in this location.
294        + DataSchemaUri - Amazon S3 location of the `DataSchema`.
295        + DataSchema - A JSON string representing the schema. This is not
296              required if `DataSchemaUri` is specified.
297        + DataRearrangement - A JSON string representing the splitting
298              requirement of a `Datasource`. Sample - ` "{\"randomSeed\":\"some-
299              random-seed\",
300              \"splitting\":{\"percentBegin\":10,\"percentEnd\":60}}"`
301
302        :type role_arn: string
303        :param role_arn: A fully specified role Amazon Resource Name (ARN).
304            Amazon ML assumes the role on behalf of the user to create the
305            following:
306
307
308        + A security group to allow Amazon ML to execute the `SelectSqlQuery`
309              query on an Amazon Redshift cluster
310        + An Amazon S3 bucket policy to grant Amazon ML read/write permissions
311              on the `S3StagingLocation`
312
313        :type compute_statistics: boolean
314        :param compute_statistics: The compute statistics for a `DataSource`.
315            The statistics are generated from the observation data referenced
316            by a `DataSource`. Amazon ML uses the statistics internally during
317            `MLModel` training. This parameter must be set to `True` if the
318            ``DataSource `` needs to be used for `MLModel` training
319
320        """
321        params = {
322            'DataSourceId': data_source_id,
323            'DataSpec': data_spec,
324            'RoleARN': role_arn,
325        }
326        if data_source_name is not None:
327            params['DataSourceName'] = data_source_name
328        if compute_statistics is not None:
329            params['ComputeStatistics'] = compute_statistics
330        return self.make_request(action='CreateDataSourceFromRedshift',
331                                 body=json.dumps(params))
332
333    def create_data_source_from_s3(self, data_source_id, data_spec,
334                                   data_source_name=None,
335                                   compute_statistics=None):
336        """
337        Creates a `DataSource` object. A `DataSource` references data
338        that can be used to perform CreateMLModel, CreateEvaluation,
339        or CreateBatchPrediction operations.
340
341        `CreateDataSourceFromS3` is an asynchronous operation. In
342        response to `CreateDataSourceFromS3`, Amazon Machine Learning
343        (Amazon ML) immediately returns and sets the `DataSource`
344        status to `PENDING`. After the `DataSource` is created and
345        ready for use, Amazon ML sets the `Status` parameter to
346        `COMPLETED`. `DataSource` in `COMPLETED` or `PENDING` status
347        can only be used to perform CreateMLModel, CreateEvaluation or
348        CreateBatchPrediction operations.
349
350        If Amazon ML cannot accept the input source, it sets the
351        `Status` parameter to `FAILED` and includes an error message
352        in the `Message` attribute of the GetDataSource operation
353        response.
354
355        The observation data used in a `DataSource` should be ready to
356        use; that is, it should have a consistent structure, and
357        missing data values should be kept to a minimum. The
358        observation data must reside in one or more CSV files in an
359        Amazon Simple Storage Service (Amazon S3) bucket, along with a
360        schema that describes the data items by name and type. The
361        same schema must be used for all of the data files referenced
362        by the `DataSource`.
363
364        After the `DataSource` has been created, it's ready to use in
365        evaluations and batch predictions. If you plan to use the
366        `DataSource` to train an `MLModel`, the `DataSource` requires
367        another item: a recipe. A recipe describes the observation
368        variables that participate in training an `MLModel`. A recipe
369        describes how each input variable will be used in training.
370        Will the variable be included or excluded from training? Will
371        the variable be manipulated, for example, combined with
372        another variable, or split apart into word combinations? The
373        recipe provides answers to these questions. For more
374        information, see the `Amazon Machine Learning Developer
375        Guide`_.
376
377        :type data_source_id: string
378        :param data_source_id: A user-supplied identifier that uniquely
379            identifies the `DataSource`.
380
381        :type data_source_name: string
382        :param data_source_name: A user-supplied name or description of the
383            `DataSource`.
384
385        :type data_spec: dict
386        :param data_spec:
387        The data specification of a `DataSource`:
388
389
390        + DataLocationS3 - Amazon Simple Storage Service (Amazon S3) location
391              of the observation data.
392        + DataSchemaLocationS3 - Amazon S3 location of the `DataSchema`.
393        + DataSchema - A JSON string representing the schema. This is not
394              required if `DataSchemaUri` is specified.
395        + DataRearrangement - A JSON string representing the splitting
396              requirement of a `Datasource`. Sample - ` "{\"randomSeed\":\"some-
397              random-seed\",
398              \"splitting\":{\"percentBegin\":10,\"percentEnd\":60}}"`
399
400        :type compute_statistics: boolean
401        :param compute_statistics: The compute statistics for a `DataSource`.
402            The statistics are generated from the observation data referenced
403            by a `DataSource`. Amazon ML uses the statistics internally during
404            an `MLModel` training. This parameter must be set to `True` if the
405            ``DataSource `` needs to be used for `MLModel` training
406
407        """
408        params = {
409            'DataSourceId': data_source_id,
410            'DataSpec': data_spec,
411        }
412        if data_source_name is not None:
413            params['DataSourceName'] = data_source_name
414        if compute_statistics is not None:
415            params['ComputeStatistics'] = compute_statistics
416        return self.make_request(action='CreateDataSourceFromS3',
417                                 body=json.dumps(params))
418
419    def create_evaluation(self, evaluation_id, ml_model_id,
420                          evaluation_data_source_id, evaluation_name=None):
421        """
422        Creates a new `Evaluation` of an `MLModel`. An `MLModel` is
423        evaluated on a set of observations associated to a
424        `DataSource`. Like a `DataSource` for an `MLModel`, the
425        `DataSource` for an `Evaluation` contains values for the
426        Target Variable. The `Evaluation` compares the predicted
427        result for each observation to the actual outcome and provides
428        a summary so that you know how effective the `MLModel`
429        functions on the test data. Evaluation generates a relevant
430        performance metric such as BinaryAUC, RegressionRMSE or
431        MulticlassAvgFScore based on the corresponding `MLModelType`:
432        `BINARY`, `REGRESSION` or `MULTICLASS`.
433
434        `CreateEvaluation` is an asynchronous operation. In response
435        to `CreateEvaluation`, Amazon Machine Learning (Amazon ML)
436        immediately returns and sets the evaluation status to
437        `PENDING`. After the `Evaluation` is created and ready for
438        use, Amazon ML sets the status to `COMPLETED`.
439
440        You can use the GetEvaluation operation to check progress of
441        the evaluation during the creation operation.
442
443        :type evaluation_id: string
444        :param evaluation_id: A user-supplied ID that uniquely identifies the
445            `Evaluation`.
446
447        :type evaluation_name: string
448        :param evaluation_name: A user-supplied name or description of the
449            `Evaluation`.
450
451        :type ml_model_id: string
452        :param ml_model_id: The ID of the `MLModel` to evaluate.
453        The schema used in creating the `MLModel` must match the schema of the
454            `DataSource` used in the `Evaluation`.
455
456        :type evaluation_data_source_id: string
457        :param evaluation_data_source_id: The ID of the `DataSource` for the
458            evaluation. The schema of the `DataSource` must match the schema
459            used to create the `MLModel`.
460
461        """
462        params = {
463            'EvaluationId': evaluation_id,
464            'MLModelId': ml_model_id,
465            'EvaluationDataSourceId': evaluation_data_source_id,
466        }
467        if evaluation_name is not None:
468            params['EvaluationName'] = evaluation_name
469        return self.make_request(action='CreateEvaluation',
470                                 body=json.dumps(params))
471
472    def create_ml_model(self, ml_model_id, ml_model_type,
473                        training_data_source_id, ml_model_name=None,
474                        parameters=None, recipe=None, recipe_uri=None):
475        """
476        Creates a new `MLModel` using the data files and the recipe as
477        information sources.
478
479        An `MLModel` is nearly immutable. Users can only update the
480        `MLModelName` and the `ScoreThreshold` in an `MLModel` without
481        creating a new `MLModel`.
482
483        `CreateMLModel` is an asynchronous operation. In response to
484        `CreateMLModel`, Amazon Machine Learning (Amazon ML)
485        immediately returns and sets the `MLModel` status to
486        `PENDING`. After the `MLModel` is created and ready for use,
487        Amazon ML sets the status to `COMPLETED`.
488
489        You can use the GetMLModel operation to check progress of the
490        `MLModel` during the creation operation.
491
492        CreateMLModel requires a `DataSource` with computed
493        statistics, which can be created by setting
494        `ComputeStatistics` to `True` in CreateDataSourceFromRDS,
495        CreateDataSourceFromS3, or CreateDataSourceFromRedshift
496        operations.
497
498        :type ml_model_id: string
499        :param ml_model_id: A user-supplied ID that uniquely identifies the
500            `MLModel`.
501
502        :type ml_model_name: string
503        :param ml_model_name: A user-supplied name or description of the
504            `MLModel`.
505
506        :type ml_model_type: string
507        :param ml_model_type: The category of supervised learning that this
508            `MLModel` will address. Choose from the following types:
509
510        + Choose `REGRESSION` if the `MLModel` will be used to predict a
511              numeric value.
512        + Choose `BINARY` if the `MLModel` result has two possible values.
513        + Choose `MULTICLASS` if the `MLModel` result has a limited number of
514              values.
515
516
517        For more information, see the `Amazon Machine Learning Developer
518            Guide`_.
519
520        :type parameters: map
521        :param parameters:
522        A list of the training parameters in the `MLModel`. The list is
523            implemented as a map of key/value pairs.
524
525        The following is the current set of training parameters:
526
527
528        + `sgd.l1RegularizationAmount` - Coefficient regularization L1 norm. It
529              controls overfitting the data by penalizing large coefficients.
530              This tends to drive coefficients to zero, resulting in sparse
531              feature set. If you use this parameter, start by specifying a small
532              value such as 1.0E-08. The value is a double that ranges from 0 to
533              MAX_DOUBLE. The default is not to use L1 normalization. The
534              parameter cannot be used when `L2` is specified. Use this parameter
535              sparingly.
536        + `sgd.l2RegularizationAmount` - Coefficient regularization L2 norm. It
537              controls overfitting the data by penalizing large coefficients.
538              This tends to drive coefficients to small, nonzero values. If you
539              use this parameter, start by specifying a small value such as
540              1.0E-08. The valuseis a double that ranges from 0 to MAX_DOUBLE.
541              The default is not to use L2 normalization. This cannot be used
542              when `L1` is specified. Use this parameter sparingly.
543        + `sgd.maxPasses` - Number of times that the training process traverses
544              the observations to build the `MLModel`. The value is an integer
545              that ranges from 1 to 10000. The default value is 10.
546        + `sgd.maxMLModelSizeInBytes` - Maximum allowed size of the model.
547              Depending on the input data, the size of the model might affect its
548              performance. The value is an integer that ranges from 100000 to
549              2147483648. The default value is 33554432.
550
551        :type training_data_source_id: string
552        :param training_data_source_id: The `DataSource` that points to the
553            training data.
554
555        :type recipe: string
556        :param recipe: The data recipe for creating `MLModel`. You must specify
557            either the recipe or its URI. If you dont specify a recipe or its
558            URI, Amazon ML creates a default.
559
560        :type recipe_uri: string
561        :param recipe_uri: The Amazon Simple Storage Service (Amazon S3)
562            location and file name that contains the `MLModel` recipe. You must
563            specify either the recipe or its URI. If you dont specify a recipe
564            or its URI, Amazon ML creates a default.
565
566        """
567        params = {
568            'MLModelId': ml_model_id,
569            'MLModelType': ml_model_type,
570            'TrainingDataSourceId': training_data_source_id,
571        }
572        if ml_model_name is not None:
573            params['MLModelName'] = ml_model_name
574        if parameters is not None:
575            params['Parameters'] = parameters
576        if recipe is not None:
577            params['Recipe'] = recipe
578        if recipe_uri is not None:
579            params['RecipeUri'] = recipe_uri
580        return self.make_request(action='CreateMLModel',
581                                 body=json.dumps(params))
582
583    def create_realtime_endpoint(self, ml_model_id):
584        """
585        Creates a real-time endpoint for the `MLModel`. The endpoint
586        contains the URI of the `MLModel`; that is, the location to
587        send real-time prediction requests for the specified
588        `MLModel`.
589
590        :type ml_model_id: string
591        :param ml_model_id: The ID assigned to the `MLModel` during creation.
592
593        """
594        params = {'MLModelId': ml_model_id, }
595        return self.make_request(action='CreateRealtimeEndpoint',
596                                 body=json.dumps(params))
597
598    def delete_batch_prediction(self, batch_prediction_id):
599        """
600        Assigns the DELETED status to a `BatchPrediction`, rendering
601        it unusable.
602
603        After using the `DeleteBatchPrediction` operation, you can use
604        the GetBatchPrediction operation to verify that the status of
605        the `BatchPrediction` changed to DELETED.
606
607        The result of the `DeleteBatchPrediction` operation is
608        irreversible.
609
610        :type batch_prediction_id: string
611        :param batch_prediction_id: A user-supplied ID that uniquely identifies
612            the `BatchPrediction`.
613
614        """
615        params = {'BatchPredictionId': batch_prediction_id, }
616        return self.make_request(action='DeleteBatchPrediction',
617                                 body=json.dumps(params))
618
619    def delete_data_source(self, data_source_id):
620        """
621        Assigns the DELETED status to a `DataSource`, rendering it
622        unusable.
623
624        After using the `DeleteDataSource` operation, you can use the
625        GetDataSource operation to verify that the status of the
626        `DataSource` changed to DELETED.
627
628        The results of the `DeleteDataSource` operation are
629        irreversible.
630
631        :type data_source_id: string
632        :param data_source_id: A user-supplied ID that uniquely identifies the
633            `DataSource`.
634
635        """
636        params = {'DataSourceId': data_source_id, }
637        return self.make_request(action='DeleteDataSource',
638                                 body=json.dumps(params))
639
640    def delete_evaluation(self, evaluation_id):
641        """
642        Assigns the `DELETED` status to an `Evaluation`, rendering it
643        unusable.
644
645        After invoking the `DeleteEvaluation` operation, you can use
646        the GetEvaluation operation to verify that the status of the
647        `Evaluation` changed to `DELETED`.
648
649        The results of the `DeleteEvaluation` operation are
650        irreversible.
651
652        :type evaluation_id: string
653        :param evaluation_id: A user-supplied ID that uniquely identifies the
654            `Evaluation` to delete.
655
656        """
657        params = {'EvaluationId': evaluation_id, }
658        return self.make_request(action='DeleteEvaluation',
659                                 body=json.dumps(params))
660
661    def delete_ml_model(self, ml_model_id):
662        """
663        Assigns the DELETED status to an `MLModel`, rendering it
664        unusable.
665
666        After using the `DeleteMLModel` operation, you can use the
667        GetMLModel operation to verify that the status of the
668        `MLModel` changed to DELETED.
669
670        The result of the `DeleteMLModel` operation is irreversible.
671
672        :type ml_model_id: string
673        :param ml_model_id: A user-supplied ID that uniquely identifies the
674            `MLModel`.
675
676        """
677        params = {'MLModelId': ml_model_id, }
678        return self.make_request(action='DeleteMLModel',
679                                 body=json.dumps(params))
680
681    def delete_realtime_endpoint(self, ml_model_id):
682        """
683        Deletes a real time endpoint of an `MLModel`.
684
685        :type ml_model_id: string
686        :param ml_model_id: The ID assigned to the `MLModel` during creation.
687
688        """
689        params = {'MLModelId': ml_model_id, }
690        return self.make_request(action='DeleteRealtimeEndpoint',
691                                 body=json.dumps(params))
692
693    def describe_batch_predictions(self, filter_variable=None, eq=None,
694                                   gt=None, lt=None, ge=None, le=None,
695                                   ne=None, prefix=None, sort_order=None,
696                                   next_token=None, limit=None):
697        """
698        Returns a list of `BatchPrediction` operations that match the
699        search criteria in the request.
700
701        :type filter_variable: string
702        :param filter_variable:
703        Use one of the following variables to filter a list of
704            `BatchPrediction`:
705
706
707        + `CreatedAt` - Sets the search criteria to the `BatchPrediction`
708              creation date.
709        + `Status` - Sets the search criteria to the `BatchPrediction` status.
710        + `Name` - Sets the search criteria to the contents of the
711              `BatchPrediction` ** ** `Name`.
712        + `IAMUser` - Sets the search criteria to the user account that invoked
713              the `BatchPrediction` creation.
714        + `MLModelId` - Sets the search criteria to the `MLModel` used in the
715              `BatchPrediction`.
716        + `DataSourceId` - Sets the search criteria to the `DataSource` used in
717              the `BatchPrediction`.
718        + `DataURI` - Sets the search criteria to the data file(s) used in the
719              `BatchPrediction`. The URL can identify either a file or an Amazon
720              Simple Storage Solution (Amazon S3) bucket or directory.
721
722        :type eq: string
723        :param eq: The equal to operator. The `BatchPrediction` results will
724            have `FilterVariable` values that exactly match the value specified
725            with `EQ`.
726
727        :type gt: string
728        :param gt: The greater than operator. The `BatchPrediction` results
729            will have `FilterVariable` values that are greater than the value
730            specified with `GT`.
731
732        :type lt: string
733        :param lt: The less than operator. The `BatchPrediction` results will
734            have `FilterVariable` values that are less than the value specified
735            with `LT`.
736
737        :type ge: string
738        :param ge: The greater than or equal to operator. The `BatchPrediction`
739            results will have `FilterVariable` values that are greater than or
740            equal to the value specified with `GE`.
741
742        :type le: string
743        :param le: The less than or equal to operator. The `BatchPrediction`
744            results will have `FilterVariable` values that are less than or
745            equal to the value specified with `LE`.
746
747        :type ne: string
748        :param ne: The not equal to operator. The `BatchPrediction` results
749            will have `FilterVariable` values not equal to the value specified
750            with `NE`.
751
752        :type prefix: string
753        :param prefix:
754        A string that is found at the beginning of a variable, such as `Name`
755            or `Id`.
756
757        For example, a `Batch Prediction` operation could have the `Name`
758            `2014-09-09-HolidayGiftMailer`. To search for this
759            `BatchPrediction`, select `Name` for the `FilterVariable` and any
760            of the following strings for the `Prefix`:
761
762
763        + 2014-09
764        + 2014-09-09
765        + 2014-09-09-Holiday
766
767        :type sort_order: string
768        :param sort_order: A two-value parameter that determines the sequence
769            of the resulting list of `MLModel`s.
770
771        + `asc` - Arranges the list in ascending order (A-Z, 0-9).
772        + `dsc` - Arranges the list in descending order (Z-A, 9-0).
773
774
775        Results are sorted by `FilterVariable`.
776
777        :type next_token: string
778        :param next_token: An ID of the page in the paginated results.
779
780        :type limit: integer
781        :param limit: The number of pages of information to include in the
782            result. The range of acceptable values is 1 through 100. The
783            default value is 100.
784
785        """
786        params = {}
787        if filter_variable is not None:
788            params['FilterVariable'] = filter_variable
789        if eq is not None:
790            params['EQ'] = eq
791        if gt is not None:
792            params['GT'] = gt
793        if lt is not None:
794            params['LT'] = lt
795        if ge is not None:
796            params['GE'] = ge
797        if le is not None:
798            params['LE'] = le
799        if ne is not None:
800            params['NE'] = ne
801        if prefix is not None:
802            params['Prefix'] = prefix
803        if sort_order is not None:
804            params['SortOrder'] = sort_order
805        if next_token is not None:
806            params['NextToken'] = next_token
807        if limit is not None:
808            params['Limit'] = limit
809        return self.make_request(action='DescribeBatchPredictions',
810                                 body=json.dumps(params))
811
812    def describe_data_sources(self, filter_variable=None, eq=None, gt=None,
813                              lt=None, ge=None, le=None, ne=None,
814                              prefix=None, sort_order=None, next_token=None,
815                              limit=None):
816        """
817        Returns a list of `DataSource` that match the search criteria
818        in the request.
819
820        :type filter_variable: string
821        :param filter_variable:
822        Use one of the following variables to filter a list of `DataSource`:
823
824
825        + `CreatedAt` - Sets the search criteria to `DataSource` creation
826              dates.
827        + `Status` - Sets the search criteria to `DataSource` statuses.
828        + `Name` - Sets the search criteria to the contents of `DataSource` **
829              ** `Name`.
830        + `DataUri` - Sets the search criteria to the URI of data files used to
831              create the `DataSource`. The URI can identify either a file or an
832              Amazon Simple Storage Service (Amazon S3) bucket or directory.
833        + `IAMUser` - Sets the search criteria to the user account that invoked
834              the `DataSource` creation.
835
836        :type eq: string
837        :param eq: The equal to operator. The `DataSource` results will have
838            `FilterVariable` values that exactly match the value specified with
839            `EQ`.
840
841        :type gt: string
842        :param gt: The greater than operator. The `DataSource` results will
843            have `FilterVariable` values that are greater than the value
844            specified with `GT`.
845
846        :type lt: string
847        :param lt: The less than operator. The `DataSource` results will have
848            `FilterVariable` values that are less than the value specified with
849            `LT`.
850
851        :type ge: string
852        :param ge: The greater than or equal to operator. The `DataSource`
853            results will have `FilterVariable` values that are greater than or
854            equal to the value specified with `GE`.
855
856        :type le: string
857        :param le: The less than or equal to operator. The `DataSource` results
858            will have `FilterVariable` values that are less than or equal to
859            the value specified with `LE`.
860
861        :type ne: string
862        :param ne: The not equal to operator. The `DataSource` results will
863            have `FilterVariable` values not equal to the value specified with
864            `NE`.
865
866        :type prefix: string
867        :param prefix:
868        A string that is found at the beginning of a variable, such as `Name`
869            or `Id`.
870
871        For example, a `DataSource` could have the `Name`
872            `2014-09-09-HolidayGiftMailer`. To search for this `DataSource`,
873            select `Name` for the `FilterVariable` and any of the following
874            strings for the `Prefix`:
875
876
877        + 2014-09
878        + 2014-09-09
879        + 2014-09-09-Holiday
880
881        :type sort_order: string
882        :param sort_order: A two-value parameter that determines the sequence
883            of the resulting list of `DataSource`.
884
885        + `asc` - Arranges the list in ascending order (A-Z, 0-9).
886        + `dsc` - Arranges the list in descending order (Z-A, 9-0).
887
888
889        Results are sorted by `FilterVariable`.
890
891        :type next_token: string
892        :param next_token: The ID of the page in the paginated results.
893
894        :type limit: integer
895        :param limit: The maximum number of `DataSource` to include in the
896            result.
897
898        """
899        params = {}
900        if filter_variable is not None:
901            params['FilterVariable'] = filter_variable
902        if eq is not None:
903            params['EQ'] = eq
904        if gt is not None:
905            params['GT'] = gt
906        if lt is not None:
907            params['LT'] = lt
908        if ge is not None:
909            params['GE'] = ge
910        if le is not None:
911            params['LE'] = le
912        if ne is not None:
913            params['NE'] = ne
914        if prefix is not None:
915            params['Prefix'] = prefix
916        if sort_order is not None:
917            params['SortOrder'] = sort_order
918        if next_token is not None:
919            params['NextToken'] = next_token
920        if limit is not None:
921            params['Limit'] = limit
922        return self.make_request(action='DescribeDataSources',
923                                 body=json.dumps(params))
924
925    def describe_evaluations(self, filter_variable=None, eq=None, gt=None,
926                             lt=None, ge=None, le=None, ne=None, prefix=None,
927                             sort_order=None, next_token=None, limit=None):
928        """
929        Returns a list of `DescribeEvaluations` that match the search
930        criteria in the request.
931
932        :type filter_variable: string
933        :param filter_variable:
934        Use one of the following variable to filter a list of `Evaluation`
935            objects:
936
937
938        + `CreatedAt` - Sets the search criteria to the `Evaluation` creation
939              date.
940        + `Status` - Sets the search criteria to the `Evaluation` status.
941        + `Name` - Sets the search criteria to the contents of `Evaluation` **
942              ** `Name`.
943        + `IAMUser` - Sets the search criteria to the user account that invoked
944              an `Evaluation`.
945        + `MLModelId` - Sets the search criteria to the `MLModel` that was
946              evaluated.
947        + `DataSourceId` - Sets the search criteria to the `DataSource` used in
948              `Evaluation`.
949        + `DataUri` - Sets the search criteria to the data file(s) used in
950              `Evaluation`. The URL can identify either a file or an Amazon
951              Simple Storage Solution (Amazon S3) bucket or directory.
952
953        :type eq: string
954        :param eq: The equal to operator. The `Evaluation` results will have
955            `FilterVariable` values that exactly match the value specified with
956            `EQ`.
957
958        :type gt: string
959        :param gt: The greater than operator. The `Evaluation` results will
960            have `FilterVariable` values that are greater than the value
961            specified with `GT`.
962
963        :type lt: string
964        :param lt: The less than operator. The `Evaluation` results will have
965            `FilterVariable` values that are less than the value specified with
966            `LT`.
967
968        :type ge: string
969        :param ge: The greater than or equal to operator. The `Evaluation`
970            results will have `FilterVariable` values that are greater than or
971            equal to the value specified with `GE`.
972
973        :type le: string
974        :param le: The less than or equal to operator. The `Evaluation` results
975            will have `FilterVariable` values that are less than or equal to
976            the value specified with `LE`.
977
978        :type ne: string
979        :param ne: The not equal to operator. The `Evaluation` results will
980            have `FilterVariable` values not equal to the value specified with
981            `NE`.
982
983        :type prefix: string
984        :param prefix:
985        A string that is found at the beginning of a variable, such as `Name`
986            or `Id`.
987
988        For example, an `Evaluation` could have the `Name`
989            `2014-09-09-HolidayGiftMailer`. To search for this `Evaluation`,
990            select `Name` for the `FilterVariable` and any of the following
991            strings for the `Prefix`:
992
993
994        + 2014-09
995        + 2014-09-09
996        + 2014-09-09-Holiday
997
998        :type sort_order: string
999        :param sort_order: A two-value parameter that determines the sequence
1000            of the resulting list of `Evaluation`.
1001
1002        + `asc` - Arranges the list in ascending order (A-Z, 0-9).
1003        + `dsc` - Arranges the list in descending order (Z-A, 9-0).
1004
1005
1006        Results are sorted by `FilterVariable`.
1007
1008        :type next_token: string
1009        :param next_token: The ID of the page in the paginated results.
1010
1011        :type limit: integer
1012        :param limit: The maximum number of `Evaluation` to include in the
1013            result.
1014
1015        """
1016        params = {}
1017        if filter_variable is not None:
1018            params['FilterVariable'] = filter_variable
1019        if eq is not None:
1020            params['EQ'] = eq
1021        if gt is not None:
1022            params['GT'] = gt
1023        if lt is not None:
1024            params['LT'] = lt
1025        if ge is not None:
1026            params['GE'] = ge
1027        if le is not None:
1028            params['LE'] = le
1029        if ne is not None:
1030            params['NE'] = ne
1031        if prefix is not None:
1032            params['Prefix'] = prefix
1033        if sort_order is not None:
1034            params['SortOrder'] = sort_order
1035        if next_token is not None:
1036            params['NextToken'] = next_token
1037        if limit is not None:
1038            params['Limit'] = limit
1039        return self.make_request(action='DescribeEvaluations',
1040                                 body=json.dumps(params))
1041
1042    def describe_ml_models(self, filter_variable=None, eq=None, gt=None,
1043                           lt=None, ge=None, le=None, ne=None, prefix=None,
1044                           sort_order=None, next_token=None, limit=None):
1045        """
1046        Returns a list of `MLModel` that match the search criteria in
1047        the request.
1048
1049        :type filter_variable: string
1050        :param filter_variable:
1051        Use one of the following variables to filter a list of `MLModel`:
1052
1053
1054        + `CreatedAt` - Sets the search criteria to `MLModel` creation date.
1055        + `Status` - Sets the search criteria to `MLModel` status.
1056        + `Name` - Sets the search criteria to the contents of `MLModel` ** **
1057              `Name`.
1058        + `IAMUser` - Sets the search criteria to the user account that invoked
1059              the `MLModel` creation.
1060        + `TrainingDataSourceId` - Sets the search criteria to the `DataSource`
1061              used to train one or more `MLModel`.
1062        + `RealtimeEndpointStatus` - Sets the search criteria to the `MLModel`
1063              real-time endpoint status.
1064        + `MLModelType` - Sets the search criteria to `MLModel` type: binary,
1065              regression, or multi-class.
1066        + `Algorithm` - Sets the search criteria to the algorithm that the
1067              `MLModel` uses.
1068        + `TrainingDataURI` - Sets the search criteria to the data file(s) used
1069              in training a `MLModel`. The URL can identify either a file or an
1070              Amazon Simple Storage Service (Amazon S3) bucket or directory.
1071
1072        :type eq: string
1073        :param eq: The equal to operator. The `MLModel` results will have
1074            `FilterVariable` values that exactly match the value specified with
1075            `EQ`.
1076
1077        :type gt: string
1078        :param gt: The greater than operator. The `MLModel` results will have
1079            `FilterVariable` values that are greater than the value specified
1080            with `GT`.
1081
1082        :type lt: string
1083        :param lt: The less than operator. The `MLModel` results will have
1084            `FilterVariable` values that are less than the value specified with
1085            `LT`.
1086
1087        :type ge: string
1088        :param ge: The greater than or equal to operator. The `MLModel` results
1089            will have `FilterVariable` values that are greater than or equal to
1090            the value specified with `GE`.
1091
1092        :type le: string
1093        :param le: The less than or equal to operator. The `MLModel` results
1094            will have `FilterVariable` values that are less than or equal to
1095            the value specified with `LE`.
1096
1097        :type ne: string
1098        :param ne: The not equal to operator. The `MLModel` results will have
1099            `FilterVariable` values not equal to the value specified with `NE`.
1100
1101        :type prefix: string
1102        :param prefix:
1103        A string that is found at the beginning of a variable, such as `Name`
1104            or `Id`.
1105
1106        For example, an `MLModel` could have the `Name`
1107            `2014-09-09-HolidayGiftMailer`. To search for this `MLModel`,
1108            select `Name` for the `FilterVariable` and any of the following
1109            strings for the `Prefix`:
1110
1111
1112        + 2014-09
1113        + 2014-09-09
1114        + 2014-09-09-Holiday
1115
1116        :type sort_order: string
1117        :param sort_order: A two-value parameter that determines the sequence
1118            of the resulting list of `MLModel`.
1119
1120        + `asc` - Arranges the list in ascending order (A-Z, 0-9).
1121        + `dsc` - Arranges the list in descending order (Z-A, 9-0).
1122
1123
1124        Results are sorted by `FilterVariable`.
1125
1126        :type next_token: string
1127        :param next_token: The ID of the page in the paginated results.
1128
1129        :type limit: integer
1130        :param limit: The number of pages of information to include in the
1131            result. The range of acceptable values is 1 through 100. The
1132            default value is 100.
1133
1134        """
1135        params = {}
1136        if filter_variable is not None:
1137            params['FilterVariable'] = filter_variable
1138        if eq is not None:
1139            params['EQ'] = eq
1140        if gt is not None:
1141            params['GT'] = gt
1142        if lt is not None:
1143            params['LT'] = lt
1144        if ge is not None:
1145            params['GE'] = ge
1146        if le is not None:
1147            params['LE'] = le
1148        if ne is not None:
1149            params['NE'] = ne
1150        if prefix is not None:
1151            params['Prefix'] = prefix
1152        if sort_order is not None:
1153            params['SortOrder'] = sort_order
1154        if next_token is not None:
1155            params['NextToken'] = next_token
1156        if limit is not None:
1157            params['Limit'] = limit
1158        return self.make_request(action='DescribeMLModels',
1159                                 body=json.dumps(params))
1160
1161    def get_batch_prediction(self, batch_prediction_id):
1162        """
1163        Returns a `BatchPrediction` that includes detailed metadata,
1164        status, and data file information for a `Batch Prediction`
1165        request.
1166
1167        :type batch_prediction_id: string
1168        :param batch_prediction_id: An ID assigned to the `BatchPrediction` at
1169            creation.
1170
1171        """
1172        params = {'BatchPredictionId': batch_prediction_id, }
1173        return self.make_request(action='GetBatchPrediction',
1174                                 body=json.dumps(params))
1175
1176    def get_data_source(self, data_source_id, verbose=None):
1177        """
1178        Returns a `DataSource` that includes metadata and data file
1179        information, as well as the current status of the
1180        `DataSource`.
1181
1182        `GetDataSource` provides results in normal or verbose format.
1183        The verbose format adds the schema description and the list of
1184        files pointed to by the DataSource to the normal format.
1185
1186        :type data_source_id: string
1187        :param data_source_id: The ID assigned to the `DataSource` at creation.
1188
1189        :type verbose: boolean
1190        :param verbose: Specifies whether the `GetDataSource` operation should
1191            return `DataSourceSchema`.
1192        If true, `DataSourceSchema` is returned.
1193
1194        If false, `DataSourceSchema` is not returned.
1195
1196        """
1197        params = {'DataSourceId': data_source_id, }
1198        if verbose is not None:
1199            params['Verbose'] = verbose
1200        return self.make_request(action='GetDataSource',
1201                                 body=json.dumps(params))
1202
1203    def get_evaluation(self, evaluation_id):
1204        """
1205        Returns an `Evaluation` that includes metadata as well as the
1206        current status of the `Evaluation`.
1207
1208        :type evaluation_id: string
1209        :param evaluation_id: The ID of the `Evaluation` to retrieve. The
1210            evaluation of each `MLModel` is recorded and cataloged. The ID
1211            provides the means to access the information.
1212
1213        """
1214        params = {'EvaluationId': evaluation_id, }
1215        return self.make_request(action='GetEvaluation',
1216                                 body=json.dumps(params))
1217
1218    def get_ml_model(self, ml_model_id, verbose=None):
1219        """
1220        Returns an `MLModel` that includes detailed metadata, and data
1221        source information as well as the current status of the
1222        `MLModel`.
1223
1224        `GetMLModel` provides results in normal or verbose format.
1225
1226        :type ml_model_id: string
1227        :param ml_model_id: The ID assigned to the `MLModel` at creation.
1228
1229        :type verbose: boolean
1230        :param verbose: Specifies whether the `GetMLModel` operation should
1231            return `Recipe`.
1232        If true, `Recipe` is returned.
1233
1234        If false, `Recipe` is not returned.
1235
1236        """
1237        params = {'MLModelId': ml_model_id, }
1238        if verbose is not None:
1239            params['Verbose'] = verbose
1240        return self.make_request(action='GetMLModel',
1241                                 body=json.dumps(params))
1242
1243    def predict(self, ml_model_id, record, predict_endpoint):
1244        """
1245        Generates a prediction for the observation using the specified
1246        `MLModel`.
1247
1248
1249        Not all response parameters will be populated because this is
1250        dependent on the type of requested model.
1251
1252        :type ml_model_id: string
1253        :param ml_model_id: A unique identifier of the `MLModel`.
1254
1255        :type record: map
1256        :param record: A map of variable name-value pairs that represent an
1257            observation.
1258
1259        :type predict_endpoint: string
1260        :param predict_endpoint: The endpoint to send the predict request to.
1261
1262        """
1263        predict_host =  urlsplit(predict_endpoint).hostname
1264        if predict_host is None:
1265            predict_host = predict_endpoint
1266
1267        params = {
1268            'MLModelId': ml_model_id,
1269            'Record': record,
1270            'PredictEndpoint': predict_host,
1271        }
1272        return self.make_request(action='Predict',
1273                                 body=json.dumps(params),
1274                                 host=predict_host)
1275
1276    def update_batch_prediction(self, batch_prediction_id,
1277                                batch_prediction_name):
1278        """
1279        Updates the `BatchPredictionName` of a `BatchPrediction`.
1280
1281        You can use the GetBatchPrediction operation to view the
1282        contents of the updated data element.
1283
1284        :type batch_prediction_id: string
1285        :param batch_prediction_id: The ID assigned to the `BatchPrediction`
1286            during creation.
1287
1288        :type batch_prediction_name: string
1289        :param batch_prediction_name: A new user-supplied name or description
1290            of the `BatchPrediction`.
1291
1292        """
1293        params = {
1294            'BatchPredictionId': batch_prediction_id,
1295            'BatchPredictionName': batch_prediction_name,
1296        }
1297        return self.make_request(action='UpdateBatchPrediction',
1298                                 body=json.dumps(params))
1299
1300    def update_data_source(self, data_source_id, data_source_name):
1301        """
1302        Updates the `DataSourceName` of a `DataSource`.
1303
1304        You can use the GetDataSource operation to view the contents
1305        of the updated data element.
1306
1307        :type data_source_id: string
1308        :param data_source_id: The ID assigned to the `DataSource` during
1309            creation.
1310
1311        :type data_source_name: string
1312        :param data_source_name: A new user-supplied name or description of the
1313            `DataSource` that will replace the current description.
1314
1315        """
1316        params = {
1317            'DataSourceId': data_source_id,
1318            'DataSourceName': data_source_name,
1319        }
1320        return self.make_request(action='UpdateDataSource',
1321                                 body=json.dumps(params))
1322
1323    def update_evaluation(self, evaluation_id, evaluation_name):
1324        """
1325        Updates the `EvaluationName` of an `Evaluation`.
1326
1327        You can use the GetEvaluation operation to view the contents
1328        of the updated data element.
1329
1330        :type evaluation_id: string
1331        :param evaluation_id: The ID assigned to the `Evaluation` during
1332            creation.
1333
1334        :type evaluation_name: string
1335        :param evaluation_name: A new user-supplied name or description of the
1336            `Evaluation` that will replace the current content.
1337
1338        """
1339        params = {
1340            'EvaluationId': evaluation_id,
1341            'EvaluationName': evaluation_name,
1342        }
1343        return self.make_request(action='UpdateEvaluation',
1344                                 body=json.dumps(params))
1345
1346    def update_ml_model(self, ml_model_id, ml_model_name=None,
1347                        score_threshold=None):
1348        """
1349        Updates the `MLModelName` and the `ScoreThreshold` of an
1350        `MLModel`.
1351
1352        You can use the GetMLModel operation to view the contents of
1353        the updated data element.
1354
1355        :type ml_model_id: string
1356        :param ml_model_id: The ID assigned to the `MLModel` during creation.
1357
1358        :type ml_model_name: string
1359        :param ml_model_name: A user-supplied name or description of the
1360            `MLModel`.
1361
1362        :type score_threshold: float
1363        :param score_threshold: The `ScoreThreshold` used in binary
1364            classification `MLModel` that marks the boundary between a positive
1365            prediction and a negative prediction.
1366        Output values greater than or equal to the `ScoreThreshold` receive a
1367            positive result from the `MLModel`, such as `True`. Output values
1368            less than the `ScoreThreshold` receive a negative response from the
1369            `MLModel`, such as `False`.
1370
1371        """
1372        params = {'MLModelId': ml_model_id, }
1373        if ml_model_name is not None:
1374            params['MLModelName'] = ml_model_name
1375        if score_threshold is not None:
1376            params['ScoreThreshold'] = score_threshold
1377        return self.make_request(action='UpdateMLModel',
1378                                 body=json.dumps(params))
1379
1380    def make_request(self, action, body, host=None):
1381        headers = {
1382            'X-Amz-Target': '%s.%s' % (self.TargetPrefix, action),
1383            'Host': self.region.endpoint,
1384            'Content-Type': 'application/x-amz-json-1.1',
1385            'Content-Length': str(len(body)),
1386        }
1387        http_request_kwargs = {
1388            'method':'POST', 'path':'/', 'auth_path':'/', 'params':{},
1389            'headers': headers, 'data':body
1390        }
1391        if host is not None:
1392            headers['Host'] = host
1393            http_request_kwargs['host'] = host
1394        http_request = self.build_base_http_request(**http_request_kwargs)
1395        response = self._mexe(http_request, sender=None,
1396                              override_num_retries=10)
1397        response_body = response.read().decode('utf-8')
1398        boto.log.debug(response_body)
1399        if response.status == 200:
1400            if response_body:
1401                return json.loads(response_body)
1402        else:
1403            json_body = json.loads(response_body)
1404            fault_name = json_body.get('__type', None)
1405            exception_class = self._faults.get(fault_name, self.ResponseError)
1406            raise exception_class(response.status, response.reason,
1407                                  body=json_body)
1408
1409