Structural learning in Python

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

# __author__ = 'Bayes Server'
# __version__= '0.1'

import pandas as pd
from jpype import *  # pip install jpype1
import data_frame_utils as dfu

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 = bayes_structure.PCStructuralLearning()

    data_reader_command = create_data_reader_command()

    variable_references = []

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

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

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

    options = bayes_structure.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 = bayes.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 = bayes.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 bayes_data.DataTableDataReaderCommand(dt)

classpath = "C:\\Program Files\\Bayes Server\\Bayes Server 8.8\\API\\Java\\bayesserver-8.8.jar"

startJVM(getDefaultJVMPath(), "-Djava.class.path=%s" % classpath)

bayes = JPackage("com.bayesserver")
bayes_data = bayes.data
bayes_inference = bayes.inference
bayes_structure = bayes.learning.structure

learn_structure()

shutdownJVM()