nexosis_api 1.4.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a8f386ea632449db904147f0f38b1fbb113633ef
4
- data.tar.gz: c6afea0f24270d210be6fea0efa8e8e99be6b6fb
3
+ metadata.gz: 98e972055cf506f2a4e54483c50f57605ade5992
4
+ data.tar.gz: f9da5b974d540d66e589c8f09a5df16a10ff9d81
5
5
  SHA512:
6
- metadata.gz: 27fcb7d85fe04fb158a52e2c1dc76f438f4bd8b71380b5d8410cd264081086b4038dc2010dc82ba5a84d5fcc46ce95d3a9836699d993997f243207263f794130
7
- data.tar.gz: 88e9204cdfc9fd40e5ee0532acda9a56c7eb73677c301feb47a47886a0909e8a358fb9aa7fdf726992d6874a461a525901111f4a3db7dfc0a599268c37d0cbbb
6
+ metadata.gz: 9f763f8f98fd480d8d84e2b77ace7d8097f426ff003fc1e5bb01ad114306792ab589ef147e297e7a1684ef1ebec5e602f45c5daf5c3f9a1204ab6f78b07452bc
7
+ data.tar.gz: ea5d25a7bc0502c59ac958c26af5d170e80a0ee6fa5389e395a61fed7e1e2b1cbccd6c209c44fb0b70420233156167c0b37f7497f4e272450d0f25f869d5dbd2
@@ -0,0 +1,43 @@
1
+ module NexosisApi
2
+ # Class to parse results of an algorithm run
3
+ # @since 2.0.0
4
+ class AlgorithmContestant
5
+ def initialize(contestant_hash)
6
+ contestant_hash.each do |k, v|
7
+ if k.to_s == 'links'
8
+ instance_variable_set("@#{k}", v.map { |l| NexosisApi::Link.new(l) unless l.nil? })
9
+ elsif k.to_s == 'dataSourceProperties'
10
+ @datasource_properties = v
11
+ elsif k.to_s == 'algorithm'
12
+ instance_variable_set("@#{k}", NexosisApi::Algorithm.new(v)) unless v.nil?
13
+ else
14
+ instance_variable_set("@#{k}", v)
15
+ end
16
+ end
17
+ end
18
+
19
+ # Unique identifier for this contestant
20
+ attr_reader :id
21
+
22
+ # Identifier of algorithm run
23
+ # @return [NexosisApi::Algorithm]
24
+ attr_accessor :algorithm
25
+
26
+ # Name and value for metrics calculated for this algorithm
27
+ # @return [Hash]
28
+ attr_accessor :metrics
29
+
30
+ # Relevant hypermedia as {NexosisApi::Link}
31
+ # @return [Array]
32
+ attr_accessor :links
33
+
34
+ # Operations performed on datasource prior to run
35
+ # @return [Array]
36
+ attr_reader :datasource_properties
37
+
38
+ # The test dataset used to score the algo
39
+ # @return [Array of Hash] columnname: value hash of each observation row in test set
40
+ # @note - may be nil when reviewing contestant lists
41
+ attr_reader :data
42
+ end
43
+ end
@@ -1,5 +1,4 @@
1
- require 'nexosis_api/algorithm_run'
2
- require 'nexosis_api/algorithm_selection'
1
+ require 'nexosis_api/algorithm_contestant'
3
2
  require 'nexosis_api/algorithm'
4
3
  require 'nexosis_api/calendar_jointarget'
5
4
  require 'nexosis_api/classifier_result'
@@ -21,12 +20,15 @@ require 'nexosis_api/metric'
21
20
  require 'nexosis_api/model_summary'
22
21
  require 'nexosis_api/paged_array'
23
22
  require 'nexosis_api/predict_response'
23
+ require 'nexosis_api/session_contest'
24
24
  require 'nexosis_api/session_response'
25
25
  require 'nexosis_api/session_result'
26
+ require 'nexosis_api/session_selection_metrics'
26
27
  require 'nexosis_api/session'
27
28
  require 'nexosis_api/time_interval'
28
29
  require 'nexosis_api/view_definition'
29
30
  require 'nexosis_api/view_data'
31
+ require 'nexosis_api/client/contest'
30
32
  require 'nexosis_api/client/sessions'
31
33
  require 'nexosis_api/client/datasets'
32
34
  require 'nexosis_api/client/imports'
@@ -43,6 +45,7 @@ module NexosisApi
43
45
  include Client::Imports
44
46
  include Client::Views
45
47
  include Client::Models
48
+ include Client::Contest
46
49
 
47
50
  def initialize(options = {})
48
51
  raise ArgumentError, 'api_key was not defined' unless options[:api_key].nil? == false
