Using Trees to subselect datasets

The Data limb isn’t just for Treants; it works for Tree objects as well. So we could use our Treant ‘sequoia’ directly as a Tree instead of a Treant if we wanted:

>>> import datreant.core as dtr
>>> import datreant.data
>>> t = dtr.Tree('sequoia/')
>>> t.attach('data')
>>> t.data
<Data(['a grocery list', 'something enormous', 'something wicked'])>

and it would work all the same. This behavior is most useful, however, when nesting datasets.

Nesting within a tree

Dataset names are their paths downward relative to the Tree/Treant they are called from, so we can store a dataset like:

>>> t.data['a/better/grocery/list'] = ['ham', 'eggs', 'steak']
>>> t.data
<Data(['a grocery list', 'a/better/grocery/list', 'something enormous', 'something wicked'])>

and this creates the directory structure you might expect:

>>> t.draw()
sequoia/
 +-- a grocery list/
 |   +-- pyData.pkl
 +-- Treant.608f7463-5063-450a-96eb-c5c93f16dc32.json
 +-- something enormous/
 |   +-- pdData.h5
 +-- a/
 |   +-- better/
 |       +-- grocery/
 |           +-- list/
 |               +-- pyData.pkl
 +-- something wicked/
     +-- npData.h5

This allows us to group together related datasets in a natural way, as we would probably do even if we weren’t using datreant objects. So if we had several shopping lists, we might put them under a directory of their own:

>>> t.data['shopping lists/food'] = ['milk', 'ham', 'eggs', 'steak']
>>> t.data['shopping lists/clothes'] = ['shirts', 'pants', 'shoes']
>>> t.data['shopping lists/misc'] = ['dish soap']

which would give us:

>>> t['shopping lists'].draw()
shopping lists/
 +-- misc/
 |   +-- pyData.pkl
 +-- food/
 |   +-- pyData.pkl
 +-- clothes/
     +-- pyData.pkl

and we could always get them back easily enough:

>>> t.data['shopping lists/food']
['milk', 'ham', 'eggs', 'steak']

Trees as subselections

But since Trees can access datasets inside them, we could work more directly with our shopping lists by using the ‘shopping lists’ Tree

>>> lets_go_shopping = t['shopping lists']
>>> lets_go_shopping.data
 <Data(['clothes', 'food', 'misc'])>

and now selecting is a bit less verbose:

>>> lets_go_shopping['food']
['milk', 'ham', 'eggs', 'steak']