π³ DocumentationΒΆ
Big Tree Python PackageΒΆ
Tree Implementation and Methods for Python, integrated with Python list, dictionary, and pandas DataFrame.
It is pythonic, making it easy to learn and extendable to many types of workflows.
Related Links:
Community
Package
Articles
ComponentsΒΆ
There are 3 segments to Big Tree consisting of Tree, Binary Tree, and Directed Acyclic Graph (DAG) implementation.
For Tree implementation, there are 9 main components.
-
BaseNode, extendable classNode, BaseNode with node name attribute
-
From
Node, using parent and children constructorsFrom str, using tree in string display format
From list, using paths or parent-child tuples
From nested dictionary, using path or recursive structure
From pandas DataFrame, using paths or parent-child columns
Add nodes to existing tree using path string
Add nodes and attributes to existing tree using dictionary or pandas DataFrame, using path
Add only attributes to existing tree using dictionary or pandas DataFrame, using node name
-
Pre-Order Traversal
Post-Order Traversal
Level-Order Traversal
Level-Order-Group Traversal
ZigZag Traversal
ZigZag-Group Traversal
-
Shift nodes from location to destination
Copy nodes from location to destination
Copy nodes from one tree to another
Shift and replace nodes from location to destination
Copy and replace nodes from one tree to another
-
Find multiple nodes based on name, partial path, relative path, attribute value, user-defined condition
Find single nodes based on name, partial path, relative path, full path, attribute value, user-defined condition
Find multiple child nodes based on user-defined condition
Find single child node based on name, user-defined condition
-
Cloning tree to another
NodetypePrune tree
Get difference between two trees
-
Enhanced Reingold Tilford Algorithm to retrieve (x, y) coordinates for a tree structure
-
Print to console
Export to dictionary, nested dictionary, or pandas DataFrame
Export tree to dot (can save to .dot, .png, .svg, .jpeg files)
Export tree to Pillow (can save to .png, .jpg)
Export tree to Mermaid Flowchart (can display on .md)
-
Sample workflows for tree demonstration!
For Binary Tree implementation, there are 3 main components. Binary Node inherits from Node, so the components in Tree implementation are also available in Binary Tree.
-
BinaryNode, Node with binary tree rules
-
From list, using flattened list structure
-
In-Order Traversal
For Directed Acyclic Graph (DAG) implementation, there are 4 main components.
-
DAGNode, extendable class for constructing Directed Acyclic Graph (DAG)
-
From list, containing parent-child tuples
From nested dictionary
From pandas DataFrame
-
Generic traversal method
-
Export to list, dictionary, or pandas DataFrame
Export DAG to dot (can save to .dot, .png, .svg, .jpeg files)
InstallationΒΆ
There are two ways to install bigtree, with pip (from PyPI) or conda (from conda-forge).
a) Installation with pip (recommended)ΒΆ
To install bigtree, run the following line in command prompt:
$ pip install bigtree
If tree needs to use pandas methods, it requires additional dependencies. Run the following line in command prompt:
$ pip install 'bigtree[pandas]'
If tree needs to be exported to image, it requires additional dependencies. Run the following lines in command prompt:
$ pip install 'bigtree[image]'
$ brew install gprof2dot # for MacOS
$ conda install graphviz # for Windows
Alternatively, install all optional dependencies with the following line in command prompt:
$ pip install 'bigtree[all]'
b) Installation with condaΒΆ
To install bigtree with conda, run the following line in command prompt:
$ conda install -c conda-forge bigtree
Tree DemonstrationΒΆ
Here are some codes to get started.
Construct TreeΒΆ
Nodes can have attributes if they are initialized from Node, dictionary, or pandas DataFrame.
From
Node
Nodes can be linked to each other in the following ways:
Using
parentandchildrensetter methodsDirectly passing
parentorchildrenargumentUsing bitshift operator with the convention
parent >> childorchild << parentUsing
.append(child)or.extend([child1, child2])methods
from bigtree import Node, tree_to_dot
root = Node("a")
b = Node("b")
c = Node("c")
d = Node("d")
root.children = [b, c]
d.parent = b
root.show()
# a
# βββ b
# β βββ d
# βββ c
graph = tree_to_dot(root, node_colour="gold")
graph.write_png("assets/docs/demo_tree.png")