@@ -53,15 +56,22 @@ module NexosisApi
53
56
  @options = { headers: @headers, format: :json }
54
57
  end
55
58
 
56
- # Gets the current account balance.
59
+ # Gets the quota stats for the account
57
60
  #
58
- # @return [String] a string with the numeric balance and currency identifier postfix - 10.0 USD
59
- # @example Get account balance
60
- # client.get_account_balance
61
- def get_account_balance()
62
- session_url = '/sessions'
61
+ # @return [Hash] a hash of quota values and current values
62
+ def get_account_quotas()
63
+ session_url = '/sessions?page=0&pageSize=1'
63
64
  response = self.class.get(session_url, @options)
64
- response.headers['nexosis-account-balance']
65
+ response.headers.select { |k, _v| k.to_s.start_with? 'nexosis-account' }
66
+ end
67
+
68
+ # Provide access to read or modify the api key
69
+ # @return [String]
70
+ # @since 2.0.0
71
+ def api_key(value)
72
+ @api_key = value unless value.nil?
73
+ @headers['api-key'] = @api_key
74
+ @api_key
65
75
  end
66
76
 
67
77
  private
@@ -0,0 +1,66 @@
1
+ module NexosisApi
2
+ class Client
3
+ # Session Contest-based API operations
4
+ #
5
+ # @see http://docs.nexosis.com/
6
+ # @since 2.0.0
7
+ module Contest
8
+
9
+ # @return [NexosisApi::SessionContest]
10
+ def get_session_contest(session_id)
11
+ raise ArgumentError, 'session_id was not provided and is not optional ' if session_id.to_s.empty?
12
+ contest_url = "/sessions/#{session_id}/contest"
13
+ response = self.class.get(contest_url, headers: @headers)
14
+ raise HttpException.new("There was a problem getting session contest #{response.code}.",
15
+ "getting contest for #{session_id}",
16
+ response) unless response.success?
17
+ NexosisApi::SessionContest.new(response.parsed_response)
18
+ end
19
+
20
+ # @return [NexosisApi::AlgorithmContestant]
21
+ def get_contest_champion(session_id)
22
+ raise ArgumentError, 'session_id was not provided and is not optional ' if session_id.to_s.empty?
23
+ champion_url = "/sessions/#{session_id}/contest/champion"
24
+ response = self.class.get(champion_url, headers: @headers)
25
+ raise HttpException.new("There was a problem getting session champion #{response.code}.",
26
+ "getting champion for #{session_id}",
27
+ response) unless response.success?
28
+ NexosisApi::AlgorithmContestant.new(response.parsed_response)
29
+ end
30
+
31
+ # @return [Array of NexosisApi::AlgorithmContestant]
32
+ def get_contestants(session_id)
33
+ raise ArgumentError, 'session_id was not provided and is not optional ' if session_id.to_s.empty?
34
+ contestants_url = "/sessions/#{session_id}/contest/contestants"
35
+ response = self.class.get(contestants_url, headers: @headers)
36
+ raise HttpException.new("There was a problem getting session contestants #{response.code}.",
37
+ "getting contestants for #{session_id}",
38
+ response) unless response.success?
39
+ response.parsed_response['items'].map { |c| NexosisApi::AlgorithmContestant.new(c) }
40
+ end
41
+
42
+ # @return [NexosisApi::AlgorithmContestant]
43
+ def get_contestant_results(session_id, contestant_id)
44
+ raise ArgumentError, 'session_id was not provided and is not optional ' if session_id.to_s.empty?
45
+ raise ArgumentError, 'contestant_id was not provided and is not optional ' if contestant_id.to_s.empty?
46
+ contestant_url = "/sessions/#{session_id}/contest/contestants/#{contestant_id}"
47
+ response = self.class.get(contestant_url, headers: @headers)
48
+ raise HttpException.new("There was a problem getting session contestant result #{response.code}.",
49
+ "getting contestant result for #{session_id}:#{contestant_id}",
50
+ response) unless response.success?
51
+ NexosisApi::AlgorithmContestant.new(response.parsed_response)
52
+ end
53
+
54
+ # @return [NexosisApi::SessionSelectionMetrics]
55
+ def get_selection_metrics(session_id)
56
+ raise ArgumentError, 'session_id was not provided and is not optional ' if session_id.to_s.empty?
57
+ selection_url = "/sessions/#{session_id}/contest/selection"
58
+ response = self.class.get(selection_url, headers: @headers)
59
+ raise HttpException.new("There was a problem getting session selection metrics #{response.code}.",
60
+ "getting selection metrics for #{session_id}",
61
+ response) unless response.success?
62
+ NexosisApi::SessionSelectionMetrics.new(response.parsed_response)
63
+ end
64
+ end
65
+ end
66
+ end
@@ -36,10 +36,12 @@ module NexosisApi
36
36
  # @param bucket_name [String] the AWS S3 bucket name in which the path will be found
