Repository: imputr/imputr (language: python)

Issue:
Merge latest core-class-structure to docs



Discussion / hints:

Fix patch:
diff --git a/README.md b/README.md
index 259ae18..4a0a62c 100644
--- a/README.md
+++ b/README.md
@@ -1,16 +1,21 @@
-# ImputR documentation
 
-←—— This will be a our logo ——>
+<p align="center">
+  <img src="https://github.com/imputr/imputr/blob/release-v.0.1/docs/docs/_static/imputr-logo-horizontal.svg?raw=true" width="800">
+</p>
 
-# ****🎯 What is ImputR?****
 
-ImputR is an open-source library that allows users to stably impute tabular data sets with ML-based and conventional techniques. It is designed to have an extremely simple, yet extensive API, making it possible for users of all levels and archetypes to deploy the library in their workflows. 
+# ****🎯 What is Imputr?****
 
-←——- This will be a GIF showing imputation ——→ 
+ImputRris an open-source library that allows users to stably impute tabular data sets with ML-based and conventional techniques. It is designed to have an extremely simple, yet extensive API, making it possible for users of all levels and tasks to deploy the library in their workflows. 
 
+
+<p align="center">
+ <img src="https://github.com/imputr/imputr/blob/release-v.0.1/docs/docs/_static/imputation.gif?raw=true" width="600">
+</p> 
+ 
 # 🚀 Getting started
 
-**Install ImputR PyPI:**
+**Install Imputr with PIP:**
 
 ```bash
 pip install imputr
@@ -18,7 +23,7 @@ pip install imputr
 
 ## AutoImputer
 
-We will start with the simplest usage of the AutoImputer (our recommended workflow for newbies and intermediates), which by default automatically imputes the missing values for all columns with a modern version of the [missForest](https://arxiv.org/pdf/1105.0828.pdf) algorithm.
+Here is an example of the simplest usage of the AutoImputer (our recommended workflow for newbies and intermediates), which by default automatically imputes the missing values for all columns with a modern version of the [missForest](https://arxiv.org/pdf/1105.0828.pdf) algorithm.
 
 ```python
 from imputr.autoimputer import AutoImputer
