{ "info": { "author": "Max Halford", "author_email": "maxhalford25@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "\n
\n \"prince_logo\"/\n
\n\n
\n\n
\n \n \n \"PyPI\n \n \n \n \"pypi\"\n \n \n \n \"Build\n \n \n \n \"Coverage\n \n \n \n \"license\"/\n \n
\n\n
\n\nPrince is a library for doing [factor analysis](https://www.wikiwand.com/en/Factor_analysis). This includes a variety of methods including [principal component analysis (PCA)](https://www.wikiwand.com/en/Principal_component_analysis) and [correspondence analysis (CA)](https://www.wikiwand.com/en/Correspondence_analysis). The goal is to provide an efficient implementation for each algorithm along with a scikit-learn API.\n\n## Table of contents\n\n- [Installation](#installation)\n- [Usage](#usage)\n - [Guidelines](#guidelines)\n - [Principal component analysis (PCA)](#principal-component-analysis-pca)\n - [Correspondence analysis (CA)](#correspondence-analysis-ca)\n - [Multiple correspondence analysis (MCA)](#multiple-correspondence-analysis-mca)\n - [Multiple factor analysis (MFA)](#multiple-factor-analysis-mfa)\n - [Factor analysis of mixed data (FAMD)](#factor-analysis-of-mixed-data-famd)\n- [Going faster](#going-faster)\n- [License](#license)\n\n## Installation\n\n:warning: Prince is only compatible with **Python 3**.\n\n:snake: Although it isn't a requirement, using [Anaconda](https://www.continuum.io/downloads) is highly recommended.\n\n**Via PyPI**\n\n```sh\n>>> pip install prince # doctest: +SKIP\n```\n\n**Via GitHub for the latest development version**\n\n```sh\n>>> pip install git+https://github.com/MaxHalford/Prince # doctest: +SKIP\n```\n\nPrince doesn't have any extra dependencies apart from the usual suspects (`sklearn`, `pandas`, `matplotlib`) which are included with Anaconda.\n\n## Usage\n\n```python\nimport numpy as np; np.random.set_state(42) # This is for doctests reproducibility\n```\n\n### Guidelines\n\nEach estimator provided by `prince` extends scikit-learn's `TransformerMixin`. This means that each estimator implements a `fit` and a `transform` method which makes them usable in a transformation pipeline. The `fit` method is actually an alias for the `row_principal_components` method which returns the row principal components. However you can also access the column principal components with the `column_principal_components`.\n\nUnder the hood Prince uses a [randomised version of SVD](https://research.fb.com/fast-randomized-svd/). This is much faster than using the more commonly full approach. However the results may have a small inherent randomness. For most applications this doesn't matter and you shouldn't have to worry about it. However if you want reproducible results then you should set the `random_state` parameter.\n\nThe randomised version of SVD is an iterative method. Because each of Prince's algorithms use SVD, they all possess a `n_iter` parameter which controls the number of iterations used for computing the SVD. On the one hand the higher `n_iter` is the more precise the results will be. On the other hand increasing `n_iter` increases the computation time. In general the algorithm converges very quickly so using a low `n_iter` (which is the default behaviour) is recommended.\n\nYou are supposed to use each method depending on your situation:\n\n- All your variables are numeric: use principal component analysis (`prince.PCA`)\n- You have a contingency table: use correspondence analysis (`prince.CA`)\n- You have more than 2 variables and they are all categorical: use multiple correspondence analysis (`prince.MCA`)\n- You have groups of categorical **or** numerical variables: use multiple factor analysis (`prince.MFA`)\n- You have both categorical and numerical variables: use factor analysis of mixed data (`prince.FAMD`)\n\nThe next subsections give an overview of each method along with usage information. The following papers give a good overview of the field of factor analysis if you want to go deeper:\n\n- [A Tutorial on Principal Component Analysis](https://arxiv.org/pdf/1404.1100.pdf)\n- [Theory of Correspondence Analysis](http://statmath.wu.ac.at/courses/CAandRelMeth/caipA.pdf)\n- [Finding structure with randomness: Probabilistic algorithms for constructing approximate matrix decompositions](https://arxiv.org/pdf/0909.4061.pdf)\n- [Computation of Multiple Correspondence Analysis, with code in R](https://core.ac.uk/download/pdf/6591520.pdf)\n- [Singular Value Decomposition Tutorial](https://davetang.org/file/Singular_Value_Decomposition_Tutorial.pdf)\n- [Multiple Factor Analysis](https://www.utdallas.edu/~herve/Abdi-MFA2007-pretty.pdf)\n\n### Principal component analysis (PCA)\n\nIf you're using PCA it is assumed you have a dataframe consisting of numerical continuous variables. In this example we're going to be using the [Iris flower dataset](https://www.wikiwand.com/en/Iris_flower_data_set).\n\n```python\n>>> import pandas as pd\n>>> import prince\n>>> from sklearn import datasets\n\n>>> X, y = datasets.load_iris(return_X_y=True)\n>>> X = pd.DataFrame(data=X, columns=['Sepal length', 'Sepal width', 'Petal length', 'Petal width'])\n>>> y = pd.Series(y).map({0: 'Setosa', 1: 'Versicolor', 2: 'Virginica'})\n>>> X.head()\n Sepal length Sepal width Petal length Petal width\n0 5.1 3.5 1.4 0.2\n1 4.9 3.0 1.4 0.2\n2 4.7 3.2 1.3 0.2\n3 4.6 3.1 1.5 0.2\n4 5.0 3.6 1.4 0.2\n\n```\n\nThe `PCA` class implements scikit-learn's `fit`/`transform` API. It's parameters have to passed at initialisation before calling the `fit` method.\n\n```python\n>>> pca = prince.PCA(\n... n_components=2,\n... n_iter=3,\n... rescale_with_mean=True,\n... rescale_with_std=True,\n... copy=True,\n... check_input=True,\n... engine='auto',\n... random_state=42\n... )\n>>> pca = pca.fit(X)\n\n```\n\nThe available parameters are:\n\n- `n_components`: the number of components that are computed. You only need two if your intention is to make a chart.\n- `n_iter`: the number of iterations used for computing the SVD\n- `rescale_with_mean`: whether to substract each column's mean\n- `rescale_with_std`: whether to divide each column by it's standard deviation\n- `copy`: if `False` then the computations will be done inplace which can have possible side-effects on the input data\n- `engine`: what SVD engine to use (should be one of `['auto', 'fbpca', 'sklearn']`)\n- `random_state`: controls the randomness of the SVD results.\n\nOnce the `PCA` has been fitted, it can be used to extract the row principal coordinates as so:\n\n```python\n>>> pca.transform(X).head() # Same as pca.row_coordinates(X).head()\n 0 1\n0 -2.264703 0.480027\n1 -2.080961 -0.674134\n2 -2.364229 -0.341908\n3 -2.299384 -0.597395\n4 -2.389842 0.646835\n\n```\n\nEach column stands for a principal component whilst each row stands a row in the original dataset. You can display these projections with the `plot_row_coordinates` method:\n\n```python\n>>> ax = pca.plot_row_coordinates(\n... X,\n... ax=None,\n... figsize=(6, 6),\n... x_component=0,\n... y_component=1,\n... labels=None,\n... color_labels=y,\n... ellipse_outline=False,\n... ellipse_fill=True,\n... show_points=True\n... )\n>>> ax.get_figure().savefig('images/pca_row_coordinates.svg')\n\n```\n\n
\n \n
\n\nEach principal component explains part of the underlying of the distribution. You can see by how much by using the accessing the `explained_inertia_` property:\n\n```python\n>>> pca.explained_inertia_ # doctest: +ELLIPSIS\n[0.729624..., 0.228507...]\n\n```\n\nThe explained inertia represents the percentage of the inertia each principal component contributes. It sums up to 1 if the `n_components` property is equal to the number of columns in the original dataset. you The explained inertia is obtained by dividing the eigenvalues obtained with the SVD by the total inertia, both of which are also accessible.\n\n```python\n>>> pca.eigenvalues_ # doctest: +ELLIPSIS\n[437.774672..., 137.104570...]\n\n>>> pca.total_inertia_ # doctest: +ELLIPSIS\n600.0...\n\n>>> pca.explained_inertia_\n[0.729624..., 0.228507...]\n\n```\n\nYou can also obtain the correlations between the original variables and the principal components.\n\n```python\n>>> pca.column_correlations(X)\n 0 1\nPetal length 0.991555 0.023415\nPetal width 0.964979 0.064000\nSepal length 0.890169 0.360830\nSepal width -0.460143 0.882716\n\n```\n\nYou may also want to know how much each observation contributes to each principal component. This can be done with the `row_contributions` method.\n\n```python\n>>> pca.row_contributions(X).head()\n 0 1\n0 0.011716 0.001681\n1 0.009892 0.003315\n2 0.012768 0.000853\n3 0.012077 0.002603\n4 0.013046 0.003052\n\n```\n\nYou can also transform row projections back into their original space by using the `inverse_transform` method.\n\n```python\n>>> pca.inverse_transform(pca.transform(X)).head()\n 0 1 2 3\n0 5.018949 3.514854 1.466013 0.251922\n1 4.738463 3.030433 1.603913 0.272074\n2 4.720130 3.196830 1.328961 0.167414\n3 4.668436 3.086770 1.384170 0.182247\n4 5.017093 3.596402 1.345411 0.206706\n\n```\n\n### Correspondence analysis (CA)\n\nYou should be using correspondence analysis when you want to analyse a contingency table. In other words you want to analyse the dependencies between two categorical variables. The following example comes from section 17.2.3 of [this textbook](http://ce.aut.ac.ir/~shiry/lecture/Advanced%20Machine%20Learning/Manifold_Modern_Multivariate%20Statistical%20Techniques%20-%20Regres.pdf). It shows the number of occurrences between different hair and eye colors.\n\n```python\n>>> import pandas as pd\n\n>>> pd.set_option('display.float_format', lambda x: '{:.6f}'.format(x))\n>>> X = pd.DataFrame(\n... data=[\n... [326, 38, 241, 110, 3],\n... [688, 116, 584, 188, 4],\n... [343, 84, 909, 412, 26],\n... [98, 48, 403, 681, 85]\n... ],\n... columns=pd.Series(['Fair', 'Red', 'Medium', 'Dark', 'Black']),\n... index=pd.Series(['Blue', 'Light', 'Medium', 'Dark'])\n... )\n>>> X\n Fair Red Medium Dark Black\nBlue 326 38 241 110 3\nLight 688 116 584 188 4\nMedium 343 84 909 412 26\nDark 98 48 403 681 85\n\n```\n\nUnlike the `PCA` class, the `CA` only exposes scikit-learn's `fit` method.\n\n```python\n>>> import prince\n>>> ca = prince.CA(\n... n_components=2,\n... n_iter=3,\n... copy=True,\n... check_input=True,\n... engine='auto',\n... random_state=42\n... )\n>>> X.columns.rename('Hair color', inplace=True)\n>>> X.index.rename('Eye color', inplace=True)\n>>> ca = ca.fit(X)\n\n```\n\nThe parameters and methods overlap with those proposed by the `PCA` class.\n\n```python\n>>> ca.row_coordinates(X)\n 0 1\nBlue -0.400300 -0.165411\nLight -0.440708 -0.088463\nMedium 0.033614 0.245002\nDark 0.702739 -0.133914\n\n>>> ca.column_coordinates(X)\n 0 1\nFair -0.543995 -0.173844\nRed -0.233261 -0.048279\nMedium -0.042024 0.208304\nDark 0.588709 -0.103950\nBlack 1.094388 -0.286437\n\n```\n\nYou can plot both sets of principal coordinates with the `plot_coordinates` method.\n\n```python\n>>> ax = ca.plot_coordinates(\n... X=X,\n... ax=None,\n... figsize=(6, 6),\n... x_component=0,\n... y_component=1,\n... show_row_labels=True,\n... show_col_labels=True\n... )\n>>> ax.get_figure().savefig('images/ca_coordinates.svg')\n\n```\n\n
\n \n
\n\nLike for the `PCA` you can access the inertia contribution of each principal component as well as the eigenvalues and the total inertia.\n\n```python\n>>> ca.eigenvalues_ # doctest: +ELLIPSIS\n[0.199244..., 0.030086...]\n\n>>> ca.total_inertia_ # doctest: +ELLIPSIS\n0.230191...\n\n>>> ca.explained_inertia_ # doctest: +ELLIPSIS\n[0.865562..., 0.130703...]\n\n```\n\n### Multiple correspondence analysis (MCA)\n\nMultiple correspondence analysis (MCA) is an extension of correspondence analysis (CA). It should be used when you have more than two categorical variables. The idea is simply to compute the one-hot encoded version of a dataset and apply CA on it. As an example we're going to use the [balloons dataset](https://archive.ics.uci.edu/ml/machine-learning-databases/balloons/) taken from the [UCI datasets website](https://archive.ics.uci.edu/ml/datasets.html).\n\n```python\n>>> import pandas as pd\n\n>>> X = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/balloons/adult+stretch.data')\n>>> X.columns = ['Color', 'Size', 'Action', 'Age', 'Inflated']\n>>> X.head()\n Color Size Action Age Inflated\n0 YELLOW SMALL STRETCH ADULT T\n1 YELLOW SMALL STRETCH CHILD F\n2 YELLOW SMALL DIP ADULT F\n3 YELLOW SMALL DIP CHILD F\n4 YELLOW LARGE STRETCH ADULT T\n\n```\n\nThe `MCA` also implements the `fit` and `transform` methods.\n\n```python\n>>> import prince\n>>> mca = prince.MCA(\n... n_components=2,\n... n_iter=3,\n... copy=True,\n... check_input=True,\n... engine='auto',\n... random_state=42\n... )\n>>> mca = mca.fit(X)\n\n```\n\nLike the `CA` class, the `MCA` class also has `plot_coordinates` method.\n\n```python\n>>> ax = mca.plot_coordinates(\n... X=X,\n... ax=None,\n... figsize=(6, 6),\n... show_row_points=True,\n... row_points_size=10,\n... show_row_labels=False,\n... show_column_points=True,\n... column_points_size=30,\n... show_column_labels=False,\n... legend_n_cols=1\n... )\n>>> ax.get_figure().savefig('images/mca_coordinates.svg')\n\n```\n\n
\n \n
\n\nThe eigenvalues and inertia values are also accessible.\n\n```python\n>>> mca.eigenvalues_ # doctest: +ELLIPSIS\n[0.401656..., 0.211111...]\n\n>>> mca.total_inertia_\n1.0\n\n>>> mca.explained_inertia_ # doctest: +ELLIPSIS\n[0.401656..., 0.211111...]\n\n```\n\n\n### Multiple factor analysis (MFA)\n\nMultiple factor analysis (MFA) is meant to be used when you have groups of variables. In practice it builds a PCA on each group -- or an MCA, depending on the types of the group's variables. It then constructs a global PCA on the results of the so-called partial PCAs -- or MCAs. The dataset used in the following examples come from [this paper](https://www.utdallas.edu/~herve/Abdi-MFA2007-pretty.pdf). In the dataset, three experts give their opinion on six different wines. Each opinion for each wine is recorded as a variable. We thus want to consider the separate opinions of each expert whilst also having a global overview of each wine. MFA is the perfect fit for this kind of situation.\n\nFirst of all let's copy the data used in the paper.\n\n```python\n>>> import pandas as pd\n\n>>> X = pd.DataFrame(\n... data=[\n... [1, 6, 7, 2, 5, 7, 6, 3, 6, 7],\n... [5, 3, 2, 4, 4, 4, 2, 4, 4, 3],\n... [6, 1, 1, 5, 2, 1, 1, 7, 1, 1],\n... [7, 1, 2, 7, 2, 1, 2, 2, 2, 2],\n... [2, 5, 4, 3, 5, 6, 5, 2, 6, 6],\n... [3, 4, 4, 3, 5, 4, 5, 1, 7, 5]\n... ],\n... columns=['E1 fruity', 'E1 woody', 'E1 coffee',\n... 'E2 red fruit', 'E2 roasted', 'E2 vanillin', 'E2 woody',\n... 'E3 fruity', 'E3 butter', 'E3 woody'],\n... index=['Wine {}'.format(i+1) for i in range(6)]\n... )\n>>> X['Oak type'] = [1, 2, 2, 2, 1, 1]\n\n```\n\nThe groups are passed as a dictionary to the `MFA` class.\n\n```python\n>>> groups = {\n... 'Expert #{}'.format(no+1): [c for c in X.columns if c.startswith('E{}'.format(no+1))]\n... for no in range(3)\n... }\n>>> import pprint\n>>> pprint.PrettyPrinter().pprint(groups)\n{'Expert #1': ['E1 fruity', 'E1 woody', 'E1 coffee'],\n 'Expert #2': ['E2 red fruit', 'E2 roasted', 'E2 vanillin', 'E2 woody'],\n 'Expert #3': ['E3 fruity', 'E3 butter', 'E3 woody']}\n\n```\n\nNow we can fit an `MFA`.\n\n```python\n>>> import prince\n>>> mfa = prince.MFA(\n... groups=groups,\n... n_components=2,\n... n_iter=3,\n... copy=True,\n... check_input=True,\n... engine='auto',\n... random_state=42\n... )\n>>> mfa = mfa.fit(X)\n\n```\n\nThe `MFA` inherits from the `PCA` class, which entails that you have access to all it's methods and properties. The `row_coordinates` method will return the global coordinates of each wine.\n\n```python\n>>> mfa.row_coordinates(X)\n 0 1\nWine 1 -2.172155 -0.508596\nWine 2 0.557017 -0.197408\nWine 3 2.317663 -0.830259\nWine 4 1.832557 0.905046\nWine 5 -1.403787 0.054977\nWine 6 -1.131296 0.576241\n\n```\n\nJust like for the `PCA` you can plot the row coordinates with the `plot_row_coordinates` method.\n\n```python\n>>> ax = mfa.plot_row_coordinates(\n... X,\n... ax=None,\n... figsize=(6, 6),\n... x_component=0,\n... y_component=1,\n... labels=X.index,\n... color_labels=['Oak type {}'.format(t) for t in X['Oak type']],\n... ellipse_outline=False,\n... ellipse_fill=True,\n... show_points=True\n... )\n>>> ax.get_figure().savefig('images/mfa_row_coordinates.svg')\n\n```\n\n
\n \n
\n\nYou can also obtain the row coordinates inside each group. The `partial_row_coordinates` method returns a `pandas.DataFrame` where the set of columns is a `pandas.MultiIndex`. The first level of indexing corresponds to each specified group whilst the nested level indicates the coordinates inside each group.\n\n```python\n>>> mfa.partial_row_coordinates(X) # doctest: +NORMALIZE_WHITESPACE\n Expert #1 Expert #2 Expert #3\n 0 1 0 1 0 1\nWine 1 -2.764432 -1.104812 -2.213928 -0.863519 -1.538106 0.442545\nWine 2 0.773034 0.298919 0.284247 -0.132135 0.613771 -0.759009\nWine 3 1.991398 0.805893 2.111508 0.499718 2.850084 -3.796390\nWine 4 1.981456 0.927187 2.393009 1.227146 1.123206 0.560803\nWine 5 -1.292834 -0.620661 -1.492114 -0.488088 -1.426414 1.273679\nWine 6 -0.688623 -0.306527 -1.082723 -0.243122 -1.622541 2.278372\n\n```\n\nLikewhise you can visualize the partial row coordinates with the `plot_partial_row_coordinates` method.\n\n```python\n>>> ax = mfa.plot_partial_row_coordinates(\n... X,\n... ax=None,\n... figsize=(6, 6),\n... x_component=0,\n... y_component=1,\n... color_labels=['Oak type {}'.format(t) for t in X['Oak type']]\n... )\n>>> ax.get_figure().savefig('images/mfa_partial_row_coordinates.svg')\n\n```\n\n
\n \n
\n\nAs usual you have access to inertia information.\n\n```python\n>>> mfa.eigenvalues_ # doctest: +ELLIPSIS\n[2.834800..., 0.356859...]\n\n>>> mfa.total_inertia_\n3.353004...\n\n>>> mfa.explained_inertia_ # doctest: +ELLIPSIS\n[0.845450..., 0.106429...]\n\n```\n\nYou can also access information concerning each partial factor analysis via the `partial_factor_analysis_` attribute.\n\n```python\n>>> for name, fa in sorted(mfa.partial_factor_analysis_.items()): # doctest: +ELLIPSIS\n... print('{} eigenvalues: {}'.format(name, fa.eigenvalues_))\nExpert #1 eigenvalues: [2.862595..., 0.119836...]\nExpert #2 eigenvalues: [3.651083..., 0.194159...]\nExpert #3 eigenvalues: [2.480488..., 0.441195...]\n\n```\n\nThe `row_contributions` method will provide you with the inertia contribution of each row with respect to each component.\n\n```python\n>>> mfa.row_contributions(X)\n 0 1\nWine 1 1.664406 0.724851\nWine 2 0.109450 0.109203\nWine 3 1.894865 1.931661\nWine 4 1.184657 2.295325\nWine 5 0.695152 0.008470\nWine 6 0.451471 0.930490\n\n```\n\nThe `column_correlations` method will return the correlation between the original variables and the components.\n\n```python\n>>> mfa.column_correlations(X)\n 0 1\nE1 coffee -0.918449 -0.043444\nE1 fruity 0.968449 0.192294\nE1 woody -0.984442 -0.120198\nE2 red fruit 0.887263 0.357632\nE2 roasted -0.955795 0.026039\nE2 vanillin -0.950629 -0.177883\nE2 woody -0.974649 0.127239\nE3 butter -0.945767 0.221441\nE3 fruity 0.594649 -0.820777\nE3 woody -0.992337 0.029747\n\n```\n\n\n### Factor analysis of mixed data (FAMD)\n\nA description is on it's way. This section is empty because I have to refactor the documentation a bit.\n\n```python\n>>> import pandas as pd\n\n>>> X = pd.DataFrame(\n... data=[\n... ['A', 'A', 'A', 2, 5, 7, 6, 3, 6, 7],\n... ['A', 'A', 'A', 4, 4, 4, 2, 4, 4, 3],\n... ['B', 'A', 'B', 5, 2, 1, 1, 7, 1, 1],\n... ['B', 'A', 'B', 7, 2, 1, 2, 2, 2, 2],\n... ['B', 'B', 'B', 3, 5, 6, 5, 2, 6, 6],\n... ['B', 'B', 'A', 3, 5, 4, 5, 1, 7, 5]\n... ],\n... columns=['E1 fruity', 'E1 woody', 'E1 coffee',\n... 'E2 red fruit', 'E2 roasted', 'E2 vanillin', 'E2 woody',\n... 'E3 fruity', 'E3 butter', 'E3 woody'],\n... index=['Wine {}'.format(i+1) for i in range(6)]\n... )\n>>> X['Oak type'] = [1, 2, 2, 2, 1, 1]\n\n```\n\nNow we can fit an `FAMD`.\n\n```python\n>>> import prince\n>>> famd = prince.FAMD(\n... n_components=2,\n... n_iter=3,\n... copy=True,\n... check_input=True,\n... engine='auto',\n... random_state=42\n... )\n>>> famd = famd.fit(X.drop('Oak type', axis='columns')) # No need for 'Oak type'\n\n```\n\nThe `FAMD` inherits from the `MFA` class, which entails that you have access to all it's methods and properties. The `row_coordinates` method will return the global coordinates of each wine.\n\n```python\n>>> famd.row_coordinates(X)\n 0 1\nWine 1 3.351475 4.278852\nWine 2 3.396873 4.135743\nWine 3 4.777638 -1.643254\nWine 4 4.769714 -1.665251\nWine 5 3.779385 -3.053543\nWine 6 3.465413 -0.304409\n\n```\n\nJust like for the `MFA` you can plot the row coordinates with the `plot_row_coordinates` method.\n\n```python\n>>> ax = famd.plot_row_coordinates(\n... X,\n... ax=None,\n... figsize=(6, 6),\n... x_component=0,\n... y_component=1,\n... labels=X.index,\n... color_labels=['Oak type {}'.format(t) for t in X['Oak type']],\n... ellipse_outline=False,\n... ellipse_fill=True,\n... show_points=True\n... )\n>>> ax.get_figure().savefig('images/famd_row_coordinates.svg')\n\n```\n\n
\n \n
\n\n\n## Going faster\n\nBy default `prince` uses `sklearn`'s randomized SVD implementation (the one used under the hood for [`TruncatedSVD`](http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.TruncatedSVD.html)). One of the goals of Prince is to make it possible to use a different SVD backend. For the while the only other supported backend is [Facebook's randomized SVD implementation](https://research.facebook.com/blog/fast-randomized-svd/) called [fbpca](http://fbpca.readthedocs.org/en/latest/). You can use it by setting the `engine` parameter to `'fbpca'`:\n\n```python\n>>> import prince\n>>> pca = prince.PCA(engine='fbpca')\n\n```\n\nIf you are using Anaconda then you should be able to install `fbpca` without any pain by running `pip install fbpca`.\n\n\n## License\n\nThe MIT License (MIT). Please see the [license file](LICENSE) for more information.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/MaxHalford/prince", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "prince", "package_url": "https://pypi.org/project/prince/", "platform": "", "project_url": "https://pypi.org/project/prince/", "project_urls": { "Homepage": "https://github.com/MaxHalford/prince" }, "release_url": "https://pypi.org/project/prince/0.6.3/", "requires_dist": [ "matplotlib (>=3.0.2)", "numpy (>=1.16.1)", "pandas (>=0.24.0)", "scipy (>=1.1.0)", "scikit-learn (>=0.20.1)" ], "requires_python": ">=3.4.0", "summary": "Statistical factor analysis in Python", "version": "0.6.3" }, "last_serial": 5477034, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "61dff7911e785d9524322947b5a536e1", "sha256": "a85ba58f5968ba7f8455544d0e3de8b047429a2cd1fef6c38f8aed492840830a" }, "downloads": -1, "filename": "prince-0.1.0.tar.gz", "has_sig": false, "md5_digest": "61dff7911e785d9524322947b5a536e1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18974, "upload_time": "2016-11-11T17:12:24", "url": "https://files.pythonhosted.org/packages/cf/be/b9d98a74be06f526c6425628af2bb88be561c0d50d025095eb15224fdd71/prince-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "6195dd13a2cd049705c9862e130a10ea", "sha256": "817faf34f4a841a93d2dd184630b07b3bd338ae6cfddc5f52bd89190dfb66a35" }, "downloads": -1, "filename": "prince-0.1.1.tar.gz", "has_sig": false, "md5_digest": "6195dd13a2cd049705c9862e130a10ea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19015, "upload_time": "2016-11-11T17:23:34", "url": "https://files.pythonhosted.org/packages/df/25/e51b3784c70f3bbe4e7d2dfdde39309a6a76d6f32c5303f5420744a2dd52/prince-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "3037f89294f6875b9861322ce0dbe172", "sha256": "5615b27513fe65c113b320a86b3f0d730da395d1d2ae359c96f903d12cc01764" }, "downloads": -1, "filename": "prince-0.1.2.tar.gz", "has_sig": false, "md5_digest": "3037f89294f6875b9861322ce0dbe172", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13464, "upload_time": "2016-11-11T18:37:44", "url": "https://files.pythonhosted.org/packages/69/ca/3d53aec9d99ca1f927d28789c8f03e9aca65db296501a6d0c2fd06273138/prince-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "1f0af79595cfb499922d1326031c9206", "sha256": "9def3d9427b034cbc01544093fa323327c81e900cfcd45ae90af8fe64ef8f558" }, "downloads": -1, "filename": "prince-0.1.3.tar.gz", "has_sig": false, "md5_digest": "1f0af79595cfb499922d1326031c9206", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14158, "upload_time": "2016-11-14T13:15:48", "url": "https://files.pythonhosted.org/packages/b6/7f/c19b7e661d81d374dd1dd172290efb01bc28d94eaf7c7115d7c5778a9e1b/prince-0.1.3.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "e9381b6847b47fadfed64fc9d988194a", "sha256": "bb8d60140e80ec3f33fdd6cf1a1756b9d6223daaeca92d6fb0cb14d6b46d45b2" }, "downloads": -1, "filename": "prince-0.2.0.tar.gz", "has_sig": false, "md5_digest": "e9381b6847b47fadfed64fc9d988194a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15089, "upload_time": "2016-11-22T08:22:54", "url": "https://files.pythonhosted.org/packages/9d/08/a01d11893ef8631f4a9acfeffc2dff3f6e44b09092229c8165398319e233/prince-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "a2491ac4ad0ef35fa4b78ea8e757061a", "sha256": "312ad5fcd15ab2818c3b529f5acb1730ac26e02b616c670bbad6800479412aab" }, "downloads": -1, "filename": "prince-0.2.1.tar.gz", "has_sig": false, "md5_digest": "a2491ac4ad0ef35fa4b78ea8e757061a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15095, "upload_time": "2016-11-23T22:00:16", "url": "https://files.pythonhosted.org/packages/12/14/c82db15aeb26be9ed9568215e6367c4d280e742cde033936ed6023cf0cb5/prince-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "3e3f27ef55f3811035af7ae5d99bff9a", "sha256": "b7a2e2a3e7a0dc532e466330f8fb765ed7621c140b0a5ac53550716e43410076" }, "downloads": -1, "filename": "prince-0.2.2.tar.gz", "has_sig": false, "md5_digest": "3e3f27ef55f3811035af7ae5d99bff9a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12194, "upload_time": "2017-01-10T19:09:32", "url": "https://files.pythonhosted.org/packages/64/e8/1bcc648fb6b7af14d4c82ca3fbb4b49a77f235155a7c72fd330112792f9b/prince-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "f8e160ab1066600e0bd99fc9334a8e37", "sha256": "74e3f86f62923ded54454ed483acdea18ab79d498dc8907bed79668d83c00fb2" }, "downloads": -1, "filename": "prince-0.2.3.tar.gz", "has_sig": false, "md5_digest": "f8e160ab1066600e0bd99fc9334a8e37", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12194, "upload_time": "2017-01-10T19:11:47", "url": "https://files.pythonhosted.org/packages/0e/4e/0705d8b9546763f8e61c920538dd2943173d01b2df64d3a90977b6eaa6ec/prince-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "17fa9ec1b6868856605ad53ff7c743b6", "sha256": "91be21e64b737ce66a35c75030b5b39807d8098bcc694bcc39a6501070d4c941" }, "downloads": -1, "filename": "prince-0.2.4.tar.gz", "has_sig": false, "md5_digest": "17fa9ec1b6868856605ad53ff7c743b6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12196, "upload_time": "2017-01-17T18:00:42", "url": "https://files.pythonhosted.org/packages/24/2a/5cf3a0cba5cb1ef2a44ea0aa653ef2b5cbf1a7801260231bc346768b5834/prince-0.2.4.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "c456e7b1e4ba0a0f418471fc7eee4654", "sha256": "2c2cba4acfd5f4079bd6877fd31521863a6f3e6bed309965cd405c5f10314b50" }, "downloads": -1, "filename": "prince-0.2.5.tar.gz", "has_sig": false, "md5_digest": "c456e7b1e4ba0a0f418471fc7eee4654", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12246, "upload_time": "2017-03-05T11:51:37", "url": "https://files.pythonhosted.org/packages/ac/86/0f77733ace7ffb83778282c5f9edbddc2dd9f4b25f4d43d493738089ce5d/prince-0.2.5.tar.gz" } ], "0.2.6": [ { "comment_text": "", "digests": { "md5": "f98cb57df37d4b4d323814392f2f54dc", "sha256": "9f1f1a4d09a8b0b77a5305662c182469974e455db888e7283856f7ae18a1f7fe" }, "downloads": -1, "filename": "prince-0.2.6.tar.gz", "has_sig": false, "md5_digest": "f98cb57df37d4b4d323814392f2f54dc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12170, "upload_time": "2017-03-20T07:56:08", "url": "https://files.pythonhosted.org/packages/2f/a8/af9b9033e72c1fcc4e87e554b6cf46d79b2a1e11d80607294116da5f4d89/prince-0.2.6.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "715467daf8fc844ce17ba06346ee78a4", "sha256": "8f46b9d7dae01e9d879fdd3e3f6d6925045cbbfc0e6f08a91f4fd09383e7ccec" }, "downloads": -1, "filename": "prince-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "715467daf8fc844ce17ba06346ee78a4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 15554, "upload_time": "2018-04-25T15:04:45", "url": "https://files.pythonhosted.org/packages/15/65/57391a089ded6b326302d8dfbdac5eebd75a014f99a5511b2d2942491bac/prince-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6cdcba9df8f4434384e0dbb1f79162c1", "sha256": "9bc98eb8827723b221bb8f8114c7db6fd3035e26e190724bd09eedfcb4425562" }, "downloads": -1, "filename": "prince-0.3.0.tar.gz", "has_sig": false, "md5_digest": "6cdcba9df8f4434384e0dbb1f79162c1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 14120, "upload_time": "2018-04-25T15:04:46", "url": "https://files.pythonhosted.org/packages/4f/99/3c6b43ba2898bdbcefa2ddb1360308fda6021b9a09009d7d3507b9ece425/prince-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "0ce457f3d5e81e37b4f882604955e001", "sha256": "ec4116846070071042b9d4be1808193aa5b729704733e7ec6b4fd85af7ec608a" }, "downloads": -1, "filename": "prince-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0ce457f3d5e81e37b4f882604955e001", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 15885, "upload_time": "2018-04-27T15:04:31", "url": "https://files.pythonhosted.org/packages/3f/d8/68567760fa30677149bcf01389313426e8e28ec0e0efe7479d75da61ea72/prince-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dacde4a815e4d28779762080578f1178", "sha256": "6b2461807663398b8aad21830af6c80c4ebaeec545fd28e4a27fa95466b3cf73" }, "downloads": -1, "filename": "prince-0.3.1.tar.gz", "has_sig": false, "md5_digest": "dacde4a815e4d28779762080578f1178", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 14279, "upload_time": "2018-04-27T15:04:32", "url": "https://files.pythonhosted.org/packages/a3/fc/cde43d87c462f05414b24756f408c6ae0878818e21373bea4ca5347ed6f0/prince-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "7dac4f6c07edcb7445d6e252632891e4", "sha256": "9848ff8102485dd5f13a5237bbac424fbfd8e0dda25f60c6f2f3a1c1b53cd57b" }, "downloads": -1, "filename": "prince-0.3.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7dac4f6c07edcb7445d6e252632891e4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 18813, "upload_time": "2018-05-01T09:45:27", "url": "https://files.pythonhosted.org/packages/37/98/4c12905e0037e1d8302ed0e7ae544a846266c13aa38fed7741b27f22d43b/prince-0.3.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dd93295487f261a95d5b161ca245b999", "sha256": "2700c74f4d36e4fcf1e7fccea7f49a93016d9d1f66755ecb64881129edeb297a" }, "downloads": -1, "filename": "prince-0.3.2.tar.gz", "has_sig": false, "md5_digest": "dd93295487f261a95d5b161ca245b999", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 17497, "upload_time": "2018-05-01T09:45:29", "url": "https://files.pythonhosted.org/packages/6d/b2/7b856af83733b5968684b7e1db168b40689230663637b0aa4a343bd9b6cc/prince-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "11820d6b2f52f49c985a14be4e5822b5", "sha256": "4f30fe712bf0dc2e233366511a252e5c3e89d784c43020cb8ad5ff2351547acc" }, "downloads": -1, "filename": "prince-0.3.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "11820d6b2f52f49c985a14be4e5822b5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 18862, "upload_time": "2018-05-03T14:46:49", "url": "https://files.pythonhosted.org/packages/71/f5/af03617ec4e5e8079259eea92d0021fc9301b30316ceed3e9d95b01ae81d/prince-0.3.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fdeb43e023e45640a0e35a9df2221441", "sha256": "313c5986e8a93d3b10eaefbe92290e8e45f939e875a9e1accaabb8b2b24ebf40" }, "downloads": -1, "filename": "prince-0.3.3.tar.gz", "has_sig": false, "md5_digest": "fdeb43e023e45640a0e35a9df2221441", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 17539, "upload_time": "2018-05-03T14:46:49", "url": "https://files.pythonhosted.org/packages/07/07/bcbea5225451b904d9db4a010afdce0b31d244eb34247ac298580dd2d3b4/prince-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "2bb9691ef34abf2c4e88a38fc1057001", "sha256": "f3c8fa9d4e29709df427b3890be8c24e2ffa9d9ea72c6fd0d3396f5a1215b702" }, "downloads": -1, "filename": "prince-0.3.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2bb9691ef34abf2c4e88a38fc1057001", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 18874, "upload_time": "2018-05-03T14:58:27", "url": "https://files.pythonhosted.org/packages/02/c5/bd170275d0f462288312f64bc0ccbdf029e6a692183a332dfbc311568f56/prince-0.3.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "64ae60fe9f5b45dca1784208ca1a2d4a", "sha256": "51bff592b160fa1f4a88a133e9c556b0d3a13d009319f1100ed5f5966a3ee18a" }, "downloads": -1, "filename": "prince-0.3.4.tar.gz", "has_sig": false, "md5_digest": "64ae60fe9f5b45dca1784208ca1a2d4a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 17554, "upload_time": "2018-05-03T14:58:28", "url": "https://files.pythonhosted.org/packages/f2/c2/5ce8606622669519cc03edaf8a9c71f6d171cda6c120d1346f312352b02c/prince-0.3.4.tar.gz" } ], "0.3.5": [ { "comment_text": "", "digests": { "md5": "57bd746581946b798fa2cf509f535a33", "sha256": "8066678d9919083a8613af4d00f252a92b913e60800672ad959763dae9beb524" }, "downloads": -1, "filename": "prince-0.3.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "57bd746581946b798fa2cf509f535a33", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 18855, "upload_time": "2018-05-03T14:59:22", "url": "https://files.pythonhosted.org/packages/a8/55/abc9c92f9dae7551f920b18f87de12488918d5ca5a440dadf207db41136e/prince-0.3.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e2c943c730ca8564efb0f3b883e5e94e", "sha256": "9fe570eab9af268182de1e324de207f4151c21e9b639f7cf5e0f61c2e0378577" }, "downloads": -1, "filename": "prince-0.3.5.tar.gz", "has_sig": false, "md5_digest": "e2c943c730ca8564efb0f3b883e5e94e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 17537, "upload_time": "2018-05-03T14:59:24", "url": "https://files.pythonhosted.org/packages/7e/93/25b9511b456009fe72248abd1ed8bf56aad75fb949c20b33a8a2ea63cd29/prince-0.3.5.tar.gz" } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "a334a84d427a83146cd1b4789f1c563e", "sha256": "0d28d951d413d05c566192ad7ffdd5bf2e3b34888ca30d76b27ab797e8085797" }, "downloads": -1, "filename": "prince-0.3.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a334a84d427a83146cd1b4789f1c563e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 16423, "upload_time": "2018-05-08T16:22:10", "url": "https://files.pythonhosted.org/packages/40/00/accf84057036b59259911626577b5783421a39521fb6d4f6fe1694fb0596/prince-0.3.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6fc2b452238800291894f9d89c242deb", "sha256": "211a85c5acd5713c6d04719367dd34f1208d5944f0923e06aaf0dc2441de16ad" }, "downloads": -1, "filename": "prince-0.3.6.tar.gz", "has_sig": false, "md5_digest": "6fc2b452238800291894f9d89c242deb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 20953, "upload_time": "2018-05-08T16:22:11", "url": "https://files.pythonhosted.org/packages/41/7a/60f864a35d1b2cf2e31b6b70daf77128cce2c8e9170166b7c326d5279458/prince-0.3.6.tar.gz" } ], "0.3.7": [ { "comment_text": "", "digests": { "md5": "417481069e34b35cc939135f29692757", "sha256": "7db24d8c792dfcbad9e79fd6ff1d91bc5a15fc72834aff88dfe8edccff271764" }, "downloads": -1, "filename": "prince-0.3.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "417481069e34b35cc939135f29692757", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 16445, "upload_time": "2018-05-15T08:47:59", "url": "https://files.pythonhosted.org/packages/c3/99/2b7013a07ae8b3da632f31a30848e57fe1a9dfa5ecc4137a9d223755b575/prince-0.3.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e505bc7de77dead2cbb3cce9c9c7b3b8", "sha256": "9278812a3383af2508b91abe2435d406ef65a38d8fcf9c78f2141888a2fc5e14" }, "downloads": -1, "filename": "prince-0.3.7.tar.gz", "has_sig": false, "md5_digest": "e505bc7de77dead2cbb3cce9c9c7b3b8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 20946, "upload_time": "2018-05-15T08:48:00", "url": "https://files.pythonhosted.org/packages/b6/03/2f83b3cd591c4c9a310c69718e4c3246906f6a3766a6f7e64c6f9f4e8f10/prince-0.3.7.tar.gz" } ], "0.3.8": [ { "comment_text": "", "digests": { "md5": "5a10cade36560cf532acd13022099dc0", "sha256": "b274cb8a12af9e3a57ce6248bb10177f6791ff836aa3cfc8198b230f681008ab" }, "downloads": -1, "filename": "prince-0.3.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5a10cade36560cf532acd13022099dc0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 17082, "upload_time": "2018-05-17T14:59:51", "url": "https://files.pythonhosted.org/packages/c1/f9/ceb23eb34b748e30570a08359b3d38958789071d2160c41c0129096ee357/prince-0.3.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a678ceed87b0ffdc8c71fe58fa83bcc7", "sha256": "83ce905ec2f1f11f80a8583c3b8ce0ae0ffdc1fa3790bfe7702ce6b1257e03df" }, "downloads": -1, "filename": "prince-0.3.8.tar.gz", "has_sig": false, "md5_digest": "a678ceed87b0ffdc8c71fe58fa83bcc7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 21195, "upload_time": "2018-05-17T14:59:51", "url": "https://files.pythonhosted.org/packages/67/a4/5a36d31c81f5fb7634ef9b1c6c8797e21e7644add66bc6073897f0072bb6/prince-0.3.8.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "832cf02911d9077ed9dd24c88d82dbb2", "sha256": "fbb9399e86430665b22265c77b42fc23aa6d11cde73f5c3db3b589892a88087c" }, "downloads": -1, "filename": "prince-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "832cf02911d9077ed9dd24c88d82dbb2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 21010, "upload_time": "2018-05-19T22:11:38", "url": "https://files.pythonhosted.org/packages/3d/7d/74fe2b4ab0299314e7532849d6a7c750e2c11b1364da3a422fe0b66593fc/prince-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bb41a9eac09afbb39fbc3c770086f99f", "sha256": "f80f5e26edda5aa35838001247657a4aad6914b8daed41af1a43fa08e4cc5130" }, "downloads": -1, "filename": "prince-0.4.0.tar.gz", "has_sig": false, "md5_digest": "bb41a9eac09afbb39fbc3c770086f99f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 26489, "upload_time": "2018-05-19T22:11:40", "url": "https://files.pythonhosted.org/packages/ed/ae/32c06220c8b8ce06212df568b67dd5e40ad97dc2715e130f674e4a0b9285/prince-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "f7f8673ad3e177551e8cc89a0b9e3f32", "sha256": "fc4950dec64dafb7ef03c018325caeff915aa2030d7bf6550cee8675cf3ffa1b" }, "downloads": -1, "filename": "prince-0.4.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f7f8673ad3e177551e8cc89a0b9e3f32", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 20883, "upload_time": "2018-05-22T07:47:19", "url": "https://files.pythonhosted.org/packages/9f/c2/3f17e7e9df4cafbfb463c8393b3356ce4e9d1e404dc642dbf174c40c9e42/prince-0.4.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f9dcabc374df87ed75395f69bc5c4841", "sha256": "39ba0202f4f4540af226c110b13a45b5f59e949a595684d6a94fc6437456f6f9" }, "downloads": -1, "filename": "prince-0.4.1.tar.gz", "has_sig": false, "md5_digest": "f9dcabc374df87ed75395f69bc5c4841", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 26225, "upload_time": "2018-05-22T07:47:21", "url": "https://files.pythonhosted.org/packages/8b/3c/6f232799006ab5c1e5bcc8adf2f61c6f38b3f83f21acdf4eaf65e6279430/prince-0.4.1.tar.gz" } ], "0.4.10": [ { "comment_text": "", "digests": { "md5": "0bfd9f017e0df433e854be36f2395257", "sha256": "308e7262291953305c8e7580ea5cd03300af0977f8fe3076e9d186079ae11da5" }, "downloads": -1, "filename": "prince-0.4.10-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0bfd9f017e0df433e854be36f2395257", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 20094, "upload_time": "2018-11-06T17:46:22", "url": "https://files.pythonhosted.org/packages/65/90/12d7e58a0bd8afc336b1e12985d34602e8a057dd0fb2db67133c0c74e188/prince-0.4.10-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "afb0824fd890df438a303558d2c37f63", "sha256": "434ec44cfe44c2b23a13626fca5c29d875787d617f41372939cb96c163454420" }, "downloads": -1, "filename": "prince-0.4.10.tar.gz", "has_sig": false, "md5_digest": "afb0824fd890df438a303558d2c37f63", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 26464, "upload_time": "2018-11-06T17:46:24", "url": "https://files.pythonhosted.org/packages/a5/5c/b270554254521f9fbce9da3eeb396d183d182a36ba9718acb0ced9d427dd/prince-0.4.10.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "2b56f38c69c858350f14c736bf478f45", "sha256": "fb75fa7554afe9cd2352ebb904feef83cbcebc8f29ebeb38abfb5c691a64fdde" }, "downloads": -1, "filename": "prince-0.4.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2b56f38c69c858350f14c736bf478f45", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 20676, "upload_time": "2018-08-06T17:29:47", "url": "https://files.pythonhosted.org/packages/be/96/64c9899e4f9c68740733d083ba5810aeb6dea56cca45b300466c4c91a60f/prince-0.4.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1fc541c90768ab898e974147510d89ec", "sha256": "ae83af9b7dc8ca0f51c310ac31181af95055ff64355bf6db0a6add88758b8131" }, "downloads": -1, "filename": "prince-0.4.2.tar.gz", "has_sig": false, "md5_digest": "1fc541c90768ab898e974147510d89ec", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 26454, "upload_time": "2018-08-06T17:29:49", "url": "https://files.pythonhosted.org/packages/03/a4/2302c86cce7c193ad1598187d9fc79a42c7c6ebd1284cc1b7abc99988a7b/prince-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "7b81dbcb706f3797a3ca6ab35102a1a2", "sha256": "08dc7f8ce98aef9d3d409ab9e8750a60b631370c1ff9f2a3f3c4452139d9f3aa" }, "downloads": -1, "filename": "prince-0.4.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7b81dbcb706f3797a3ca6ab35102a1a2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 20675, "upload_time": "2018-08-06T17:34:19", "url": "https://files.pythonhosted.org/packages/7e/2c/7d1ea6cd34519d7126a805cf5d4c35aaa50efedb7a9c4ca17293319d32de/prince-0.4.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0d1b4bb66f6bf812a4d2767b5067ff55", "sha256": "a2e6339ea9b04198a7a01a7a6d905394c61ea624f207ddb383f8b5a7320c3725" }, "downloads": -1, "filename": "prince-0.4.3.tar.gz", "has_sig": false, "md5_digest": "0d1b4bb66f6bf812a4d2767b5067ff55", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 26451, "upload_time": "2018-08-06T17:34:21", "url": "https://files.pythonhosted.org/packages/16/f3/9e714d141fe981ab2fbbd77d00ef384169f891a60a7ff19f50afb352545f/prince-0.4.3.tar.gz" } ], "0.4.4": [ { "comment_text": "", "digests": { "md5": "57c712a5c10cb4132eb0adc33ae43434", "sha256": "daf9bdeed90bfd52321aca1f1c1f9740578695859eb8884303247feab1f72458" }, "downloads": -1, "filename": "prince-0.4.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "57c712a5c10cb4132eb0adc33ae43434", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 20826, "upload_time": "2018-08-07T22:10:41", "url": "https://files.pythonhosted.org/packages/e0/68/4df80d890cd03964f9124a5ebeba31960b58b71afcf73dbc4514180920e5/prince-0.4.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "29e01a6cfd7cf911f77831203d5d611f", "sha256": "870ddac2ea3e97f04342bd385950ed1665e091199e49cc165ca42ff3146dea4d" }, "downloads": -1, "filename": "prince-0.4.4.tar.gz", "has_sig": false, "md5_digest": "29e01a6cfd7cf911f77831203d5d611f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 27223, "upload_time": "2018-08-07T22:10:44", "url": "https://files.pythonhosted.org/packages/bd/e2/a1c18d7709e7110a52577204abb555ac5c5c02ef2813e529a92abbb25005/prince-0.4.4.tar.gz" } ], "0.4.5": [ { "comment_text": "", "digests": { "md5": "e847f8cbea71a07e92f540eb2bbfd978", "sha256": "4258eb2be67a081b54a9ba291c5565e5740c1dbd299b9013c34695d651f8318a" }, "downloads": -1, "filename": "prince-0.4.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e847f8cbea71a07e92f540eb2bbfd978", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 20875, "upload_time": "2018-08-09T09:31:22", "url": "https://files.pythonhosted.org/packages/ec/05/7819ef2fb12f615d2e4cf55fd7003bc98cf0e9cad39649f3366f03c0e523/prince-0.4.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e8452867d7a8d7ad46b4e90a5a2b9257", "sha256": "4d49e8193915984e73f049f4a06f6569f200dc685e99d1b640ae9f3447259abd" }, "downloads": -1, "filename": "prince-0.4.5.tar.gz", "has_sig": false, "md5_digest": "e8452867d7a8d7ad46b4e90a5a2b9257", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 27230, "upload_time": "2018-08-09T09:31:24", "url": "https://files.pythonhosted.org/packages/d9/8e/396d85245a050572e6573a3e04c28540ed4c7eaf6bbf7f853275f9e7e394/prince-0.4.5.tar.gz" } ], "0.4.6": [ { "comment_text": "", "digests": { "md5": "80d74db13af82ad7281e4b4d7f8541f5", "sha256": "006b0b5ac28af6b4decb561e2374448a07e038e6a04614e19f5a7765b87413a3" }, "downloads": -1, "filename": "prince-0.4.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "80d74db13af82ad7281e4b4d7f8541f5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 20815, "upload_time": "2018-08-09T13:55:22", "url": "https://files.pythonhosted.org/packages/5d/39/0d09a4c008f149d2a5994d13977020716a1254cfb5dd86234504ea99c64c/prince-0.4.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "78de465236b76cf7bd2c6d1572b20ca1", "sha256": "1bbc14b0069e4c2575bcefc5ce1c6ad8a8b3108019ad7971bdfdc86c66630dae" }, "downloads": -1, "filename": "prince-0.4.6.tar.gz", "has_sig": false, "md5_digest": "78de465236b76cf7bd2c6d1572b20ca1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 26640, "upload_time": "2018-08-09T13:55:25", "url": "https://files.pythonhosted.org/packages/c7/66/6812b36e3d171a6f618e9d4f7f58dcbc886ef685875e5ce03a2ef275e1e6/prince-0.4.6.tar.gz" } ], "0.4.7": [ { "comment_text": "", "digests": { "md5": "76477f2fc3a6af069df5170b8fc9b997", "sha256": "b6f3535c17fe1079da3938386726067effd2938f6d97803f6f4ae38a036589ff" }, "downloads": -1, "filename": "prince-0.4.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "76477f2fc3a6af069df5170b8fc9b997", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 20958, "upload_time": "2018-09-24T13:15:22", "url": "https://files.pythonhosted.org/packages/86/02/4007353278c110b2598077d40b248492955995dc9005ec997d29cf43f787/prince-0.4.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e0b15732e23a9564faf3fb85d36df339", "sha256": "93a90bf04c98c928d27d4206b019f33b90bd78471bc8198bafe0f837e8706748" }, "downloads": -1, "filename": "prince-0.4.7.tar.gz", "has_sig": false, "md5_digest": "e0b15732e23a9564faf3fb85d36df339", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 26730, "upload_time": "2018-09-24T13:15:24", "url": "https://files.pythonhosted.org/packages/7c/39/9dab3bb645b1838f7928e837d672149496fdf7cfbb17de4c1e1dc9bc0bb9/prince-0.4.7.tar.gz" } ], "0.4.8": [ { "comment_text": "", "digests": { "md5": "9e8f9604d9a41a4d13f9ae798647ab70", "sha256": "5ee5135b258733a9494e6040115a9ab1d074897bad0b0ce217e9cf8be49e8d4c" }, "downloads": -1, "filename": "prince-0.4.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9e8f9604d9a41a4d13f9ae798647ab70", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 19936, "upload_time": "2018-10-11T11:23:53", "url": "https://files.pythonhosted.org/packages/8f/f9/fe6530c264428ec9515bd1bbad1b8726aa0f31e6e98272eb422b8c414fff/prince-0.4.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ee618972b03643e7555045eca8f37823", "sha256": "8ea8f711ab588b95c9bac8a54314e345c5a56bcaec11eed41d695b11bc808719" }, "downloads": -1, "filename": "prince-0.4.8.tar.gz", "has_sig": false, "md5_digest": "ee618972b03643e7555045eca8f37823", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 26330, "upload_time": "2018-10-11T11:23:55", "url": "https://files.pythonhosted.org/packages/88/05/d06958c8720d89dac86a7d883ac8209b7b4763fc47fe4543194075a22264/prince-0.4.8.tar.gz" } ], "0.4.9": [ { "comment_text": "", "digests": { "md5": "f80b46dc85d45a5d54e72bc22cf905a4", "sha256": "aff1d501601f564d0698204531f457a83c4633bf59d524d737ad95571014d578" }, "downloads": -1, "filename": "prince-0.4.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f80b46dc85d45a5d54e72bc22cf905a4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 20072, "upload_time": "2018-10-23T16:51:14", "url": "https://files.pythonhosted.org/packages/7d/08/37285dab60e68440c51cc5c10bb04f88be7ab4f3529cf398fc333df05ea3/prince-0.4.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "264153019ab7b6ba996a0e40f87c3d20", "sha256": "0bf0ace6fc7becdfa74ff798d64c730f81dd66794de855d8596884d700248494" }, "downloads": -1, "filename": "prince-0.4.9.tar.gz", "has_sig": false, "md5_digest": "264153019ab7b6ba996a0e40f87c3d20", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 26452, "upload_time": "2018-10-23T16:51:16", "url": "https://files.pythonhosted.org/packages/09/c0/d8e937318631c362dc0738b8da5d2f8843c0e203c880fb84589b621c4e9e/prince-0.4.9.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "691b0222c860379d999392e92dbab8f9", "sha256": "78642d136570e7a7866f1855e9d04c20ae09a0f58cb549a33bc0423a57229218" }, "downloads": -1, "filename": "prince-0.5.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "691b0222c860379d999392e92dbab8f9", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 20189, "upload_time": "2018-12-09T17:51:33", "url": "https://files.pythonhosted.org/packages/08/64/4f00256ad808aa429f81c08493588628d8ad6a7046d588d4df158fb5ab80/prince-0.5.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aa26ac1a07d1365c0907773f53852624", "sha256": "2e617ee701cb4bdb14ea5f01f810d89b71cb6d6928035b050f5115a1411307d5" }, "downloads": -1, "filename": "prince-0.5.2.tar.gz", "has_sig": false, "md5_digest": "aa26ac1a07d1365c0907773f53852624", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 26707, "upload_time": "2018-12-09T17:51:34", "url": "https://files.pythonhosted.org/packages/d7/91/14e631a62df3341d1880bd2f6c3773e404e0373e9034c5b8e7e340964924/prince-0.5.2.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "d2ec4db196d506962ad0f85b70be0e87", "sha256": "116efce46e598d885e312fea4e11406c069375542c67a2b463fe5d874fc34029" }, "downloads": -1, "filename": "prince-0.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d2ec4db196d506962ad0f85b70be0e87", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 20217, "upload_time": "2019-02-02T17:49:22", "url": "https://files.pythonhosted.org/packages/01/93/44429403972164f7a54432c272e558bc8b8c31b9c5b3bff9fa194dcd9d26/prince-0.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9a88af15dab12a52ce436c750cc12660", "sha256": "3b702ab6bb2be072a38dc8c188e1953e7d64ea07b52b468101b102447b693194" }, "downloads": -1, "filename": "prince-0.6.0.tar.gz", "has_sig": false, "md5_digest": "9a88af15dab12a52ce436c750cc12660", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 26763, "upload_time": "2019-02-02T17:49:24", "url": "https://files.pythonhosted.org/packages/a6/10/f429e051850d17a587c6cdddd5cd69f239f0b48ff54616852d07cbfdfb1a/prince-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "bb1051fee61ba06816a532ef345a1038", "sha256": "dfd539dcd55c0def583d346255f9c79f9ca5dea738778eb030f86bc156555128" }, "downloads": -1, "filename": "prince-0.6.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bb1051fee61ba06816a532ef345a1038", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 20223, "upload_time": "2019-02-14T17:07:34", "url": "https://files.pythonhosted.org/packages/38/7f/0a39e784ef888b1782b56467be6f59dd7d76b141de78a3159f1696a5968c/prince-0.6.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1a921d877b77a4edab5ecb74d2a09325", "sha256": "040839d47de865308374fd472142614ab3a3278d022dfdccb6ce3a1bda47fd1b" }, "downloads": -1, "filename": "prince-0.6.1.tar.gz", "has_sig": false, "md5_digest": "1a921d877b77a4edab5ecb74d2a09325", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 26784, "upload_time": "2019-02-14T17:07:36", "url": "https://files.pythonhosted.org/packages/4c/53/889cec061b1a96a240963dc687c334af9e2989f6e8785e471fea30c55a8f/prince-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "bf9a3840d0d082f6bf3150f3980c5f07", "sha256": "894e14273514d03ca6c3ba2755cdd3882306b9569f960172975153c2340e5b62" }, "downloads": -1, "filename": "prince-0.6.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bf9a3840d0d082f6bf3150f3980c5f07", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 20237, "upload_time": "2019-03-14T17:09:25", "url": "https://files.pythonhosted.org/packages/04/f8/81256326b8c8ef77b824a64a9ef7ff463be8e936c00cd8eee1a6c9b85abc/prince-0.6.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "00a86f671effd699845993e029c6539f", "sha256": "06cd19b5bcc392660c01eeb7fd28f0bdae083659f42591abee4295a09340c115" }, "downloads": -1, "filename": "prince-0.6.2.tar.gz", "has_sig": false, "md5_digest": "00a86f671effd699845993e029c6539f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 26786, "upload_time": "2019-03-14T17:09:27", "url": "https://files.pythonhosted.org/packages/4a/3d/76ba37f35b09dc21eb8d348b11366e5eca4bfd0a4ca4c131fdb461b55cc2/prince-0.6.2.tar.gz" } ], "0.6.3": [ { "comment_text": "", "digests": { "md5": "b96b35aee05cde72151943cc8cc568e6", "sha256": "b7ba1d959406f87dd345d52a8d689425efb896e92fe39987c2a3fac21369a443" }, "downloads": -1, "filename": "prince-0.6.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b96b35aee05cde72151943cc8cc568e6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 21582, "upload_time": "2019-07-02T14:13:19", "url": "https://files.pythonhosted.org/packages/0b/37/8b234580f76ba21a8b4a57d46ed024da19d88b6cfe0d231d27d07261e878/prince-0.6.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d85dfb1ebaf3a8f8c00b01541553e014", "sha256": "f6dc02fa63bf2b1b0a5edb7c1f30efc062e498bbf705a207b8bb5e1fa3fec4fa" }, "downloads": -1, "filename": "prince-0.6.3.tar.gz", "has_sig": false, "md5_digest": "d85dfb1ebaf3a8f8c00b01541553e014", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 26973, "upload_time": "2019-07-02T14:13:22", "url": "https://files.pythonhosted.org/packages/ff/a1/3226427a56d75ee34b615aac9c314fa214e5294d0c487821ae9577b778ea/prince-0.6.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b96b35aee05cde72151943cc8cc568e6", "sha256": "b7ba1d959406f87dd345d52a8d689425efb896e92fe39987c2a3fac21369a443" }, "downloads": -1, "filename": "prince-0.6.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b96b35aee05cde72151943cc8cc568e6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.4.0", "size": 21582, "upload_time": "2019-07-02T14:13:19", "url": "https://files.pythonhosted.org/packages/0b/37/8b234580f76ba21a8b4a57d46ed024da19d88b6cfe0d231d27d07261e878/prince-0.6.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d85dfb1ebaf3a8f8c00b01541553e014", "sha256": "f6dc02fa63bf2b1b0a5edb7c1f30efc062e498bbf705a207b8bb5e1fa3fec4fa" }, "downloads": -1, "filename": "prince-0.6.3.tar.gz", "has_sig": false, "md5_digest": "d85dfb1ebaf3a8f8c00b01541553e014", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 26973, "upload_time": "2019-07-02T14:13:22", "url": "https://files.pythonhosted.org/packages/ff/a1/3226427a56d75ee34b615aac9c314fa214e5294d0c487821ae9577b778ea/prince-0.6.3.tar.gz" } ] }