37
37
  # @param path [String] the path within the bucket (usually file name)
38
38
  # @param region [String] the region in which your bucket exists. Defaults to us-east-1
39
+ # @param credentials [Hash] :access_key_id and :secret_access_key for user with rights to read the target file.
39
40
  # @param column_metadata [Array of NexosisApi::Column] description of each column in target dataset. Optional.
40
41
  # @return [NexosisApi::ImportsResponse]
41
42
  # @see http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region for information on region names
42
- def import_from_s3(dataset_name, bucket_name, path, region = 'us-east-1', column_metadata = [])
43
+ # @note If credentials are provided they will be encrypted at the server, used once, and then removed from storage.
44
+ def import_from_s3(dataset_name, bucket_name, path, region = 'us-east-1', credentials = {}, column_metadata = [])
43
45
  raise ArgumentError, 'dataset_name was not provided and is not optional ' unless dataset_name.to_s.empty? == false
44
46
  raise ArgumentError, 'bucket_name was not provided and is not optional ' unless bucket_name.to_s.empty? == false
45
47
  raise ArgumentError, 'path was not provided and is not optional ' unless path.to_s.empty? == false
@@ -52,29 +54,87 @@ module NexosisApi
52
54
  'region' => region,
53
55
  'columns' => column_json
54
56
  }
57
+ body['accessKeyId'] = credentials[:access_key_id] unless credentials.nil? || credentials[:access_key_id].nil?
58
+ body['secretAccessKey'] = credentials[:secret_access_key] unless credentials.nil? || credentials[:secret_access_key].nil?
55
59
  response = self.class.post(s3_import_url, headers: @headers, body: body.to_json)
56
- if (response.success?)
57
- NexosisApi::ImportsResponse.new(response.parsed_response)
58
- else
59
- raise HttpException.new("There was a problem importing from s3: #{response.code}.", "uploading dataset from s3 #{dataset_name}" ,response)
60
- end
60
+ raise HttpException.new("There was a problem importing from s3: #{response.code}.",
61
+ "uploading dataset from s3 #{dataset_name}",
62
+ response) unless response.success?
63
+ NexosisApi::ImportsResponse.new(response.parsed_response)
61
64
  end
62
65
 
63
- # Get s3 response back from import created previously. Presumably to check status.
66
+ # Get response back from import created previously. Presumably to check status.
64
67
  #
65
68
  # @param import_id [String] The id returned from a previous request to import
66
69
  # @return [NexosisApi::ImportsResponse]
67
- # @example get S3 import
70
+ # @example get import
68
71
  # NexosisApi.client.retrieve_import('740dca2a-b488-4322-887e-fa473b1caa54')
69
72
  def retrieve_import(import_id)
70
73
  raise ArgumentError, 'import_id was not provided and is not optional ' unless import_id.to_s.empty? == false
71
74
  imports_url = "/imports/#{import_id}"
72
75
  response = self.class.get(imports_url, headers: @headers)
