A Python π Package for Markov Chains, Markov Chain Neural Networks and Markov Switching Models.
pip install chainopy
Before you begin, ensure you have the following installed on your system:
Fork and Clone the Chainopy repository to your local machine using Git:
git clone https://github.com/aadya940/chainopy.git
Navigate to the directory which contains the pyproject.toml
file.
python -m build
requirements.txt
and requirements_test.txt
tests
folderpython -m pytest tests/
You're all Set! π π
Create Markov Chains and Markov Chain Neural Networks as follows:
>>> import chainopy
>>> mc = chainopy.MarkovChain([[0, 1], [1, 0]], states = ["Rain", "No-Rain"]) # Creates a two-states Markov Chain stored in `mc`.
>>> neural_network = chainopy.MarkovChainNeuralNetwork(mc, num_layers = 5) # Creates a 5-layered Neural Network that simulates `mc`.
Create a Markov Switching Model as follows:
>>> import numpy as np
>>> import random
>>> from chainopy import MarkovSwitchingModel
>>> X = np.random.normal(0, 1, 1000) + np.random.logistic(5, 10, 1000) # Generate Random Training Data
>>> regime_col = [random.choice(["High", "Low", "Stagnant"]) for _ in range(1000)] # Generate Regimes for Training Data
>>> mod = MarkovSwitchingModel()
>>> mod.fit(X, regime_col)
>>> y, regime_y = mod.predict("High", steps=20)
Generates Data as follows:
X
: We generate 1000 data points by combining a normal distribution (mean = 0, standard deviation = 1) with a logistic
distribution (mean = 5, scale = 10). This creates a complex dataset with variations.regime_col
: We assign one of three possible regimes ("High", "Low", "Stagnant") to each data point. This is done by randomly
selecting one of these regimes for each of the 1000 data points.Later, Creates a Markov Switching Model using chainopy.MarkovSwitchingModel
with 3 regimes (High, Low and Stagnant) and
predicts the next twenty steps if the start states is "High".
pip install -r requirements.txt
and pip install -r requirements_test.txt
to download dependencies.Note: If your implementation is Cython, justify its usage in your PR to make the code more maintainable.
@article{Chinubhai2024ChainoPy,
author = {Aadya A. Chinubhai},
title = {ChainoPy: A Python Library for Discrete Time Markov Chain Based Stochastic Analysis},
journal = {Journal of Open Source Software},
volume = {9},
number = {100},
pages = {6880},
year = {2024},
doi = {10.21105/joss.06880},
url = {https://joss.theoj.org/papers/10.21105/joss.06880}
}