{ "info": { "author": "Justin Lin, Andreas Tj\u00e4rnberg, Torbj\u00f6rn Nordling", "author_email": "justin.lin@nordlinglab.org,at145@nyu.edu,t@nordlinglab.org", "bugtrack_url": null, "classifiers": [], "description": "# JATNIpy #\n\nJustin's, Andrea's, and Torbj\u00f6rn's network inference package for Python\n\n[Nordlinglab](https://www.nordlinglab.org/)\n[JATNIpy](https://bitbucket.org/temn/JATNIpy/src/)\n\n## What is JATNIpy? ##\nWe re-implemented the [GeneSPIDER](https://bitbucket.org/sonnhammergrni/genespider/src/) toolbox and chose Python as our programming language. Python is a popular high-level programming language. It is freely available and widely used by academic and commercial.\n\n\n\n### Method: ### \nWe incorporate several free available python packages into a new complete package. We finally name the new complete package as JATNIpy. \n\nAvailability and Implementation: The source code is freely available for download at https://bitbucket.org/temn/JATNIpy/. \nIt's a reimplementation of the GeneSPIDER toolbox in Python.\n\nContact: [Justin](mailto:justin.lin@nordlinglab.org)\n\n\n### How to set it up? ###\n\nBefore we uses JATNIpy, we should make sure pip3 has been installed in local computer. To install pip, use the following command:\n* For Debian/Ubuntu user:\n```\napt-get install python3-pip\n```\n\n* For CentOS 7 user:\n```\nyum install python34-setuptools\neasy_install pip\n```\n\nHaving pip3 in our local computer, we then install virtualenvwrapper to create a virtual environment for our local computer by these commands\n```\t\npip3 install virtualenvwrapper\nexport WORKON_HOME=~/Envs\nmkdir -p $WORKON_HOME\nsource /usr/local/bin/virtualenvwrapper.sh\nmkvirtualenv env1\nworkon env2\n```\nCreate the new virtual environment `env1` by \n```\nmkvirtualenv env1\n```\nChoose the virtual environment you want to work on by \n```\nworkon env1\n```\n\n#### For downloading and installing `JATNIpy`\n\n##### Alternative 1 : GIT\n1. Use [git](https://git-scm.com/) to fetch JATNIpy repository run this command\n```\ngit clone https://bitbucket.org/temn/JATNIpy/\n```\n2. Change to the directory where you downloaded from the repository by\n```\ncd ~/JATNIpy/jatnipy.\n```\n3. After working on the environment you want, then use pip3 to install\nthe open source python3 packages with the command\n```\npip3 install -e\n``` \n##### Alternative 2 : Direct download\n1. Download it from [JATNIpy](https://bitbucket.org/temn/JATNIpy/)\n2. Change to the directory where you downloaded from the repository by\n```\ncd ~/JATNIpy/jatnipy.\n```\n3. After working on the environment you want, then use pip3 to install\nthe open source python3 packages with the command\n```\npip3 install -e\n``` \n\n##### Alternative 3 : Direct installation\nUse the pip3 to install JATNIpy from [Pypi](https://pypi.org/)\n```\npip3 install jatnipy -t ~/JATNIpy\n```\n\nIn alternatives 1 and 2, when using `pip3 install -e`, it installs the following dependencies:\n\n* [git](https://git-scm.com/) Version control system for tracking the development of programming\n* [Scipy](https://www.scipy.org/) Python-based software for mathematics, science, and engineering\t\n* [Numpy](http://www.numpy.org/) Fundamental python package for doing numerical or mathematics computation\n* [pandas](https://pandas.pydata.org/) Using data structures and data analysis tools easily in Python\t\n* [matplotlib](https://matplotlib.org/) Useful Python 2D plotting tool which provides MATLAB-like interface\t\n* [scikit-learn](http://scikit-learn.org/stable/) Data mining and data analysis which built on Numpy, Scipy and matplotlib\t\n* [networkx](https://networkx.github.io/) Python package which is made for studying graphs and the complex networks\t\n* [glmnet_py](https://pypi.org/project/glmnet-py/) The popular glmnet library for Python version\n* [py-ubjson](https://pypi.org/project/py-ubjson/) Universal Binary JSON encoder/decoder for Python version\t\n* [CVXPY](http://www.cvxpy.org/) Handling convex optimization problems for Python version\t\n* [Requests: HTTP for Humans](http://docs.python-requests.org/en/master/) Python library for requesting HTTP\n\n#### Dataset and Network\n\n* Datasets are available [here](https://bitbucket.org/sonnhammergrni/gs-datasets).\n* Networks are available [here](https://bitbucket.org/sonnhammergrni/gs-networks).\n\n#### Basic functionality\n\nTo test that basic functionality after setup, open python3 and run the commands:\nNetwork fetching:\n```python=\n# for better appearance\nfrom pprint import pprint as p \nfrom datastruct.Network import Network as N\n# To show the local folder content \nN.Load('.')\n# To initialize the network\nN.Load('test') \n# To fetch the network from the website\nN.Load('random/N10/','https://bitbucket.org/api/2.0/repositories/sonnhammergrni/gs-networks/src/master') \n```\nDataset fetching:\n```python=10\nfrom datastruct.Dataset import Dataset as D\n# To show the local folder content\nD.Load('.') \n# To initialize the dataset \nD.Load('test') \n# To fetch the dataset from the website\nD.Load('N10','https://bitbucket.org/api/2.0/repositories/sonnhammergrni/gs-datasets/src/master/') \n```\nThe structures from above, network and dataset, needs to be converted to Python objects for :\n```python=17\nfrom datastruct.Dataset import Dataset\nDa = Dataset()\nData = Dataset(Dataset.Load('test'))\nfrom datastruct.Network import Network\nNe = Network()\nNet = Network(Network.Load('test'))\n```\nYou should now have the default network and a dataset loaded in python.\n\nGenerating example data as used in results section\n--------------------------------------------------\nSame as with the GeneSPIDER toolbox, the network and dataset which we used in the examples can be downloaded from the online repository at https://bitbucket.org/sonnhammergrni/gs-networks and https://bitbucket.org/sonnhammergrni/gs-datasets. \nIn addition, the example network and dataset we used are [Nordling-D20100302-random-N10-L25-ID1446937](https://bitbucket.org/sonnhammergrni/gs-networks/raw/ec384db2750b5ef229d1c613e3dd04a5e3b634e2/random/N10/Nordling-D20100302-random-N10-L25-ID1446937.json) and [Nordling-ID1446937-D20150825-E15-SNR3291-IDY15968](https://bitbucket.org/sonnhammergrni/gs-datasets/raw/a9d9b00aaa5fa6f4059ba03fd0cb5ec8eb80f3f0/N10/Nordling-ID1446937-D20150825-E15-SNR3291-IDY15968.json), respectively. The code below is to generate a new network and dataset which will differ from the examples. Because we use the random number generators to create the network and noise matrices.\n\n### Network generation in JATNIpy\n\nNext, we generate a stable random network with 10 nodes and [sparsity](https://en.wikipedia.org/wiki/Dense_graph#Sparse_and_tight_graphs) 0.25. With these specifications, the following code creates a `datastruct.Network` object.\n\n```python=\nfrom datastruct.randomNet import randomNet\nfrom datastruct.stabilize import stabilize\nfrom datastruct.Network import Network\t\nNe = Network()\nimport numpy as np\n# Defining number of nodes\nN = 10\n# Defining the sparsity\nS = 0.25\nA = randomNet(N,S)-np.eye(N)\nA = stabilize(A,'iaa','high')\nNet = Ne.Network(A,'random')\ncreator_setting = {'creator':'Nordlinglab_Justin'}\nNe.setname(Net,creator_setting)\nNet.description = 'This is a sparse network with 10 nodes, 10 negative self-loops and 15 randomly chosen links generated by Justin 2018-08-31. The coefficients are chosen such that they form one strong component and a stable dynamical system with time constants in the range 0.089 to 12 and an interampatteness level of 145 that is in-between the estimated level of an E. coli (Gardner et al. 2003 Science) and Yeast (Lorenz et al. 2009 PNAS) gene regulatory network. The coefficients of the network have not been tuned to explain any of the data sets in the mentioned articles.'\n```\n\nThe random network created using `datastruct.randomNet` and the desired interampatteness (IAA) degree are used as input parameters to put in the `datastruct.stabilize`. This one stabilizes the network by making the real part of all eigenvalues negative while adjusting the IAA degree level. The method `Ne.setname` is used to specify the fields of the Network object. The network's name is generated based on its properties automatically to make sure that each one is unique. Then, you can run the command to save your Network in the `.json` format using `savepath` (the directory where you want to save).\n```python=16\nNetwork.save(Network,Net,'savepath/','.json')\n``` \nAfter saving the Network object, you can use the next commands to display the content of the `Network` object that you have generated.\n\n```python=17\nNet = Network(Network.Load('./savepath/Nordlinglab_Justin-D20190414-random-N10-L12ID33097.json'))\nNet.__dict__\n```\n\nThe content displayed is shown below. It shows the properties of the `Network` object. Some of the content are:\n* `A`: is the network matrix\n* `G`: is the static gain matrix\n* `N`: is the number of nodes\n* `created`: is the dictionary record the detail information for this object\n* `description`: is a description of the network\n* `name`: is the name of the Network object which contains the name of the creator `Nordlinglab_Justin`, the date of creation `D` and the number of edges `L`\n* `names`,`nodes`: contain the name assigned to each node, which are generated automatically if they are not specified\n* `params` records nonzeros in the network matrix\n* `random`: is the type of network\n* `shape` is the shape of the network matrix\n* `structure` which is same as type is `random` \n```\n{'A': source G01 G02 G03 ... G08 G09 G10\ntarget ... \nG01 -9.999993 0.000000 0.000000 ... -34.951935 0.000000 0.000000\nG02 0.000000 -9.999993 0.000000 ... 0.000000 0.000000 0.000000\nG03 0.000000 0.000000 -9.999993 ... 0.000000 0.000000 0.000000\nG04 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000000\nG05 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000000\nG06 -46.352859 0.000000 0.000000 ... 0.000000 0.000000 0.000000\nG07 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000000\nG08 34.951935 0.000000 0.000000 ... -9.999993 0.000000 0.000000\nG09 0.000000 0.000000 0.000000 ... 0.000000 -9.999993 0.000000\nG10 0.000000 0.000000 0.000000 ... 0.000000 0.000000 -9.999993\n\n[10 rows x 10 columns],\n'G': source G01 G02 G03 ... G08 G09 G10\ntarget ... \nG01 2.881656e-03 7.357080e-20 -0.000000e+00 ... -1.007195e-02 -0.0 -0.0\nG02 -5.187064e-18 1.000001e-01 -1.230312e-17 ... 2.462769e-17 -0.0 -0.0\nG03 1.054544e-17 8.764060e-18 1.000001e-01 ... 1.465668e-17 -0.0 -0.0\nG04 -1.924527e-18 7.464553e-18 -2.235816e-18 ... -1.955644e-19 -0.0 -0.0\nG05 -1.574097e-33 9.320219e-18 -2.277998e-18 ... 1.414714e-33 -0.0 -0.0\nG06 -1.335731e-02 -1.022088e-17 1.552109e-17 ... 4.668640e-02 -0.0 -0.0\nG07 -0.000000e+00 -0.000000e+00 -0.000000e+00 ... -0.000000e+00 -0.0 -0.0\nG08 1.007195e-02 -1.120548e-17 -1.970795e-17 ... 6.479663e-02 -0.0 -0.0\nG09 -0.000000e+00 -0.000000e+00 -0.000000e+00 ... -0.000000e+00 0.1 -0.0\nG10 -0.000000e+00 -0.000000e+00 -0.000000e+00 ... -0.000000e+00 -0.0 0.1\n\n[10 rows x 10 columns],\n'N': 10,\n'created': {'creator': 'Nordlinglab _Justin',\n'id': '58909',\n'nodes': '10',\n'sparsity': 14,\n'time': '1555834954',\n'type': 'random'},\n'description': 'This is a sparse network with 10 nodes, 10 negative '\n'self-loops and 15 randomly chosen links generated by Justin '\n'2018-08-31. The coefficients are chosen such that they form '\n'one strong component and a stable dynamical system with time '\n'constants in the range 0.089 to 12 and an interampatteness '\n'level of 145 that is in-between the estimated level of an E. '\n'coli (Gardner et al. 2003 Science) and Yeast (Lorenz et al. '\n'2009 PNAS) gene regulatory network. The coefficients of the '\n'network have not been tuned to explain any of the data sets '\n'in the mentioned articles.',\n'name': 'Nordlinglab _Justin-D20190421-random-N10-L14ID58909',\n'names': ['G01',\n'G02',\n'G03',\n'G04',\n'G05',\n'G06',\n'G07',\n'G08',\n'G09',\n'G10'],\n'nodes': 0 G01\n1 G02\n2 G03\n3 G04\n4 G05\n5 G06\n6 G07\n7 G08\n8 G09\n9 G10\nName: node, dtype: object,\n'params': source target\nG01 G01 -9.999993\nG06 -46.352859\nG08 34.951935\nG02 G02 -9.999993\nG03 G03 -9.999993\nG04 G04 -9.999993\nG05 G05 -9.999993\nG06 G01 46.352859\nG06 -9.999993\nG07 G07 -9.999993\nG08 G01 -34.951935\nG08 -9.999993\nG09 G09 -9.999993\nG10 G10 -9.999993\nName: value, dtype: float64,\n'shape': (10, 10),\n'structure': 'random',\n'tol': 2.220446049250313e-16}\n```\n\n### Data generation in JATNIpy\n\nWe use the network generated by JATNIpy to simulate perturbation experiments. We simulate N single gene perturbation experiments. Each gene is perturbed one after another followed by `N/2` experiments randomly.\n```python=\nfrom datastruct.Dataset import Dataset\nDa = Dataset()\nimport numpy as np\nimport scipy\nfrom scipy import sparse as sparse\nfrom numpy import linalg as LA\nfrom numpy import random as rd\nSNR = 7\nalpha = 0.01\nc=sparse.rand(N,int(N/2),density=0.2,format='coo',dtype=None,random_state=None)\nd=np.logical_and(c.A,1)\ng = np.eye(N)\nP=np.concatenate((g,d),axis = 1)\nG = np.asarray(Net.G)\nY = np.dot(G,P)\ns=LA.svd(Y, full_matrices=True)[1]\ndata = Da.Dataset()\nstdE = s[N-1]/(((scipy.stats.chi2.ppf(1-alpha,P.shape[0]*P.shape[1]))**0.05)*SNR)\nE = rd.rand(P.shape[0],P.shape[1])*stdE\nF = np.zeros((P.shape[0],P.shape[1]))\n```\nWe create a perturbation matrix `P` and a corresponding response matrix `Y`. The standard deviation is used to generate the noise matrix `E` with Signal Noise Ratio (`SNR`) equal to 7. We don't use the input noise `F` here, but we still should define it, therefore, we set it to zero. Then we populate a `Dataset` object with these information.\n\n```python=21\nD = Da.Dataset()\nD.network = Net.name\nimport pandas as pd\nnames = pd.Series(Net.names, name=\"node\")\nnames.name = \"node\"\nD.M = P.shape[1]\nM = D.M\nD.N = P.shape[0]\nN = D.N\nsamples = pd.Series([\"S\" + str(i + 1) for i in range(M)], name=\"sample\")\nD.E = pd.DataFrame(E, index=names, columns=samples)\nD.F = pd.DataFrame(F, index=names, columns=samples)\nD.Y = pd.DataFrame(Y+D.E, index=names, columns=samples)\nD.P = pd.DataFrame(P, index=names, columns=samples)\nD.lamda = pd.Series(np.array([np.array(i) for i in [stdE**2,0]]), index=[\"E\", \"F\"])\nsdY1 = pd.DataFrame(np.eye(int(D.N)), index=D.Y.index, columns=D.Y.index)\nsdY2 = pd.DataFrame(pd.DataFrame(stdE*np.ones((D.P.shape[0],D.P.shape[1])), index=D.Y.index, columns=D.Y.columns), index=D.Y.index, columns=D.Y.columns)\nframes1_Y = [sdY1,sdY2]\nsdY_c_1 = pd.concat(frames1_Y,axis = 1)\nsdY3 = pd.DataFrame(np.asarray(pd.DataFrame(stdE*np.ones((D.P.shape[0],D.P.shape[1])), index=D.Y.index, columns=D.Y.columns)).transpose(), index=D.Y.columns, columns=D.Y.index)\nsdY4 = pd.DataFrame(np.eye(int(D.M)), index=D.Y.columns, columns=D.Y.columns)\nframes2_Y = [sdY3,sdY4]\nsdY_c_2 = pd.concat(frames2_Y,axis = 1)\nframes_Y = [sdY_c_1,sdY_c_2]\nD.E_covariance_element = pd.concat(frames_Y,axis = 0)\nD.E_covariance_variable = pd.DataFrame(D.lamda[0]*np.eye(N), index=names, columns=names)\nD.F_covariance_variable = pd.DataFrame(np.zeros((N,N)), index=names, columns=names)\nsdP1 = pd.DataFrame(np.eye(int(D.N)), index=D.Y.index, columns=D.Y.index)\nsdP2 = pd.DataFrame(pd.DataFrame(np.zeros((D.P.shape[0],D.P.shape[1])), index=D.P.index, columns=D.P.columns), index=D.Y.index, columns=D.Y.columns)\nframes1_P = [sdP1,sdP2]\nsdP_c_1 = pd.concat(frames1_P,axis = 1)\t\nsdP3 = pd.DataFrame(np.asarray(pd.DataFrame(np.zeros((D.P.shape[0],D.P.shape[1])), index=D.P.index, columns=D.P.columns)).transpose(), index=D.Y.columns, columns=D.Y.index)\nsdP4 = pd.DataFrame(np.eye(int(D.M)), index=D.Y.columns, columns=D.Y.columns)\nframes2_P = [sdP3,sdP4]\nsdP_c_2 = pd.concat(frames2_P,axis = 1)\nframes_P = [sdP_c_1,sdP_c_2]\nD.F_covariance_element = pd.concat(frames_P,axis = 0)\n```\nIn order to initialize the `datastruct.Dataset` object with data, we then do the following code snippet:\n```python=58\nData = Da.Dataset(D,Net)\ncreator_setting = {'creator':'Nordlinglab_Justin'}\nDa.setname(Data,creator_setting)\nData.description = 'This data set contains 15 simulated experiments with additive white Gaussian noise with variance 0.00028 added to the response in order to make the SNR 7 and the data partly informative for network inference. The singular values of the response matrix are in the range 0.77 to 1.2.'\nData.nodes = Net.names\n```\nAfter initializing the `datastruct.Dataset` object, we then save it with the following command\n```python=63\nDataset.save(Dataset,Data,'savepath/','.json')\n```\nThen, you can use these code to display the new `Dataset` object that you have generated in your personal folder. You should use your personal directory name instead of `Nordlinglab_Justin-ID17795-D20190415-N10-E15-SNR277998-IDY17795.json`\n```python=64\nData = Dataset(Dataset.Load('./savepath/Nordlinglab_Justin-ID17795-D20190415-N10-E15-SNR277998-IDY17795.json'))\nData.__dict__\n```\nThe displayed output is\n* `E`: is expression noise matrix\n* `E_covariance_element`: is measurement point variation of response\n* `E_covariance_variable`: is covariance of noisy response\n* `F`: is perturbation noise matrix\n* `F_covariance_element`: is measurement point variation of perturbation\n* `E_covariance_variable`: is covariance of pertubations\n* `M`: is perturbations matrix\n* `N`: is gene number\n* `P`: is perturbations number\n* `Y`: is response matrix\n* `__model_eq__`: shows the model equation\n* `created`: is the basic information of the network\n* `nodes`: are names for each gene nodes\n* `description`: is data set description\n* `lamda`: includes expression and perturbation noise variable `E_variance` and `F_variance`\n* `network`: is network name\n* `nodes`: are names for each gene nodes\n\n```\n{'E': sample S1 S2 S3 ... S13 S14 S15\nnode ... \nG01 0.001609 0.000334 0.000934 ... 0.000664 0.000593 0.000298\nG02 0.001145 0.000808 0.000116 ... 0.000497 0.001746 0.001446\nG03 0.001796 0.000210 0.000173 ... 0.000684 0.001074 0.001337\nG04 0.000962 0.000706 0.001298 ... 0.000916 0.000908 0.000054\nG05 0.001347 0.001081 0.000509 ... 0.001760 0.001839 0.000857\nG06 0.001201 0.000180 0.001394 ... 0.000518 0.000246 0.001442\nG07 0.001585 0.000752 0.000197 ... 0.000918 0.000703 0.000525\nG08 0.001627 0.001223 0.001366 ... 0.001103 0.000204 0.001348\nG09 0.001298 0.000705 0.000014 ... 0.000690 0.001257 0.000649\nG10 0.000353 0.000890 0.001845 ... 0.001720 0.000523 0.000738\n\n[10 rows x 15 columns],\n'E_covariance_element': G01 G02 G03 ... S13 S14 S15\nG01 1.000000 0.000000 0.000000 ... 0.001864 0.001864 0.001864\nG02 0.000000 1.000000 0.000000 ... 0.001864 0.001864 0.001864\nG03 0.000000 0.000000 1.000000 ... 0.001864 0.001864 0.001864\nG04 0.000000 0.000000 0.000000 ... 0.001864 0.001864 0.001864\nG05 0.000000 0.000000 0.000000 ... 0.001864 0.001864 0.001864\nG06 0.000000 0.000000 0.000000 ... 0.001864 0.001864 0.001864\nG07 0.000000 0.000000 0.000000 ... 0.001864 0.001864 0.001864\nG08 0.000000 0.000000 0.000000 ... 0.001864 0.001864 0.001864\nG09 0.000000 0.000000 0.000000 ... 0.001864 0.001864 0.001864\nG10 0.000000 0.000000 0.000000 ... 0.001864 0.001864 0.001864\nS1 0.001864 0.001864 0.001864 ... 0.000000 0.000000 0.000000\nS2 0.001864 0.001864 0.001864 ... 0.000000 0.000000 0.000000\nS3 0.001864 0.001864 0.001864 ... 0.000000 0.000000 0.000000\nS4 0.001864 0.001864 0.001864 ... 0.000000 0.000000 0.000000\nS5 0.001864 0.001864 0.001864 ... 0.000000 0.000000 0.000000\nS6 0.001864 0.001864 0.001864 ... 0.000000 0.000000 0.000000\nS7 0.001864 0.001864 0.001864 ... 0.000000 0.000000 0.000000\nS8 0.001864 0.001864 0.001864 ... 0.000000 0.000000 0.000000\nS9 0.001864 0.001864 0.001864 ... 0.000000 0.000000 0.000000\nS10 0.001864 0.001864 0.001864 ... 0.000000 0.000000 0.000000\nS11 0.001864 0.001864 0.001864 ... 0.000000 0.000000 0.000000\nS12 0.001864 0.001864 0.001864 ... 0.000000 0.000000 0.000000\nS13 0.001864 0.001864 0.001864 ... 1.000000 0.000000 0.000000\nS14 0.001864 0.001864 0.001864 ... 0.000000 1.000000 0.000000\nS15 0.001864 0.001864 0.001864 ... 0.000000 0.000000 1.000000\n\n[25 rows x 25 columns],\n'E_covariance_variable': node G01 G02 G03 ... G08 G09 G10\nnode ... \nG01 0.000003 0.000000 0.000000 ... 0.000000 0.000000 0.000000\nG02 0.000000 0.000003 0.000000 ... 0.000000 0.000000 0.000000\nG03 0.000000 0.000000 0.000003 ... 0.000000 0.000000 0.000000\nG04 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000000\nG05 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000000\nG06 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000000\nG07 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000000\nG08 0.000000 0.000000 0.000000 ... 0.000003 0.000000 0.000000\nG09 0.000000 0.000000 0.000000 ... 0.000000 0.000003 0.000000\nG10 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000003\n\n[10 rows x 10 columns],\n'F': sample S1 S2 S3 S4 S5 S6 ... S10 S11 S12 S13 S14 S15\nnode ... \nG01 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\nG02 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\nG03 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\nG04 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\nG05 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\nG06 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\nG07 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\nG08 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\nG09 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\nG10 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\n\n[10 rows x 15 columns],\n'F_covariance_element': G01 G02 G03 G04 G05 G06 G07 ... S9 S10 S11 S12 S13 S14 S15\nG01 1.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG02 0.0 1.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG03 0.0 0.0 1.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG04 0.0 0.0 0.0 1.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG05 0.0 0.0 0.0 0.0 1.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG06 0.0 0.0 0.0 0.0 0.0 1.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG07 0.0 0.0 0.0 0.0 0.0 0.0 1.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG08 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG09 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG10 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nS1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nS2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nS3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nS4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nS5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nS6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nS7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nS8 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nS9 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 1.0 0.0 0.0 0.0 0.0 0.0 0.0\nS10 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 0.0 0.0 0.0 0.0\nS11 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 1.0 0.0 0.0 0.0 0.0\nS12 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 1.0 0.0 0.0 0.0\nS13 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 1.0 0.0 0.0\nS14 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 1.0 0.0\nS15 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 1.0\n\n[25 rows x 25 columns],\n'F_covariance_variable': node G01 G02 G03 G04 G05 G06 G07 G08 G09 G10\nnode \nG01 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG02 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG03 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG04 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG05 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG06 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG07 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG08 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG09 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\nG10 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0,\n'M': 15,\n'N': 10,\n'P': sample S1 S2 S3 S4 S5 S6 ... S10 S11 S12 S13 S14 S15\nnode ... \nG01 1.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\nG02 0.0 1.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 1.0 0.0 0.0\nG03 0.0 0.0 1.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 1.0 1.0 0.0\nG04 0.0 0.0 0.0 1.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 1.0 0.0\nG05 0.0 0.0 0.0 0.0 1.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\nG06 0.0 0.0 0.0 0.0 0.0 1.0 ... 0.0 0.0 0.0 0.0 1.0 0.0\nG07 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 1.0 0.0 0.0\nG08 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 1.0 0.0 0.0 0.0\nG09 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 0.0 0.0 0.0\nG10 0.0 0.0 0.0 0.0 0.0 0.0 ... 1.0 0.0 0.0 0.0 1.0 0.0\n\n[10 rows x 15 columns],\n'Y': sample S1 S2 S3 ... S13 S14 S15\nnode ... \nG01 0.004491 0.000334 0.000934 ... 0.000664 0.013951 0.000298\nG02 0.001145 0.100809 0.000116 ... 0.100497 0.001746 0.001446\nG03 0.001796 0.000210 0.100173 ... 0.100685 0.101074 0.001337\nG04 0.000962 0.000706 0.001298 ... 0.000916 0.100908 0.000054\nG05 0.001347 0.001081 0.000509 ... 0.001760 0.001839 0.000857\nG06 -0.012157 0.000180 0.001394 ... 0.000518 0.038331 0.001442\nG07 0.001585 0.000752 0.000197 ... 0.100918 0.000703 0.000525\nG08 0.011699 0.001223 0.001366 ... 0.001103 0.046890 0.001348\nG09 0.001298 0.000705 0.000014 ... 0.000690 0.001257 0.000649\nG10 0.000353 0.000890 0.001845 ... 0.001720 0.100523 0.000738\n\n[10 rows x 15 columns],\n'__model_eq__': 'X ~ -dot(P, pinv(A).T)',\n'created': {'creator': 'Nordlinglab_Justin',\n'id': '58909',\n'nodes': '10',\n'sparsity': 14,\n'time': '1555834954',\n'type': 'random'},\n'description': 'This data set contains 15 simulated experiments with additive '\n'white Gaussian noise with variance 0.00028 added to the '\n'response in order to make the SNR 7 and the data partly '\n'informative for network inference. The singular values of the '\n'response matrix are in the range 0.77 to 1.2.',\n'lamda': E_variance 0.000003\nF_variance 0.000000\ndtype: float64,\n'name': 'Nordlinglab_Justin-ID58909-D20190422-N10-E15-SNR655-IDY58909',\n'network': 'Nordlinglab _Justin-D20190421-random-N10-L14ID58909',\n'nodes': 0 G01\n1 G02\n2 G03\n3 G04\n4 G05\n5 G06\n6 G07\n7 G08\n8 G09\n9 G10\nName: node, dtype: object,\n'tol': 2.220446049250313e-16}\n```\nIf the data is generated by yourself using the computer, then, it can connect a dataset to a network. So, the `network` is reported in the `Data` object.\nWe also provide normalisation procedures for the `Data` object that will normalize the expression matrix `Y`. Three different normalisation procedures are available:\n1. Standard normalisation\n1. Min/Max range scaling\n1. Unit scaling. \n\n\nAll methods works over rows or columns, depending on input. Some usage examples are:\n\n1. For standard normalisation\n```python=\nNewData = Da.std_normalize(Data,2)\nnp.sum(Da.response(NewData),axis = 1)\nnp.sum(Da.response(NewData)**2,axis = 1)\n```\nshould return zeros as sum over rows and the squared values should be 1 for each sample so the sum over rows should be = M.\n\n2. For range scaling\n```python=\nNewData = Da.range_scaling(Data,2)\nnp.max(Da.response(NewData),axis=1)\nnp.min(Da.response(NewData),axis=1)\n``` \nthe max and min of each row should be 1 and 0 respectively.\n\n3. For unit scaling\n```python=\nNewData = Da.unit_length_scaling(Data,2)\nnp.sum(Da.response(NewData)**2,axis = 1)\n```\nthe squared values should sum to 1.\n\n\n\nIt should be noted that the noise estimates are currently not scaled according to the new data and should therefore not be used *as is* in subsequent calculations.\n\n### Save Dataset\n```python=\nDataset.save(Dataset,Data,'savepath/','.json')\n```\n\n### Analyse\n\nThe `analyse` folder provides the programming to analyse networks, datasets and benchmark results.\n\nWe first demonstrate how to load the example network `Nordling-D20100302-random-N10-L25-ID1446937.json` and dataset `Nordling-ID1446937-D20150825-E15-SNR3291-IDY15968.json` from the online repository with the following command:\n```python=\nfrom datastruct.Dataset import Dataset\nData = Dataset(Dataset.Load('test'))\nfrom datastruct.Network import Network\nNet = Network(Network.Load('test'))\n```\n\n#### Network analysis in JATNIpy:\n\nWe input the `Net` to the `analyse.Model` to analyse the network:\n\n```python=5\nfrom analyse.Model import Model\nM = Model()\nnet_prop = M.Model(Net)\nnet_prop.__dict__\n```\n\nIt then produces the output like the following:\n```\n{\n\t\t'network': 'Nordling-D20100302-random-N10-L25-ID1446937',\n\t\t'interampatteness': 144.6936524435306,\n\t\t'NetworkComponents': 1,\n\t\t'AvgPathLength': 2.8777777777777778,\n\t\t'tauG': 0.08503206402335546\n\t\t'CC': 0.05,\n\t\t'DD': 1.5,\n}\n```\nThere are six measures be calculated in JATNIpy: \n* `interampatteness`: which is the condition number of `A` calculated by using `numpy.linalg.cond(A)`. \n* `NetworkComponents`: The number of strongly connected components, is calculated by `graphconncomp` function.\n* `AvgPathLength`: is the path length of the graph of the network uses `median_path_length` function. No matter the `graphconncomp` or `median_path_length` are used the python based `networkx` package to calculate.\n* `tauG`: is the time constant of the network\n* `CC`: is the average clustering coefficient that can be explained as as the neighborhood sparsity of each node in the network but not considering itself. \n* `DD`: is the average degree distribution of model. \n\nThe property `analyse.Model.type` can be selected as `directed` or `undirected` by using `analyse.DataModel.type`.\n\nNot only the average clustering coefficients but also all clustering coefficients can be calculated. All clustering coefficients can be calculated by\n```python=9\nCCs = M.clustering_coefficient(Net)\n```\n#### Data analysis in JATNIpy:\n\nWe input the `Data` to the `analyse.DataAnalysis` to analyse the data:\n```python=\nfrom analyse.DataAnalysis import DataAnalysis\nDD = DataAnalysis()\ndata_prop = DD.Data(Data)\ndata_prop.__dict__\n```\n\nIt then produces the output like the following:\n```\n{\n'dataset': 'Nordling-ID1446937-D20150825-N10-E15-SNR3291-IDY15968',\n'SNR\\textunderscore Phi\\textunderscore true': 6.999999962249559,\n'SNR\\textunderscore Phi\\textunderscore gauss': 3.3098514156225645,\n'SNR\\textunderscore phi\\textunderscore true': 10.991358740090298,\n'SNR\\textunderscore phi\\textunderscore gauss': 10.340857240865667\n} \n```\nThe following two functions calculates the SNR for all\n```python=6\nSNRe = DD.calc_SNR_phi_true(Data)\nSNRl = DD.calc_SNR_phi_gauss(Data)\n```\n#### Performance evaluation in JATNIpy:\n\nIn order to analyze the performance of an inference method, we first need to generate an output. It is easy to manipulate by using wrappers. Each method has an associated wrapper that parses the data of the method itself.\nIn JATNIpy, we re-implement four wrappers which are LASSO, Glmnet, LSCO, RNICO, respectively.\nBefore running Glmnet implementation, we should do these command lines\n```bash=\napt-get -y update\napt-get install -y libatlas-base-dev\napt-get install -y python3-tk\napt-get install libgfortran3\n```\n* To run the `Glmnet` method we execute:\n```python=\nfrom Methods.Glmnet import Glmnet\nestA,zetavec,zetaRange = Glmnet(Data,'full')\n```\nto use Glmnet you should install first (if you install in virtual, then don't need this step)\n```bash=\npip3 install python-glmnet\n```\n* To run the `lsco` implementation we execute:\n```python=\nfrom Methods.lsco import lsco\nestA,zetavec,zetaRange = lsco(Data,'full')\n```\n\n* To run the `RNI` implementation we execute:\n```python=\nfrom Methods.RNI import RNI\nestA,zetavec,zetaRange = RNI(Data,'full')\n```\n\n* To run the `Lasso` implementation we execute:\n```python=\nfrom Methods.Lasso import Lasso\nestA,zetavec,zetaRange = Lasso(Data,'full')\n```\n\n\nThe returned regularization parameters used within the algorithm is `zetavec`. The parameter `'full'` implies that the method will generate the complete regularization path from full to empty network with the `zeta` values scaled between 0 and 1. \nOnly for the `RNI` method, a zetavec can be specified and supplied to it in JATNIpy. And `zetaRange` can scale the factor used for the parameters. Then, RNI will use the vector of values to infer the networks\n\n```python=\nzetavec = np.logspace(-6,0,100)\nestA = RNI(Data,zetavec)[0]\n```\nand the method will use that vector of values to infere the networks.\n\nTo analyse the performance of the model, we input the network estimates\nproduced by the algorithm to the model comparison method:\n\n```python=\nfrom analyse.CompareModels import CompareModels\nimport numpy as np\nM = CompareModels()\nM = M.set_A(M,Net)\nM = M.CompareModels(M,np.asarray(Net.A),estA)\n```\n\nThe `max` function in `CompareModels` is used to find the maximum for each calculated measure:\n\n```python=6\nmaxM = M.max(M)\n```\n\nAnd the `maxM` contains the maximum of all measures in `CompareModels` . If you want to get the optimal performance for specific measure like `'MCC'`:\n\n```python=7\nmaxM[0]['MCC']\n```\n### How to publish JATNIpy on Pypi ###\nFirst, you should enter [Pypi_register](https://pypi.org/account/register/) and register a new account of Pypi.\n\nSecond, in order to upload your package to [PyPI](https://pypi.org/), you\u2019ll use a tool called Twine. You can install Twine using Pip as usual:\n```bash=\npip install twine\n```\n\nPackages on PyPI are not distributed as plain source code. They are wrapped into distribution packages. The most common formats for distribution packages are source archives and Python wheels.\n\nIn order to create a source archive and a wheel for your package, you can run the following command:\n```bash=\npython3 setup.py sdist\n```\n\nBefore runing this command, you should check the setup.py, you can refer [Packaging Python Projects](https://packaging.python.org/tutorials/packaging-projects/). Remember to change the version. The newest version, should not have the same name as previous ones.\n\nIf you have your own package to publish, this final step is short:\n(Check that there is only the newest version the dist folder.)\n```bash=\ntwine upload dist/*\n```\nAnd you should input your account and password to update the version \n\n\n\n### Who do I talk to? ###\n\n* For questions contact [Justin](mailto:justin.lin@nordlinglab.org), [Andreas Tj\u00e4rnberg](mailto:at145@nyu.edu) \n, [Torbj\u00f6rn Nordling](mailto:t@nordlinglab.org)", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://bitbucket.org/temn/JATNIpy/", "keywords": "", "license": "LGPL", "maintainer": "", "maintainer_email": "", "name": "jatnipy", "package_url": "https://pypi.org/project/jatnipy/", "platform": "", "project_url": "https://pypi.org/project/jatnipy/", "project_urls": { "Homepage": "https://bitbucket.org/temn/JATNIpy/" }, "release_url": "https://pypi.org/project/jatnipy/1.0.16/", "requires_dist": null, "requires_python": ">=3", "summary": "Justin's, Andrea's, and Torbj\u00f6rn's network inference package for Python", "version": "1.0.16" }, "last_serial": 5662002, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "3fd7ada51a02c85c54bc832dc57c2a60", "sha256": "7efd74081ac33b2b70ea5a1e136eaa1de4cf0ad8be97e1ea8a28e005c350bfd7" }, "downloads": -1, "filename": "jatnipy-1.0.tar.gz", "has_sig": false, "md5_digest": "3fd7ada51a02c85c54bc832dc57c2a60", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 14702, "upload_time": "2019-06-06T11:46:19", "url": "https://files.pythonhosted.org/packages/38/57/293ee451de9b848293db636354fe131feb242a7c54a0c0e9177156ffe447/jatnipy-1.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "0f7e4dad02f9d075a7e38e07d98e4a67", "sha256": "f30f0d30ec42a82f789232725c0f721821f4cf6f430e78708f5a1c55b5a1b1b1" }, "downloads": -1, "filename": "jatnipy-1.0.1.tar.gz", "has_sig": false, "md5_digest": "0f7e4dad02f9d075a7e38e07d98e4a67", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 39479, "upload_time": "2019-06-06T12:13:53", "url": "https://files.pythonhosted.org/packages/e4/a5/1ed194dc1fa8082af6804f4a9523e403029bb90dd44944e1a7c1f95dad80/jatnipy-1.0.1.tar.gz" } ], "1.0.10": [ { "comment_text": "", "digests": { "md5": "1b78c1c7b45b5e74fdfa062e7401b59d", "sha256": "a19d651d06ce7d04b0a17567cbbde527276ec00f7b18733962e7b9cb8215ad99" }, "downloads": -1, "filename": "jatnipy-1.0.10.tar.gz", "has_sig": false, "md5_digest": "1b78c1c7b45b5e74fdfa062e7401b59d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 32771, "upload_time": "2019-06-06T15:43:57", "url": "https://files.pythonhosted.org/packages/84/c0/148d0f26b8f183480919395dad3d4e3f7035cfa71b563dddb13eb4514fa7/jatnipy-1.0.10.tar.gz" } ], "1.0.11": [ { "comment_text": "", "digests": { "md5": "170fbc24963f2bf5b8dac54e480c4c84", "sha256": "7e7eb1ddac7ed86d1bf7cfd1261322f1d7eb3b12691e65021f407799d0c20a48" }, "downloads": -1, "filename": "jatnipy-1.0.11.tar.gz", "has_sig": false, "md5_digest": "170fbc24963f2bf5b8dac54e480c4c84", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 32823, "upload_time": "2019-06-06T15:49:57", "url": "https://files.pythonhosted.org/packages/f4/a7/929adb36363513181bd1b1b58bfb48c3c22bddce3c2ce06715631ecff45c/jatnipy-1.0.11.tar.gz" } ], "1.0.12": [ { "comment_text": "", "digests": { "md5": "08ff70f974e2b104af427ab63941857d", "sha256": "a030e7ece7531b3f41e955109d3f54848885c3562d893b91c33439c71d9cba43" }, "downloads": -1, "filename": "jatnipy-1.0.12.tar.gz", "has_sig": false, "md5_digest": "08ff70f974e2b104af427ab63941857d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 33477, "upload_time": "2019-06-06T15:52:28", "url": "https://files.pythonhosted.org/packages/5a/d3/84f861d095272056f1ed2571d7f5db1a96f5c0d3c15fcc7c4577ba96f864/jatnipy-1.0.12.tar.gz" } ], "1.0.13": [ { "comment_text": "", "digests": { "md5": "b1bc80c9f42f050ae0dd47f11ad01cec", "sha256": "c9bd4c864a96f4cfab3f3d3c13020201ec7fb9e8f77b0815906ddc37dcfef3ca" }, "downloads": -1, "filename": "jatnipy-1.0.13.tar.gz", "has_sig": false, "md5_digest": "b1bc80c9f42f050ae0dd47f11ad01cec", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 33481, "upload_time": "2019-06-06T15:54:46", "url": "https://files.pythonhosted.org/packages/95/0f/ebebaad113773ca842aa22e1a6df935d2f2088a54aeb4bfec196a0e5a7a1/jatnipy-1.0.13.tar.gz" } ], "1.0.14": [ { "comment_text": "", "digests": { "md5": "6153997faab2fd9affa47fbf37a39891", "sha256": "889016334da38e840c33edb37c8f9b952f4213152c4245d3f5e52ed372f02a9e" }, "downloads": -1, "filename": "jatnipy-1.0.14.tar.gz", "has_sig": false, "md5_digest": "6153997faab2fd9affa47fbf37a39891", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 50223, "upload_time": "2019-06-06T15:56:04", "url": "https://files.pythonhosted.org/packages/2c/59/0c59589588f7e3fff356facf542835ca74cb49e6cc54d6191d40c99ee13c/jatnipy-1.0.14.tar.gz" } ], "1.0.15": [ { "comment_text": "", "digests": { "md5": "b0c5c398e030f5d2facd3c2201235e53", "sha256": "7f11e7ccbe2ccc7a4129ce7b6c19d05efa4d53d0265e75fc13c898b9204b6d33" }, "downloads": -1, "filename": "jatnipy-1.0.15.tar.gz", "has_sig": false, "md5_digest": "b0c5c398e030f5d2facd3c2201235e53", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 56143, "upload_time": "2019-06-12T05:28:18", "url": "https://files.pythonhosted.org/packages/f4/8b/f020affa97b86dad025dd00fae23d435d4025c2bbf344bbf0f808ef2c2ad/jatnipy-1.0.15.tar.gz" } ], "1.0.16": [ { "comment_text": "", "digests": { "md5": "06323fe2a26ae2738441fecc7473a078", "sha256": "7e139e766c4fdff8e999a44c6824d77453739304fbbbe5ae7d4a1ebe0d2d18f8" }, "downloads": -1, "filename": "jatnipy-1.0.16.tar.gz", "has_sig": false, "md5_digest": "06323fe2a26ae2738441fecc7473a078", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 59157, "upload_time": "2019-08-11T12:18:00", "url": "https://files.pythonhosted.org/packages/98/ac/c5c74c2bd456e7c20b4bd167c182b9cfd99d67840a5d55d172ccf22391e9/jatnipy-1.0.16.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "033a521c01bcbd81e6865795cf1d13be", "sha256": "372fa4fb68f3d94f6116f37f4541f4d83a97bdacf295ee4318964ce45470d74f" }, "downloads": -1, "filename": "jatnipy-1.0.2.tar.gz", "has_sig": false, "md5_digest": "033a521c01bcbd81e6865795cf1d13be", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 39581, "upload_time": "2019-06-06T13:02:28", "url": "https://files.pythonhosted.org/packages/2e/7e/31113336e56a12bb4e7079e614d79752a5f676cbc0cbec972d53a8ef20ab/jatnipy-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "5b76a32d3ef0ad24710049cd69efcbc1", "sha256": "65192da783610e01b16ad1ec94dae08ae2e979d70d8a3761e9beb8d20a7ef4c4" }, "downloads": -1, "filename": "jatnipy-1.0.3.tar.gz", "has_sig": false, "md5_digest": "5b76a32d3ef0ad24710049cd69efcbc1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 39640, "upload_time": "2019-06-06T13:24:03", "url": "https://files.pythonhosted.org/packages/25/fe/28383d1f1dcf83b11b498ac538c89a7f85ce88614efedbde6274ab3241e2/jatnipy-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "c464fd9837ec3c503afdbb61d0dd9b06", "sha256": "0e9cf783860f5e8e9a4378e9f2629f63f5f0026257ad6ec89b67c91058052db4" }, "downloads": -1, "filename": "jatnipy-1.0.4.tar.gz", "has_sig": false, "md5_digest": "c464fd9837ec3c503afdbb61d0dd9b06", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 39954, "upload_time": "2019-06-06T15:04:17", "url": "https://files.pythonhosted.org/packages/0e/ce/ea409f8a49330b062c9c3083951c9b7e9f36d3c2fa811d7aecded69e6e26/jatnipy-1.0.4.tar.gz" } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "59facf663ff03ec55818abec1dde3f6b", "sha256": "e7a94c44a42f29e5c46e6c3cd5e3d5e13c62931bf1ebe6d6ac8754107ec749d9" }, "downloads": -1, "filename": "jatnipy-1.0.5.tar.gz", "has_sig": false, "md5_digest": "59facf663ff03ec55818abec1dde3f6b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 31312, "upload_time": "2019-06-06T15:09:47", "url": "https://files.pythonhosted.org/packages/1b/bc/936cdcc6a953ba15e87e6b0016e5a7233b6a6a11894a0b6f755ab60df7c8/jatnipy-1.0.5.tar.gz" } ], "1.0.7": [ { "comment_text": "", "digests": { "md5": "843a5e8faa17a5bb915d54355b20821c", "sha256": "4fbcd4114ef00f6e12c9b65e3de0945155fceee4dfd1db2259d6049cd86848d4" }, "downloads": -1, "filename": "jatnipy-1.0.7.tar.gz", "has_sig": false, "md5_digest": "843a5e8faa17a5bb915d54355b20821c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 32714, "upload_time": "2019-06-06T15:31:30", "url": "https://files.pythonhosted.org/packages/cb/99/042e2f7c30202c4f3cbd7fc9afc015899093bf026c545645c2564d98d519/jatnipy-1.0.7.tar.gz" } ], "1.0.8": [ { "comment_text": "", "digests": { "md5": "85ff294b60117bd7cdd139aa570a12f4", "sha256": "39dacd038fa351f6792c6f4141c56eb5e197b96061c6e216d6b4bfa8abd43d3d" }, "downloads": -1, "filename": "jatnipy-1.0.8.tar.gz", "has_sig": false, "md5_digest": "85ff294b60117bd7cdd139aa570a12f4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 32746, "upload_time": "2019-06-06T15:37:53", "url": "https://files.pythonhosted.org/packages/7b/27/598ac7be53e95709700fead5cd63bba7d174d601e84a8f9eac117e71884f/jatnipy-1.0.8.tar.gz" } ], "1.0.9": [ { "comment_text": "", "digests": { "md5": "4932607dd0319c7ee306c5c1cb83ff9c", "sha256": "eb21b829d8e547df71312cc644834302cae179591a8b3998fb94b6f76cf01d9e" }, "downloads": -1, "filename": "jatnipy-1.0.9.tar.gz", "has_sig": false, "md5_digest": "4932607dd0319c7ee306c5c1cb83ff9c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 32827, "upload_time": "2019-06-06T15:40:25", "url": "https://files.pythonhosted.org/packages/c9/c7/22029cdabd77a2182428d8cfe7d81b82f06ebc31eae6040b431af26a6053/jatnipy-1.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "06323fe2a26ae2738441fecc7473a078", "sha256": "7e139e766c4fdff8e999a44c6824d77453739304fbbbe5ae7d4a1ebe0d2d18f8" }, "downloads": -1, "filename": "jatnipy-1.0.16.tar.gz", "has_sig": false, "md5_digest": "06323fe2a26ae2738441fecc7473a078", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 59157, "upload_time": "2019-08-11T12:18:00", "url": "https://files.pythonhosted.org/packages/98/ac/c5c74c2bd456e7c20b4bd167c182b9cfd99d67840a5d55d172ccf22391e9/jatnipy-1.0.16.tar.gz" } ] }