Skip to content

Commit 1f09b20

Browse files
committed
Merge pull request #10 from pferrel/master
ready for v0.2.0 release
2 parents 73f1dfe + e00c2d2 commit 1f09b20

20 files changed

+1819
-552
lines changed

README.md

Lines changed: 246 additions & 114 deletions
Large diffs are not rendered by default.

build.sbt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
name := "template-scala-parallel-recommendation"
1+
name := "template-scala-parallel-universal-recommendation"
2+
3+
version := "0.2.0"
24

35
organization := "io.prediction"
46

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
Event: purchase entity_id: u1 target_entity_id: iphone
2+
Event: purchase entity_id: u1 target_entity_id: ipad
3+
Event: purchase entity_id: u2 target_entity_id: nexus
4+
Event: purchase entity_id: u2 target_entity_id: galaxy
5+
Event: purchase entity_id: u3 target_entity_id: surface
6+
Event: purchase entity_id: u4 target_entity_id: iphone
7+
Event: purchase entity_id: u4 target_entity_id: galaxy
8+
Event: view entity_id: u1 target_entity_id: phones
9+
Event: view entity_id: u1 target_entity_id: mobile_acc
10+
Event: view entity_id: u2 target_entity_id: phones
11+
Event: view entity_id: u2 target_entity_id: tablets
12+
Event: view entity_id: u2 target_entity_id: mobile_acc
13+
Event: view entity_id: u3 target_entity_id: mobile_acc
14+
Event: view entity_id: u4 target_entity_id: phones
15+
Event: view entity_id: u4 target_entity_id: tablets
16+
Event: view entity_id: u4 target_entity_id: soap
17+
Event: view entity_id: u5 target_entity_id: soap
18+
Event: $set entity_id: iphone properties/catagory: phones properties/date: 2015-08-30T12:24:41 properties/expiredate: 2015-09-01T12:24:41
19+
Event: $set entity_id: ipad properties/catagory: tablets properties/availabledate: 2015-08-29T12:24:41 properties/date: 2015-08-31T12:24:41 properties/expiredate: 2015-09-02T12:24:41
20+
Event: $set entity_id: nexus properties/catagory: tablets properties/availabledate: 2015-08-30T12:24:41 properties/date: 2015-09-01T12:24:41 properties/expiredate: 2015-09-03T12:24:41
21+
Event: $set entity_id: galaxy properties/catagory: phones properties/date: 2015-09-02T12:24:41 properties/expiredate: 2015-09-04T12:24:41
22+
Event: $set entity_id: surface properties/catagory: tablets properties/availabledate: 2015-09-01T12:24:41 properties/date: 2015-09-03T12:24:41

engine.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{
2+
"comment":" This config file uses default settings for all but the required values see README.md for docs",
23
"id": "default",
34
"description": "Default settings",
45
"engineFactory": "org.template.RecommendationEngine",
@@ -25,7 +26,7 @@
2526
"appName": "handmade",
2627
"indexName": "urindex",
2728
"typeName": "items",
28-
"eventNames": ["purchase", "view"]
29+
"eventNames": ["purchase", "view"],
2930
}
3031
}
3132
]

examples/import_handmade_eventserver.py

Lines changed: 54 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,29 @@
55
import predictionio
66
import argparse
77
import random
8+
import datetime
9+
import pytz
810

911
RATE_ACTIONS_DELIMITER = ","
10-
SEED = 3
12+
SEED = 1
13+
1114

1215
def import_events(client, file):
1316
f = open(file, 'r')
1417
random.seed(SEED)
1518
count = 0
19+
# year, month, day[, hour[, minute[, second[
20+
event_date = datetime.datetime(2015, 8, 13, 12, 24, 41)
21+
# event_date = datetime.now(pytz.utc)
22+
date_increment = datetime.timedelta(days=1)
23+
available_date = event_date + datetime.timedelta(days=-2)
24+
expire_date = event_date + datetime.timedelta(days=2)
1625
print "Importing data..."
26+
1727
for line in f:
1828
data = line.rstrip('\r\n').split(RATE_ACTIONS_DELIMITER)
1929
# For demonstration purpose action names are taken from input along with secondary actions on
20-
# For the MMR add some item metadata
30+
# For the UR add some item metadata
2131