from bigtree import Node
root = Node("a")
b = Node("b")
c = Node("c")
d = Node("d")
root >> b
root >> c
d << b
root.show()
# a
# βββ b
# β βββ d
# βββ c
Alternatively, we can directly pass parent or children argument.
from bigtree import Node
b = Node("b")
c = Node("c")
d = Node("d", parent=b)
root = Node("a", children=[b, c])
root.show(style="ascii")
# a
# |-- b
# | +-- d
# +-- c
From str
Construct nodes only.
from bigtree import str_to_tree
tree_str = """
a
βββ b
β βββ d
β βββ e
β βββ g
β βββ h
βββ c
βββ f
"""
root = str_to_tree(tree_str)
root.show()
# a
# βββ b
# β βββ d
# β βββ e
# β βββ g
# β βββ h
# βββ c
# βββ f
From list
Construct nodes only, list can contain either full paths or tuples of parent-child names.
from bigtree import list_to_tree, list_to_tree_by_relation
root = list_to_tree(["a/b/d", "a/c"])
root.show()
# a
# βββ b
# β βββ d
# βββ c
root = list_to_tree_by_relation([("a", "b"), ("a", "c"), ("b", "d")])
root.show()
# a
# βββ b
# β βββ d
# βββ c
From nested dictionary
Construct nodes using path where key is path and value is dict of node attribute names and attribute values.
Dictionary can also be a recursive structure where key is node attribute names and value is node attribute values,
and list of children (recursive).
from bigtree import dict_to_tree, nested_dict_to_tree
path_dict = {
"a": {"age": 90},
"a/b": {"age": 65},
"a/c": {"age": 60},
"a/b/d": {"age": 40},
}
root = dict_to_tree(path_dict)
root.show(attr_list=["age"])
# a [age=90]
# βββ b [age=65]
# β βββ d [age=40]
# βββ c [age=60]
path_dict = {
"name": "a",
"age": 90,
"children": [
{
"name": "b",
"age": 65,
"children": [
{"name": "d", "age": 40},
],
},
{"name": "c", "age": 60},
],
}
root = nested_dict_to_tree(path_dict)
root.show(attr_list=["age"])
# a [age=90]
# βββ b [age=65]
# β βββ d [age=40]
# βββ c [age=60]
From pandas DataFrame
Construct nodes with attributes, pandas DataFrame can contain either path column or parent-child columns, and attribute columns.
import pandas as pd
from bigtree import dataframe_to_tree, dataframe_to_tree_by_relation
data = pd.DataFrame(
[
["a", 90],
["a/b", 65],
["a/c", 60],
["a/b/d", 40],
],
columns=["path", "age"],
)
root = dataframe_to_tree(data)
root.show(attr_list=["age"])
# a [age=90]
# βββ b [age=65]
# β βββ d [age=40]
# βββ c [age=60]
data = pd.DataFrame(
[
["a", None, 90],
["b", "a", 65],
["c", "a", 60],
["d", "b", 40],
],
columns=["child", "parent", "age"],
)
root = dataframe_to_tree_by_relation(data)
root.show(attr_list=["age"])
# a [age=90]
# βββ b [age=65]
# β βββ d [age=40]
# βββ c [age=60]
If tree is already created, attributes can still be added using a dictionary or pandas DataFrame!
Print TreeΒΆ
After tree is constructed, it can be viewed by printing to console using show method directly.
Alternatively, the print_tree method can be used.
from bigtree import Node, print_tree
root = Node("a", age=90, gender="F")
b = Node("b", age=65, gender="M", parent=root)
c = Node("c", age=60, gender="M", parent=root)
d = Node("d", age=40, gender="F", parent=b)
e = Node("e", age=35, gender="M", parent=b)
print_tree(root)
# a
# βββ b
# β βββ d
# β βββ e
# βββ c
# Print subtree
print_tree(root, node_name_or_path="b")
# b
# βββ d
# βββ e
print_tree(root, max_depth=2)
# a
# βββ b
# βββ c
# Print attributes
print_tree(root, attr_list=["age"])
# a [age=90]
# βββ b [age=65]
# β βββ d [age=40]
# β βββ e [age=35]
# βββ c [age=60]
print_tree(root, attr_list=["age"], attr_bracket=["*(", ")"])
# a *(age=90)
# βββ b *(age=65)
# β βββ d *(age=40)
# β βββ e *(age=35)
# βββ c *(age=60)
print_tree(root, all_attrs=True)
# a [age=90, gender=F]
# βββ b [age=65, gender=M]
# β βββ d [age=40, gender=F]
# β βββ e [age=35, gender=M]
# βββ c [age=60, gender=M]
# Available styles
print_tree(root, style="ansi")
# a
# |-- b
# | |-- d
# | `-- e
# `-- c
print_tree(root, style="ascii")
# a
# |-- b
# | |-- d
# | +-- e
# +-- c
print_tree(root, style="const")
# a
# βββ b
# β βββ d
# β βββ e
# βββ c
print_tree(root, style="const_bold")
# a
# β£ββ b
# β β£ββ d
# β βββ e
# βββ c
print_tree(root, style="rounded")
# a
# βββ b
# β βββ d
# β β°ββ e
# β°ββ c
print_tree(root, style="double")
# a
# β ββ b
# β β ββ d
# β βββ e
# βββ c
print_tree(
root,
style="custom",
custom_style=("| ", "|-- ", "+-- "),
)
# a
# |-- b
# | |-- d
# | +-- e
# +-- c
Traverse TreeΒΆ
Tree can be traversed using pre-order, post-order, level-order, level-order-group, zigzag, zigzag-group traversal methods.
from bigtree import (
Node,
levelorder_iter,
levelordergroup_iter,
postorder_iter,
preorder_iter,
zigzag_iter,
zigzaggroup_iter,
)
root = Node("a")
b = Node("b", parent=root)
c = Node("c", parent=root)
d = Node("d", parent=b)
e = Node("e", parent=b)
root.show()
# a
# βββ b
# β βββ d
# β βββ e
# βββ c
[node.name for node in preorder_iter(root)]
# ['a', 'b', 'd', 'e', 'c']
[node.name for node in postorder_iter(root)]
# ['d', 'e', 'b', 'c', 'a']
[node.name for node in levelorder_iter(root)]
# ['a', 'b', 'c', 'd', 'e']
[[node.name for node in node_group] for node_group in levelordergroup_iter(root)]
# [['a'], ['b', 'c'], ['d', 'e']]
[node.name for node in zigzag_iter(root)]
# ['a', 'c', 'b', 'd', 'e']
[[node.name for node in node_group] for node_group in zigzaggroup_iter(root)]
# [['a'], ['c', 'b'], ['d', 'e']]
Modify TreeΒΆ
Nodes can be shifted (with or without replacement) or copied from one path to another.
from bigtree import Node, shift_nodes, shift_and_replace_nodes
root = Node("a")
b = Node("b", parent=root)
c = Node("c", parent=root)
d = Node("d", parent=root)
root.show()
# a
# βββ b
# βββ c
# βββ d
shift_nodes(
tree=root,
from_paths=["a/c", "a/d"],
to_paths=["a/b/c", "a/dummy/d"],
)
root.show()
# a
# βββ b
# β βββ c
# βββ dummy
# βββ d
shift_and_replace_nodes(
tree=root,
from_paths=["a/dummy"],
to_paths=["a/b/c"],
)
root.show()
# a
# βββ b
# βββ dummy
# βββ d
from bigtree import Node, copy_nodes
root = Node("a")
b = Node("b", parent=root)
c = Node("c", parent=root)
d = Node("d", parent=root)
root.show()
# a
# βββ b
# βββ c
# βββ d
copy_nodes(
tree=root,
from_paths=["a/c", "a/d"],
to_paths=["a/b/c", "a/dummy/d"],
)
root.show()
# a
# βββ b
# β βββ c
# βββ c
# βββ d
# βββ dummy
# βββ d
Nodes can also be copied (with or without replacement) between two different trees.
from bigtree import Node, copy_nodes_from_tree_to_tree, copy_and_replace_nodes_from_tree_to_tree
root = Node("a")
b = Node("b", parent=root)
c = Node("c", parent=root)
d = Node("d", parent=root)
root.show()
# a
# βββ b
# βββ c
# βββ d
root_other = Node("aa")
copy_nodes_from_tree_to_tree(
from_tree=root,
to_tree=root_other,
from_paths=["a/b", "a/c", "a/d"],
to_paths=["aa/b", "aa/b/c", "aa/dummy/d"],
)
root_other.show()
# aa
# βββ b
# β βββ c
# βββ dummy
# βββ d
root_other = Node("aa")
b = Node("b", parent=root_other)
c = Node("c", parent=b)
d = Node("d", parent=root_other)
root_other.show()
# aa
# βββ b
# β βββ c
# βββ d
copy_and_replace_nodes_from_tree_to_tree(
from_tree=root,
to_tree=root_other,
from_paths=["a/b", "a/c"],
to_paths=["aa/b/c", "aa/d"],
)
root_other.show()
# aa
# βββ b
# β βββ b
# βββ c
Tree SearchΒΆ
One or multiple nodes can be searched based on name, path, attribute value, or user-defined condition.
To find a single node:
from bigtree import Node, find, find_name, find_path, find_relative_path, find_full_path, find_attr
root = Node("a", age=90)
b = Node("b", age=65, parent=root)
c = Node("c", age=60, parent=root)
d = Node("d", age=40, parent=c)
root.show(attr_list=["age"])
# a [age=90]
# βββ b [age=65]
# βββ c [age=60]
# βββ d [age=40]
find(root, lambda node: node.age == 60)
# Node(/a/c, age=60)
find_name(root, "d")
# Node(/a/c/d, age=40)
find_relative_path(c, "../b") # relative path
# (Node(/a/b, age=65),)
find_path(root, "/c/d") # partial path
# Node(/a/c/d, age=40)
find_full_path(root, "a/c/d") # full path
# Node(/a/c/d, age=40)
find_attr(root, "age", 40)
# Node(/a/c/d, age=40)
To find multiple nodes:
from bigtree import Node, findall, find_names, find_relative_path, find_paths, find_attrs
root = Node("a", age=90)
b = Node("b", age=65, parent=root)
c = Node("c", age=60, parent=root)
d = Node("c", age=40, parent=c)
root.show(attr_list=["age"])
# a [age=90]
# βββ b [age=65]
# βββ c [age=60]
# βββ c [age=40]
findall(root, lambda node: node.age >= 65)
# (Node(/a, age=90), Node(/a/b, age=65))
find_names(root, "c")
# (Node(/a/c, age=60), Node(/a/c/c, age=40))
find_relative_path(c, "../*") # relative path
# (Node(/a/b, age=65), Node(/a/c, age=60))
find_paths(root, "/c") # partial path
# (Node(/a/c, age=60), Node(/a/c/c, age=40))
find_attrs(root, "age", 40)
# (Node(/a/c/c, age=40),)
It is also possible to search for one or more child node(s) based on attributes, and the search will be faster as this does not require traversing the whole tree to find the node(s).
from bigtree import Node, find_children, find_child, find_child_by_name
root = Node("a", age=90)
b = Node("b", age=65, parent=root)
c = Node("c", age=60, parent=root)
d = Node("c", age=40, parent=c)
root.show(attr_list=["age"])
# a [age=90]
# βββ b [age=65]
# βββ c [age=60]
# βββ c [age=40]
find_children(root, lambda node: node.age >= 60)
# (Node(/a/b, age=65), Node(/a/c, age=60))
find_child(root, lambda node: node.name == "c")
# Node(/a/c, age=60)
find_child_by_name(root, "c")
# Node(/a/c, age=60)
find_child_by_name(c, "c")
# Node(/a/c/c, age=40)
Helper UtilityΒΆ
There following are helper functions for cloning tree to another Node type, pruning tree, and getting difference
between two trees.
from bigtree import BaseNode, Node, clone_tree, prune_tree, get_tree_diff
# Cloning tree from `BaseNode` to `Node` type
root = BaseNode(name="a")
b = BaseNode(name="b", parent=root)
clone_tree(root, Node)
# Node(/a, )
# Prune tree to only path a/b
root = Node("a")
b = Node("b", parent=root)
c = Node("c", parent=root)
root.show()
# a
# βββ b
# βββ c
root_pruned = prune_tree(root, "a/b")
root_pruned.show()
# a
# βββ b
# Get difference between two trees
root = Node("a")
b = Node("b", parent=root)
c = Node("c", parent=root)
root.show()
# a
# βββ b
# βββ c
root_other = Node("a")
b_other = Node("b", parent=root_other)
root_other.show()
# a
# βββ b
tree_diff = get_tree_diff(root, root_other)
tree_diff.show()
# a
# βββ c (-)
tree_diff = get_tree_diff(root, root_other, only_diff=False)
tree_diff.show()
# a
# βββ b
# βββ c (-)
Export TreeΒΆ
Tree can be exported to another data type.
Export to nested dictionary
Export to nested recursive dictionary
Export to pandas DataFrame
Export to dot (and png)
Export to Pillow (and png)
Export to Mermaid Flowchart (and md)
from bigtree import (
Node,
tree_to_dataframe,
tree_to_dict,
tree_to_dot,
tree_to_mermaid,
tree_to_nested_dict,
tree_to_pillow,
)
root = Node("a", age=90)
b = Node("b", age=65, parent=root)
c = Node("c", age=60, parent=root)
d = Node("d", age=40, parent=b)
e = Node("e", age=35, parent=b)
root.show()
# a
# βββ b
# β βββ d
# β βββ e
# βββ c
tree_to_dict(
root,
name_key="name",
parent_key="parent",
attr_dict={"age": "person age"}
)
# {
# '/a': {'name': 'a', 'parent': None, 'person age': 90},
# '/a/b': {'name': 'b', 'parent': 'a', 'person age': 65},
# '/a/b/d': {'name': 'd', 'parent': 'b', 'person age': 40},
# '/a/b/e': {'name': 'e', 'parent': 'b', 'person age': 35},
# '/a/c': {'name': 'c', 'parent': 'a', 'person age': 60}
# }
tree_to_nested_dict(root, all_attrs=True)
# {
# 'name': 'a',
# 'age': 90,
# 'children': [
# {
# 'name': 'b',
# 'age': 65,
# 'children': [
# {
# 'name': 'd',
# 'age': 40
# },
# {
# 'name': 'e',
# 'age': 35
# }
# ]
# },
# {
# 'name': 'c',
# 'age': 60
# }
# ]
# }
tree_to_dataframe(
root,
name_col="name",
parent_col="parent",
path_col="path",
attr_dict={"age": "person age"}
)
# path name parent person age
# 0 /a a None 90
# 1 /a/b b a 65
# 2 /a/b/d d b 40
# 3 /a/b/e e b 35
# 4 /a/c c a 60
graph = tree_to_dot(root, node_colour="gold")
graph.write_png("assets/docs/demo_dot.png")
pillow_image = tree_to_pillow(root)
pillow_image.save("assets/docs/demo_pillow.png")
mermaid_md = tree_to_mermaid(root)
print(mermaid_md)
demo_dot.png