@@ -34,87 +39,33 @@ imputer = AutoImputer(data=df)
 imputed_df = imputer.get_result()
 ```
 
-In short, the following steps are executed under the hood when the imputr code is run:
-
-1. Make a deep copy of the given dataframe
-2. Classify column types based on name, frequencies and data type into continuous or categorical 
-3. Determine execution order for imputation. Start with the column with the least missing values as target and end at the column with most missing values.
-4. Determine random forest depths for each column with [heuristic](http://linktopseudocodereadthedocs.io) algorithm
-5. Apply missForest algorithm for all columns: iteratively take the target columns from the execution order, temporarily impute other (unimputed) columns with mean/mode and train random forest to impute target. Iterate until converged.
-6. Log all imputations as tuple in new auxiliary column.
-
-←——- This will be a GIF showing iterative column imputation ——→ 
-
-To see what else be done with the AutoImputer API to customise its behaviour, reference our [documentation](http://readthedocs.io).
-
-## BaseImputer
-
-Next we will use the BaseImputer to show a how we can construct a more custom imputation workflow.
-
-```python
-from imputr.autoimputer import BaseImputer
-import pandas as pd
-
-# Import dataset into Pandas DataFrame
-df = pd.read_csv("example.csv")
-
-# Initialize BaseImputer with data
-imputer = BaseImputer(data=df,
-                      include_target_columns = ['age', 'gender', 'income'],
-                      column_types = {
-                        'age' : 'continuous'
-                      }
-                      impute_strategies = {
-                        'age': 'ndist',
-                        'income: 'kde'
-                        },
-                      impute_order = ['income', 'gender']
-                      )
-
-# Retrieve imputed dataset from AutoImputer object
-imputed_df = imputer.get_result()
-```
-This code will use the user's input as main source of truth, but will still contain automated parts that the user did not give explicitly to the imputer. In short, it will:
+Here you can see an example of how the AutoImputer works internally.
 
-1. Make a deep copy like previous code block
-2. Classify columns for 'gender' and 'income', as 'age' was already given by the user.
-3. Deteremine execution order for imputation. The order will be ('age', 'income', 'gender') as the 'ndist' (normal distrbution) impute strategy is univariate, and is therefore best done before other columns. 
+<p align="center">
+ <img src="https://github.com/imputr/imputr/blob/release-v.0.1/docs/docs/_static/autoimputer.gif?raw=true" width="600" align="center">
+</p>
 
-The rest is analogous to the example given above.
+To see what else be done with the AutoImputer API to customise its behaviour, reference our [documentation](https://imputr.readthedocs.io/en/latest/examples.html).
 
-If for some reason you want to put a univariate imputation after a multivariate imputation one, you must explicitly give the order for it, e.g.:
 
-```python
-impute_order = ['income', 'gender', 'age']
-```
 
 # 📕 Documentation
 
 Multiple links to documentation:
 
-- Imputer API
-- strategies and coneptds: univariate, multivariate, time series, exec order
-- column inference techniques
-
-blogs
-
-slack
-
-latest release
-
-more real world examples
+- [Imputr API](https://imputr.readthedocs.io/en/latest/autoapi/index.html)
+- [Imputr concepts](https://imputr.readthedocs.io/en/latest/concepts.html)
+- [Core class structure](https://imputr.readthedocs.io/en/latest/coreclass.html)
+- [Medium blogs for more information](https://medium.com/tag/imputr)
+- [Our Slack channel](https://join.slack.com/t/imputr/shared_invite/zt-1jnbwuv0l-T5xd0Akr3ab5jr2RprF_ZA)
+- [More real world examples](https://imputr.readthedocs.io/en/latest/examples.html)
 
 # 👨🏽‍💻 Contribution
 
-The core contribution team built ImputR based on extensive research, benchmark tests and numerous interviews with the end users of the library. We are always looking for other xxxx’s who would like to share with the community:
-
-- ideas about how they use - and would like to use - the ImputR library
-- engineering efforts to build something that will last for the future of Python’s data dominance
-- imputation test results and (privacy-proof) data sets
-- bug discoveries and proposed fixes
+Imputr is an ever-evolving open source library and can always use contributors who want to help build with the community.
 
-The easiest way to get started is to have a look at the [issues](https://github.com/NannyML/nannyml/issues) or talk to one of the core members in the [Slack](http://boat.nl) channel. See the [Contribution Jumpstart](http://boat.nl) page to get started with your first contribution!
+See the [Contribution Jumpstart](https://imputr.readthedocs.io/en/latest/contributionjumpstart.html) page to get started with your first contribution!
 
 ---
 
-ImputR is distributed under an Apache License Version 2.0. A complete version can be found [here](https://github.com/NannyML/nannyml/blob/main/LICENSE.MD). All future contributions will continue to be distributed under this license.
+Imputr is distributed under an Apache License Version 2.0. A complete version can be found [here](https://github.com/imputr/imputr/blob/main/LICENSE). All future contributions will continue to be distributed under this license.
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 0000000..269cadc
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS    ?=
+SPHINXBUILD   ?= sphinx-build
+SOURCEDIR     = source
+BUILDDIR      = build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
\ No newline at end of file
diff --git a/docs/_static/Untitled.png b/docs/_static/Untitled.png
new file mode 100644
index 0000000..74b2b0b
Binary files /dev/null and b/docs/_static/Untitled.png differ
diff --git a/docs/_static/autoimputer.gif b/docs/_static/autoimputer.gif
new file mode 100644
index 0000000..0cb9091
Binary files /dev/null and b/docs/_static/autoimputer.gif differ
diff --git a/docs/_static/imputation.gif b/docs/_static/imputation.gif
new file mode 100644
index 0000000..a3493e0
Binary files /dev/null and b/docs/_static/imputation.gif differ
diff --git a/docs/_static/imputr-logo-horizontal.svg b/docs/_static/imputr-logo-horizontal.svg
new file mode 100644
index 0000000..dd5fd34
--- /dev/null
+++ b/docs/_static/imputr-logo-horizontal.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="341" height="122" viewBox="0 0 341 122" xml:space="preserve">
+<desc>Created with Fabric.js 4.6.0</desc>
+<defs>
+</defs>
+<g transform="matrix(0.49 0 0 0.49 57.86 61)" id="qZAGDN7KbCdsPr9AP4uln"  >
+<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: square; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 10; fill: rgb(147,196,125); fill-rule: evenodd; opacity: 1;" vector-effect="non-scaling-stroke"  transform=" translate(0, 0)" d="M -0.24773 -87.41099 L 68.42585 -53.07421 L 46.063179999999996 -42.1406 L 2.8737899999999925 -63.99129 C 2.0810299999999926 -64.25554 1.1726499999999924 -64.38767 0.2642599999999926 -64.38767 C -0.6441300000000074 -64.38767 -1.5524800000000074 -64.25554 -2.3287600000000075 -63.99129 L -46.04663000000001 -42.1406 L -67.38531 -53.07421 L -0.2477400000000074 -87.41099 z M -5.97878 -48.91216 L -5.97878 3.641779999999997 L -40.84407 21.346949999999996 L -40.84407 -31.73551 L -5.97878 -48.91216 z M 5.99534 -48.91216 L 40.84413 -31.73551 L 40.84413 21.346949999999996 L 5.995339999999999 3.641779999999997 L 5.995339999999999 -48.91216 z M -0.24773 12.49435 L 33.04854 29.671020000000002 L -0.24772999999999712 46.31915 L -33.032 29.671020000000002 z M -75.18086 -43.42886 L -52.289649999999995 -31.73552 L -52.289649999999995 30.183 C -52.289649999999995 32.26402 -50.72064999999999 34.34502 -48.63963 34.87355 L -5.978769999999997 56.19572 L -5.978769999999997 82.22496000000001 L -75.18086 47.35963000000001 L -75.18086 -43.42886999999999 z M 75.70943 -43.18112 L 75.70943 48.40016000000001 L 5.995350000000002 82.73695000000001 L 5.995350000000002 56.72422 L 48.65621 35.385540000000006 C 50.7372 34.87355000000001 51.77773 32.79252 51.77773 30.182990000000007 L 51.77773 -31.735529999999994 L 75.70943 -43.181129999999996 z M -0.24772 -99.12084 C -1.17262 -99.12084 -2.081 -98.85659 -2.85725 -98.34459 L -82.46443 -58.27672999999999 C -86.11444999999999 -57.23622999999999 -87.15498 -55.15521 -87.15498 -52.54567999999999 L -87.15498 52.03370000000001 C -87.15498 54.11472000000001 -86.11444999999999 56.19575000000001 -84.03343 57.76475000000001 L -2.8572499999999934 98.34458000000001 C -2.0809999999999933 98.87311000000001 -1.1726199999999933 99.12086000000001 -0.2477199999999935 99.12086000000001 C 0.6606700000000065 99.12086000000001 1.5690500000000065 98.87312000000001 2.3453000000000066 98.34458000000001 L 84.03347000000001 57.76475000000001 C 85.6025 56.195750000000004 87.15499000000001 54.11473000000001 87.15499000000001 52.03370000000001 L 87.15499000000001 -53.07418999999999 C 87.15499000000001 -55.15519999999999 85.6025 -56.70769999999999 84.03347000000001 -57.74821999999999 L 2.345300000000009 -98.34457999999998 C 1.5690500000000087 -98.85656999999998 0.6606700000000088 -99.12082999999998 -0.24771999999999128 -99.12082999999998 z" stroke-linecap="round" />
+</g>
+<g transform="matrix(1 0 0 1 221.63 56.37)" style="" id="QattTbScyj24UX1bFUeSR">
+		<text xml:space="preserve" font-family="Squada One" font-size="76" font-style="normal" font-weight="normal" letter-spacing="0.152" line-height="1" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(135,135,135); fill-rule: nonzero; opacity: 1; white-space: pre;"><tspan x="-104" y="29.81">I</tspan><tspan x="-85.3" y="29.81">M</tspan><tspan x="-32.03" y="29.81">P</tspan><tspan x="2.02" y="29.81">U</tspan><tspan x="37.66" y="29.81">T</tspan><tspan x="66.47" y="29.81">R</tspan></text>
+<style>
+          @font-face {
+          font-family: "Squada One";
+          font-weight: normal;
+          src: url("data:font/ttf;base64,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AGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgAgAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAAIAAAAAAAD/tQAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwBgAKMAhACFAL0AlgDoAIYAjgCLAJ0AqQCkAIoA2gCDAJMA8gDzAI0AlwCIAMMA3gDxAJ4AqgCiAK0AyQDHAK4AYgBjAJAAZADLAGUAyADKAM8AzADNAM4A6QBmANMA0ADRAK8AZwDwAJEA1gDUANUAaADrAO0AiQBqAGkAawBtAGwAbgCgAG8AcQBwAHIAcwB1AHQAdgB3AOoAeAB6AHkAewB9AHwAuAChAH8AfgCAAIEA7ADuALoA2ADdANkAwgAAAAEAAf//AA8AAQAAAAwAAAAAAAAAAgABAAMAvwABAAA=");
+          }
+        </style></g></svg>
\ No newline at end of file
diff --git a/docs/_static/imputr-logo.png b/docs/_static/imputr-logo.png
new file mode 100644
index 0000000..c5fb92b
Binary files /dev/null and b/docs/_static/imputr-logo.png differ
diff --git a/docs/_static/imputr-logo.svg b/docs/_static/imputr-logo.svg
new file mode 100644
index 0000000..32147c5
--- /dev/null
+++ b/docs/_static/imputr-logo.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500" height="500" viewBox="0 0 500 500" xml:space="preserve">
+<desc>Created with Fabric.js 4.6.0</desc>
+<defs>
+</defs>
+<g transform="matrix(0.56 0 0 0.56 239.59 243.12)" id="qZAGDN7KbCdsPr9AP4uln"  >
+<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: square; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 10; fill: rgb(147,196,125); fill-rule: evenodd; opacity: 1;" vector-effect="non-scaling-stroke"  transform=" translate(0, 0)" d="M -0.24773 -87.41099 L 68.42585 -53.07421 L 46.063179999999996 -42.1406 L 2.8737899999999925 -63.99129 C 2.0810299999999926 -64.25554 1.1726499999999924 -64.38767 0.2642599999999926 -64.38767 C -0.6441300000000074 -64.38767 -1.5524800000000074 -64.25554 -2.3287600000000075 -63.99129 L -46.04663000000001 -42.1406 L -67.38531 -53.07421 L -0.2477400000000074 -87.41099 z M -5.97878 -48.91216 L -5.97878 3.641779999999997 L -40.84407 21.346949999999996 L -40.84407 -31.73551 L -5.97878 -48.91216 z M 5.99534 -48.91216 L 40.84413 -31.73551 L 40.84413 21.346949999999996 L 5.995339999999999 3.641779999999997 L 5.995339999999999 -48.91216 z M -0.24773 12.49435 L 33.04854 29.671020000000002 L -0.24772999999999712 46.31915 L -33.032 29.671020000000002 z M -75.18086 -43.42886 L -52.289649999999995 -31.73552 L -52.289649999999995 30.183 C -52.289649999999995 32.26402 -50.72064999999999 34.34502 -48.63963 34.87355 L -5.978769999999997 56.19572 L -5.978769999999997 82.22496000000001 L -75.18086 47.35963000000001 L -75.18086 -43.42886999999999 z M 75.70943 -43.18112 L 75.70943 48.40016000000001 L 5.995350000000002 82.73695000000001 L 5.995350000000002 56.72422 L 48.65621 35.385540000000006 C 50.7372 34.87355000000001 51.77773 32.79252 51.77773 30.182990000000007 L 51.77773 -31.735529999999994 L 75.70943 -43.181129999999996 z M -0.24772 -99.12084 C -1.17262 -99.12084 -2.081 -98.85659 -2.85725 -98.34459 L -82.46443 -58.27672999999999 C -86.11444999999999 -57.23622999999999 -87.15498 -55.15521 -87.15498 -52.54567999999999 L -87.15498 52.03370000000001 C -87.15498 54.11472000000001 -86.11444999999999 56.19575000000001 -84.03343 57.76475000000001 L -2.8572499999999934 98.34458000000001 C -2.0809999999999933 98.87311000000001 -1.1726199999999933 99.12086000000001 -0.2477199999999935 99.12086000000001 C 0.6606700000000065 99.12086000000001 1.5690500000000065 98.87312000000001 2.3453000000000066 98.34458000000001 L 84.03347000000001 57.76475000000001 C 85.6025 56.195750000000004 87.15499000000001 54.11473000000001 87.15499000000001 52.03370000000001 L 87.15499000000001 -53.07418999999999 C 87.15499000000001 -55.15519999999999 85.6025 -56.70769999999999 84.03347000000001 -57.74821999999999 L 2.345300000000009 -98.34457999999998 C 1.5690500000000087 -98.85656999999998 0.6606700000000088 -99.12082999999998 -0.24771999999999128 -99.12082999999998 z" stroke-linecap="round" />
+</g>
+<g transform="matrix(1 0 0 1 239.59 326.71)" style="" id="QattTbScyj24UX1bFUeSR">
+		<text xml:space="preserve" font-family="Squada One" font-size="45" font-style="normal" font-weight="normal" letter-spacing="0.09" line-height="1" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(134,137,132); fill-rule: nonzero; opacity: 1; white-space: pre;"><tspan x="-60.89" y="18.06">I</tspan><tspan x="-49.81" y="18.06">M</tspan><tspan x="-18.27" y="18.06">P</tspan><tspan x="1.89" y="18.06">U</tspan><tspan x="23" y="18.06">T</tspan><tspan x="40.05" y="18.06">R</tspan></text>
+<style>
+          @font-face {
+          font-family: "Squada One";
+          font-weight: normal;
+          src: url("data:font/ttf;base64,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AGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgAgAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAAIAAAAAAAD/tQAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwBgAKMAhACFAL0AlgDoAIYAjgCLAJ0AqQCkAIoA2gCDAJMA8gDzAI0AlwCIAMMA3gDxAJ4AqgCiAK0AyQDHAK4AYgBjAJAAZADLAGUAyADKAM8AzADNAM4A6QBmANMA0ADRAK8AZwDwAJEA1gDUANUAaADrAO0AiQBqAGkAawBtAGwAbgCgAG8AcQBwAHIAcwB1AHQAdgB3AOoAeAB6AHkAewB9AHwAuAChAH8AfgCAAIEA7ADuALoA2ADdANkAwgAAAAEAAf//AA8AAQAAAAwAAAAAAAAAAgABAAMAvwABAAA=");
+          }
+        </style></g></svg>
\ No newline at end of file
diff --git a/docs/make.bat b/docs/make.bat
new file mode 100644
index 0000000..5394189
--- /dev/null
+++ b/docs/make.bat
@@ -0,0 +1,35 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+	set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=source
+set BUILDDIR=build
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+	echo.
+	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+	echo.installed, then set the SPHINXBUILD environment variable to point
+	echo.to the full path of the 'sphinx-build' executable. Alternatively you
+	echo.may add the Sphinx directory to PATH.
+	echo.
+	echo.If you don't have Sphinx installed, grab it from
+	echo.http://sphinx-doc.org/
+	exit /b 1
+)
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
\ No newline at end of file
diff --git a/docs/requirements.txt b/docs/requirements.txt
new file mode 100644
index 0000000..8dad8f3
--- /dev/null
+++ b/docs/requirements.txt
@@ -0,0 +1,4 @@
+sphinx-autoapi
+furo
+pandas
+scikit-learn
\ No newline at end of file
diff --git a/docs/source/_templates/custom-class-template.rst b/docs/source/_templates/custom-class-template.rst
new file mode 100644
index 0000000..b55ecb3
--- /dev/null
+++ b/docs/source/_templates/custom-class-template.rst
@@ -0,0 +1,32 @@
+{{ fullname | escape | underline}}
+
+.. currentmodule:: {{ module }}
+
+.. autoclass:: {{ objname }}
+   :members:                                    <-- add at least this line
+   :show-inheritance:                           <-- plus I want to show inheritance...
+   :inherited-members:                          <-- ...and inherited members too
+
+   {% block methods %}
+   .. automethod:: __init__
+
+   {% if methods %}
+   .. rubric:: {{ _('Methods') }}
+
+   .. autosummary::
+   {% for item in methods %}
+      ~{{ name }}.{{ item }}
+   {%- endfor %}
+   {% endif %}
+   {% endblock %}
+
+   {% block attributes %}
+   {% if attributes %}
+   .. rubric:: {{ _('Attributes') }}
+
+   .. autosummary::
+   {% for item in attributes %}
+      ~{{ name }}.{{ item }}
+   {%- endfor %}
+   {% endif %}
+   {% endblock %}
\ No newline at end of file
diff --git a/docs/source/_templates/custom-module-template.rst b/docs/source/_templates/custom-module-template.rst
new file mode 100644
index 0000000..7823285
--- /dev/null
+++ b/docs/source/_templates/custom-module-template.rst
@@ -0,0 +1,34 @@
+ .. autosummary::
+      :toctree:                                          <-- add this line
+      :template: custom-class-template.rst               <-- add this line
+   {% for item in classes %}
+      {{ item }}
+   {%- endfor %}
+   {% endif %}
+   {% endblock %}
+
+   {% block exceptions %}
+   {% if exceptions %}
+   .. rubric:: {{ _('Exceptions') }}
+
+   .. autosummary::
+      :toctree:                                          <-- add this line
+   {% for item in exceptions %}
+      {{ item }}
+   {%- endfor %}
+   {% endif %}
+   {% endblock %}
+
+{% block modules %}
+{% if modules %}
+.. rubric:: Modules
+
+.. autosummary::
+   :toctree:
+   :template: custom-module-template.rst                 <-- add this line
+   :recursive:
+{% for item in modules %}
+   {{ item }}
+{%- endfor %}
+{% endif %}
+{% endblock %}
\ No newline at end of file
diff --git a/docs/source/concepts.rst b/docs/source/concepts.rst
new file mode 100644
index 0000000..f162f77
--- /dev/null
+++ b/docs/source/concepts.rst
@@ -0,0 +1,61 @@
+
+Imputr concepts
+===============
+
+There are a number of core concepts on which the Imputr is built and are good to know when using the library. 
+Some concepts are specific to the Imputr library and some are general imputation concepts.
+
+Univariate vs Multivariate
+--------------------------
+Imputation techniques can be divided into two categories: univariate and multivariate. 
+
+Univariate techniques only base the imputation on the data that is in the target column (the column that undergoes imputation). An example of this is is the :py:class:`imputr.strategy.MeanStrategy`.
+
+Multivariate techniques use columns additional to the target column (feature columns) to impute the target column. An example of this is the :py:class:`imputr.strategy.RandomForestStrategy`, where multiple columns are used as features to train a RandomForest model.
+
+Cyclical imputation
+-------------------
+Cyclical imputation is the concept of having multiple iterations of full table imputations. The idea is that in a first full multivariate table imputation, at training time for some target column A, the missing values of feature columns [B’] (B for feature column, B’ for feature column that has not undergone imputation yet) are temporarily imputed with a stable strategy such as the MeanStrategy. After A full imputation run, a second imputation run can be initiated, for which the same strategy for a target column A with feature columns [B] is fitted and used to impute the cells that were originally missing. 
+
+.. note::
+   This feature has not been implemented yet. Please see our `issues`_ to contribute or follow its status.
+
+.. _issues: https://github.com/imputr/imputr/issues/
+
+Imputation order
+----------------
+Imputation order
+The reason the order of imputation matters is because of the cyclical imputation dynamics. 
+
+The default and recommended imputation order of the library is partially based on the missForest paper. In short:
+   - columns with a univariate strategy are prioritised over columns with a multivariate strategy.
+   - (for multivariate) columns with less missing values are prioritized over columns with more missing values.
+
+Here is an example where:
+   - the Memory column has 2 missing values but has a univariate strategy, putting it in first place.
+   - the Lv 50 Atk column has 1 missing value with a multivariate sttategy, putting it in second place
+   - and the Stage column comes in last place as it has both a multivariate strategy and most missing values.
+
+   .. image:: ../_static/imputation-order.png
+      :width: 600
+      :alt: Example of order
+
+
+Missing at completely random
+----------------------------
+Missing at completely random (MCAR) happens when reanons for any particular data-item that is missing is independent both of observable variables and of 
+unobservable parameters.It must happen entirely at random. When data are MCAR, the analysis performed on the data is unbiased. 
+
+.. note:: 
+   MCAR generally is a good sign for analysis and imputation. However, real-world data is rarely MCAR.
+
+Missing at random
+-----------------
+Missing at random (MAR) is when the missingness actually is not random and can be fully considered by looking at the variables that contain complete information.
+MAR is an assumption that is impossible to verify statistically, which means it relies on the assumptions of the data scientist. An example is that males are less likely to fill in a depression survey but this has nothing to do with their level of depression, 
+after accounting for maleness. Depending on the analysis method, these data can still induce parameter bias in analyses due to the contingent emptiness of cells (male, very high depression may have zero entries for example).
+
+Missing not at random
+---------------------
+Values in a data set are missing not at random (MNAR) when data that contains missing values is neither MAR or MCAR (i.e. the value of the variable that's missing is related to the reason it's missing).
+An example for this could be a survey where people that earn a salary that is significantly lower or higher than the national average, which would make them less inclined to fill in this value.
\ No newline at end of file
diff --git a/docs/source/conf.py b/docs/source/conf.py
new file mode 100644
index 0000000..a9a6e22
--- /dev/null
+++ b/docs/source/conf.py
@@ -0,0 +1,55 @@
+# Configuration file for the Sphinx documentation builder.
+
+import os
+import sys
+sys.path.insert(0, os.path.abspath('../..')) 
+
+# -- Project information
+
+project = 'Imputr'
+copyright = '2022'
+author = 'Rauf Akdemir'
+
+release = '0.1'
+version = '0.1.0'
+
+# -- General configuration
+
+extensions = [
+    'sphinx.ext.duration',
+    'sphinx.ext.doctest',
+    'sphinx.ext.autodoc',
+    'sphinx.ext.autosummary',
+    'sphinx.ext.intersphinx',
+    'sphinx.ext.napoleon',
+    'sphinx.ext.autosectionlabel',
+    'autoapi.extension'
+]
+
+intersphinx_mapping = {
+    'python': ('https://docs.python.org/3/', None),
+    'sphinx': ('https://www.sphinx-doc.org/en/master/', None),
+}
+intersphinx_disabled_domains = ['std']
+
+templates_path = ['_templates']
+
+# # -- Options for HTML output
+
+html_theme = 'furo'
+
+html_logo = "../_static/imputr-logo-horizontal.svg"
+
+autoapi_dirs = ['../../imputr']
+
+html_theme_options = {
+    # 'navigation_depth': 4
+}
+
+# -- Options for EPUB output
+epub_show_urls = 'footnote'
+
+# Configs for napoleon
+napoleon_use_ivar = True
+napoleon_use_rtype = False
+napoleon_attr_annotations = True
\ No newline at end of file
diff --git a/docs/source/contributionjumpstart.rst b/docs/source/contributionjumpstart.rst
new file mode 100644
index 0000000..759f3a3
--- /dev/null
+++ b/docs/source/contributionjumpstart.rst
@@ -0,0 +1,100 @@
+Contribution jumpstart
+======================
+
+Imputr is an ever-evolving open source library and can always use contributors who want to help build with the community.
+
+Thanks for your interest, let's have a look at we can do!
+
+
+Create awareness
+----------------
+
+The more people we have aboard, the more we can improve the quality of this library!
+
+- **Share our project with the people around you**: you may talk about our project with your co-workers and friends, or post about us
+    on your social media accounts. 
+- **Write about Imputr**: If you like to write content, you could be of great help to Imputr! 
+    You may feature is in a blog article, newsletter or post in which you show how to the library or why you 
+    think Imputr is useful to the community.
+
+
+Contribute to the codebase
+--------------------------
+- **Report bugs**: inform us of things breaking or improvements you'd like to see by submitting an issues on
+  our `issues`_ page. We recommend using our templates for the best way of handling your issue.
+- **Smash those bugs**: have a scroll through the bugs in our `issues`_ page. Anything tagged with `bug` and
+  `help wanted` is open to whoever wants to implement it.
+- **Implement a strategy**: implementing a strategy should be relatively easy to pick up as there are numerous examples. See this `strategy milestone`_ to find some strategy issues you may want to pick up.
+- **Implement an enhancement**: look through the GitHub issues for features. Anything tagged with "enhancement"
+  and "help wanted" is open to whoever wants to implement it.
+- **Write documentation**: it might not seem very glorious, but it is some of the hardest yet most important work to be
+  done. Additions to the official Imputr docs, docstrings or even on the web in blog posts or articles are highly
+  appreciated!
+  
+Help the science team
+---------------------
+
+The Imputr core science team is constantly trying to learn from Imputr's real-world behavior to best tailor it to the needs of its users.
+
+- **Share your results**: you may share your imputation's accuracy, runtime, memory and (privacy proof) dataset. Tell us what works and does not work for you.
+- **Propose research on ideas**: we are constnatly looking for new papers, strategies and heuristics to help us improve our imputations overall. If you have an idea or you happen to find something, please let us know!
+
+.. _issues: https://github.com/imputr/imputr/issues
+.. _strategy milestone: https://github.com/imputr/imputr/milestone/1
+
+Getting started
+---------------
+
+Ready to contribute code? Here's how to set up `imputr` for local development.
+
+
+Steps to get started
+~~~~~~~~~~~~~~~~~~~~
+
+1. Fork the `imputr` repo on GitHub.
+2. Clone your fork locally: ::
+
+    $ git clone git@github.com:your_name_here/imputr.git
+
+3. Ensure poetry_ is installed.
+
+
+4. Install dependencies and start your virtualenv. Execute the following from within your local repository directory: ::
+
+    $ poetry install
+
+5. Create a branch for local development: ::
+
+    $ git checkout -b name-of-your-bugfix-or-feature
+
+  Now you can make your changes locally.
+
+6. When you're done making changes, check that your changes pass the
+   tests, including testing other Python versions, with tox: ::
+
+    $ poetry run tox
+
+7. Commit your changes and push your branch to GitHub: ::
+
+    $ git add .
+    $ git commit -m "Your detailed description of your changes."
+    $ git push origin name-of-your-bugfix-or-feature
+
+8. Submit a pull request through the GitHub website.
+
+.. _poetry: https://python-poetry.org/docs/
+
+Pull Request Guidelines
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Before you submit a pull request, check that it meets these guidelines:
+
+1. The pull request should include your tests. We follow a 95% code coverage guideline.
+2. If the pull request adds functionality, the docs should be updated. Put
+   your new functionality into a function with a docstring, and add the
+   feature to the list in ``README.md``.
+3. The pull request should work for Python 3.7, 3.8, 3.9 and 3.10. Check
+   the project's `github actions page`_ and make sure that the tests pass
+   for all supported Python versions.
+
+.. _`github actions page`: https://github.com/imputr/imputr/actions
\ No newline at end of file
diff --git a/docs/source/coreclass.rst b/docs/source/coreclass.rst
new file mode 100644
index 0000000..ca924e0
--- /dev/null
+++ b/docs/source/coreclass.rst
@@ -0,0 +1,47 @@
+Core class structure
+====================
+
+Strategy (class)
+----------------
+A strategy in the imputr library is an imputation method. Its name stems from the Strategy behavioral design pattern. It allows you to indiciate how you want the Imputer to impute for a specific column.
+
+An example of this is the RandomForestStrategy.
+
+.. autoclass:: imputr.strategy.RandomForestStrategy
+
+In short, a strategy:
+- is instantiated for a single column
+- can support one or more DataTypes
+- can be univariate or multivariate
+- can be customized
+
+Its interface is defined in the abstract _BaseStrategy class. 
+
+Imputer (class)
+---------------
+An Imputer is the highest level class of the library and also provides the API for the end user of the library. 
+
+An example of this is the AutoImputer.
+
+.. autoclass:: imputr.AutoImputer
+
+It fits and imputes with 1 or more strategies for a whole table. Its behavior can be customized by the caller. It implements the _BaseImputer class.
+
+Column (class)
+--------------
+The Column is the dataclass that is used for holding the actual data as well as the metadata of a column such as name, number of unique values, number of missing values and DataType. It also comes with a basic set of methods that make it easier to work with an imputer. It is a list attribute of the Table dataclass. 
+
+.. autoclass:: imputr.domain.Column
+
+DataType (enum)
+---------------
+The DataType describes the data in a column from an imputation perspective. A strategies must explicitly execute a DataType before and Imputer can use it.
+
+.. autoclass:: imputr.domain.DataType
+
+The DataTypes Imputr uses are the following:
+   - Categorical
+   - Continuous
+   - Discrete-ordinal (future release)
+   - Datetime (future release, currently mapped to Continuous)
+
diff --git a/docs/source/examples.rst b/docs/source/examples.rst
index ce68152..31aacf6 100644
--- a/docs/source/examples.rst
+++ b/docs/source/examples.rst
@@ -1,3 +1,139 @@
 Examples
 ========
 
+Let's look at how we can use the library. We will start with the most simple use case and incrementally add complexity to show what the library can do. 
+
+
+The simplest use
+----------------
+The easiest way to use the library is by simply calling the AutoImputer. This fits a Random Forest model for each column and incrementally imputes each column before returning.
+
+
+.. code-block:: python
+
+   from imputr import AutoImputer
+   import pandas as pd
+
+   # Import dataset with missing values
+   df = pd.read_csv("example.csv")
+
+   # Initialize AutoImputer with data 
+   imputer = AutoImputer(data=df)
+
+   # Retrieve fully imputed dataset
+   imputed_df = imputer.impute()
+
+
+This will return a fully imputed dataset.
+
+Specifying strategies
+---------------------
+However easy, the AutoImputer may not perfectly suit your needs. For example, if you know a particular column has little missing values, it may not be worth training a Random Forest model for each column, as it takes some time. 
+
+Let's say you have a column called age with only 1% missing values, you may want to substitute that imputation strategy with a Mean strategy, like so:
+
+.. code-block:: python
+
+   from imputr import AutoImputer
+   import pandas as pd
+
+   # Import dataset with missing values
+   df = pd.read_csv("example.csv")
+
+   # Specify MeanStrategy for column called 'age' in pandas DataFrame
+   predefined_strategies = {
+      'age': {
+         'strategy':'mean'
+         }
+   }
+
+   # Initialize AutoImputer with data 
+   imputer = AutoImputer(data=df, predefined_strategies=predefined_strategies)
+
+   # Retrieve fully imputed dataset
+   imputed_df = imputer.impute()
+
+The imputation framework recognizes the 'mean' strategy as one of the predefined names that are specified in the mapping.
+
+Specifying strategies with params
+---------------------------------
+Another way to tweak the working of an Imputer is by specifying parameters for the strategies. 
+
+In case of the Random Forest strategy, we exposed scikit-learn's RandomForestClassifier and RandomForestRegressor APIs through the strategy interface.
+
+Let's say you have another column called income, where we want a higher accuracy than the mean. We can specify a lower the number of estimators and maximum depth. This way we reduce the runtime and memory footprint, while still maintaining a certain degree of accuracy.
+
+
+.. code-block:: python
+
+   from imputr import AutoImputer
+   import pandas as pd
+
+   # Import dataset with missing values
+   df = pd.read_csv("example.csv")
+
+   # Specify RandomForestStrategy params for column called 'income' in pandas DataFrame
+   predefined_strategies = {
+       'age': {
+          'strategy': 'mean'
+          }
+       'income': {
+          'strategy': 'rf',
+          'params': {
+            'n_estimators': 4,
+            'max_depth': 8
+          }
+       }
+   }
+
+   # Initialize AutoImputer with data 
+   imputer = AutoImputer(data=df, predefined_strategies=predefined_strategies)
+
+   # Retrieve fully imputed dataset
+   imputed_df = imputer.impute()
+
+Specifying data type of column
+------------------------------
+There may be a case where a numeric column is actually a categorical value. For example, let's say you have a column called 'zip_code', the column may be numeric, but is not an ordinal value, therefore it doesn't make sense to train a regressor model to predict the value. 
+
+.. note::
+   Currently the library only contains continous and categorical as data types. The plan is to include datetime and discrete-ordinal in future releases.
+
+In these cases, you can specify the data type for the column, so that the imputer uses a classifier instead of a regressor. To do this, simply specify it in `predefined_datatypes` dictionary:
+
+.. code-block:: python
+
+   from imputr import AutoImputer
+   import pandas as pd
+
+   # Import dataset with missing values
+   df = pd.read_csv("example.csv")
+   
+   # Specify data type of the column
+   predefined_datatypes = {
+      'zip_code': 'cat'
+   }
+
+   # Specify RandomForestStrategy params for column called 'income' in pandas DataFrame
+   predefined_strategies = {
+       'age': {
+          'strategy': 'mean'
+          }
+       'income': {
+          'strategy': 'rf',
+          'params': {
+            'n_estimators': 4,
+            'max_depth': 8
+          }
+       }
+   }
+
+   # Initialize AutoImputer with data 
+   imputer = AutoImputer(data=df, 
+                         predefined_strategies=predefined_strategies,
+                         predefined_datatypes=predefined_datatypes
+                        )
+
+   # Retrieve fully imputed dataset
+   imputed_df = imputer.impute()
+
diff --git a/docs/source/index.rst b/docs/source/index.rst
new file mode 100644
index 0000000..bfb6877
--- /dev/null
+++ b/docs/source/index.rst
@@ -0,0 +1,48 @@
+Welcome to Imputr's documentation!
+===================================
+
+.. image:: https://badge.fury.io/py/.svg
+   :target: https://badge.fury.io/py/imputr
+   :alt: PyPI version
+ 
+.. image:: https://github.com/kearnz/autoimpute/actions/workflows/build.yml/badge.svg
+   :target: https://github.com/kearnz/autoimpute/actions
+   :alt: Build Status
+ 
+.. image:: https://readthedocs.org/projects/imputr/badge/?version=latest
+   :target: https://imputr.readthedocs.io/en/latest/?badge=latest
+   :alt: Documentation Status
+ 
+.. image:: http://img.shields.io/badge/license-apache-blue.svg?style=flat
+   :target: http://www.apache.org/licenses/LICENSE-2.0
+   :alt: Apache License
+
+ 
+.. image:: https://img.shields.io/badge/python-3.7+-blue.svg
+   :target: https://www.python.org/downloads/release/python-380/
+   :alt: Python 3.7+
+
+**Imputr** is an open-source library that allows users to stably impute 
+tabular data sets with ML-based and conventional techniques. 
+It is designed to have an extremely simple, yet extensive API, 
+making it possible for users of all levels and tasks to deploy the library in their workflows.
+
+Check out the :doc:`usage` section for further information, including
+how to install the project.
+
+.. note::
+
+   This project is under active development.
+
+Contents
+--------
+
+.. toctree::
+   :maxdepth: 2
+   
+   usage
+   concepts
+   examples
+   coreclass
+   contributionjumpstart
+   
diff --git a/docs/source/usage.rst b/docs/source/usage.rst
new file mode 100644
index 0000000..50c9f9e
--- /dev/null
+++ b/docs/source/usage.rst
@@ -0,0 +1,35 @@
+Usage
+=====
+
+Installation
+------------
+
+To use Imputr, first install it using pip:
+
+.. code-block:: console
+
+   $ pip install imputr
+
+Using the AutoImputer
+---------------------
+
+To impute a dataset, we recommend using the AutoImputer. 
+You import it and simply parse your Pandas DataFrame to initialize it.
+
+For example:
+
+.. code-block:: python
+
+   from imputr import AutoImputer
+   import pandas as pd
+
+   # Import dataset into Pandas DataFrame
+   df = pd.read_csv("example.csv")
+
+   # Initialize AutoImputer with data 
+   imputer = AutoImputer(data=df)
+
+   # Retrieve fully imputed dataset
+   imputed_df = imputer.impute()
+      
+To see how you can customize the behaviour of the imputer, check out the :ref:`Examples`.
diff --git a/imputr.code-workspace b/imputr.code-workspace
deleted file mode 100644
index 5e835fc..0000000
--- a/imputr.code-workspace
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-	"settings": {
-		"jupyter.debugJustMyCode": false
-	},
-	"folders": [
-		{
-			"path": "."
-		}
-	]
-}
\ No newline at end of file
diff --git a/imputr/domain/column.py b/imputr/domain/column.py
index 187f49e..db2bce8 100644
--- a/imputr/domain/column.py
+++ b/imputr/domain/column.py
@@ -43,7 +43,8 @@ def imputed_data(self) -> pd.Series:
         the _imputed_data value as average-based imputed pd.Series (mode for
         discrete and mean for continuous) and returns it.
 
-        Returns:
+        Returns
+        -------
             pd.Series: imputed data of the Column object.
         """
         if self._imputed_data is None:
@@ -70,9 +71,10 @@ def numeric_encoded_imputed_data(self) -> pd.Series:
         
         Transforms categorical data types to incrementally labeled integer data.
         Calls the property getter of self._imputed_data.
-
-        Returns:
-            pd.Series: _description_
+       
+        Returns
+        -------
+            pd.Series: series containing in imputed data in numerically encoded form.
         """
 
         if self.type is DataType.CONTINUOUS:
@@ -86,8 +88,9 @@ def null_indices(self) -> np.ndarray:
         """Returns np.ndarray of indexes where a null value is found.
         
         Mutually exclusive with the non_null_indices property.
-
-        Returns:
+        
+        Returns
+        -------
             np.ndarray: indexes where a null value is found
         """
         return np.where(pd.isnull(self.data))
@@ -97,8 +100,9 @@ def non_null_indices(self) -> np.ndarray:
         """Returns np.ndarray of indexes where a non-null value is found.
         
         Mutually exclusive with the null_indices property.
-
-        Returns:
+        
+        Returns
+        -------
             np.ndarray: indexes where a non-null value is found
         """
         return np.where(~pd.isnull(self.data))
@@ -187,7 +191,7 @@ def _compute_average(self, column: pd.Series, type: DataType) -> Union[str, floa
             Union[str, float] : Either the mode or the mean of the library.
         """
         if type is DataType.CATEGORICAL:
-            # Picks first mode in the list of possible modes
+            # Picks first mode in the List of possible modes
             return str(column.mode().iloc[0])
         else:
             return float(column.mean())
\ No newline at end of file
diff --git a/imputr/domain/table.py b/imputr/domain/table.py
index 34e9db1..a097f33 100644
--- a/imputr/domain/table.py
+++ b/imputr/domain/table.py
@@ -1,34 +1,45 @@
-from typing import Union
+from typing import Union, List, Dict
 import pandas as pd
-
 from ..domain import DataType
 from ..domain import Column
 
+
 class Table:
     """Data class that encapsulates the data and imputr-specific metadata of a table.
     
+    Attributes
+    ----------
+    
+    data : pd.DataFrame
+        The Pandas DataFrame that contains the table data.
+        
+    columns : Dict[str, Union[str, DataType]] (optional)
+        Dictionary that has column names as key and the data type as specified
+        in the Column constructor as value.
+    
 
     Parameters
     ----------
     data : pd.DataFrame
         The Pandas DataFrame that contains the table data.
         
-    predefined_datatypes : dict[str, Union[str, DataType]] (optional)
+    predefined_datatypes : Dict[str, Union[str, DataType]] (optional)
         Dictionary that has column names as key and the data type as specified
         in the Column constructor as value.
     
     """
     
     data: pd.DataFrame
-    columns: list[Column]
+    columns: List[Column]
     
     def __init__(self,
                  data: pd.DataFrame,
-                 predefined_datatypes: dict[str, Union[str, DataType]] = None):
+                 predefined_datatypes: Dict[str, Union[str, DataType]] = None):
         self.columns = self._construct_columns(data, predefined_datatypes)
+        
     def _construct_columns(self, 
                            data: pd.DataFrame,
-                           predefined_datatypes) -> list[Column]:
+                           predefined_datatypes) -> List[Column]:
         """
         Loops over dataframe columns to construct Column objects.
 
@@ -37,13 +48,13 @@ def _construct_columns(self,
         data : pd.DataFrame 
             The Pandas DataFrame that contains the columns.
             
-        predefined_datatypes : dict[str, Union[str, DataType]] (optional)
+        predefined_datatypes : Dict[str, Union[str, DataType]] (optional)
             Dictionary that has column names as key and the data type as specified
             in the Column constructor as value.
 
         Returns
         -------
-            List[Column] : the list of constructed Column objects.
+            List[Column] : the List of constructed Column objects.
         """
         return [Column(data.iloc[:, index]) if predefined_datatypes is None 
                 or item not in predefined_datatypes
diff --git a/imputr/imputers/_base.py b/imputr/imputers/_base.py
index 4fcaa56..dff1c20 100644
--- a/imputr/imputers/_base.py
+++ b/imputr/imputers/_base.py
@@ -5,10 +5,10 @@
 
 from ..domain import Table, Column, DataType
 from ..strategy._base import _BaseStrategy
-from ..strategy.multivariate import _MultivariateStrategy
+from ..strategy.randomforest import _MultivariateStrategy
 from ..strategy import *
-from ..strategy.univariate import _UnivariateStrategy, MeanStrategy
-from typing import Union
+from ..strategy.mean import _UnivariateStrategy, MeanStrategy
+from typing import Union, Dict, List
 
 class _BaseImputer(ABC):
     """Abstract base class for imputer classes.
@@ -22,23 +22,23 @@ class _BaseImputer(ABC):
     data : pd.DataFrame
         The dataframe which undergoes imputation.
     
-    predefined_datatypes : dict[str, Union[str, DataType]] (optional)
+    predefined_datatypes : Dict[str, Union[str, DataType]] (optional)
         Dictionary that has column names as key and the data type as specified
         in the Column constructor as value.
 
     """
     
     table: Table
-    predefined_order: dict[str, int]
-    predefined_strategies: dict[str, dict]
+    predefined_order: Dict[str, int]
+    predefined_strategies: Dict[str, Dict]
     
-    strategies: dict[str, _BaseStrategy]
-    ordered_columns: list[Column]
+    strategies: Dict[str, _BaseStrategy]
+    ordered_columns: List[Column]
     include_non_missing: bool
             
     def __init__(self,
                  data: pd.DataFrame,
-                 predefined_datatypes: dict[str, Union[str, DataType]] = None):
+                 predefined_datatypes: Dict[str, Union[str, DataType]] = None):
         self.table = Table(data, predefined_datatypes)
         
         
@@ -55,9 +55,9 @@ def impute(self) -> pd.DataFrame:
         return
 
     def _determine_order(self, 
-                        columns: list[Column],
-                        predefined_strategies: dict[str, _BaseStrategy],
-                        predefined_order: dict[str, int] = None) -> list[Column]:
+                        columns: List[Column],
+                        predefined_strategies: Dict[str, _BaseStrategy],
+                        predefined_order: Dict[str, int] = None) -> List[Column]:
         """
         Determines the imputation order based on the predefined order, imputation
         strategy type and the number of missing values. The algorithm looks at predefined
@@ -67,22 +67,22 @@ def _determine_order(self,
 
         Parameters
         ----------
-        columns : list[Column]
+        columns : List[Column]
             The columns that will undergo sequential imputation.
             
-        predefined_strategies : dict[str, _BaseStrategy] 
+        predefined_strategies : Dict[str, _BaseStrategy] 
             Dictionary of of column names and their respective strategy that the 
             imputer will use.
 
-        predefined_order : dict[str, int] (optional)
+        predefined_order : Dict[str, int] (optional)
             Dictionary of predefined order in which the imputation must be done.
             
         Returns
         -------
-            List[Column] : returns list of Column references in imputation order.
+            List[Column] : returns List of Column references in imputation order.
         """
         
-        # TODO Implement assertion that order dict is incremental starting
+        # TODO Implement assertion that order Dict is incremental starting
         # from 0 as such: { 'column_x': 0, 'column_z': 1, 'column_y': 2 }
         
         if predefined_order is not None:
@@ -116,20 +116,20 @@ def _determine_order(self,
         return columns_in_predefined_order + univariate_strat_cols + multivariate_strat_cols 
 
     def _determine_list_of_included_columns(self, 
-                                           predefined_strategies: dict[str, dict] = None, 
-                                           predefined_order: dict[str, int] = None, 
-                                           include_non_missing: bool = False) -> list[Column]:
-        """Determines list of columns that need fitting of imputation strategies.
+                                           predefined_strategies: Dict[str, Dict] = None, 
+                                           predefined_order: Dict[str, int] = None, 
+                                           include_non_missing: bool = False) -> List[Column]:
+        """Determines List of columns that need fitting of imputation strategies.
         
         By default includes all columns that have missing value, a defined strategy or defined order.
         
         Parameters
         ----------
-        predefined_datatypes : dict[str, Union[str, DataType]] (optional)
+        predefined_datatypes : Dict[str, Union[str, DataType]] (optional)
             Dictionary that has column names as key and the data type as specified
             in the Column constructor as value.
             
-        predefined_order : dict[int, str] (optional)
+        predefined_order : Dict[int, str] (optional)
             Contains predefined order as defined in public API. Defaults to None
             
         include_non_missing : bool
@@ -137,7 +137,7 @@ def _determine_list_of_included_columns(self,
             Defaults to None.
 
         Returns:
-            list[Column]: List of columns that need strategy fitting.
+            List[Column]: List of columns that need strategy fitting.
         """
         
         if include_non_missing == True:
@@ -151,22 +151,22 @@ def _determine_list_of_included_columns(self,
             
     def _construct_strategies(self, 
                         default_strategy: _BaseStrategy,
-                        predefined_strategies: dict[str, dict] = None
-                        ) -> dict[str, _BaseStrategy]:
+                        predefined_strategies: Dict[str, Dict] = None
+                        ) -> Dict[str, _BaseStrategy]:
         """Constructs strategies to prepare for fitting and imputation.
         
         Parameters
         ----------
-        strategies : dict[str, dict] (optional)
-            Contains name - dict as defined in public API. Defaults to None.
+        strategies : Dict[str, Dict] (optional)
+            Contains name - Dict as defined in public API. Defaults to None.
 
         Returns:
-            dict[str, _BaseStrategy]: Contains strategy for each column.
+            Dict[str, _BaseStrategy]: Contains strategy for each column.
         """
         if predefined_strategies is None: 
             predefined_strategies = {}
         
-        constructed_strategies: dict[str, _BaseStrategy] = {}
+        constructed_strategies: Dict[str, _BaseStrategy] = {}
         
         for col in self.included_columns:
             feature_columns = list(filter(lambda x: x.name != col.name, self.table.columns))
@@ -220,9 +220,11 @@ def str_to_strategy(self, string_name: str) -> _BaseStrategy:
                 raise ValueError(f'Strategy with \'{string_name}\' string representation is not defined.')
         return str_to_strategy_mapping[string_name]
 
-    
+
     def impute(self) -> pd.DataFrame:
         """Imputes dataframe with specified strategies.
+        
+        Overwrite this method if you wish to implement different imputation behavior.
 
         Returns:
             pd.DataFrame: imputed dataset.
diff --git a/imputr/imputers/autoimputer.py b/imputr/imputers/autoimputer.py
index fd1339f..dd67b24 100644
--- a/imputr/imputers/autoimputer.py
+++ b/imputr/imputers/autoimputer.py
@@ -2,8 +2,8 @@
 from ._base import _BaseImputer
 import pandas as pd
 from ..strategy._base import _BaseStrategy
-from ..strategy.multivariate import RandomForestStrategy
-from typing import Union
+from ..strategy.randomforest import RandomForestStrategy
+from typing import Union, Dict, List
 
 
 class AutoImputer(_BaseImputer):
@@ -11,19 +11,32 @@ class AutoImputer(_BaseImputer):
     as main imputation method. Can be configured to implement other strategies
     for specific columns and a custom imputation order.
     
+    Attributes
+    ----------
+    predefined_order : Dict[int, str] (optional)
+        Dictionary of column names and their order for imputation. 
+        Keys must be incremental starting from zero: 0, 1, 2
+        
+    strategies : Dict[str, Dict] (optional)
+        Dictionary of column name and strategy kwargs.
+    
+    predefined_datatypes : Dict[str, Union[str, DataType]] (optional)
+        Dictionary that has column names as key and the data type as specified
+        in the Column constructor as value.
+    
     Parameters
     ----------
     data : pd.DataFrame
         The dataframe which undergoes imputation.
         
-    predefined_order : dict[int, str] (optional)
+    predefined_order : Dict[int, str] (optional)
         Dictionary of column names and their order for imputation. 
         Keys must be incremental starting from zero: 0, 1, 2
         
-    predefined_strategies : dict[str, dict] (optional)
+    predefined_strategies : Dict[str, Dict] (optional)
         Dictionary of column name and strategy kwargs.
     
-    predefined_datatypes : dict[str, Union[str, DataType]] (optional)
+    predefined_datatypes : Dict[str, Union[str, DataType]] (optional)
         Dictionary that has column names as key and the data type as specified
         in the Column constructor as value.
         
@@ -33,16 +46,15 @@ class AutoImputer(_BaseImputer):
 
     """
     
-    predefined_order: dict[str, int]
-    strategies: dict[str, _BaseStrategy]
-    ordered_columns: list[Column]
-    include_non_missing: bool
+    strategies: Dict[str, _BaseStrategy]
+    ordered_columns: List[Column]
+    included_columns: List[Column]
     
     def __init__(self, 
                  data: pd.DataFrame,
-                 predefined_order: dict[str, int] = None,
-                 predefined_strategies: dict[str, dict] = None,
-                 predefined_datatypes: dict[str, Union[str, DataType]] = None,
+                 predefined_order: Dict[str, int] = None,
+                 predefined_strategies: Dict[str, Dict] = None,
+                 predefined_datatypes: Dict[str, Union[str, DataType]] = None,
                  include_non_missing: bool = False,
                  ):
         super().__init__(data, predefined_datatypes)
diff --git a/imputr/imputers/meanimputer.py b/imputr/imputers/meanimputer.py
index 7f0db33..86ce6a5 100644
--- a/imputr/imputers/meanimputer.py
+++ b/imputr/imputers/meanimputer.py
@@ -3,7 +3,8 @@
 from ._base import _BaseImputer
 import pandas as pd
 from ..strategy._base import _BaseStrategy
-from ..strategy.univariate import MeanStrategy
+from ..strategy.mean import MeanStrategy
+from typing import Union, Dict, List
 
 class MeanImputer(_BaseImputer):
     """Simple imputation class that uses average imputation
@@ -16,14 +17,14 @@ class MeanImputer(_BaseImputer):
     data : pd.DataFrame
         The dataframe which undergoes imputation.
         
-    predefined_order : dict[int, str] (optional)
+    predefined_order : Dict[int, str] (optional)
         Dictionary of column names and their order for imputation. 
         Keys must be incremental starting from zero: 0, 1, 2
         
-    predefined_strategies : dict[str, dict] (optional)
+    predefined_strategies : Dict[str, Dict] (optional)
         Dictionary of column name and strategy kwargs.
     
-    predefined_datatypes : dict[str, Union[str, DataType]] (optional)
+    predefined_datatypes : Dict[str, Union[str, DataType]] (optional)
         Dictionary that has column names as key and the data type as specified
         in the Column constructor as value.
         
@@ -32,20 +33,20 @@ class MeanImputer(_BaseImputer):
         of strategies. Default is set to False.
     """
     
-    predefined_order: dict[str, int]
-    predefined_strategies: dict[str, dict]
-    strategies: dict[str, _BaseStrategy]
-    ordered_columns: list[Column]
+    predefined_order: Dict[str, int]
+    predefined_strategies: Dict[str, Dict]
+    strategies: Dict[str, _BaseStrategy]
+    ordered_columns: List[Column]
     include_non_missing: bool
     
     def __init__(self, 
                  data: pd.DataFrame,
-                 predefined_order: dict[str, int] = None,
-                 predefined_strategies: dict[str, dict] = None,
-                 predefined_datatypes: dict[str, Union[str, DataType]] = None,
+                 predefined_order: Dict[str, int] = None,
+                 predefined_strategies: Dict[str, Dict] = None,
+                 predefined_datatypes: Dict[str, Union[str, DataType]] = None,
                  include_non_missing: bool = False,
                  ):
-        super().__init__(data)
+        super().__init__(data, predefined_datatypes)
         self.included_columns = self._determine_list_of_included_columns(predefined_strategies, 
                                                                         predefined_order, 
                                                                         include_non_missing)
diff --git a/imputr/strategy/__init__.py b/imputr/strategy/__init__.py
index 4102633..01a28bb 100644
--- a/imputr/strategy/__init__.py
+++ b/imputr/strategy/__init__.py
@@ -1,2 +1,2 @@
-from .multivariate import RandomForestStrategy
-from .univariate import MeanStrategy
\ No newline at end of file
+from .randomforest import RandomForestStrategy
+from .mean import MeanStrategy
\ No newline at end of file
diff --git a/imputr/strategy/_base.py b/imputr/strategy/_base.py
index f3c25c6..69d63d8 100644
--- a/imputr/strategy/_base.py
+++ b/imputr/strategy/_base.py
@@ -1,8 +1,7 @@
 from abc import ABC, abstractmethod
 import pandas as pd
-from ..domain import DataType
-
-from ..domain import Column
+from ..domain import DataType, Column
+from typing import Dict, List
 
 class _BaseStrategy(ABC):
     """Abstract base class for strategy classes.
@@ -25,25 +24,26 @@ def __init__(self, target_column: Column):
     @abstractmethod
     def from_dict(cls, 
                   target_column: Column,
-                  **kwargs: dict):
+                  **kwargs: Dict):
         """Class constructor that uses the dictionary to build strategy.
         
         Uses a part of the dictionary given to imputer constructor.
 
-        Args:
-            target_column (Column): Column that needs imputation by strategy.
+        Parameters
+        ----------
+        target_column : Column
+            Column that needs imputation by strategy.
         """
         return
     
     @property
     @abstractmethod
-    def supported_data_types(self) -> list[DataType]:
+    def supported_data_types(self) -> List[DataType]:
         """The imputer data types that are supported by 
         this imputation strategy.
 
-        Returns
-        -------
-        list[DataType] : List of imputr DataType enums.
+        Returns:
+            List[DataType] : List of imputr DataType enums.
         """
         return 
         
@@ -64,9 +64,38 @@ def impute_column(self) -> pd.Series:
         This method fills all missing values with its own strategy.
 
         Returns:
-            pd.Series : The Pandas Series that has the imputed column values.
+            pd.Series : The Pandas Series that contains that has the imputed column values.
         """
         return
+    
+class _MultivariateStrategy(_BaseStrategy):
+    """
+    The abstract class that contains the interface for multivariate imputation
+    strategies.
+    """
+    
+    feature_columns: List[Column]
+    _feature_df: pd.DataFrame
+    
+    def __init__(self, 
+                 target_column: Column, 
+                 feature_columns: List[Column]
+                 ):
+        super().__init__(target_column)
+        self.feature_columns = feature_columns
+        
+    @classmethod   
+    @abstractmethod
+    def from_dict(cls, 
+                  target_column: Column, 
+                  feature_columns: List[Column],
+                  **kwargs: Dict):
+        return
+    
+    def _create_df_from_num_encoded_feature_columns(self, feature_columns: 
+                                                List[Column]) -> pd.DataFrame:
+        """Creates pd.DataFrame from pd.Series objects that contain
+        the numerically encoded imputed data for the respective column.
 
         Returns:
             pd.DataFrame : joined dataframe of num-encoded and imputed data.
diff --git a/imputr/strategy/mean.py b/imputr/strategy/mean.py
index 666720e..7ebf57b 100644
--- a/imputr/strategy/mean.py
+++ b/imputr/strategy/mean.py
@@ -1,3 +1,4 @@
+from abc import abstractmethod
 from ..domain import Column
 from ._base import _UnivariateStrategy
 import pandas as pd
diff --git a/imputr/strategy/multivariate.py b/imputr/strategy/multivariate.py
deleted file mode 100644
index e2d7bd6..0000000
--- a/imputr/strategy/multivariate.py
+++ /dev/null
@@ -1,194 +0,0 @@
-from abc import  abstractmethod
-from typing import Union, Dict, List
-from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
-import pandas as pd
-from ..domain import Column, DataType
-from ._base import _BaseStrategy
-import numpy as np
-
-
-class _MultivariateStrategy(_BaseStrategy):
-    """
-    The abstract class that contains the interface for multivariate imputation
-    strategies.
-    """
-    
-    feature_columns: List[Column]
-    _feature_df: pd.DataFrame
-    
-    def __init__(self, 
-                 target_column: Column, 
-                 feature_columns: List[Column]
-                 ):
-        super().__init__(target_column)
-        self.feature_columns = feature_columns
-        
-    @classmethod   
-    @abstractmethod
-    def from_dict(cls, 
-                  target_column: Column, 
-                  feature_columns: List[Column],
-                  **kwargs: Dict):
-        return
-    
-    def _create_df_from_num_encoded_feature_columns(self, feature_columns: 
-                                                List[Column]) -> pd.DataFrame:
-        """Creates pd.DataFrame from pd.Series objects that contain
-        the numerically encoded imputed data for the respective column.
-
-        Returns:
-            pd.DataFrame : joined dataframe of num-encoded and imputed data.
-        """
-        
-        df_dict = {}
-        for col in feature_columns:
-            df_dict[col.name] = col.numeric_encoded_imputed_data
-        return pd.DataFrame(df_dict)
-
-class RandomForestStrategy(_MultivariateStrategy):
-    """
-    Strategy implementation for RandomForest-based imputation.
-        
-    Parameters
-    ----------
-    target_column : Column
-        The column which needs imputation.
-    
-    feature_columns : List[Column]
-        The predictor columns for the Random Forest to train on.
-    
-    data_type : Union[str, DataType] (optional)
-        The string or enum representation of the data_type.
-        
-    n_estimators : int (optional)
-        Number of decision trees used in the forest. Please refer ...
-        
-    max_depth : int (optional)
-        Maximum depth of decision trees used in the forest. Please refer ...
-    
-    min_sample_split : int (optional)
-        Minimum sample split of decision trees.  Please refer ...
-    
-    min_samples_leaf : int (optional)
-        Minimum samples at leaves of decision trees. Please refer ...
-    
-    min_weight_fraction_leaf : float (optional)
-        Minimum weight fractions of leaves of decision trees. Please refer...
-        
-    max_features : Union[str, float] (optional)
-        Max features used per decision tree. Can be fraction or identifier like `sqrt`.
-        Please refer...
-        
-    max_leaf_nodes : int (optional)
-        Max number of nodes at leaves of the decision trees. Please refer...
-    
-    """
-    
-    supported_data_types: List = [
-        DataType.CATEGORICAL,
-        DataType.CONTINUOUS
-        ]
-
-    def __init__(self, 
-                 target_column: Column, 
-                 feature_columns: List[Column],
-                 n_estimators: int = 64,
-                 max_depth:int =8,
-                 min_sample_split: int  = 512,
-                 min_samples_leaf: int = 128,
-                 min_weight_fraction_leaf: float = 0.35,
-                 max_features: Union[str, float] = "sqrt",
-                 max_leaf_nodes: int = 32
-                 ):
-        super().__init__(target_column, feature_columns)
-        
-        if target_column.type not in self.supported_data_types:
-            raise ValueError(f'Data type {self.data_type} not supported by Random Forest.')
-
-        self.n_estimators = n_estimators
-        self.max_depth = max_depth
-        self.min_sample_split = min_sample_split
-        self.min_samples_leaf = min_samples_leaf
-        self.min_weight_fraction_leaf = min_weight_fraction_leaf
-        self.max_features = max_features
-        self.max_leaf_nodes = max_leaf_nodes
-        self.data_type = target_column.type
-       
-    @classmethod
-    def from_dict(cls, 
-                  target_column: Column, 
-                  feature_columns: List[Column], 
-                  **kwargs: Dict):
-        return cls(
-            target_column, 
-            feature_columns, 
-            n_estimators = kwargs.get('n_estimators', 64),
-            max_depth = kwargs.get('max_depth', 8),
-            min_sample_split = kwargs.get('min_sample_split', 512),
-            min_samples_leaf = kwargs.get('min_samples_leaf', 128),
-            min_weight_fraction_leaf = kwargs.get('min_weight_fraction_leaf', 0.35),
-            max_features = kwargs.get('max_features', 'sqrt'),
-            max_leaf_nodes = kwargs.get('max_leaf_nodes', 32)
-        )
-
-    def fit(self) -> None:
-        """Fits RandomForest to make ready for imputation.
-        
-        Looks at DataType to determine if it needs a Regressor or Classifier. 
-        The scikit APIs are the same for both models, which is why we use the 
-        `estimator_cls` variable.
-        """
-        if self.data_type == DataType.CONTINUOUS:
-            estimator_cls = RandomForestRegressor
-
-        if self.data_type == DataType.CATEGORICAL:
-            estimator_cls = RandomForestClassifier
-
-        self.impute_strategy = estimator_cls(n_estimators=self.n_estimators,
-                                          max_depth=self.max_depth,
-                                          min_samples_leaf=self.min_samples_leaf,
-                                          min_samples_split=self.min_sample_split,
-                                          min_weight_fraction_leaf=self.min_weight_fraction_leaf,
-                                          max_features=self.max_features,
-                                          max_leaf_nodes=self.max_leaf_nodes
-                                          )
-        
-        # Get full feature DF, train on rows where target column is not null.
-        self._feature_df = self._create_df_from_num_encoded_feature_columns(self.feature_columns)
-        
-        feature_df_where_not_null = self._feature_df.iloc[self.target_column.non_null_indices]
-        target_where_not_null = self.target_column.data.iloc[self.target_column.non_null_indices]
-        self.impute_strategy.fit(feature_df_where_not_null, target_where_not_null)
-    
-    def impute_column(self) -> pd.Series:
-        """Imputes all null values with the Random Forest and unions with non-null values.
-    
-        TODO: Refactor this in general method for better reuse.
-        
-        Returns
-        -------
-            pd.Series: fully imputed data column.
-        """
-        
-        feature_df_where_null = self._feature_df.iloc[self.target_column.null_indices]
-        if len(feature_df_where_null) == 0:
-            predictions_ndarray = np.empty(0)
-        else:
-            predictions_ndarray = self.impute_strategy.predict(feature_df_where_null)
-                    
-        # Create data frame from predictions (single column dataframe)
-        predictions_frame = pd.DataFrame(predictions_ndarray, columns=[self.target_column.name])
-        predictions_frame['index'] = self.target_column.null_indices[0]
-        predictions_frame.set_index('index', inplace=True)
-        
-        # Create data frame from existing non-null values (single column dataframe)
-        target_where_not_null = self.target_column.data.iloc[self.target_column.non_null_indices]
-        target_column_where_not_null_frame = pd.DataFrame(target_where_not_null.to_numpy(), 
-                                                          columns=[self.target_column.name])
-        target_column_where_not_null_frame['index'] = self.target_column.non_null_indices[0]
-        target_column_where_not_null_frame.set_index('index', inplace=True)
-        
-        # Union data together and return pd.Series containing fully imputed data.
-        concatenated_frame = pd.concat([target_column_where_not_null_frame, predictions_frame]) \
-            .sort_index(axis=0)
-        return concatenated_frame[self.target_column.name]
\ No newline at end of file
diff --git a/imputr/strategy/randomforest.py b/imputr/strategy/randomforest.py
index 55e3457..f826ef8 100644
--- a/imputr/strategy/randomforest.py
+++ b/imputr/strategy/randomforest.py
@@ -150,9 +150,6 @@ def impute_column(self) -> pd.Series:
         target_column_where_not_null_frame['index'] = self.target_column.non_null_indices[0]
         target_column_where_not_null_frame.set_index('index', inplace=True)
         
-        # Cast to float if prediction is not float and target is float
-        # if predictions_frame[self]
-        
         # Union data together and return pd.Series containing fully imputed data.
         concatenated_frame = pd.concat([target_column_where_not_null_frame, predictions_frame]) \
             .sort_index(axis=0)
diff --git a/imputr/strategy/univariate.py b/imputr/strategy/univariate.py
deleted file mode 100644
index c883232..0000000
--- a/imputr/strategy/univariate.py
+++ /dev/null
@@ -1,63 +0,0 @@
-from abc import abstractmethod
-from ..domain import Column
-from ._base import _BaseStrategy
-import pandas as pd
-from ..domain import DataType
-from typing import Dict, List
-
-
-class _UnivariateStrategy(_BaseStrategy):
-    """
-    The abstract class that contains the interface for univariate imputation
-    strategies.
-    """
-
-    def __init__(self, 
-                 target_column: Column
-                 ):
-        super().__init__(target_column)
-        
-    @classmethod   
-    @abstractmethod
-    def from_dict(cls, 
-                  target_column: Column,
-                  **kwargs: Dict):
-        return
-    
-class MeanStrategy(_UnivariateStrategy):
-    """
-    Mean imputation strategy. Imputes calculated mean for numeric columns
-    and median for categoric columns.
-    """
-
-    supported_data_types: List = [
-        DataType.CATEGORICAL,
-        DataType.CONTINUOUS
-        ]
-
-    def __init__(self,
-                 target_column: Column
-                 ):
-        super().__init__(target_column)
-
-    @classmethod
-    def from_dict(cls, 
-                  target_column: Column,
-                  **kwargs: Dict):
-        return cls(target_column)
-    
-    def fit(self) -> None:
-        """
-        Gets mean or median value from Column to be imputed.
-        """
-        
-        self.mean = self.target_column.average
-    
-    def impute_column(self) -> pd.Series:
-        """Imputes column with mean value.
-
-        Returns
-        -------
-            pd.Series: fully imputed data column.
-        """
-        return self.target_column.data.fillna(self.mean)
\ No newline at end of file


Test patch:
diff --git a/test.ipynb b/test.ipynb
deleted file mode 100644
index 9777d2d..0000000
--- a/test.ipynb
+++ /dev/null
@@ -1,346 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "import pandas as pd\n",
-    "import numpy as np\n",
-    "from imputr import AutoImputer\n",
-    "\n",
-    "df = pd.read_csv('datasets/DigiDB_digimonlist.csv')\n",
-    "\n",
-    "# Create random missing values\n",
-    "np.random.seed(100)\n",
-    "mask = np.random.choice([True, False], size=df.shape)\n",
-    "df.mask(mask, inplace=True)\n",
-    "\n",
-    "imputer = AutoImputer(df)\n",
-    "imputed_df = imputer.impute()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/html": [
-       "<div>\n",
-       "<style scoped>\n",
-       "    .dataframe tbody tr th:only-of-type {\n",
-       "        vertical-align: middle;\n",
-       "    }\n",
-       "\n",
-       "    .dataframe tbody tr th {\n",
-       "        vertical-align: top;\n",
-       "    }\n",
-       "\n",
-       "    .dataframe thead th {\n",
-       "        text-align: right;\n",
-       "    }\n",
-       "</style>\n",
-       "<table border=\"1\" class=\"dataframe\">\n",
-       "  <thead>\n",
-       "    <tr style=\"text-align: right;\">\n",
-       "      <th></th>\n",
-       "      <th>Number</th>\n",
-       "      <th>Digimon</th>\n",
-       "      <th>Stage</th>\n",
-       "      <th>Type</th>\n",
-       "      <th>Attribute</th>\n",
-       "      <th>Memory</th>\n",
-       "      <th>Equip Slots</th>\n",
-       "      <th>Lv 50 HP</th>\n",
-       "      <th>Lv50 SP</th>\n",
-       "      <th>Lv50 Atk</th>\n",
-       "      <th>Lv50 Def</th>\n",
-       "      <th>Lv50 Int</th>\n",
-       "      <th>Lv50 Spd</th>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>index</th>\n",
-       "      <th></th>\n",
-       "      <th></th>\n",
-       "      <th></th>\n",
-       "      <th></th>\n",
-       "      <th></th>\n",
-       "      <th></th>\n",
-       "      <th></th>\n",
-       "      <th></th>\n",
-       "      <th></th>\n",
-       "      <th></th>\n",
-       "      <th></th>\n",
-       "      <th></th>\n",
-       "      <th></th>\n",
-       "    </tr>\n",
-       "  </thead>\n",
-       "  <tbody>\n",
-       "    <tr>\n",
-       "      <th>0</th>\n",
-       "      <td>124.642175</td>\n",
-       "      <td>Silphymon</td>\n",
-       "      <td>Baby</td>\n",
-       "      <td>Free</td>\n",
-       "      <td>Neutral</td>\n",
-       "      <td>2.000000</td>\n",
-       "      <td>1.617187</td>\n",
-       "      <td>1171.997575</td>\n",
-       "      <td>109.500384</td>\n",
-       "      <td>121.911932</td>\n",
-       "      <td>115.772511</td>\n",
-       "      <td>68.000000</td>\n",
-       "      <td>120.035061</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>1</th>\n",
-       "      <td>124.642175</td>\n",
-       "      <td>Silphymon</td>\n",
-       "      <td>Mega</td>\n",
-       "      <td>Free</td>\n",
-       "      <td>Dark</td>\n",
-       "      <td>11.916496</td>\n",
-       "      <td>0.000000</td>\n",
-       "      <td>1171.997575</td>\n",
-       "      <td>62.000000</td>\n",
-       "      <td>121.911932</td>\n",
-       "      <td>115.772511</td>\n",
-       "      <td>111.538451</td>\n",
-       "      <td>68.000000</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>2</th>\n",
-       "      <td>3.000000</td>\n",
-       "      <td>Punimon</td>\n",
-       "      <td>Mega</td>\n",
-       "      <td>Virus</td>\n",
-       "      <td>Neutral</td>\n",
-       "      <td>11.916496</td>\n",
-       "      <td>1.617187</td>\n",
-       "      <td>870.000000</td>\n",
-       "      <td>50.000000</td>\n",
-       "      <td>97.000000</td>\n",
-       "      <td>87.000000</td>\n",
-       "      <td>50.000000</td>\n",
-       "      <td>120.035061</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>3</th>\n",
-       "      <td>124.642175</td>\n",
-       "      <td>Botamon</td>\n",
-       "      <td>Baby</td>\n",
-       "      <td>Free</td>\n",
-       "      <td>Neutral</td>\n",
-       "      <td>2.000000</td>\n",
-       "      <td>0.000000</td>\n",
-       "      <td>690.000000</td>\n",
-       "      <td>68.000000</td>\n",
-       "      <td>121.911932</td>\n",
-       "      <td>95.000000</td>\n",
-       "      <td>76.000000</td>\n",
-       "      <td>61.000000</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>4</th>\n",
-       "      <td>124.642175</td>\n",
-       "      <td>Silphymon</td>\n",
-       "      <td>Baby</td>\n",
-       "      <td>Free</td>\n",
-       "      <td>Dark</td>\n",
-       "      <td>2.000000</td>\n",
-       "      <td>1.617187</td>\n",
-       "      <td>540.000000</td>\n",
-       "      <td>98.000000</td>\n",
-       "      <td>54.000000</td>\n",
-       "      <td>115.772511</td>\n",
-       "      <td>111.538451</td>\n",
-       "      <td>86.000000</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>...</th>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>244</th>\n",
-       "      <td>124.642175</td>\n",
-       "      <td>Silphymon</td>\n",
-       "      <td>Mega</td>\n",
-       "      <td>Virus</td>\n",
-       "      <td>Wind</td>\n",
-       "      <td>11.916496</td>\n",
-       "      <td>3.000000</td>\n",
-       "      <td>1171.997575</td>\n",
-       "      <td>109.500384</td>\n",
-       "      <td>148.000000</td>\n",
-       "      <td>129.000000</td>\n",
-       "      <td>129.000000</td>\n",
-       "      <td>120.035061</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>245</th>\n",
-       "      <td>246.000000</td>\n",
-       "      <td>Silphymon</td>\n",
-       "      <td>Mega</td>\n",
-       "      <td>Vaccine</td>\n",
-       "      <td>Fire</td>\n",
-       "      <td>11.916496</td>\n",
-       "      <td>1.617187</td>\n",
-       "      <td>1980.000000</td>\n",
-       "      <td>114.000000</td>\n",
-       "      <td>228.000000</td>\n",
-       "      <td>104.000000</td>\n",
-       "      <td>84.000000</td>\n",
-       "      <td>120.035061</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>246</th>\n",
-       "      <td>247.000000</td>\n",
-       "      <td>MirageGaogamon BM</td>\n",
-       "      <td>Mega</td>\n",
-       "      <td>Virus</td>\n",
-       "      <td>Light</td>\n",
-       "      <td>11.916496</td>\n",
-       "      <td>1.617187</td>\n",
-       "      <td>1440.000000</td>\n",
-       "      <td>124.000000</td>\n",
-       "      <td>121.911932</td>\n",
-       "      <td>104.000000</td>\n",
-       "      <td>158.000000</td>\n",
-       "      <td>120.035061</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>247</th>\n",
-       "      <td>124.642175</td>\n",
-       "      <td>Silphymon</td>\n",
-       "      <td>Mega</td>\n",
-       "      <td>Virus</td>\n",
-       "      <td>Wind</td>\n",
-       "      <td>20.000000</td>\n",
-       "      <td>2.000000</td>\n",
-       "      <td>1171.997575</td>\n",
-       "      <td>109.500384</td>\n",
-       "      <td>149.000000</td>\n",
-       "      <td>115.772511</td>\n",
-       "      <td>144.000000</td>\n",
-       "      <td>213.000000</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>248</th>\n",
-       "      <td>249.000000</td>\n",
-       "      <td>Silphymon</td>\n",
-       "      <td>Mega</td>\n",
-       "      <td>Data</td>\n",
-       "      <td>Plant</td>\n",
-       "      <td>20.000000</td>\n",
-       "      <td>1.617187</td>\n",
-       "      <td>1171.997575</td>\n",
-       "      <td>109.500384</td>\n",
-       "      <td>149.000000</td>\n",
-       "      <td>115.772511</td>\n",
-       "      <td>111.538451</td>\n",
-       "      <td>143.000000</td>\n",
-       "    </tr>\n",
-       "  </tbody>\n",
-       "</table>\n",
-       "<p>249 rows × 13 columns</p>\n",
-       "</div>"
-      ],
-      "text/plain": [
-       "           Number            Digimon Stage     Type Attribute     Memory  \\\n",
-       "index                                                                      \n",
-       "0      124.642175          Silphymon  Baby     Free   Neutral   2.000000   \n",
-       "1      124.642175          Silphymon  Mega     Free      Dark  11.916496   \n",
-       "2        3.000000            Punimon  Mega    Virus   Neutral  11.916496   \n",
-       "3      124.642175            Botamon  Baby     Free   Neutral   2.000000   \n",
-       "4      124.642175          Silphymon  Baby     Free      Dark   2.000000   \n",
-       "...           ...                ...   ...      ...       ...        ...   \n",
-       "244    124.642175          Silphymon  Mega    Virus      Wind  11.916496   \n",
-       "245    246.000000          Silphymon  Mega  Vaccine      Fire  11.916496   \n",
-       "246    247.000000  MirageGaogamon BM  Mega    Virus     Light  11.916496   \n",
-       "247    124.642175          Silphymon  Mega    Virus      Wind  20.000000   \n",
-       "248    249.000000          Silphymon  Mega     Data     Plant  20.000000   \n",
-       "\n",
-       "       Equip Slots     Lv 50 HP     Lv50 SP    Lv50 Atk    Lv50 Def  \\\n",
-       "index                                                                 \n",
-       "0         1.617187  1171.997575  109.500384  121.911932  115.772511   \n",
-       "1         0.000000  1171.997575   62.000000  121.911932  115.772511   \n",
-       "2         1.617187   870.000000   50.000000   97.000000   87.000000   \n",
-       "3         0.000000   690.000000   68.000000  121.911932   95.000000   \n",
-       "4         1.617187   540.000000   98.000000   54.000000  115.772511   \n",
-       "...            ...          ...         ...         ...         ...   \n",
-       "244       3.000000  1171.997575  109.500384  148.000000  129.000000   \n",
-       "245       1.617187  1980.000000  114.000000  228.000000  104.000000   \n",
-       "246       1.617187  1440.000000  124.000000  121.911932  104.000000   \n",
-       "247       2.000000  1171.997575  109.500384  149.000000  115.772511   \n",
-       "248       1.617187  1171.997575  109.500384  149.000000  115.772511   \n",
-       "\n",
-       "         Lv50 Int    Lv50 Spd  \n",
-       "index                          \n",
-       "0       68.000000  120.035061  \n",
-       "1      111.538451   68.000000  \n",
-       "2       50.000000  120.035061  \n",
-       "3       76.000000   61.000000  \n",
-       "4      111.538451   86.000000  \n",
-       "...           ...         ...  \n",
-       "244    129.000000  120.035061  \n",
-       "245     84.000000  120.035061  \n",
-       "246    158.000000  120.035061  \n",
-       "247    144.000000  213.000000  \n",
-       "248    111.538451  143.000000  \n",
-       "\n",
-       "[249 rows x 13 columns]"
-      ]
-     },
-     "execution_count": 2,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "imputed_df"
-   ]
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3.9.12 ('.venv': venv)",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.9.12"
-  },
-  "orig_nbformat": 4,
-  "vscode": {
-   "interpreter": {
-    "hash": "b749e987cabc368a9a100edd9de6cab5c866b24e6a4e434db56032cbeee10200"
-   }
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/tests/test_auto_imputer.py b/tests/test_auto_imputer.py
index 4f94318..e07dfa0 100644
--- a/tests/test_auto_imputer.py
+++ b/tests/test_auto_imputer.py
@@ -1,8 +1,8 @@
 import pandas as pd
 from imputr.domain.types import DataType
 from imputr.imputers.autoimputer import AutoImputer
-from imputr.strategy.univariate import MeanStrategy
-from imputr.strategy.multivariate import RandomForestStrategy
+from imputr.strategy.mean import MeanStrategy
+from imputr.strategy.randomforest import RandomForestStrategy
 
 df = pd.read_csv('datasets/unittestsets/DigiDB_digimonlist_small.csv')