73
- if (response.success?)
74
- NexosisApi::ImportsResponse.new(response.parsed_response)
75
- else
76
- raise HttpException.new("There was a problem getting the import #{response.code}.", "requesting an import #{import_id}" ,response)
77
- end
76
+ raise HttpException.new("There was a problem getting the import #{response.code}.",
77
+ "requesting an import #{import_id}", response) unless response.success?
78
+ NexosisApi::ImportsResponse.new(response.parsed_response)
79
+ end
80
+
81
+ # Import a csv, json file (gzip'd or raw) from a Microsoft Azure storage blob
82
+ #
83
+ # @param dataset_name [String] the name to give to the new dataset or existing dataset to which this data will be upserted
84
+ # @param connection_string [String] the azure blob storage connection string providing access to the file resource
85
+ # @param container [String] the container in which the object is located.
86
+ # @param blob_name [String] the name of the object to import, usually a file. Always csv or json content.
87
+ # If folders have been used this will contain the full path within the container.
88
+ # @param column_metadata [Array of NexosisApi::Column] description of each column in target dataset. Optional.
89
+ # @return [NexosisApi::ImportsResponse]
90
+ # @since 2.0.0
91
+ # @note the connection string provided will be encrypted at the server, used once, and then removed from storage.
92
+ def import_from_azure(dataset_name, connection_string, container, blob_name, column_metadata = [])
93
+ raise ArgumentError, 'dataset_name was not provided and is not optional ' unless dataset_name.empty? == false
94
+ raise ArgumentError, 'connection_string was not provided and is not optional ' unless connection_string.empty? == false
95
+ raise ArgumentError, 'container was not provided and is not optional ' unless container.empty? == false
96
+ raise ArgumentError, 'blob_name was not provided and is not optional ' unless blob_name.empty? == false
97
+ azure_url = '/imports/azure'
98
+ column_json = Column.to_json(column_metadata)
99
+ body = {
100
+ 'dataSetName' => dataset_name,
101
+ 'connectionString' => connection_string,
102
+ 'container' => container,
103
+ 'blob' => blob_name,
104
+ 'columns' => column_json
105
+ }
106
+ response = self.class.post(azure_url, headers: @headers, body: body.to_json)
107
+ raise HttpException.new("There was a problem importing from azure: #{response.code}.",
108
+ "uploading dataset from azure #{dataset_name}",
109
+ response) unless response.success?
110
+ NexosisApi::ImportsResponse.new(response.parsed_response)
111
+ end
112
+
113
+ # Import a csv or json file directly from any avaiable and reachable public endpoint.
114
+ #
115
+ # @param dataset_name [String] the name to give to the new dataset or existing dataset to which this data will be upserted
116
+ # @param url [String] the url indicating where to find the file resource to import
117
+ # @param column_metadata [Array of NexosisApi::Column] description of each column in target dataset. Optional.
118
+ # @param options [Hash] may provide basic auth credentials or a 'content-type' value to identify csv or json content.
119
+ # @return [NexosisApi::ImportsResponse]
120
+ # @note imports depend on file extensions, so use a content type indicator if json or csv cannot be inferred.
121
+ # @note Urls protected by basic auth can be accessed if given a userid and password in options
122
+ # @since 2.0.0
123
+ def import_from_url(dataset_name, url, column_metadata = [], options = {})
124
+ raise ArgumentError, 'dataset_name was not provided and is not optional ' unless dataset_name.empty? == false
125
+ raise ArgumentError, 'url was not provided and is not optional ' unless url.empty? == false
126
+ endpoint_url = '/imports/url'
127
+ column_json = Column.to_json(column_metadata)
128
+ body = {
129
+ 'dataSetName' => dataset_name,
130
+ 'url' => url,
131
+ 'columns' => column_json
132
+ }
133
+ response = self.class.post(endpoint_url, headers: @headers, body: body.to_json)
134
+ raise HttpException.new("There was a problem importing from url: #{response.code}.",
135
+ "uploading dataset from #{url}",
136
+ response) unless response.success?
137
+ NexosisApi::ImportsResponse.new(response.parsed_response)
78
138
  end
79
139
  end
80
140
  end
@@ -78,19 +78,7 @@ module NexosisApi
78
78
  # For instance if your data includes many recoreds per hour, then you could request hour, day, or any other result interval.
79
79
  # However, if your data includes only a few records per day or fewer, then a request for an hourly result interval will produce poor results.
80
80
  def create_forecast_session(dataset_name, start_date, end_date, target_column = nil, result_interval = NexosisApi::TimeInterval::DAY, column_metadata = nil)
81
- create_session(dataset_name, start_date, end_date, target_column, false, nil, 'forecast', result_interval, column_metadata)
82
- end
83
-
84
- # Estimate the cost of a forecast from data already saved to the API.
85
- #
86
- # @param dataset_name [String] The name of the saved data set that has the data to forecast on.
87
- # @param start_date [DateTime] The starting date of the forecast period. Can be ISO 8601 string.
88
- # @param end_date [DateTime] The ending date of the forecast period. Can be ISO 8601 string.
89
- # @param target_column [String] The name of the column for which you want predictions. Nil if defined in dataset.
90
- # @param result_interval [NexosisApi::TimeInterval] (optional) - The date/time interval (e.g. Day, Hour) at which predictions should be generated. So, if Hour is specified for this parameter you will get a Result record for each hour between startDate and endDate. If unspecified, we’ll generate predictions at a Day interval.
91
- # @return [NexosisApi::SessionResponse] providing information about the sesssion, including the cost
92
- def estimate_forecast_session(dataset_name, start_date, end_date, target_column = nil, result_interval = NexosisApi::TimeInterval::DAY)
93
- create_session(dataset_name, start_date, end_date, target_column, true, nil, 'forecast', result_interval)
81
+ create_session(dataset_name, start_date, end_date, target_column, nil, 'forecast', result_interval, column_metadata)
94
82
  end
95
83
 
96
84
  # Analyze impact for an event with data already saved to the API.
@@ -104,20 +92,7 @@ module NexosisApi
104
92
  # @param column_metadata [Array of NexosisApi::Column] (optional) - specification for how to handle columns if different from existing metadata on dataset
105
93
  # @return [NexosisApi::SessionResponse] providing information about the sesssion
106
94
  def create_impact_session(dataset_name, start_date, end_date, event_name, target_column = nil, result_interval = NexosisApi::TimeInterval::DAY, column_metadata = nil)