demo_pillow.png

Mermaid flowchart
%%{ init: { 'flowchart': { 'curve': 'basis' } } }%%
flowchart TB
0("a") --> 0-0("b")
0-0 --> 0-0-0("d")
0-0 --> 0-0-1("e")
0("a") --> 0-1("c")
classDef default stroke-width:1
Binary Tree DemonstrationΒΆ
Compared to nodes in tree, nodes in Binary Tree are only allowed maximum of 2 children. Since BinaryNode extends from Node, construct, traverse, search, export methods from Node are applicable to Binary Tree as well.
Construct Binary TreeΒΆ
From
BinaryNode
BinaryNode can be linked to each other with parent, children, left, and right setter methods,
or using bitshift operator with the convention parent_node >> child_node or child_node << parent_node.
from bigtree import BinaryNode, tree_to_dot
e = BinaryNode(5)
d = BinaryNode(4)
c = BinaryNode(3)
b = BinaryNode(2, left=d, right=e)
a = BinaryNode(1, children=[b, c])
f = BinaryNode(6, parent=c)
g = BinaryNode(7, parent=c)
h = BinaryNode(8, parent=d)
graph = tree_to_dot(a, node_colour="gold")
graph.write_png("assets/docs/demo_binarytree.png")

From list
Construct nodes only, list has similar format as heapq list.
from bigtree import list_to_binarytree
nums_list = [1, 2, 3, 4, 5, 6, 7, 8]
root = list_to_binarytree(nums_list)
root.show()
# 1
# βββ 2
# β βββ 4
# β β βββ 8
# β βββ 5
# βββ 3
# βββ 6
# βββ 7
Traverse Binary TreeΒΆ
In addition to the traversal methods in the usual tree, binary tree includes in-order traversal method.
from bigtree import (
inorder_iter,
levelorder_iter,
levelordergroup_iter,
list_to_binarytree,
postorder_iter,
preorder_iter,
zigzag_iter,
zigzaggroup_iter,
)
nums_list = [1, 2, 3, 4, 5, 6, 7, 8]
root = list_to_binarytree(nums_list)
root.show()
# 1
# βββ 2
# β βββ 4
# β β βββ 8
# β βββ 5
# βββ 3
# βββ 6
# βββ 7
[node.name for node in inorder_iter(root)]
# ['8', '4', '2', '5', '1', '6', '3', '7']
[node.name for node in preorder_iter(root)]
# ['1', '2', '4', '8', '5', '3', '6', '7']
[node.name for node in postorder_iter(root)]
# ['8', '4', '5', '2', '6', '7', '3', '1']
[node.name for node in levelorder_iter(root)]
# ['1', '2', '3', '4', '5', '6', '7', '8']
[[node.name for node in node_group] for node_group in levelordergroup_iter(root)]
# [['1'], ['2', '3'], ['4', '5', '6', '7'], ['8']]
[node.name for node in zigzag_iter(root)]
# ['1', '3', '2', '4', '5', '6', '7', '8']
[[node.name for node in node_group] for node_group in zigzaggroup_iter(root)]
# [['1'], ['3', '2'], ['4', '5', '6', '7'], ['8']]
DAG DemonstrationΒΆ
Compared to nodes in tree, nodes in DAG are able to have multiple parents.
Construct DAGΒΆ
From
DAGNode
DAGNode can be linked to each other with parents and children setter methods,
or using bitshift operator with the convention parent_node >> child_node or child_node << parent_node.
from bigtree import DAGNode, dag_to_dot
a = DAGNode("a")
b = DAGNode("b")
c = DAGNode("c", parents=[a, b])
d = DAGNode("d", parents=[a, c])
e = DAGNode("e", parents=[d])
f = DAGNode("f", parents=[c, d])
h = DAGNode("h")
g = DAGNode("g", parents=[c], children=[h])
graph = dag_to_dot(a, node_colour="gold")
graph.write_png("assets/docs/demo_dag.png")