2232
if (data[1] == "purchase"):
2333
client.create_event(
@@ -28,27 +38,59 @@ def import_events(client, file):
2838
target_entity_id=data[2],
2939
)
3040
print "Event: " + data[1] + " entity_id: " + data[0] + " target_entity_id: " + data[2]
31-
elif (data[1] == "view"): # assumes other event type is 'view'
41+
elif (data[1] == "view"): # assumes other event type is 'view'
3242
client.create_event(
3343
event=data[1],
3444
entity_type="user",
3545
entity_id=data[0],
36-
target_entity_type="item", # type of item in this action
46+
target_entity_type="item", # type of item in this action
3747
target_entity_id=data[2],
3848
)
3949
print "Event: " + data[1] + " entity_id: " + data[0] + " target_entity_id: " + data[2]
40-
elif (data[1] == "$set"): # must be a set event
41-
client.create_event(
42-
event=data[1],
43-
entity_type="item",
44-
entity_id=data[0],
45-
properties= { "category": [data[2]] }
46-
)
47-
print "Event: " + data[1] + " entity_id: " + data[0] + " properties/catagory: " + data[2]
50+
elif (data[1] == "$set"): # must be a set event
51+
date_choice = random.randint(0, 2)
52+
if (date_choice == 2): # both bounds and date for daterange
53+
client.create_event(
54+
event=data[1],
55+
entity_type="item",
56+
entity_id=data[0],
57+
properties={"category": [data[2]], "expiredate": expire_date.isoformat(),
58+
"availabledate": available_date.isoformat(), "date": event_date.isoformat()}
59+
)
60+
print "Event: " + data[1] + " entity_id: " + data[0] + " properties/catagory: " + data[2] + \
61+
" properties/availabledate: " + available_date.isoformat() + \
62+
" properties/date: " + event_date.isoformat() + \
63+
" properties/expiredate: " + expire_date.isoformat()
64+
elif (date_choice == 1): # available bound and date for daterange
65+
client.create_event(
66+
event=data[1],
67+
entity_type="item",
68+
entity_id=data[0],
69+
properties={"category": [data[2]],
70+
"availabledate": available_date.isoformat(), "date": event_date.isoformat()}
71+
)
72+
print "Event: " + data[1] + " entity_id: " + data[0] + " properties/catagory: " + data[2] + \
73+
" properties/availabledate: " + available_date.isoformat() + \
74+
" properties/date: " + event_date.isoformat()
75+
else: # expire bound and date for daterange
76+
client.create_event(
77+
event=data[1],
78+
entity_type="item",
79+
entity_id=data[0],
80+
properties={"category": [data[2]], "expiredate": expire_date.isoformat(),
81+
"date": event_date.isoformat()}
82+
)
83+
print "Event: " + data[1] + " entity_id: " + data[0] + " properties/catagory: " + data[2] + \
84+
" properties/date: " + event_date.isoformat() + \
85+
" properties/expiredate: " + expire_date.isoformat()
4886
count += 1
87+
expire_date += date_increment
88+
event_date += date_increment
89+
available_date += date_increment
4990
f.close()
5091
print "%s events are imported." % count
5192