107
- create_session(dataset_name, start_date, end_date, target_column, false, event_name, 'impact', result_interval, column_metadata)
108
- end
109
-
110
- # Estimate the cost of impact analysis for an event with data already saved to the API.
111
- #
112
- # @param dataset_name [String] The name of the saved data set that has the data to forecast on.
113
- # @param start_date [DateTime] The starting date of the impactful event. Can be ISO 8601 string.
114
- # @param end_date [DateTime] The ending date of the impactful event. Can be ISO 8601 string.
115
- # @param event_name [String] The name of the event.
116
- # @param target_column [String] The name of the column for which you want predictions. Nil if defined in dataset.
117
- # @param result_interval [NexosisApi::TimeInterval] (optional) - The date/time interval (e.g. Day, Hour) at which predictions should be generated. So, if Hour is specified for this parameter you will get a Result record for each hour between startDate and endDate. If unspecified, we’ll generate predictions at a Day interval.
118
- # @return [NexosisApi::SessionResponse] providing information about the sesssion, including the cost
119
- def estimate_impact_session(dataset_name, start_date, end_date, event_name, target_column = nil, result_interval = NexosisApi::TimeInterval::DAY)
120
- create_session(dataset_name, start_date, end_date, target_column, true, event_name, 'impact', result_interval)
95
+ create_session(dataset_name, start_date, end_date, target_column, event_name, 'impact', result_interval, column_metadata)
121
96
  end
122
97
 
123
98
  # Get the results of the session.
@@ -157,7 +132,7 @@ module NexosisApi
157
132
  # @param datasource_name [String] The datasource from which to build the model
158
133
  # @param target_column [String] The column which will be predicted when using the model
159
134
  # @param columns [Hash] column metadata to modify roles, imputation, or target.
160
- # @param options [Hash] prediction_domain and or balanced indicator for classification
135
+ # @param options [Hash] prediction_domain and or balance (true or false) indicator for classification
161
136
  # @note - classifcation assumes balanced classes. The use of a 'balanced=false' option
162
137
  # indicates that no attempt should be made to sample the classes in balanced fashion.
163
138
  # @since 1.3.0
@@ -166,10 +141,9 @@ module NexosisApi
166
141
  body = {
167
142
  dataSourceName: datasource_name,
168
143
  targetColumn: target_column,
169
- predictionDomain: options[:prediction_domain].downcase,
170
- isEstimate: false
144
+ predictionDomain: options[:prediction_domain].downcase
171
145
  }
172
- body.store(:balance, options[:balance]) if options.include?(:balance) && body[:predictionDomain] == 'classification'
146
+ body.store(:extraParameters, { balance: options[:balance] }) if options.include?(:balance) && body[:predictionDomain] == 'classification'
173
147
  body.store(columns: columns) unless columns.empty?
174
148
  response = self.class.post(model_url, headers: @headers, body: body.to_json)
175
149
  if response.success?
@@ -195,13 +169,12 @@ module NexosisApi
195
169
  private
196
170
 
197
171
  # @private
198
- def create_session(dataset_name, start_date, end_date, target_column = nil, is_estimate=false, event_name = nil, type = 'forecast', result_interval = NexosisApi::TimeInterval::DAY, column_metadata = nil)
172
+ def create_session(dataset_name, start_date, end_date, target_column = nil, event_name = nil, type = 'forecast', result_interval = NexosisApi::TimeInterval::DAY, column_metadata = nil)
199
173
  session_url = "/sessions/#{type}"
200
174
  query = {
201
175
  'targetColumn' => target_column.to_s,
202
176
  'startDate' => start_date.to_s,
203
177
  'endDate' => end_date.to_s,
204
- 'isestimate' => is_estimate.to_s,
205
178
  'resultInterval' => result_interval.to_s
206
179
  }
207
180
  query['dataSetName'] = dataset_name.to_s unless dataset_name.to_s.empty?
@@ -30,7 +30,7 @@ module NexosisApi
30
30
  # @return [String]
31
31
  attr_accessor :import_id
32
32
 
33
- # Currently always s3
33
+ # Where the import was requested from - S3, Azure, or Url
34
34
  # @return [String]
35
35
  attr_accessor :type, :s3
36
36
 
@@ -1,20 +1,15 @@
1
1
  module NexosisApi
2
2
  # Class to parse algorithm metrics from model results
3
3
  class Metric
4
- def initialize(metric_hash)
5
- metric_hash.each do |k, v|
6
- instance_variable_set("@#{k}", v) unless v.nil?
7
- end
4
+ def initialize(name, value)
5
+ @name = name
6
+ @value = value
8
7
  end
9
8
 
10
9
  # Friendly name of the metric
