Skip to main content

Structural learning in Python

This example makes use of the Python code in Data Frame Utils.

# __author__ = 'Bayes Server'
# __version__= '0.2'

import pandas as pd

import jpype # pip install jpype1 (version 1.2.1 or later)
import jpype.imports
from jpype.types import *

classpath = "lib/bayesserver-10.8.jar" # TODO download the Bayes Server Java API, and adjust the path

# Launch the JVM
jpype.startJVM(classpath=[classpath])

import data_frame_utils as dfu

# import the Java modules
from com.bayesserver import *
from com.bayesserver.inference import *
from com.bayesserver.data import *
from com.bayesserver.learning.structure import *
from jpype import java

# Uncomment the following line and change the license key, if you are using a licensed version
# License.validate("xxx")


def learn_structure():
"""
This example uses a Pandas DataFrame as the data source for learning the structure of a Bayesian network
You can also connect to databases using DatabaseDataReaderCommand
"""

network = create_network_no_links() # we manually construct the network here, but it could be loaded from a file

learning = PCStructuralLearning()

data_reader_command = create_data_reader_command()

variable_references = []

for v in network.getVariables():
variable_references.append(VariableReference(v, ColumnValueType.NAME, v.getName()))

reader_options = ReaderOptions() # we do not have a case column in this example

evidence_reader_command = DefaultEvidenceReaderCommand(
data_reader_command,
java.util.Arrays.asList(variable_references),
reader_options)

options = PCStructuralLearningOptions()

output = learning.learn(evidence_reader_command, network.getNodes(), options)

for linkOutput in output.getLinkOutputs():
print("Link added from {0} -> {1}".format(linkOutput.getLink().getFrom().getName(), linkOutput.getLink().getTo().getName()))


def create_network_no_links():
"""
Manually construct a network to keep the example simple.
"""

network = Network()

# Instead of manually constructing a network
# you could also load from a file using
# network.load("path-to-file");

for name in ["A", "B", "C"]:

node = Node(name, ["False", "True"])
network.getNodes().add(node)

# We are not adding links here, as we are going to learn them from data.

return network


def create_data_reader_command():

"""
Create a data reader command.
Normally you would read from a database or spreadsheet, but to keep this example simple
we are hard coding the data.
"""

d = {
'A': ['True', 'True', 'True', 'False', 'False', 'False', 'False', 'True', 'True', 'True', 'True', 'False', 'True',
'True', 'False', 'True', 'False', 'False', 'True', 'False', 'False', 'True', 'False', 'True', 'False',
'True', 'False', 'False', 'True', 'False', 'True', 'False', 'True', 'True', 'True', 'True', 'True', 'True',
'False', 'True', 'True', 'False', 'True', 'False', 'False', 'True', 'True', 'True', 'False', 'True', 'True',
'True', 'True', 'True', 'True', 'True', 'True', 'True', 'False', 'True', 'False', 'False', 'True', 'False',
'True', 'False', 'False', 'True', 'False', 'False', 'True', 'True', 'False', 'False', 'True', 'True', 'True',
'False', 'True', 'False', 'True', 'True', 'True', 'True', 'False', 'True', 'True', 'False', 'True', 'True',
'True', 'False', 'False', 'True', 'True', 'True', 'True', 'False', 'True', 'True'],
'B': ['False', 'True', 'False', 'False', 'True', 'False', 'True', 'False', 'True', 'False', 'False', 'True',
'True', 'True', 'False', 'False', 'True', 'False', 'False', 'True', 'False', 'False', 'False', 'True',
'False', 'False', 'False', 'False', 'True', 'False', 'False', 'False', 'False', 'False', 'False', 'True',
'True', 'False', 'False', 'False', 'True', 'True', 'False', 'False', 'False', 'False', 'True', 'False',
'False', 'True', 'True', 'True', 'False', 'False', 'False', 'False', 'False', 'False', 'False', 'False',
'True', 'False', 'True', 'True', 'True', 'True', 'False', 'True', 'False', 'False', 'True', 'False', 'False',
'False', 'False', 'False', 'True', 'True', 'False', 'True', 'True', 'True', 'True', 'False', 'True', 'False',
'False', 'False', 'False', 'False', 'True', 'False', 'True', 'False', 'False', 'True', 'True', 'True',
'True', 'False'],
'C': ['True', 'True', 'True', 'False', 'True', 'False', 'True', 'True', 'True', 'True', 'True', 'True', 'True',
'True', 'False', 'True', 'True', 'False', 'True', 'True', 'False', 'True', 'False', 'True', 'False', 'True',
'False', 'False', 'True', 'False', 'True', 'False', 'True', 'True', 'True', 'True', 'True', 'True', 'False',
'True', 'True', 'True', 'True', 'False', 'False', 'True', 'True', 'True', 'False', 'True', 'True', 'True',
'True', 'True', 'True', 'True', 'True', 'True', 'False', 'True', 'True', 'False', 'True', 'True', 'True',
'True', 'False', 'True', 'False', 'False', 'True', 'True', 'False', 'False', 'True', 'True', 'True', 'True',
'True', 'True', 'True', 'True', 'True', 'True', 'True', 'True', 'True', 'False', 'True', 'True', 'True',
'False', 'True', 'True', 'True', 'True', 'True', 'True', 'True', 'True']
}

df = pd.DataFrame(data=d)
dt = dfu.to_data_table(df)

return DataTableDataReaderCommand(dt)


learn_structure()