  Our evolution as a species made a huge step forward when we understood the
relationships between causes and effects. These associations may be trivial for
some events, but they are not in complex scenarios. To rigorously prove that
some occurrences are caused by others, causal theory and causal inference were
formalized, introducing the $do$-operator and its associated rules. The main
goal of this report is to review and implement in Python some algorithms to
compute conditional and non-conditional causal queries from observational data.
To this end, we first present some basic background knowledge on probability
and graph theory, before introducing important results on causal theory, used
in the construction of the algorithms. We then thoroughly study the
identification algorithms presented by Shpitser and Pearl in 2006, explaining
our implementation in Python alongside. The main identification algorithm can
be seen as a repeated application of the rules of $do$-calculus, and it
eventually either returns an expression for the causal query from experimental
probabilities or fails to identify the causal effect, in which case the effect
is non-identifiable. We introduce our newly developed Python library and give
some usage examples.
