predictionio 0.3.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/predictionio/client.rb +103 -215
- metadata +2 -2
data/lib/predictionio/client.rb
CHANGED
@@ -37,15 +37,15 @@ module PredictionIO
|
|
37
37
|
# == Special Handling of Some Optional Arguments
|
38
38
|
# Some optional arguments have additional special handling:
|
39
39
|
# - For all requests that accept "itypes" as input, the value can be supplied as either an Array of String's, or a comma-delimited String.
|
40
|
-
# - For all requests that accept "
|
41
|
-
# When these are supplied, they will override any existing "
|
42
|
-
# - All time arguments (e.g. t,
|
40
|
+
# - For all requests that accept "pio_latlng" as input, they will also accept "pio_latitude" and "pio_longitude".
|
41
|
+
# When these are supplied, they will override any existing "pio_latlng" value.
|
42
|
+
# - All time arguments (e.g. t, pio_startT, pio_endT, etc) can be supplied as either a Time or Float object.
|
43
43
|
# When supplied as a Float, the SDK will interpret it as a UNIX UTC timestamp in seconds.
|
44
44
|
# The SDK will automatically round to the nearest millisecond, e.g. 3.14159 => 3.142.
|
45
45
|
#
|
46
46
|
# == Installation
|
47
|
-
#
|
48
|
-
# gem install predictionio-0.
|
47
|
+
# The easiest way is to use RubyGems:
|
48
|
+
# gem install predictionio-0.5.0.gem
|
49
49
|
#
|
50
50
|
# == Synopsis
|
51
51
|
# The recommended usage of the SDK is to fire asynchronous requests as early as you can in your code,
|
@@ -79,26 +79,28 @@ module PredictionIO
|
|
79
79
|
# log_and_email_error(...)
|
80
80
|
# end
|
81
81
|
#
|
82
|
-
# === Import a User Action (
|
82
|
+
# === Import a User Action (Rate) from Your App (with synchronous/blocking requests)
|
83
83
|
# # PredictionIO call to record the view action
|
84
84
|
# begin
|
85
|
-
#
|
85
|
+
# client.identify("foouser")
|
86
|
+
# result = client.record_action_on_item("rate", "baritem", "pio_rate" => 4)
|
86
87
|
# rescue U2IActionNotCreatedError => e
|
87
88
|
# ...
|
88
89
|
# end
|
89
90
|
#
|
90
91
|
# === Retrieving Top N Recommendations for a User
|
91
92
|
# # PredictionIO call to get recommendations
|
92
|
-
#
|
93
|
+
# client.identify("foouser")
|
94
|
+
# response = client.aget_itemrec_top_n("barengine", 10)
|
93
95
|
#
|
94
96
|
# #
|
95
97
|
# # work you need to do for the page (rendering, db queries, etc)
|
96
98
|
# #
|
97
99
|
#
|
98
100
|
# begin
|
99
|
-
# result = client.
|
101
|
+
# result = client.get_itemrec_top_n(response)
|
100
102
|
# # display results, store results, or your other work...
|
101
|
-
# rescue
|
103
|
+
# rescue ItemRecNotFoundError => e
|
102
104
|
# # graceful error handling
|
103
105
|
# end
|
104
106
|
|
@@ -113,6 +115,9 @@ module PredictionIO
|
|
113
115
|
# Only JSON is currently supported as API response format.
|
114
116
|
attr_accessor :apiformat
|
115
117
|
|
118
|
+
# The UID used for recording user-to-item actions and retrieving recommendations.
|
119
|
+
attr_accessor :apiuid
|
120
|
+
|
116
121
|
# Raised when a user is not created after a synchronous API call.
|
117
122
|
class UserNotCreatedError < StandardError; end
|
118
123
|
|
@@ -171,10 +176,10 @@ module PredictionIO
|
|
171
176
|
# See also #create_user.
|
172
177
|
def acreate_user(uid, params = {})
|
173
178
|
rparams = params
|
174
|
-
rparams["
|
175
|
-
rparams["
|
176
|
-
if params["
|
177
|
-
rparams["
|
179
|
+
rparams["pio_appkey"] = @appkey
|
180
|
+
rparams["pio_uid"] = uid
|
181
|
+
if params["pio_latitude"] != nil && params["pio_longitude"] != nil then
|
182
|
+
rparams["pio_latlng"] = "#{params["pio_latitude"]},#{params["pio_longitude"]}"
|
178
183
|
end
|
179
184
|
|
180
185
|
@http.apost(PredictionIO::AsyncRequest.new(versioned_path("/users.#{@apiformat}"), rparams))
|
@@ -191,7 +196,6 @@ module PredictionIO
|
|
191
196
|
def create_user(*args)
|
192
197
|
uid_or_res = args[0]
|
193
198
|
if uid_or_res.is_a?(PredictionIO::AsyncResponse) then
|
194
|
-
uid = uid_or_res.request.params["uid"]
|
195
199
|
response = uid_or_res.get
|
196
200
|
else
|
197
201
|
uid = uid_or_res
|
@@ -219,8 +223,8 @@ module PredictionIO
|
|
219
223
|
# See also #get_user.
|
220
224
|
def aget_user(uid)
|
221
225
|
@http.aget(PredictionIO::AsyncRequest.new(versioned_path("/users/#{uid}.#{@apiformat}"),
|
222
|
-
|
223
|
-
|
226
|
+
"pio_appkey" => @appkey,
|
227
|
+
"pio_uid" => uid))
|
224
228
|
end
|
225
229
|
|
226
230
|
# :category: Synchronous Methods
|
@@ -243,12 +247,10 @@ module PredictionIO
|
|
243
247
|
end
|
244
248
|
if response.is_a?(Net::HTTPOK) then
|
245
249
|
res = JSON.parse(response.body)
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
res["latitude"] = latlng[0]
|
251
|
-
res["longitude"] = latlng[1]
|
250
|
+
if res["pio_latlng"] != nil then
|
251
|
+
latlng = res["pio_latlng"]
|
252
|
+
res["pio_latitude"] = latlng[0]
|
253
|
+
res["pio_longitude"] = latlng[1]
|
252
254
|
end
|
253
255
|
res
|
254
256
|
else
|
@@ -269,8 +271,8 @@ module PredictionIO
|
|
269
271
|
# See also #delete_user.
|
270
272
|
def adelete_user(uid)
|
271
273
|
@http.adelete(PredictionIO::AsyncRequest.new(versioned_path("/users/#{uid}.#{@apiformat}"),
|
272
|
-
|
273
|
-
|
274
|
+
"pio_appkey" => @appkey,
|
275
|
+
"pio_uid" => uid))
|
274
276
|
end
|
275
277
|
|
276
278
|
# :category: Synchronous Methods
|
@@ -305,21 +307,21 @@ module PredictionIO
|
|
305
307
|
# See also #create_item.
|
306
308
|
def acreate_item(iid, itypes, params = {})
|
307
309
|
rparams = params
|
308
|
-
rparams["
|
309
|
-
rparams["
|
310
|
+
rparams["pio_appkey"] = @appkey
|
311
|
+
rparams["pio_iid"] = iid
|
310
312
|
begin
|
311
|
-
rparams["
|
313
|
+
rparams["pio_itypes"] = itypes.join(",")
|
312
314
|
rescue Exception
|
313
|
-
rparams["
|
315
|
+
rparams["pio_itypes"] = itypes
|
314
316
|
end
|
315
|
-
if params["
|
316
|
-
rparams["
|
317
|
+
if params["pio_latitude"] != nil && params["pio_longitude"] != nil then
|
318
|
+
rparams["pio_latlng"] = "#{params["pio_latitude"]},#{params["pio_longitude"]}"
|
317
319
|
end
|
318
|
-
if params["
|
319
|
-
rparams["
|
320
|
+
if params["pio_startT"] != nil then
|
321
|
+
rparams["pio_startT"] = ((params["pio_startT"].to_r) * 1000).round(0).to_s
|
320
322
|
end
|
321
|
-
if params["
|
322
|
-
rparams["
|
323
|
+
if params["pio_endT"] != nil then
|
324
|
+
rparams["pio_endT"] = ((params["pio_endT"].to_r) * 1000).round(0).to_s
|
323
325
|
end
|
324
326
|
|
325
327
|
@http.apost(PredictionIO::AsyncRequest.new(versioned_path("/items.#{@apiformat}"), rparams))
|
@@ -362,8 +364,8 @@ module PredictionIO
|
|
362
364
|
# See also #get_item.
|
363
365
|
def aget_item(iid)
|
364
366
|
@http.aget(PredictionIO::AsyncRequest.new(versioned_path("/items/#{iid}.#{@apiformat}"),
|
365
|
-
|
366
|
-
|
367
|
+
"pio_appkey" => @appkey,
|
368
|
+
"pio_iid" => iid))
|
367
369
|
end
|
368
370
|
|
369
371
|
# :category: Synchronous Methods
|
@@ -386,20 +388,18 @@ module PredictionIO
|
|
386
388
|
end
|
387
389
|
if response.is_a?(Net::HTTPOK) then
|
388
390
|
res = JSON.parse(response.body)
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
res["latitude"] = latlng[0]
|
394
|
-
res["longitude"] = latlng[1]
|
391
|
+
if res["pio_latlng"] != nil then
|
392
|
+
latlng = res["pio_latlng"]
|
393
|
+
res["pio_latitude"] = latlng[0]
|
394
|
+
res["pio_longitude"] = latlng[1]
|
395
395
|
end
|
396
|
-
if res["
|
397
|
-
startT = Rational(res["
|
398
|
-
res["
|
396
|
+
if res["pio_startT"] != nil then
|
397
|
+
startT = Rational(res["pio_startT"], 1000)
|
398
|
+
res["pio_startT"] = Time.at(startT)
|
399
399
|
end
|
400
|
-
if res["
|
401
|
-
endT = Rational(res["
|
402
|
-
res["
|
400
|
+
if res["pio_endT"] != nil then
|
401
|
+
endT = Rational(res["pio_endT"], 1000)
|
402
|
+
res["pio_endT"] = Time.at(endT)
|
403
403
|
end
|
404
404
|
res
|
405
405
|
else
|
@@ -420,8 +420,8 @@ module PredictionIO
|
|
420
420
|
# See also #delete_item.
|
421
421
|
def adelete_item(iid)
|
422
422
|
@http.adelete(PredictionIO::AsyncRequest.new(versioned_path("/items/#{iid}.#{@apiformat}"),
|
423
|
-
|
424
|
-
|
423
|
+
"pio_appkey" => @appkey,
|
424
|
+
"pio_iid" => iid))
|
425
425
|
end
|
426
426
|
|
427
427
|
# :category: Synchronous Methods
|
@@ -448,32 +448,37 @@ module PredictionIO
|
|
448
448
|
end
|
449
449
|
end
|
450
450
|
|
451
|
+
# Set the user ID for use in all subsequent user-to-item action recording and user recommendation retrieval.
|
452
|
+
def identify(uid)
|
453
|
+
@apiuid = uid
|
454
|
+
end
|
455
|
+
|
451
456
|
# :category: Asynchronous Methods
|
452
457
|
# Asynchronously request to get the top n recommendations for a user from an ItemRec engine and return a PredictionIO::AsyncResponse object immediately.
|
453
458
|
#
|
454
459
|
# Corresponding REST API method: GET /engines/itemrec/:engine/topn
|
455
460
|
#
|
456
461
|
# See also #get_itemrec_top_n.
|
457
|
-
def aget_itemrec_top_n(engine,
|
462
|
+
def aget_itemrec_top_n(engine, n, params = {})
|
458
463
|
rparams = Hash.new
|
459
|
-
rparams["
|
460
|
-
rparams["
|
461
|
-
rparams["
|
462
|
-
if params["
|
463
|
-
params["
|
464
|
-
params["
|
465
|
-
rparams["
|
464
|
+
rparams["pio_appkey"] = @appkey
|
465
|
+
rparams["pio_uid"] = @apiuid
|
466
|
+
rparams["pio_n"] = n
|
467
|
+
if params["pio_itypes"] != nil &&
|
468
|
+
params["pio_itypes"].kind_of?(Array) &&
|
469
|
+
params["pio_itypes"].length > 0 then
|
470
|
+
rparams["pio_itypes"] = params["pio_itypes"].join(",")
|
466
471
|
else
|
467
|
-
rparams["
|
472
|
+
rparams["pio_itypes"] = params["pio_itypes"]
|
468
473
|
end
|
469
|
-
if params["
|
470
|
-
rparams["
|
474
|
+
if params["pio_latitude"] != nil && params["pio_longitude"] != nil then
|
475
|
+
rparams["pio_latlng"] = "#{params["pio_latitude"]},#{params["pio_longitude"]}"
|
471
476
|
end
|
472
|
-
if params["
|
473
|
-
rparams["
|
477
|
+
if params["pio_within"] != nil then
|
478
|
+
rparams["pio_within"] = params["pio_within"]
|
474
479
|
end
|
475
|
-
if params["
|
476
|
-
rparams["
|
480
|
+
if params["pio_unit"] != nil then
|
481
|
+
rparams["pio_unit"] = params["pio_unit"]
|
477
482
|
end
|
478
483
|
@http.aget(PredictionIO::AsyncRequest.new(versioned_path("/engines/itemrec/#{engine}/topn.#{@apiformat}"), rparams))
|
479
484
|
end
|
@@ -484,8 +489,8 @@ module PredictionIO
|
|
484
489
|
# See #aget_itemrec_top_n for a description of special argument handling.
|
485
490
|
#
|
486
491
|
# call-seq:
|
487
|
-
#
|
488
|
-
#
|
492
|
+
# aget_itemrec_top_n(engine, n, params = {})
|
493
|
+
# aget_itemrec_top_n(async_response)
|
489
494
|
def get_itemrec_top_n(*args)
|
490
495
|
uid_or_res = args[0]
|
491
496
|
if uid_or_res.is_a?(PredictionIO::AsyncResponse) then
|
@@ -495,7 +500,7 @@ module PredictionIO
|
|
495
500
|
end
|
496
501
|
if response.is_a?(Net::HTTPOK) then
|
497
502
|
res = JSON.parse(response.body)
|
498
|
-
res["
|
503
|
+
res["pio_iids"]
|
499
504
|
else
|
500
505
|
begin
|
501
506
|
msg = response.body
|
@@ -507,166 +512,40 @@ module PredictionIO
|
|
507
512
|
end
|
508
513
|
|
509
514
|
# :category: Asynchronous Methods
|
510
|
-
# Asynchronously request to record
|
511
|
-
#
|
512
|
-
# Corresponding REST API method: POST /actions/u2i/rate
|
513
|
-
#
|
514
|
-
# See also #user_rate_item.
|
515
|
-
def auser_rate_item(uid, iid, rate, params = {})
|
516
|
-
params["rate"] = rate
|
517
|
-
auser_action_item("rate", uid, iid, params)
|
518
|
-
end
|
519
|
-
|
520
|
-
# :category: Synchronous Methods
|
521
|
-
# Synchronously request to record a user-rate-item action and block until a response is received.
|
522
|
-
#
|
523
|
-
# See #auser_rate_item.
|
524
|
-
#
|
525
|
-
# call-seq:
|
526
|
-
# user_rate_item(uid, iid, rate, params = {})
|
527
|
-
# user_rate_item(async_response)
|
528
|
-
def user_rate_item(*args)
|
529
|
-
if !args[0].is_a?(PredictionIO::AsyncResponse) then
|
530
|
-
args.unshift("rate")
|
531
|
-
params = args[4]
|
532
|
-
if params == nil then
|
533
|
-
params = Hash.new
|
534
|
-
end
|
535
|
-
params["rate"] = args[3]
|
536
|
-
args[3] = params
|
537
|
-
end
|
538
|
-
user_action_item(*args)
|
539
|
-
end
|
540
|
-
|
541
|
-
# :category: Asynchronous Methods
|
542
|
-
# Asynchronously request to record a user-like-item action and return a PredictionIO::AsyncResponse object immediately.
|
543
|
-
#
|
544
|
-
# Corresponding REST API method: POST /actions/u2i/like
|
515
|
+
# Asynchronously request to record an action on an item and return a PredictionIO::AsyncResponse object immediately.
|
545
516
|
#
|
546
|
-
#
|
547
|
-
def auser_like_item(uid, iid, params = {})
|
548
|
-
auser_action_item("like", uid, iid, params)
|
549
|
-
end
|
550
|
-
|
551
|
-
# :category: Synchronous Methods
|
552
|
-
# Synchronously request to record a user-like-item action and block until a response is received.
|
517
|
+
# Corresponding REST API method: POST /actions/u2i
|
553
518
|
#
|
554
|
-
# See also #
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
519
|
+
# See also #record_action_on_item.
|
520
|
+
def arecord_action_on_item(action, iid, params = {})
|
521
|
+
rparams = params
|
522
|
+
rparams["pio_appkey"] = @appkey
|
523
|
+
rparams["pio_action"] = action
|
524
|
+
rparams["pio_uid"] = @apiuid
|
525
|
+
rparams["pio_iid"] = iid
|
526
|
+
if params["pio_t"] != nil then
|
527
|
+
rparams["pio_t"] = ((params["pio_t"].to_r) * 1000).round(0).to_s
|
562
528
|
end
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
# :category: Asynchronous Methods
|
567
|
-
# Asynchronously request to record a user-dislike-item action and return a PredictionIO::AsyncResponse object immediately.
|
568
|
-
#
|
569
|
-
# Corresponding REST API method: POST /actions/u2i/dislike
|
570
|
-
#
|
571
|
-
# See also #user_dislike_item.
|
572
|
-
def auser_dislike_item(uid, iid, params = {})
|
573
|
-
auser_action_item("dislike", uid, iid, params)
|
574
|
-
end
|
575
|
-
|
576
|
-
# :category: Synchronous Methods
|
577
|
-
# Synchronously request to record a user-dislike-item action and block until a response is received.
|
578
|
-
#
|
579
|
-
# See also #auser_dislike_item.
|
580
|
-
#
|
581
|
-
# call-seq:
|
582
|
-
# user_dislike_item(uid, iid, params = {})
|
583
|
-
# user_dislike_item(async_response)
|
584
|
-
def user_dislike_item(*args)
|
585
|
-
if !args[0].is_a?(PredictionIO::AsyncResponse) then
|
586
|
-
args.unshift("dislike")
|
529
|
+
if params["pio_latitude"] != nil && params["pio_longitude"] != nil then
|
530
|
+
rparams["pio_latlng"] = "#{params["pio_latitude"]},#{params["pio_longitude"]}"
|
587
531
|
end
|
588
|
-
|
589
|
-
end
|
590
|
-
|
591
|
-
# :category: Asynchronous Methods
|
592
|
-
# Asynchronously request to record a user-view-item action and return a PredictionIO::AsyncResponse object immediately.
|
593
|
-
#
|
594
|
-
# Corresponding REST API method: POST /actions/u2i/view
|
595
|
-
#
|
596
|
-
# See also #user_view_item.
|
597
|
-
def auser_view_item(uid, iid, params = {})
|
598
|
-
auser_action_item("view", uid, iid, params)
|
532
|
+
@http.apost(PredictionIO::AsyncRequest.new(versioned_path("/actions/u2i.#{@apiformat}"), rparams))
|
599
533
|
end
|
600
534
|
|
601
535
|
# :category: Synchronous Methods
|
602
|
-
# Synchronously request to record
|
536
|
+
# Synchronously request to record an action on an item and block until a response is received.
|
603
537
|
#
|
604
|
-
# See also #
|
538
|
+
# See also #arecord_action_on_item.
|
605
539
|
#
|
606
540
|
# call-seq:
|
607
|
-
#
|
608
|
-
#
|
609
|
-
def
|
610
|
-
if !args[0].is_a?(PredictionIO::AsyncResponse) then
|
611
|
-
args.unshift("view")
|
612
|
-
end
|
613
|
-
user_action_item(*args)
|
614
|
-
end
|
615
|
-
|
616
|
-
# :category: Asynchronous Methods
|
617
|
-
# Asynchronously request to record a user-conversion-item action and return a PredictionIO::AsyncResponse object immediately.
|
618
|
-
#
|
619
|
-
# Corresponding REST API method: POST /actions/u2i/conversion
|
620
|
-
#
|
621
|
-
# See also #user_conversion_item.
|
622
|
-
def auser_conversion_item(uid, iid, params = {})
|
623
|
-
auser_action_item("conversion", uid, iid, params)
|
624
|
-
end
|
625
|
-
|
626
|
-
# :category: Synchronous Methods
|
627
|
-
# Synchronously request to record a user-conversion-item action and block until a response is received.
|
628
|
-
#
|
629
|
-
# See also #auser_conversion_item.
|
630
|
-
#
|
631
|
-
# call-seq:
|
632
|
-
# user_conversion_item(uid, iid, params = {})
|
633
|
-
# user_conversion_item(async_response)
|
634
|
-
def user_conversion_item(*args)
|
635
|
-
if !args[0].is_a?(PredictionIO::AsyncResponse) then
|
636
|
-
args.unshift("conversion")
|
637
|
-
end
|
638
|
-
user_action_item(*args)
|
639
|
-
end
|
640
|
-
|
641
|
-
# :nodoc: all
|
642
|
-
private
|
643
|
-
|
644
|
-
def versioned_path(path)
|
645
|
-
# disabled for now
|
646
|
-
# "/#{@apiversion}#{path}"
|
647
|
-
path
|
648
|
-
end
|
649
|
-
|
650
|
-
def auser_action_item(action, uid, iid, params = {})
|
651
|
-
rparams = params
|
652
|
-
rparams["appkey"] = @appkey
|
653
|
-
rparams["uid"] = uid
|
654
|
-
rparams["iid"] = iid
|
655
|
-
if params["t"] != nil then
|
656
|
-
rparams["t"] = ((params["t"].to_r) * 1000).round(0).to_s
|
657
|
-
end
|
658
|
-
if params["latitude"] != nil && params["longitude"] != nil then
|
659
|
-
rparams["latlng"] = "#{params["latitude"]},#{params["longitude"]}"
|
660
|
-
end
|
661
|
-
@http.apost(PredictionIO::AsyncRequest.new(versioned_path("/actions/u2i/#{action}.#{@apiformat}"), rparams))
|
662
|
-
end
|
663
|
-
|
664
|
-
def user_action_item(*args)
|
541
|
+
# record_action_on_item(action, uid, iid, params = {})
|
542
|
+
# record_action_on_item(async_response)
|
543
|
+
def record_action_on_item(*args)
|
665
544
|
action_or_res = args[0]
|
666
545
|
if action_or_res.is_a?(PredictionIO::AsyncResponse) then
|
667
546
|
response = action_or_res.get
|
668
547
|
else
|
669
|
-
response =
|
548
|
+
response = arecord_action_on_item(*args).get
|
670
549
|
end
|
671
550
|
unless response.is_a?(Net::HTTPCreated) then
|
672
551
|
begin
|
@@ -677,5 +556,14 @@ module PredictionIO
|
|
677
556
|
raise U2IActionNotCreatedError, msg
|
678
557
|
end
|
679
558
|
end
|
559
|
+
|
560
|
+
# :nodoc: all
|
561
|
+
private
|
562
|
+
|
563
|
+
def versioned_path(path)
|
564
|
+
# disabled for now
|
565
|
+
# "/#{@apiversion}#{path}"
|
566
|
+
path
|
567
|
+
end
|
680
568
|
end
|
681
569
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: predictionio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-07-20 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: ! 'PredictionIO is a prediction server for building smart applications.
|
15
15
|
This gem
|