11
10
  # @return [String]
12
11
  attr_accessor :name
13
12
 
14
- # Identifier for metric type
15
- # @return [String]
16
- attr_accessor :code
17
-
18
13
  # Calculated metric
19
14
  # @return [Float]
20
15
  attr_accessor :value
@@ -23,7 +23,7 @@ module NexosisApi
23
23
  elsif (k == 'metrics')
24
24
  @metrics = v.reject { |_key, value| value.nil? }
25
25
  .map do |col_key, col_val|
26
- NexosisApi::Metric.new(name: col_key, value: col_val)
26
+ NexosisApi::Metric.new(col_key, col_val)
27
27
  end
28
28
  elsif (k == 'sessionId')
29
29
  @session_id = v
@@ -9,7 +9,10 @@ module NexosisApi
9
9
  'availablePredictionIntervals' => :@prediction_intervals,
10
10
  'startDate' => :@start_date,
11
11
  'endDate' => :@end_date,
12
- 'predictionDomain' => :@prediction_domain }
12
+ 'predictionDomain' => :@prediction_domain,
13
+ 'extraParameters' => :@extra_parameters,
14
+ 'targetColumn' => :@target_column,
15
+ 'statusHistory' => :@status_history }
13
16
  session_hash.each do |k, v|
14
17
  if (k == 'links')
15
18
  @links = v.map { |l| NexosisApi::Link.new(l) }
@@ -25,15 +28,10 @@ module NexosisApi
25
28
  else
26
29
  instance_variable_set("@#{k}", v) unless v.nil?
27
30
  end
28
- instance_variable_set(val_map[k], v) unless val_map[k].nil?
31
+ instance_variable_set(val_map[k.to_s], v) unless val_map[k.to_s].nil?
29
32
  end
30
33
  end
31
34
 
32
- # identifier for this sesssion
33
- # @return [String]
34
- # @deprecated use session_id instead
35
- attr_accessor :sessionId
36
-
37
35
  # identifier for this sesssion
38
36
  # @return [String]
39
37
  # @since 1.4.0
@@ -43,36 +41,23 @@ module NexosisApi
43
41
  # @return [String]
44
42
  attr_accessor :type
45
43
 
46
- # Is this session requested, estimated, started, or completed
44
+ # Is this session requested, started, or completed
47
45
  # @return [String]
48
46
  attr_accessor :status
49
47
 
50
48
  # Date and status of each status this session has entered
51
- # @return [Hash]
52
- attr_accessor :statusHistory
49
+ # @return [Array of Hash]
50
+ # @note - each status object in array is form { date: 'date', status: 'status' }
51
+ attr_accessor :status_history
53
52
 
54
53
  # reserved for future extensions
55
54
  # @return [Hash]
56
- attr_accessor :extraParameters
57
-
58
- # the dataset used in this session
59
- # @return [String]
60
- # @deprecated - Use the @datasource_name property instead
61
- attr_accessor :dataSetName
55
+ # @note - included 'balance' parameter for classification models
56
+ attr_accessor :extra_parameters
62
57
 
63
58
  # The column in the dataset for which this session ran predictions
64
59
  # @return [String]
65
- attr_accessor :targetColumn
66
-
67
- # The start date of analysis in this session
68
- # @return [DateTime]
69
- # @deprecated use start_date instead
70
- attr_accessor :startDate
71
-
72
- # The end date of analysis in this session
73
- # @return [DateTime]
74
- # @deprecated use end_date instead
75
- attr_accessor :endDate
60
+ attr_accessor :target_column
76
61
 
77
62
  # The start date of analysis in this session
78
63
  # @return [DateTime]
@@ -88,10 +73,6 @@ module NexosisApi
88
73
  # @return [Array of NexosisApi::Link]
89
74
  attr_accessor :links
90
75
 
91
- # Is this session an estimate only session
92
- # @return [Boolean]
93
- attr_accessor :is_estimate
94
-
95
76
  # The column descriptors for the data in this session
96
77
  # will reflect either the metadata sent in, defaults form dataset, or inferred values
97
78
  # @return[Array of NexosisApi::Column]
@@ -133,11 +114,5 @@ module NexosisApi
133
114
  # A list of warning or error messages optionally returned from session
134
115
  # @return [Array of Message]
135
116
  attr_accessor :messages
136
-
137
- # Whether classes were sampled as balanced in the context of a classification model
138
- # @return [Boolean]
139
- # @note - the default is true and has no means outside of classification
140
- # @since 1.4.1
141
- attr_accessor :balance
142
117
  end
143
118
  end