93+
5294
if __name__ == '__main__':
5395
parser = argparse.ArgumentParser(
5496
description="Import sample data for recommendation engine")
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
"""
2+
Import sample data for recommendation engine
3+
"""
4+
5+
import predictionio
6+
import argparse
7+
import random
8+
import datetime
9+
import pytz
10+
import dateutil.parser
11+
12+
RATE_ACTIONS_DELIMITER = ","
13+
SEED = 1
14+
15+
16+
def import_events(client, file):
17+
random.seed(SEED)
18+
count = 0
19+
20+
# year, month, day[, hour[, minute[, second[
21+
#event_date = datetime.datetime(2015, 8, 13, 12, 24, 41)
22+
# These date values are chosen to match the multi-query-handmade.sh queries for testing purposes
23+
num_samples = 50
24+
num_usage_event_lines = 17
25+
start_date = dateutil.parser.parse("2015-08-12T11:28:45.114-07:00")
26+
item_date = start_date
27+
end_date = dateutil.parser.parse("2015-10-01T11:28:45.114-07:00")
28+
date_increment = (end_date - start_date) / (num_usage_event_lines * num_samples)
29+
event_date = item_date
30+
print "Date increment: " + str(date_increment)
31+
available_date = item_date + datetime.timedelta(days=-2)
32+
expire_date = item_date + datetime.timedelta(days=2)
33+
end = event_date.isoformat()
34+
start = event_date.isoformat()
35+
36+
#date_increment = datetime.timedelta(minutes=1)
37+
#item_date = datetime.datetime.now(pytz.timezone("America/New_York"))
38+
# event_date = datetime.now(pytz.utc)
39+
print "Importing data."
40+
41+
for it in range(1, num_samples, 1):
42+
f = open(file, 'r')
43+
for line in f:
44+
data = line.rstrip('\r\n').split(RATE_ACTIONS_DELIMITER)
45+
# For demonstration purpose action names are taken from input along with secondary actions on
46+
# For the UR add some item metadata
47+
user = "u" + str(random.randint(0, 1000))
48+
if (data[1] == "purchase"):
49+
client.create_event(
50+
event=data[1],
51+
entity_type="user",
52+
entity_id=data[0],
53+
target_entity_type="item",
54+
target_entity_id=data[2],
55+
event_time=event_date
56+
)
57+
print "Event: " + data[1] + " user: " + data[0] + " target_entity_id: " + data[2] + " eventDate: " + event_date.isoformat()
58+
elif (data[1] == "view"): # assumes other event type is 'view'
59+
client.create_event(
60+
event=data[1],
61+
entity_type="user",
62+
entity_id=data[0],
63+
target_entity_type="item", # type of item in this action
64+
target_entity_id=data[2],
65+
event_time=event_date
66+
)
67+
print "Event: " + data[1] + " user: " + data[0] + " target_entity_id: " + data[2] + " eventDate: " + event_date.isoformat()
68+
event_date += date_increment
69+
70+
f.close()
71+
72+
#now set some properties once per items with various dates
73+
num_items = 5
74+
start_date = dateutil.parser.parse("2015-08-12T11:28:45.114-07:00")
75+
item_date = start_date
76+
end_date = dateutil.parser.parse("2015-10-01T11:28:45.114-07:00")
77+
date_increment = (end_date - start_date)/num_items
78+
print "Date increment: " + str(date_increment)
79+
event_date = item_date
80+
available_date = item_date + datetime.timedelta(days=-2)
81+
expire_date = item_date + datetime.timedelta(days=2)
82+
end = event_date.isoformat()
83+
start = event_date.isoformat()
84+
85+
86+
f = open(file, 'r')
87+
count = 0
88+
for line in f:
89+
data = line.rstrip('\r\n').split(RATE_ACTIONS_DELIMITER)
90+
if (data[1] == "$set"): # must be a set event
91+
date_choice = count % 3
92+
print "data_choice = " + str(date_choice)
93+
if (date_choice == 2): # both bounds and date for daterange
94+
client.create_event(
95+
event=data[1],
96+
entity_type="item",
97+
entity_id=data[0],
98+
properties={"category": [data[2]], "expiredate": expire_date.isoformat(),
99+
"availabledate": available_date.isoformat(), "date": item_date.isoformat()},
100+
event_time=event_date
101+
)
102+
print "Event: " + data[1] + " item: " + data[0] + " properties/catagory: " + data[2] + " eventDate: " + \
103+
event_date.isoformat() + \
104+
" properties/availabledate: " + available_date.isoformat() + \
105+
" properties/date: " + item_date.isoformat() + \
106+
" properties/expiredate: " + expire_date.isoformat()
107+
elif (date_choice == 1): # available bound and date for daterange
108+
client.create_event(
109+
event=data[1],
110+
entity_type="item",
111+
entity_id=data[0],
112+
properties={"category": [data[2]],
113+
"availabledate": available_date.isoformat(), "date": item_date.isoformat()},
114+
event_time=event_date
115+
)
116+
print "Event: " + data[1] + " item: " + data[0] + " properties/catagory: " + data[2] + " eventDate: " + \
117+
event_date.isoformat() + \
118+
" properties/availabledate: " + available_date.isoformat() + \
119+
" properties/date: " + item_date.isoformat()
120+
else: # expire bound and date for daterange
121+
client.create_event(
122+
event=data[1],
123+
entity_type="item",
124+
entity_id=data[0],
125+
properties={"category": [data[2]], "expiredate": expire_date.isoformat(),
126+
"date": item_date.isoformat()},
127+
event_time=event_date
128+
)
129+
print "Event: " + data[1] + " item: " + data[0] + " properties/catagory: " + data[2] + " eventDate: " + \
130+
event_date.isoformat() + \
131+
" properties/date: " + item_date.isoformat() + \
132+
" properties/expiredate: " + expire_date.isoformat()
133+
count += 1
134+
expire_date += date_increment
135+
item_date += date_increment
136+
event_date += date_increment
137+
available_date += date_increment
138+
f.close()
139+
print "%s events are imported." % count
140+
print "Start at " + start + " end at " + end + " with increment in seconds of " + str(date_increment.seconds)
141+
142+
143+
if __name__ == '__main__':
144+
parser = argparse.ArgumentParser(
145+
description="Import sample data for recommendation engine")
146+
parser.add_argument('--access_key', default='invald_access_key')
147+
parser.add_argument('--url', default="http://localhost:7070")
148+
parser.add_argument('--file', default="./data/sample-handmade-data.txt")
149+
150+
args = parser.parse_args()
151+
print args
152+
153+
client = predictionio.EventClient(
154+
access_key=args.access_key,
155+
url=args.url,
156+
threads=5,
157+
qsize=500)
158+
import_events(client, args.file)

examples/import_movielens_eventserver.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def import_events(client, file):
1717
for line in f:
1818
data = line.rstrip('\r\n').split(RATE_ACTIONS_DELIMITER)
1919
# For demonstration purpose, randomly mix in some buy events
20-
# For the MMR add some item metadata
20+
# For the UR add some item metadata
2121
if (random.randint(0, 1) == 1):
2222
client.create_event(
2323
event="rate",

0 commit comments

Comments
 (0)