predictionio 0.3.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|