@@ -0,0 +1,30 @@
1
+ module NexosisApi
2
+ # Class to parse the algorithm contestants from a session
3
+ # @since 2.0.0
4
+ class SessionContest < Session
5
+ def initialize(contest_hash)
6
+ contest_hash.each do |k, v|
7
+ if k.to_s == 'champion'
8
+ instance_variable_set("@#{k}", NexosisApi::AlgorithmContestant.new(v))
9
+ elsif k.to_s == 'contestants'
10
+ instance_variable_set("@#{k}", v.map { |c| NexosisApi::AlgorithmContestant.new(c) })
11
+ elsif k.to_s == 'championMetric'
12
+ @champion_metric = v
13
+ end
14
+ end
15
+ super(contest_hash.reject { |key, _v| key == 'champion' || key == 'contestants' })
16
+ end
17
+
18
+ # The champion algorithm used
19
+ # @return [NexosisApi::AlgorithmContestant]
20
+ attr_accessor :champion
21
+
22
+ # All other algorithms which competed
23
+ # @return [Array of NexosisApi::AlgorithmContestant]
24
+ attr_accessor :contestants
25
+
26
+ # Name of metric used to determine champion algorithm
27
+ # @return [String] metric name
28
+ attr_accessor :champion_metric
29
+ end
30
+ end
@@ -1,28 +1,33 @@
1
1
  require 'nexosis_api/session'
2
2
 
3
3
  module NexosisApi
4
- #Class to parse the results from a new session
4
+ # Class to parse the results from a new session
5
5
  class SessionResponse < Session
6
6
  def initialize(forecast_hash)
7
+ val_map = {
8
+ 'Nexosis-Account-DataSetCount-Allotted' => :@datasets_allotted,
9
+ 'Nexosis-Account-DataSetCount-Current' => :@datasets_current,
10
+ 'Nexosis-Account-PredictionCount-Allotted' => :@predictions_allotted,
11
+ 'Nexosis-Account-PredictionCount-Current' => :@predictions_current,
12
+ 'Nexosis-Account-SessionCount-Allotted' => :@sessions_allotted,
13
+ 'Nexosis-Account-SessionCount-Current' => :@sessions_current
14
+ }
7
15
  forecast_hash.each do |k, v|
8
- if(k == 'session')
16
+ if (k == 'session')
9
17
  super(v) unless v.nil?
10
- elsif(k == 'nexosis-request-cost')
11
- instance_variable_set('@cost', v[0]) unless v.nil?
12
- elsif(k == 'nexosis-account-balance')
13
- instance_variable_set('@account_balance', v[0]) unless v.nil?
14
- elsif(k == 'balance')
15
- @balance = v
18
+ else
19
+ instance_variable_set(val_map[k], v) unless val_map[k].nil?
16
20
  end
17
21
  end
18
22
  end
19
23
 
20
- # The cost of this session with currency identifier
21
- # @return [String]
22
- attr_accessor :cost
23
-
24
- # Remaining balance after charge for this session
25
- # @return [String]
26
- attr_accessor :account_balance
24
+ attr_reader :datasets_allotted
25
+ attr_reader :datasets_allotted
26
+ attr_reader :datasets_current
27
+ attr_reader :predictions_allotted
28
+ attr_reader :predictions_current
29
+ attr_reader :sessions_allotted
30
+ attr_reader :sessions_current
31
+
27
32
  end
28
33
  end
@@ -6,7 +6,7 @@ module NexosisApi
6
6
  if k.to_s == 'metrics' && session_hash['type'] == 'impact'
7
7
  instance_variable_set("@#{k}", NexosisApi::ImpactMetric.new(v)) unless v.nil?
8
8
  elsif k.to_s == 'metrics'
9
- @metrics = v.map { |key, value| NexosisApi::Metric.new( { 'name' => key.to_s, 'value' => value } ) } unless v.nil?
9
+ @metrics = v.map { |key, value| NexosisApi::Metric.new(key.to_s, value) } unless v.nil?
10
10
  elsif k.to_s == 'data'
11
11
  @data = v
12
12
  end
@@ -0,0 +1,21 @@
1
+ module NexosisApi
2
+ # Class to parse the session selection metrics from a particular session
3
+ # @since 2.0.0
4
+ class SessionSelectionMetrics < Session
5
+ def initialize(metrics_hash)
6
+ if !metrics_hash['metricSets'].nil?
7
+ @dataset_properties = metrics_hash['metricSets'][0]['dataSetProperties'] unless metrics_hash['metricSets'][0]['dataSetProperties'].nil?
8
+ @metrics = metrics_hash['metricSets'][0]['metrics'] unless metrics_hash['metricSets'][0]['metrics'].nil?
9
+ end
10
+ super(metrics_hash.reject { |k, _v| k == 'metricSets' })
11
+ end
12
+
13
+ # transformations performed on dataset prior to algorithm run
14
+ # @return [Array] string list of transformations
15
+ attr_reader :dataset_properties
16
+
17
+ # dataset metrics describing some properties of it
18
+ # @return [Hash] name value pairs of dataset metrics
19
+ attr_reader :metrics
20
+ end
21
+ end
data/nexosisapi.gemspec CHANGED
@@ -16,6 +16,6 @@ Gem::Specification.new do |spec|
16
16
  spec.require_paths = ['lib']