From list
Construct nodes only, list contains parent-child tuples.
from bigtree import list_to_dag, dag_iterator
relations_list = [
("a", "c"),
("a", "d"),
("b", "c"),
("c", "d"),
("d", "e")
]
dag = list_to_dag(relations_list)
print([(parent.node_name, child.node_name) for parent, child in dag_iterator(dag)])
# [('a', 'd'), ('c', 'd'), ('d', 'e'), ('a', 'c'), ('b', 'c')]
From nested dictionary
Construct nodes with attributes, key: child name, value: dict of parent name, child node attributes.
from bigtree import dict_to_dag, dag_iterator
relation_dict = {
"a": {"step": 1},
"b": {"step": 1},
"c": {"parents": ["a", "b"], "step": 2},
"d": {"parents": ["a", "c"], "step": 2},
"e": {"parents": ["d"], "step": 3},
}
dag = dict_to_dag(relation_dict, parent_key="parents")
print([(parent.node_name, child.node_name) for parent, child in dag_iterator(dag)])
# [('a', 'd'), ('c', 'd'), ('d', 'e'), ('a', 'c'), ('b', 'c')]
From pandas DataFrame
Construct nodes with attributes, pandas DataFrame contains child column, parent column, and attribute columns.
import pandas as pd
from bigtree import dataframe_to_dag, dag_iterator
path_data = pd.DataFrame([
["a", None, 1],
["b", None, 1],
["c", "a", 2],
["c", "b", 2],
["d", "a", 2],
["d", "c", 2],
["e", "d", 3],
],
columns=["child", "parent", "step"]
)
dag = dataframe_to_dag(path_data)
print([(parent.node_name, child.node_name) for parent, child in dag_iterator(dag)])
# [('a', 'd'), ('c', 'd'), ('d', 'e'), ('a', 'c'), ('b', 'c')]
Demo UsageΒΆ
There are existing implementations of workflows to showcase how bigtree can be used!
To Do ApplicationΒΆ
There are functions to:
Add or remove list to To-Do application
Add or remove item to list, default list is the βGeneralβ list
Prioritize a list/item by reordering them as first list/item
Save and import To-Do application to and from an external JSON file
Show To-Do application, which prints tree to console
from bigtree import AppToDo
app = AppToDo("To Do App")
app.add_item(item_name="Homework 1", list_name="School")
app.add_item(item_name=["Milk", "Bread"], list_name="Groceries", description="Urgent")
app.add_item(item_name="Cook")
app.show()
# To Do App
# βββ School
# β βββ Homework 1
# βββ Groceries
# β βββ Milk [description=Urgent]
# β βββ Bread [description=Urgent]
# βββ General
# βββ Cook
app.save("list.json")
app2 = AppToDo.load("list.json")
Calendar ApplicationΒΆ
There are functions to:
Add or remove event from Calendar
Find event by name, or name and date
Display calendar, which prints events to console
Export calendar to pandas DataFrame
import datetime as dt
from bigtree import Calendar
calendar = Calendar("My Calendar")
calendar.add_event("Gym", "2023-01-01 18:00")
calendar.add_event("Dinner", "2023-01-01", date_format="%Y-%m-%d", budget=20)
calendar.add_event("Gym", "2023-01-02 18:00")
calendar.show()
# My Calendar
# 2023-01-01 00:00:00 - Dinner (budget: 20)
# 2023-01-01 18:00:00 - Gym
# 2023-01-02 18:00:00 - Gym
calendar.find_event("Gym")
# 2023-01-01 18:00:00 - Gym
# 2023-01-02 18:00:00 - Gym
calendar.delete_event("Gym", dt.date(2023, 1, 1))
calendar.show()
# My Calendar
# 2023-01-01 00:00:00 - Dinner (budget: 20)
# 2023-01-02 18:00:00 - Gym
data_calendar = calendar.to_dataframe()
data_calendar
# path name date time budget
# 0 /My Calendar/2023/01/01/Dinner Dinner 2023-01-01 00:00:00 20.0
# 1 /My Calendar/2023/01/02/Gym Gym 2023-01-02 18:00:00 NaN