erdogant/bnlearn
erdogant/bnlearn has 645 GitHub stars and 61 forks. GitHot measured 0 stars in 24 hours. Last checked 2026-11-09 23:22 UTC. Last push 2026-11-06.
Python package for Causal Discovery by learning the graphical structure of Bayesian networks. Structure Learning, Parameter Learning, Inferences, Sampling methods.
What you can do
- Causal Discovery - Overview and Starters Guide - Learn the basics of causal modelling. - link - ---
- Structure Learning - Learn the model structure from data or with expert knowledge. - link - Podcast
- Causal Predictions - Learn to make causal predictions and explore interventions. - link - ---
- Parameter Learning - Estimate model parameters (e.g., conditional probability distributions) from observed data and combine data with expert knowledge. - link - Podcast
Measured star growth
- in 24h
- 0
- in 7 days
- Collecting history
- in 15 days
- Collecting history
- in 1 month
- Collecting history
Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.
README.md
Original
bnlearn is Python package for causal discovery by learning the graphical structure of Bayesian networks, parameter learning, inference, and sampling methods.
Because probabilistic graphical models can be difficult to use, Bnlearn contains the most-wanted pipelines. Navigate to API documentations for more detailed information. ⭐️ Star it if you like it ⭐️
Key Features
| Feature | Description | Medium | Gumroad/Podcast |
|---|---|---|---|
| Causal Discovery - Overview and Starters Guide | Learn the basics of causal modelling. | link | --- |
| Structure Learning | Learn the model structure from data or with expert knowledge. | link | Podcast |
| Causal Predictions | Learn to make causal predictions and explore interventions. | link | --- |
| Parameter Learning | Estimate model parameters (e.g., conditional probability distributions) from observed data and combine data with expert knowledge. | link | Podcast |
| Causal Inference | Compute interventional and counterfactual distributions using Bayesian inference. | link | Podcast |
| Generate Synthetic Data | Generate synthetic data using Bayesian sampling. | link | Podcast |
| Discretize Data | Discretize continuous datasets for Bayesian network modelling. | --- | --- |
| Data Types | Discrete, continuous and mixed datasets. | --- | --- |
| Comparisons | Compare causal discovery libraries and their ability to find hidden causal relationships. | link | Podcast |
| LLMs and Causal Discovery | Benchmark large language models against Bayesian methods for causal discovery. | link | --- |
Resources and Links
- Example Notebooks: Examples
- Blog Posts: Medium
- Documentation: Website
- Bug Reports and Feature Requests: GitHub Issues
The following functions are available after installation:
| Feature | Description |
|---|---|
| Key Pipelines | |
| Structure learning | bn.structure_learning.fit() |
| Parameter learning | bn.parameter_learning.fit() |
| Inference | bn.inference.fit() |
| Make predictions | bn.predict() |
| Generate Synthetic Data | bn.sampling() |
| Compute Edge Strength | bn.independence_test() |
| Key Functions | |
| Imputations | bn.knn_imputer() |
| Discretizing | bn.discretize() |
| Check Model Parameters | bn.check_model() |
| Create DAG | bn.make_DAG() |
| Get Node Properties | bn.get_node_properties() |
| Get Edge Properties | bn.get_edge_properties() |
| Get Parents From Edges | bn.get_parents() |
| Generate Default CPT per Node | bn.generate_cpt() |
| Generate Default CPTs for All Edges | bn.build_cpts_from_structure() |
| Make Plots | |
| Plotting | bn.plot() |
| Plot Graphviz | bn.plot_graphviz() |
| Compare 2 Networks | bn.compare() |
| Load DAG (bif files) | bn.import_BIF() |
| Load Examples | bn.import_example() |
| Transformation Functions | |
| Convert DAG to Undirected | bn.to_undirected() |
| Convert to one-hot | bn.df2onehot() |
| Convert Adjacency Matrix to Vector | bn.adjmat2vec() |
| Convert Adjacency Matrix to Dictionary | bn.adjmat2dict() |
| Convert Vector to Adjacency Matrix | bn.vec2adjmat() |
| Convert DAG to Adjacency Matrix | bn.dag2adjmat() |
| Convert DataFrame to Onehot | bn.df2onehot() |
| Convert Query to DataFrame | bn.query2df() |
| Convert Vector to DataFrame | bn.vec2df() |
| Metrics | |
| Compute Topological Ordering | bn.topological_sort() |
| Compute Structure Scores | bn.structure_scores() |
| General | |
| Save Model | bn.save() |
| Load Model | bn.load() |
| Print CPTs | bn.print_CPD() |
Installation
Python 3.10 or newer is required.
Installation: uv-pypi
uv venv
.venv\Scripts\activate
uv pip install bnlearn
Installation: uv-local
uv venv
.venv\Scripts\activate
git clone https://github.com/erdogant/bnlearn.git
cd bnlearn
uv pip install -U -e .
Installation: conda-pypi
conda create -n env_bnlearn python=3.12
conda activate env_bnlearn
pip install bnlearn
Installation: GitHub source
pip install git+https://github.com/erdogant/bnlearn
uv pip install git+https://github.com/erdogant/bnlearn
Run tests (uv)
uv pip install -e ".[dev]"
uv run pytest
Run tests (pip)
pip install -e ".[dev]"
pytest -v
Install skill:
npx skills add erdogant/bnlearn --skill bnlearn
Load library
# Import library
import bnlearn as bn
Code Examples
import bnlearn as bn
# Example dataframe sprinkler_data.csv can be loaded with:
df = bn.import_example()
# df = pd.read_csv('sprinkler_data.csv')
Cloudy Sprinkler Rain Wet_Grass
0 0 1 0 1
1 1 1 1 1
2 1 0 1 1
3 0 0 1 1
4 1 0 1 1
.. ... ... ... ...
995 0 0 0 0
996 1 0 0 0
997 0 0 1 0
998 1 1 0 1
999 1 0 1 1
model = bn.structure_learning.fit(df)
# Compute edge strength with the chi-square test statistic
model = bn.independence_test(model, df)
G = bn.plot(model)
# Example: Structure Learning
model_hc_bic = bn.structure_learning.fit(df, methodtype='hc', scoretype='bic')
model_hc_k2 = bn.structure_learning.fit(df, methodtype='hc', scoretype='k2')
model_hc_bdeu = bn.structure_learning.fit(df, methodtype='hc', scoretype='bdeu')
model_ex_bic = bn.structure_learning.fit(df, methodtype='ex', scoretype='bic')
model_ex_k2 = bn.structure_learning.fit(df, methodtype='ex', scoretype='k2')
model_ex_bdeu = bn.structure_learning.fit(df, methodtype='ex', scoretype='bdeu')
model_cl = bn.structure_learning.fit(df, methodtype='cl', root_node='Wet_Grass')
model_tan = bn.structure_learning.fit(df, methodtype='tan', root_node='Wet_Grass', class_node='Rain')
# Example: Parameter Learning
import bnlearn as bn
# Import dataframe
df = bn.import_example()
# As an example we set the CPD at False which returns an "empty" DAG
model = bn.import_BIF('sprinkler', CPD=False)
# Now we learn the parameters of the DAG using the df
model_update = bn.parameter_learning.fit(model, df)
# Make plot
G = bn.plot(model_update)
# Example: Inference
import bnlearn as bn
model = bn.import_BIF('sprinkler')
query = bn.inference.fit(model, variables=['Rain'], evidence={'Cloudy':1,'Sprinkler':0, 'Wet_Grass':1})
print(query)
print(query.df)
# Lets try another inference
query = bn.inference.fit(model, variables=['Rain'], evidence={'Cloudy':1})
print(query)
print(query.df)
Star history
Contributors
Thank the contributors!
Maintainer
Explore related projects
tensorflow/tensorflow
An Open Source Machine Learning Framework for Everyone
201,400 starshuggingface/transformers
🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.
168,668 starsAUTOMATIC1111/stable-diffusion-webui
Stable Diffusion web UI
165,261 starsComfy-Org/ComfyUI
The most powerful and modular diffusion model GUI, api and backend with a graph/nodes interface. The fastest local inference engine in the world.
145,835 stars