Skip to content

Commit

Permalink
Merge pull request #42 from markovianhq/fix/advertiser_feature
Browse files Browse the repository at this point in the history
implement and test advertiser featurem logic
  • Loading branch information
waltherg committed May 14, 2017
2 parents fe0f713 + a5e1541 commit 81f85e7
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 47 deletions.
14 changes: 11 additions & 3 deletions bonspy/bonsai.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,14 @@ class BonsaiTree(nx.DiGraph):
signals absence of the respective feature.
"""

def __init__(self, graph=None, feature_order=None, feature_value_order=None, absence_values=None):
def __init__(self, graph=None, feature_order=None, feature_value_order=None, absence_values=None, **kwargs):
if graph is not None:
super(BonsaiTree, self).__init__(graph)
self.feature_order = feature_order or {}
self.feature_value_order = feature_value_order or {}
self.absence_values = absence_values or {}
for key, value in kwargs.items():
setattr(self, key, value)
self._transform_splits()
self._replace_absent_values()
self._remove_missing_compound_features()
Expand All @@ -61,7 +63,9 @@ def __init__(self, graph=None, feature_order=None, feature_value_order=None, abs
self._handle_switch_statements()
self.bonsai = ''.join(self._tree_to_bonsai())
else:
super(BonsaiTree, self).__init__()
super(BonsaiTree, self).__init__(**kwargs)
for key, value in kwargs.items():
setattr(self, key, value)

@property
def bonsai_encoded(self):
Expand Down Expand Up @@ -558,9 +562,13 @@ def _get_attribute_indices(feature):

def _get_formatted_compound_feature(self, feature, state_node):
object_, attribute = feature.split('.')
try:
value = self.node[state_node]['state'][object_]
except KeyError:
value = self.__getattribute__(object_)
feature = '{feature}[{value}].{attribute}'.format(
feature=object_,
value=self.node[state_node]['state'][object_],
value=value,
attribute=attribute
)

Expand Down
28 changes: 2 additions & 26 deletions bonspy/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -687,23 +687,13 @@ def multiple_compound_features_graph():

g.add_node(
'root',
split=OrderedDict(
[
('advertiser_1', 'advertiser')
]
),
state=OrderedDict([])
)

g.add_node(
'advertiser_1',
split=OrderedDict(
[
('segment_1', 'segment'),
('segment_2', 'segment')
]
),
state=OrderedDict([('advertiser', 1)])
state=OrderedDict([])
)

g.add_node(
Expand All @@ -716,7 +706,6 @@ def multiple_compound_features_graph():
),
state=OrderedDict(
[
('advertiser', 1),
('segment', 1)
]
)
Expand All @@ -731,7 +720,6 @@ def multiple_compound_features_graph():
),
state=OrderedDict(
[
('advertiser', 1),
('segment', 2)
]
)
Expand All @@ -746,7 +734,6 @@ def multiple_compound_features_graph():
),
state=OrderedDict(
[
('advertiser', 1),
('segment', 1),
('segment.age', (0, 10))
]
Expand All @@ -759,7 +746,6 @@ def multiple_compound_features_graph():
output=0.1,
state=OrderedDict(
[
('advertiser', 1),
('segment', 1),
('segment.age', (10, 20))
]
Expand All @@ -775,7 +761,6 @@ def multiple_compound_features_graph():
),
state=OrderedDict(
[
('advertiser', 1),
('segment', 2),
('segment.age', (0, 10))
]
Expand All @@ -788,7 +773,6 @@ def multiple_compound_features_graph():
output=0.5,
state=OrderedDict(
[
('advertiser', 1),
('segment', 1),
('segment.age', (0, 10)),
('advertiser.frequency', (0, 10))
Expand All @@ -802,7 +786,6 @@ def multiple_compound_features_graph():
output=0.6,
state=OrderedDict(
[
('advertiser', 1),
('segment', 2),
('segment.age', (0, 10)),
('advertiser.frequency', (10, 20))
Expand All @@ -812,20 +795,13 @@ def multiple_compound_features_graph():

g.add_edge(
'root',
'advertiser_1',
value=1,
type='assignment'
)

g.add_edge(
'advertiser_1',
'segment_1',
value=1,
type='assignment'
)

g.add_edge(
'advertiser_1',
'root',
'segment_2',
value=2,
type='assignment'
Expand Down
33 changes: 16 additions & 17 deletions bonspy/tests/test_bonsai.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ def test_multiple_compound_features(multiple_compound_features_graph):
}

feature_order = {
'advertiser': 0,
'segment': 1,
'segment.age': 2,
'advertiser.frequency': 3
Expand All @@ -71,25 +70,25 @@ def test_multiple_compound_features(multiple_compound_features_graph):
tree = BonsaiTree(
multiple_compound_features_graph,
feature_order=feature_order,
feature_value_order=feature_value_order
feature_value_order=feature_value_order,
advertiser=1
)

expected_tree = '''
if advertiser[1]:
\tif segment[1]:
\t\tswitch segment[1].age:
\t\t\tcase (0 .. 10):
\t\t\t\tswitch advertiser[1].frequency:
\t\t\t\t\tcase (0 .. 10):
\t\t\t\t\t\t0.5000
\t\t\tcase (10 .. 20):
\t\t\t\t0.1000
\telse segment[2]:
\t\tswitch segment[2].age:
\t\t\tcase (0 .. 10):
\t\t\t\tswitch advertiser[1].frequency:
\t\t\t\t\tcase (10 .. 20):
\t\t\t\t\t\t0.6000
if segment[1]:
\tswitch segment[1].age:
\t\tcase (0 .. 10):
\t\t\tswitch advertiser[1].frequency:
\t\t\t\tcase (0 .. 10):
\t\t\t\t\t0.5000
\t\tcase (10 .. 20):
\t\t\t0.1000
else segment[2]:
\tswitch segment[2].age:
\t\tcase (0 .. 10):
\t\t\tswitch advertiser[1].frequency:
\t\t\t\tcase (10 .. 20):
\t\t\t\t\t0.6000
'''.replace(8 * ' ', '').strip().lstrip('\n') + '\n'

assert tree.bonsai == expected_tree
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

setup(
name='bonspy',
version='1.2.1',
version='1.2.2',
description='Library that converts bidding trees to the AppNexus Bonsai language.',
author='Alexander Volkmann, Georg Walther',
author_email='contact@markovian.com',
Expand Down

0 comments on commit 81f85e7

Please sign in to comment.