From Branches to Forests: Decision Trees and Random Forests in Python