17
17
  spec.required_ruby_version = '>= 2.0.0'
18
18
  spec.summary = "Ruby client for working with the Nexosis API"
19
- spec.version = '1.4.1'
19
+ spec.version = '2.0.0'
20
20
  spec.metadata["yard.run"] = "yri"
21
21
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nexosis_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nexosis,Inc
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-20 00:00:00.000000000 Z
11
+ date: 2017-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -47,11 +47,11 @@ extra_rdoc_files: []
47
47
  files:
48
48
  - lib/nexosis_api.rb
49
49
  - lib/nexosis_api/algorithm.rb
50
- - lib/nexosis_api/algorithm_run.rb
51
- - lib/nexosis_api/algorithm_selection.rb
50
+ - lib/nexosis_api/algorithm_contestant.rb
52
51
  - lib/nexosis_api/calendar_jointarget.rb
53
52
  - lib/nexosis_api/classifier_result.rb
54
53
  - lib/nexosis_api/client.rb
54
+ - lib/nexosis_api/client/contest.rb
55
55
  - lib/nexosis_api/client/datasets.rb
56
56
  - lib/nexosis_api/client/imports.rb
57
57
  - lib/nexosis_api/client/models.rb
@@ -76,8 +76,10 @@ files:
76
76
  - lib/nexosis_api/paged_array.rb
77
77
  - lib/nexosis_api/predict_response.rb
78
78
  - lib/nexosis_api/session.rb
79
+ - lib/nexosis_api/session_contest.rb
79
80
  - lib/nexosis_api/session_response.rb
80
81
  - lib/nexosis_api/session_result.rb
82
+ - lib/nexosis_api/session_selection_metrics.rb
81
83
  - lib/nexosis_api/time_interval.rb
82
84
  - lib/nexosis_api/view_data.rb
83
85
  - lib/nexosis_api/view_definition.rb
@@ -1,32 +0,0 @@
1
- module NexosisApi
2
- # Class to parse results of an algorithm run
3
- class AlgorithmRun
4
- def initialize(run_hash)
5
- run_hash.each do |k, v|
6
- if k == 'metrics'
7
- metric_set = []
8
- v.each { |m| metric_set << NexosisApi::Metric.new(m) unless m.nil? }
9
- instance_variable_set("@#{k}", metric_set)
10
- elsif k == 'links'
11
- link_set = []
12
- v.each { |l| link_set << NexosisApi::Link.new(l) unless l.nil? }
13
- instance_variable_set("@#{k}", link_set)
14
- else
15
- instance_variable_set("@#{k}", NexosisApi::Algorithm.new(v)) unless v.nil?
16
- end
17
- end
18
- end
19
-
20
- # Identifier of algorithm run
21
- # @return [NexosisApi::Algorithm]
22
- attr_accessor :algorithm
23
-
24
- # Set of {NexosisApi::Metric} on algorithm
25
- # @return [Array]
26
- attr_accessor :metrics
27
-
28
- # Relevant hypermedia as {NexosisApi::Link}
29
- # @return [Array]
30
- attr_accessor :links
31
- end
32
- end
@@ -1,34 +0,0 @@
1
- module NexosisApi
2
- # Class to parse the model data results from a session
3
- class AlgorithmSelection
4
- def initialize(data_hash)
5
- data_hash.each do |k, v|
6
- if k == 'champion'
7
- instance_variable_set("@#{k}", NexosisApi::AlgorithmRun.new(v))
8
- elsif k == 'contestants'
9
- contestant_array = []
10
- v.each { |c| contestant_array << NexosisApi::AlgorithmRun.new(c) }
11
- instance_variable_set("@#{k}", contestant_array)
12
- else
13
- instance_variable_set("@#{k}", v) unless v.nil?
14
- end
15
- end
16
- end
17
-
18
- # The date on which this algo was selected as champion
19
- # @return [DateTime]
20
- attr_accessor :date
21
-
22
- # The session which selected the algorithm
23
- # @return [String] session identifier
24
- attr_accessor :sessionId
25
-
26
- # The champion algorithm used
27
- # @return [NexosisApi::AlgorithmRun]
28
- attr_accessor :champion
29
-
30
- # All other algorithms which competed
31
- # @return [Array of NexosisApi::AlgorithmRun]
32
- attr_accessor :contestants
33
- end
34
- end