{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# CIC Subpopulation Construction\n", "\n", "To create a representative model of the agent interactions, we will use subpopulation modeling. We take all of the agents and cluster them based off of the following features from full population actual transactional data from Jan - May 11 2020 xDai data (s means source, t means target):\n", "* s_location - source individual location\n", "* s_business_type - source individual business type\n", "* t_location - target individual location\n", "* t_business_type - target individual business type.\n", "* weight, which is tokens, exchange amount\n", "* s_bal - source individual CIC wallet balance\n", "* t_bal - target individual CIC wallet balance\n", "\n", "Essentially, we are taking a graph zoom operation, bundling nodes together based off of their likeness. Nodes are constant with edges being transative. The algorithm we use for this graph zoom operation is Kmeans clustering. Based off our descriptive statistical analysis and use of th Gap Statistic created by Stanford researchers Tibshirani, Walther and Hastie in their 2001 [paper](https://web.stanford.edu/~hastie/Papers/gap.pdf), we determined 50 clusters are representative of the subpopulations. All of the flows inside of the bundle become part of the self-loop flow. For example, within cluster 1, agent a can transaction with as b. This will not be reflected within our model as this is intra not inter cluster interactions.\n", " \n", "## Graph Model of Current Spend Activity\n", "\n", "We created a network graph of the CIC transaction data as a $G(N,E)$ weighted directed graph with source and target agents as nodes, $N$ and the edges as $E$. Tokens are used as the edge weight to denote the actual CIC flow between agents, as $i,j \\in E$.\n", "\n", "The observed data shows the actual payments between network actors that are transacting in CIC. The observed data does not show us shillings payments between actors, actors utility, or demand. We only know actual CIC spends between agents. \n", "\n", "\n", "## Saving Clustering Results\n", "At the bottom of this notebook, we calculate the median, 1st quartile, 3rd quartile, mean, standard deviation, utility types ordering, and utility types probability. These values can then be copied into the ```subpopulation_clusters.py``` in the simulation folders for use in the simulations." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# import libraries\n", "import networkx as nx\n", "import pandas as pd\n", "import numpy as np\n", "from sklearn.cluster import KMeans\n", "from gap_statistic import OptimalK\n", "from sklearn.decomposition import PCA\n", "\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data Dump as of 5-15-2020\n", "Jan - May 11 2020 xDai Blockchain data\n", "https://www.grassrootseconomics.org/research" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# import the data\n", "transactions = pd.read_csv('data/sarafu_xDAI_tx_all_pub_all_time_12May2020.csv')\n", "users = pd.read_csv('data/sarafu_xDAI_users_all_pub_all_time_12May2020.csv')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>id</th>\n", " <th>timeset</th>\n", " <th>transfer_subtype</th>\n", " <th>source</th>\n", " <th>s_gender</th>\n", " <th>s_location</th>\n", " <th>s_business_type</th>\n", " <th>target</th>\n", " <th>t_gender</th>\n", " <th>t_location</th>\n", " <th>t_business_type</th>\n", " <th>tx_token</th>\n", " <th>weight</th>\n", " <th>type</th>\n", " <th>token_name</th>\n", " <th>token_address</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>1</td>\n", " <td>2020-01-25 19:13:17.731529</td>\n", " <td>DISBURSEMENT</td>\n", " <td>0xBDB3Bc887C3b70586BC25D04d89eC802b897fC5F</td>\n", " <td>NaN</td>\n", " <td>None</td>\n", " <td>System</td>\n", " <td>0x245fc81fe385450Dc0f4787668e47c903C00b0A1</td>\n", " <td>female</td>\n", " <td>GE Office</td>\n", " <td>Savings Group</td>\n", " <td>NaN</td>\n", " <td>18000.000000</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>2</td>\n", " <td>2020-01-25 19:13:19.056070</td>\n", " <td>DISBURSEMENT</td>\n", " <td>0xBDB3Bc887C3b70586BC25D04d89eC802b897fC5F</td>\n", " <td>NaN</td>\n", " <td>None</td>\n", " <td>System</td>\n", " <td>0xC1697C1326fD192438515fE2F7E4cCb0C705C5d2</td>\n", " <td>male</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>NaN</td>\n", " <td>9047.660892</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>3</td>\n", " <td>2020-01-25 19:13:20.288346</td>\n", " <td>DISBURSEMENT</td>\n", " <td>0xBDB3Bc887C3b70586BC25D04d89eC802b897fC5F</td>\n", " <td>NaN</td>\n", " <td>None</td>\n", " <td>System</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>male</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>NaN</td>\n", " <td>25378.726002</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>4</td>\n", " <td>2020-01-25 19:13:21.478850</td>\n", " <td>DISBURSEMENT</td>\n", " <td>0xBDB3Bc887C3b70586BC25D04d89eC802b897fC5F</td>\n", " <td>NaN</td>\n", " <td>None</td>\n", " <td>System</td>\n", " <td>0xD95954e3fCd2f09A6Be5931D24f731eFa63BF435</td>\n", " <td>male</td>\n", " <td>G.E</td>\n", " <td>Farming/Labour</td>\n", " <td>NaN</td>\n", " <td>4495.932576</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>5</td>\n", " <td>2020-01-26 07:48:43.042684</td>\n", " <td>DISBURSEMENT</td>\n", " <td>0xBDB3Bc887C3b70586BC25D04d89eC802b897fC5F</td>\n", " <td>NaN</td>\n", " <td>None</td>\n", " <td>System</td>\n", " <td>0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72</td>\n", " <td>male</td>\n", " <td>Home</td>\n", " <td>Farming/Labour</td>\n", " <td>NaN</td>\n", " <td>400.000000</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " id timeset transfer_subtype \\\n", "0 1 2020-01-25 19:13:17.731529 DISBURSEMENT \n", "1 2 2020-01-25 19:13:19.056070 DISBURSEMENT \n", "2 3 2020-01-25 19:13:20.288346 DISBURSEMENT \n", "3 4 2020-01-25 19:13:21.478850 DISBURSEMENT \n", "4 5 2020-01-26 07:48:43.042684 DISBURSEMENT \n", "\n", " source s_gender s_location \\\n", "0 0xBDB3Bc887C3b70586BC25D04d89eC802b897fC5F NaN None \n", "1 0xBDB3Bc887C3b70586BC25D04d89eC802b897fC5F NaN None \n", "2 0xBDB3Bc887C3b70586BC25D04d89eC802b897fC5F NaN None \n", "3 0xBDB3Bc887C3b70586BC25D04d89eC802b897fC5F NaN None \n", "4 0xBDB3Bc887C3b70586BC25D04d89eC802b897fC5F NaN None \n", "\n", " s_business_type target t_gender \\\n", "0 System 0x245fc81fe385450Dc0f4787668e47c903C00b0A1 female \n", "1 System 0xC1697C1326fD192438515fE2F7E4cCb0C705C5d2 male \n", "2 System 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 male \n", "3 System 0xD95954e3fCd2f09A6Be5931D24f731eFa63BF435 male \n", "4 System 0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72 male \n", "\n", " t_location t_business_type tx_token weight type token_name \\\n", "0 GE Office Savings Group NaN 18000.000000 directed Sarafu \n", "1 GE Nairobi Farming/Labour NaN 9047.660892 directed Sarafu \n", "2 GE Nairobi Farming/Labour NaN 25378.726002 directed Sarafu \n", "3 G.E Farming/Labour NaN 4495.932576 directed Sarafu \n", "4 Home Farming/Labour NaN 400.000000 directed Sarafu \n", "\n", " token_address \n", "0 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 \n", "1 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 \n", "2 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 \n", "3 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 \n", "4 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "transactions.head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'STANDARD': 0.5085207861177824,\n", " 'DISBURSEMENT': 0.35574873997902784,\n", " 'RECLAMATION': 0.13483070053783444,\n", " 'AGENT_OUT': 0.0008997733653553429}" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "transactions.transfer_subtype.value_counts(normalize=True).to_dict()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Based on the data dictionary provided by Grassroots Economics, we know that the transfer subtype codes are:\n", "\n", "* DISBURSEMENT = from Grassroots Economics\n", "* RECLAMATION = Back to GE, \n", "* STANDARD = a trade between users, \n", "* AGENT = when a group account is cashing out\n", "\n", "\n", "For purposes of our analysis, we will subset to STANDARD transactions. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "transactions_subset = transactions[transactions['transfer_subtype'] == 'STANDARD']\n", "transactions_subset = transactions_subset[transactions_subset['token_name']=='Sarafu']" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>id</th>\n", " <th>start</th>\n", " <th>label</th>\n", " <th>gender</th>\n", " <th>location</th>\n", " <th>held_roles</th>\n", " <th>business_type</th>\n", " <th>bal</th>\n", " <th>xDAI_blockchain_address</th>\n", " <th>confidence</th>\n", " <th>...</th>\n", " <th>otxns_in</th>\n", " <th>otxns_out</th>\n", " <th>ounique_in</th>\n", " <th>ounique_out</th>\n", " <th>svol_in</th>\n", " <th>svol_out</th>\n", " <th>stxns_in</th>\n", " <th>stxns_out</th>\n", " <th>sunique_in</th>\n", " <th>sunique_out</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>1</td>\n", " <td>2020-01-25 19:10:50.218686</td>\n", " <td>1</td>\n", " <td>NaN</td>\n", " <td>None</td>\n", " <td>ADMIN</td>\n", " <td>System</td>\n", " <td>8.916761e+06</td>\n", " <td>0xBDB3Bc887C3b70586BC25D04d89eC802b897fC5F</td>\n", " <td>0.000000</td>\n", " <td>...</td>\n", " <td>19917</td>\n", " <td>52610</td>\n", " <td>9</td>\n", " <td>19862</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0</td>\n", " <td>0</td>\n", " <td>0</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>2</td>\n", " <td>2018-10-23 09:09:58</td>\n", " <td>2</td>\n", " <td>female</td>\n", " <td>GE Office</td>\n", " <td>TOKEN_AGENT</td>\n", " <td>Savings Group</td>\n", " <td>1.800000e+05</td>\n", " <td>0x245fc81fe385450Dc0f4787668e47c903C00b0A1</td>\n", " <td>0.000000</td>\n", " <td>...</td>\n", " <td>134</td>\n", " <td>16</td>\n", " <td>68</td>\n", " <td>0</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " <td>0</td>\n", " <td>0</td>\n", " <td>0</td>\n", " <td>0</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>3</td>\n", " <td>2018-10-21 14:20:57</td>\n", " <td>3</td>\n", " <td>male</td>\n", " <td>GE Nairobi</td>\n", " <td>BENEFICIARY</td>\n", " <td>Farming/Labour</td>\n", " <td>5.666089e+01</td>\n", " <td>0xC1697C1326fD192438515fE2F7E4cCb0C705C5d2</td>\n", " <td>0.000000</td>\n", " <td>...</td>\n", " <td>2</td>\n", " <td>2</td>\n", " <td>1</td>\n", " <td>0</td>\n", " <td>0.0</td>\n", " <td>9007.0</td>\n", " <td>0</td>\n", " <td>1</td>\n", " <td>0</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>4</td>\n", " <td>2018-10-21 15:38:30</td>\n", " <td>4</td>\n", " <td>male</td>\n", " <td>GE Nairobi</td>\n", " <td>BENEFICIARY</td>\n", " <td>Farming/Labour</td>\n", " <td>1.173773e+04</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>0.100000</td>\n", " <td>...</td>\n", " <td>6</td>\n", " <td>1</td>\n", " <td>1</td>\n", " <td>0</td>\n", " <td>20619.0</td>\n", " <td>50449.0</td>\n", " <td>20</td>\n", " <td>15</td>\n", " <td>11</td>\n", " <td>5</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>5</td>\n", " <td>2018-10-23 14:10:27</td>\n", " <td>5</td>\n", " <td>male</td>\n", " <td>G.E</td>\n", " <td>BENEFICIARY</td>\n", " <td>Farming/Labour</td>\n", " <td>7.297263e+03</td>\n", " <td>0xD95954e3fCd2f09A6Be5931D24f731eFa63BF435</td>\n", " <td>0.405063</td>\n", " <td>...</td>\n", " <td>15</td>\n", " <td>1</td>\n", " <td>1</td>\n", " <td>0</td>\n", " <td>127393.3</td>\n", " <td>168905.0</td>\n", " <td>158</td>\n", " <td>208</td>\n", " <td>84</td>\n", " <td>65</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>5 rows × 22 columns</p>\n", "</div>" ], "text/plain": [ " id start label gender location held_roles \\\n", "0 1 2020-01-25 19:10:50.218686 1 NaN None ADMIN \n", "1 2 2018-10-23 09:09:58 2 female GE Office TOKEN_AGENT \n", "2 3 2018-10-21 14:20:57 3 male GE Nairobi BENEFICIARY \n", "3 4 2018-10-21 15:38:30 4 male GE Nairobi BENEFICIARY \n", "4 5 2018-10-23 14:10:27 5 male G.E BENEFICIARY \n", "\n", " business_type bal xDAI_blockchain_address \\\n", "0 System 8.916761e+06 0xBDB3Bc887C3b70586BC25D04d89eC802b897fC5F \n", "1 Savings Group 1.800000e+05 0x245fc81fe385450Dc0f4787668e47c903C00b0A1 \n", "2 Farming/Labour 5.666089e+01 0xC1697C1326fD192438515fE2F7E4cCb0C705C5d2 \n", "3 Farming/Labour 1.173773e+04 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 \n", "4 Farming/Labour 7.297263e+03 0xD95954e3fCd2f09A6Be5931D24f731eFa63BF435 \n", "\n", " confidence ... otxns_in otxns_out ounique_in ounique_out svol_in \\\n", "0 0.000000 ... 19917 52610 9 19862 0.0 \n", "1 0.000000 ... 134 16 68 0 0.0 \n", "2 0.000000 ... 2 2 1 0 0.0 \n", "3 0.100000 ... 6 1 1 0 20619.0 \n", "4 0.405063 ... 15 1 1 0 127393.3 \n", "\n", " svol_out stxns_in stxns_out sunique_in sunique_out \n", "0 0.0 0 0 0 0 \n", "1 0.0 0 0 0 0 \n", "2 9007.0 0 1 0 1 \n", "3 50449.0 20 15 11 5 \n", "4 168905.0 158 208 84 65 \n", "\n", "[5 rows x 22 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "users.head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'Farming/Labour': 0.43367860016090104,\n", " 'Food/Water': 0.22863032984714401,\n", " 'Shop': 0.1406878519710378,\n", " 'Fuel/Energy': 0.06365647626709574,\n", " 'None': 0.0621983105390185,\n", " 'Transport': 0.04379525341914722,\n", " 'Education': 0.014380530973451327,\n", " 'Savings Group': 0.006335478680611424,\n", " 'Health': 0.00331858407079646,\n", " 'Environment': 0.001910699919549477,\n", " 'System': 0.0012067578439259854,\n", " 'Staff': 0.00010056315366049879,\n", " 'Chama': 5.0281576830249393e-05,\n", " 'Game': 5.0281576830249393e-05}" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "users['business_type'].value_counts(normalize=True).to_dict()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Combine user and transaction tables\n", "\n", "Combine user and transaction tables on both the source and target features." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "user_subset = users[['bal','xDAI_blockchain_address']]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>id</th>\n", " <th>timeset</th>\n", " <th>transfer_subtype</th>\n", " <th>source</th>\n", " <th>s_gender</th>\n", " <th>s_location</th>\n", " <th>s_business_type</th>\n", " <th>target</th>\n", " <th>t_gender</th>\n", " <th>t_location</th>\n", " <th>t_business_type</th>\n", " <th>tx_token</th>\n", " <th>weight</th>\n", " <th>type</th>\n", " <th>token_name</th>\n", " <th>token_address</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>72647</th>\n", " <td>170140</td>\n", " <td>2020-04-30 10:43:45.170528</td>\n", " <td>STANDARD</td>\n", " <td>0xC1697C1326fD192438515fE2F7E4cCb0C705C5d2</td>\n", " <td>male</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>male</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>NaN</td>\n", " <td>9007.0</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " </tr>\n", " <tr>\n", " <th>72648</th>\n", " <td>10</td>\n", " <td>2020-01-26 08:26:22.521902</td>\n", " <td>STANDARD</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>male</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72</td>\n", " <td>male</td>\n", " <td>Home</td>\n", " <td>Farming/Labour</td>\n", " <td>NaN</td>\n", " <td>100.0</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " </tr>\n", " <tr>\n", " <th>72649</th>\n", " <td>11</td>\n", " <td>2020-01-26 08:27:26.757372</td>\n", " <td>STANDARD</td>\n", " <td>0xD95954e3fCd2f09A6Be5931D24f731eFa63BF435</td>\n", " <td>male</td>\n", " <td>G.E</td>\n", " <td>Farming/Labour</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>male</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>NaN</td>\n", " <td>2.0</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " </tr>\n", " <tr>\n", " <th>72650</th>\n", " <td>13</td>\n", " <td>2020-01-26 08:32:05.154096</td>\n", " <td>STANDARD</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>male</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72</td>\n", " <td>male</td>\n", " <td>Home</td>\n", " <td>Farming/Labour</td>\n", " <td>NaN</td>\n", " <td>23.0</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " </tr>\n", " <tr>\n", " <th>72651</th>\n", " <td>15</td>\n", " <td>2020-01-26 08:38:42.186525</td>\n", " <td>STANDARD</td>\n", " <td>0x4AfD04b9eD17759B362c8C929207Fe7ad81C39d3</td>\n", " <td>male</td>\n", " <td>Test</td>\n", " <td>Health</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>male</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>NaN</td>\n", " <td>12.0</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " </tr>\n", " <tr>\n", " <th>...</th>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " </tr>\n", " <tr>\n", " <th>147810</th>\n", " <td>208035</td>\n", " <td>2020-05-11 08:52:34.504171</td>\n", " <td>STANDARD</td>\n", " <td>0x97F5165b544e0869ba3Be80D7eEe8b73a0270Dfe</td>\n", " <td>Unknown gender</td>\n", " <td>kilibole</td>\n", " <td>Farming/Labour</td>\n", " <td>0x5CAaA1f7dC13235Fe181D0307e682c387e75a6ec</td>\n", " <td>Unknown gender</td>\n", " <td>Kilibole</td>\n", " <td>Food/Water</td>\n", " <td>NaN</td>\n", " <td>20.0</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " </tr>\n", " <tr>\n", " <th>147811</th>\n", " <td>208021</td>\n", " <td>2020-05-11 08:49:20.768559</td>\n", " <td>STANDARD</td>\n", " <td>0x9a05d12df366cE3aa1420c6DFFD0db9ce4ba77Fc</td>\n", " <td>Unknown gender</td>\n", " <td>Kikomani</td>\n", " <td>Food/Water</td>\n", " <td>0xb44279a1d11A2bc4b1b3D08D3BEAb8278cc86985</td>\n", " <td>Unknown gender</td>\n", " <td>Bofu</td>\n", " <td>Shop</td>\n", " <td>NaN</td>\n", " <td>350.0</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " </tr>\n", " <tr>\n", " <th>147812</th>\n", " <td>208459</td>\n", " <td>2020-05-11 10:11:18.699013</td>\n", " <td>STANDARD</td>\n", " <td>0x2e44845BE57687bFdcdd26044bB7CdD575781336</td>\n", " <td>male</td>\n", " <td>Miyani</td>\n", " <td>Shop</td>\n", " <td>0xfCF20a412eB6DD345237C7BEeBab53B424b98297</td>\n", " <td>male</td>\n", " <td>Miyani</td>\n", " <td>Shop</td>\n", " <td>NaN</td>\n", " <td>400.0</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " </tr>\n", " <tr>\n", " <th>147813</th>\n", " <td>208395</td>\n", " <td>2020-05-11 10:01:04.805823</td>\n", " <td>STANDARD</td>\n", " <td>0xAc4DB7728940e76BCd98Bb8E60671916f3B7576A</td>\n", " <td>male</td>\n", " <td>Kilifi</td>\n", " <td>Farming/Labour</td>\n", " <td>0x2f99a653F5dc201eA97578A6a203BC4db1eaD2FF</td>\n", " <td>Unknown gender</td>\n", " <td>KIlifi</td>\n", " <td>Education</td>\n", " <td>NaN</td>\n", " <td>20.0</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " </tr>\n", " <tr>\n", " <th>147814</th>\n", " <td>208396</td>\n", " <td>2020-05-11 10:01:10.449068</td>\n", " <td>STANDARD</td>\n", " <td>0x2f99a653F5dc201eA97578A6a203BC4db1eaD2FF</td>\n", " <td>Unknown gender</td>\n", " <td>KIlifi</td>\n", " <td>Education</td>\n", " <td>0xAc4DB7728940e76BCd98Bb8E60671916f3B7576A</td>\n", " <td>male</td>\n", " <td>Kilifi</td>\n", " <td>Farming/Labour</td>\n", " <td>NaN</td>\n", " <td>20.0</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>75167 rows × 16 columns</p>\n", "</div>" ], "text/plain": [ " id timeset transfer_subtype \\\n", "72647 170140 2020-04-30 10:43:45.170528 STANDARD \n", "72648 10 2020-01-26 08:26:22.521902 STANDARD \n", "72649 11 2020-01-26 08:27:26.757372 STANDARD \n", "72650 13 2020-01-26 08:32:05.154096 STANDARD \n", "72651 15 2020-01-26 08:38:42.186525 STANDARD \n", "... ... ... ... \n", "147810 208035 2020-05-11 08:52:34.504171 STANDARD \n", "147811 208021 2020-05-11 08:49:20.768559 STANDARD \n", "147812 208459 2020-05-11 10:11:18.699013 STANDARD \n", "147813 208395 2020-05-11 10:01:04.805823 STANDARD \n", "147814 208396 2020-05-11 10:01:10.449068 STANDARD \n", "\n", " source s_gender \\\n", "72647 0xC1697C1326fD192438515fE2F7E4cCb0C705C5d2 male \n", "72648 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 male \n", "72649 0xD95954e3fCd2f09A6Be5931D24f731eFa63BF435 male \n", "72650 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 male \n", "72651 0x4AfD04b9eD17759B362c8C929207Fe7ad81C39d3 male \n", "... ... ... \n", "147810 0x97F5165b544e0869ba3Be80D7eEe8b73a0270Dfe Unknown gender \n", "147811 0x9a05d12df366cE3aa1420c6DFFD0db9ce4ba77Fc Unknown gender \n", "147812 0x2e44845BE57687bFdcdd26044bB7CdD575781336 male \n", "147813 0xAc4DB7728940e76BCd98Bb8E60671916f3B7576A male \n", "147814 0x2f99a653F5dc201eA97578A6a203BC4db1eaD2FF Unknown gender \n", "\n", " s_location s_business_type \\\n", "72647 GE Nairobi Farming/Labour \n", "72648 GE Nairobi Farming/Labour \n", "72649 G.E Farming/Labour \n", "72650 GE Nairobi Farming/Labour \n", "72651 Test Health \n", "... ... ... \n", "147810 kilibole Farming/Labour \n", "147811 Kikomani Food/Water \n", "147812 Miyani Shop \n", "147813 Kilifi Farming/Labour \n", "147814 KIlifi Education \n", "\n", " target t_gender \\\n", "72647 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 male \n", "72648 0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72 male \n", "72649 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 male \n", "72650 0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72 male \n", "72651 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 male \n", "... ... ... \n", "147810 0x5CAaA1f7dC13235Fe181D0307e682c387e75a6ec Unknown gender \n", "147811 0xb44279a1d11A2bc4b1b3D08D3BEAb8278cc86985 Unknown gender \n", "147812 0xfCF20a412eB6DD345237C7BEeBab53B424b98297 male \n", "147813 0x2f99a653F5dc201eA97578A6a203BC4db1eaD2FF Unknown gender \n", "147814 0xAc4DB7728940e76BCd98Bb8E60671916f3B7576A male \n", "\n", " t_location t_business_type tx_token weight type token_name \\\n", "72647 GE Nairobi Farming/Labour NaN 9007.0 directed Sarafu \n", "72648 Home Farming/Labour NaN 100.0 directed Sarafu \n", "72649 GE Nairobi Farming/Labour NaN 2.0 directed Sarafu \n", "72650 Home Farming/Labour NaN 23.0 directed Sarafu \n", "72651 GE Nairobi Farming/Labour NaN 12.0 directed Sarafu \n", "... ... ... ... ... ... ... \n", "147810 Kilibole Food/Water NaN 20.0 directed Sarafu \n", "147811 Bofu Shop NaN 350.0 directed Sarafu \n", "147812 Miyani Shop NaN 400.0 directed Sarafu \n", "147813 KIlifi Education NaN 20.0 directed Sarafu \n", "147814 Kilifi Farming/Labour NaN 20.0 directed Sarafu \n", "\n", " token_address \n", "72647 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 \n", "72648 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 \n", "72649 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 \n", "72650 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 \n", "72651 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 \n", "... ... \n", "147810 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 \n", "147811 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 \n", "147812 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 \n", "147813 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 \n", "147814 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 \n", "\n", "[75167 rows x 16 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "transactions_subset" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "transactions_subset_v1 = transactions_subset.merge(user_subset, how='left', left_on='source', right_on='xDAI_blockchain_address')\n", "transactions_subset_v1['s_bal'] = transactions_subset_v1['bal']\n", "del transactions_subset_v1['bal']\n", "transactions_subset_v1['s_xDAI_blockchain_address'] = transactions_subset_v1['xDAI_blockchain_address']\n", "del transactions_subset_v1['xDAI_blockchain_address']" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "transactions_subset_v2 = transactions_subset_v1.merge(user_subset, how='left', left_on='target', right_on='xDAI_blockchain_address')" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "transactions_subset_v2 = transactions_subset_v1.merge(user_subset, how='left', left_on='target', right_on='xDAI_blockchain_address')\n", "transactions_subset_v2['t_bal'] = transactions_subset_v2['bal']\n", "del transactions_subset_v2['bal']\n", "transactions_subset_v2['t_xDAI_blockchain_address'] = transactions_subset_v2['xDAI_blockchain_address']\n", "del transactions_subset_v2['xDAI_blockchain_address']" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>id</th>\n", " <th>timeset</th>\n", " <th>transfer_subtype</th>\n", " <th>source</th>\n", " <th>s_gender</th>\n", " <th>s_location</th>\n", " <th>s_business_type</th>\n", " <th>target</th>\n", " <th>t_gender</th>\n", " <th>t_location</th>\n", " <th>t_business_type</th>\n", " <th>tx_token</th>\n", " <th>weight</th>\n", " <th>type</th>\n", " <th>token_name</th>\n", " <th>token_address</th>\n", " <th>s_bal</th>\n", " <th>s_xDAI_blockchain_address</th>\n", " <th>t_bal</th>\n", " <th>t_xDAI_blockchain_address</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>170140</td>\n", " <td>2020-04-30 10:43:45.170528</td>\n", " <td>STANDARD</td>\n", " <td>0xC1697C1326fD192438515fE2F7E4cCb0C705C5d2</td>\n", " <td>male</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>male</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>NaN</td>\n", " <td>9007.0</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " <td>56.660892</td>\n", " <td>0xC1697C1326fD192438515fE2F7E4cCb0C705C5d2</td>\n", " <td>11737.726002</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>10</td>\n", " <td>2020-01-26 08:26:22.521902</td>\n", " <td>STANDARD</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>male</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72</td>\n", " <td>male</td>\n", " <td>Home</td>\n", " <td>Farming/Labour</td>\n", " <td>NaN</td>\n", " <td>100.0</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " <td>11737.726002</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>902.500000</td>\n", " <td>0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>11</td>\n", " <td>2020-01-26 08:27:26.757372</td>\n", " <td>STANDARD</td>\n", " <td>0xD95954e3fCd2f09A6Be5931D24f731eFa63BF435</td>\n", " <td>male</td>\n", " <td>G.E</td>\n", " <td>Farming/Labour</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>male</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>NaN</td>\n", " <td>2.0</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " <td>7297.262576</td>\n", " <td>0xD95954e3fCd2f09A6Be5931D24f731eFa63BF435</td>\n", " <td>11737.726002</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>13</td>\n", " <td>2020-01-26 08:32:05.154096</td>\n", " <td>STANDARD</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>male</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72</td>\n", " <td>male</td>\n", " <td>Home</td>\n", " <td>Farming/Labour</td>\n", " <td>NaN</td>\n", " <td>23.0</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " <td>11737.726002</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>902.500000</td>\n", " <td>0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>15</td>\n", " <td>2020-01-26 08:38:42.186525</td>\n", " <td>STANDARD</td>\n", " <td>0x4AfD04b9eD17759B362c8C929207Fe7ad81C39d3</td>\n", " <td>male</td>\n", " <td>Test</td>\n", " <td>Health</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>male</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>NaN</td>\n", " <td>12.0</td>\n", " <td>directed</td>\n", " <td>Sarafu</td>\n", " <td>0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4</td>\n", " <td>448.000000</td>\n", " <td>0x4AfD04b9eD17759B362c8C929207Fe7ad81C39d3</td>\n", " <td>11737.726002</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " id timeset transfer_subtype \\\n", "0 170140 2020-04-30 10:43:45.170528 STANDARD \n", "1 10 2020-01-26 08:26:22.521902 STANDARD \n", "2 11 2020-01-26 08:27:26.757372 STANDARD \n", "3 13 2020-01-26 08:32:05.154096 STANDARD \n", "4 15 2020-01-26 08:38:42.186525 STANDARD \n", "\n", " source s_gender s_location \\\n", "0 0xC1697C1326fD192438515fE2F7E4cCb0C705C5d2 male GE Nairobi \n", "1 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 male GE Nairobi \n", "2 0xD95954e3fCd2f09A6Be5931D24f731eFa63BF435 male G.E \n", "3 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 male GE Nairobi \n", "4 0x4AfD04b9eD17759B362c8C929207Fe7ad81C39d3 male Test \n", "\n", " s_business_type target t_gender \\\n", "0 Farming/Labour 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 male \n", "1 Farming/Labour 0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72 male \n", "2 Farming/Labour 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 male \n", "3 Farming/Labour 0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72 male \n", "4 Health 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 male \n", "\n", " t_location t_business_type tx_token weight type token_name \\\n", "0 GE Nairobi Farming/Labour NaN 9007.0 directed Sarafu \n", "1 Home Farming/Labour NaN 100.0 directed Sarafu \n", "2 GE Nairobi Farming/Labour NaN 2.0 directed Sarafu \n", "3 Home Farming/Labour NaN 23.0 directed Sarafu \n", "4 GE Nairobi Farming/Labour NaN 12.0 directed Sarafu \n", "\n", " token_address s_bal \\\n", "0 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 56.660892 \n", "1 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 11737.726002 \n", "2 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 7297.262576 \n", "3 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 11737.726002 \n", "4 0x0Fd6e8F2320C90e9D4b3A5bd888c4D556d20AbD4 448.000000 \n", "\n", " s_xDAI_blockchain_address t_bal \\\n", "0 0xC1697C1326fD192438515fE2F7E4cCb0C705C5d2 11737.726002 \n", "1 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 902.500000 \n", "2 0xD95954e3fCd2f09A6Be5931D24f731eFa63BF435 11737.726002 \n", "3 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 902.500000 \n", "4 0x4AfD04b9eD17759B362c8C929207Fe7ad81C39d3 11737.726002 \n", "\n", " t_xDAI_blockchain_address \n", "0 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 \n", "1 0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72 \n", "2 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 \n", "3 0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72 \n", "4 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 " ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "transactions_subset_v2.head()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# subset the data into the needed columns for clustering\n", "combined = transactions_subset_v2[['source','s_location','s_business_type','target','t_location',\n", " 't_business_type','weight','s_bal','t_bal']]" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>source</th>\n", " <th>s_location</th>\n", " <th>s_business_type</th>\n", " <th>target</th>\n", " <th>t_location</th>\n", " <th>t_business_type</th>\n", " <th>weight</th>\n", " <th>s_bal</th>\n", " <th>t_bal</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>0xC1697C1326fD192438515fE2F7E4cCb0C705C5d2</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>9007.0</td>\n", " <td>56.660892</td>\n", " <td>11737.726002</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72</td>\n", " <td>Home</td>\n", " <td>Farming/Labour</td>\n", " <td>100.0</td>\n", " <td>11737.726002</td>\n", " <td>902.500000</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>0xD95954e3fCd2f09A6Be5931D24f731eFa63BF435</td>\n", " <td>G.E</td>\n", " <td>Farming/Labour</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>2.0</td>\n", " <td>7297.262576</td>\n", " <td>11737.726002</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72</td>\n", " <td>Home</td>\n", " <td>Farming/Labour</td>\n", " <td>23.0</td>\n", " <td>11737.726002</td>\n", " <td>902.500000</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>0x4AfD04b9eD17759B362c8C929207Fe7ad81C39d3</td>\n", " <td>Test</td>\n", " <td>Health</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>12.0</td>\n", " <td>448.000000</td>\n", " <td>11737.726002</td>\n", " </tr>\n", " <tr>\n", " <th>...</th>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " </tr>\n", " <tr>\n", " <th>75162</th>\n", " <td>0x97F5165b544e0869ba3Be80D7eEe8b73a0270Dfe</td>\n", " <td>kilibole</td>\n", " <td>Farming/Labour</td>\n", " <td>0x5CAaA1f7dC13235Fe181D0307e682c387e75a6ec</td>\n", " <td>Kilibole</td>\n", " <td>Food/Water</td>\n", " <td>20.0</td>\n", " <td>0.000000</td>\n", " <td>5.000000</td>\n", " </tr>\n", " <tr>\n", " <th>75163</th>\n", " <td>0x9a05d12df366cE3aa1420c6DFFD0db9ce4ba77Fc</td>\n", " <td>Kikomani</td>\n", " <td>Food/Water</td>\n", " <td>0xb44279a1d11A2bc4b1b3D08D3BEAb8278cc86985</td>\n", " <td>Bofu</td>\n", " <td>Shop</td>\n", " <td>350.0</td>\n", " <td>0.000000</td>\n", " <td>800.000000</td>\n", " </tr>\n", " <tr>\n", " <th>75164</th>\n", " <td>0x2e44845BE57687bFdcdd26044bB7CdD575781336</td>\n", " <td>Miyani</td>\n", " <td>Shop</td>\n", " <td>0xfCF20a412eB6DD345237C7BEeBab53B424b98297</td>\n", " <td>Miyani</td>\n", " <td>Shop</td>\n", " <td>400.0</td>\n", " <td>0.000000</td>\n", " <td>800.000000</td>\n", " </tr>\n", " <tr>\n", " <th>75165</th>\n", " <td>0xAc4DB7728940e76BCd98Bb8E60671916f3B7576A</td>\n", " <td>Kilifi</td>\n", " <td>Farming/Labour</td>\n", " <td>0x2f99a653F5dc201eA97578A6a203BC4db1eaD2FF</td>\n", " <td>KIlifi</td>\n", " <td>Education</td>\n", " <td>20.0</td>\n", " <td>400.000000</td>\n", " <td>500.000000</td>\n", " </tr>\n", " <tr>\n", " <th>75166</th>\n", " <td>0x2f99a653F5dc201eA97578A6a203BC4db1eaD2FF</td>\n", " <td>KIlifi</td>\n", " <td>Education</td>\n", " <td>0xAc4DB7728940e76BCd98Bb8E60671916f3B7576A</td>\n", " <td>Kilifi</td>\n", " <td>Farming/Labour</td>\n", " <td>20.0</td>\n", " <td>500.000000</td>\n", " <td>400.000000</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>75167 rows × 9 columns</p>\n", "</div>" ], "text/plain": [ " source s_location s_business_type \\\n", "0 0xC1697C1326fD192438515fE2F7E4cCb0C705C5d2 GE Nairobi Farming/Labour \n", "1 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 GE Nairobi Farming/Labour \n", "2 0xD95954e3fCd2f09A6Be5931D24f731eFa63BF435 G.E Farming/Labour \n", "3 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 GE Nairobi Farming/Labour \n", "4 0x4AfD04b9eD17759B362c8C929207Fe7ad81C39d3 Test Health \n", "... ... ... ... \n", "75162 0x97F5165b544e0869ba3Be80D7eEe8b73a0270Dfe kilibole Farming/Labour \n", "75163 0x9a05d12df366cE3aa1420c6DFFD0db9ce4ba77Fc Kikomani Food/Water \n", "75164 0x2e44845BE57687bFdcdd26044bB7CdD575781336 Miyani Shop \n", "75165 0xAc4DB7728940e76BCd98Bb8E60671916f3B7576A Kilifi Farming/Labour \n", "75166 0x2f99a653F5dc201eA97578A6a203BC4db1eaD2FF KIlifi Education \n", "\n", " target t_location t_business_type \\\n", "0 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 GE Nairobi Farming/Labour \n", "1 0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72 Home Farming/Labour \n", "2 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 GE Nairobi Farming/Labour \n", "3 0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72 Home Farming/Labour \n", "4 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 GE Nairobi Farming/Labour \n", "... ... ... ... \n", "75162 0x5CAaA1f7dC13235Fe181D0307e682c387e75a6ec Kilibole Food/Water \n", "75163 0xb44279a1d11A2bc4b1b3D08D3BEAb8278cc86985 Bofu Shop \n", "75164 0xfCF20a412eB6DD345237C7BEeBab53B424b98297 Miyani Shop \n", "75165 0x2f99a653F5dc201eA97578A6a203BC4db1eaD2FF KIlifi Education \n", "75166 0xAc4DB7728940e76BCd98Bb8E60671916f3B7576A Kilifi Farming/Labour \n", "\n", " weight s_bal t_bal \n", "0 9007.0 56.660892 11737.726002 \n", "1 100.0 11737.726002 902.500000 \n", "2 2.0 7297.262576 11737.726002 \n", "3 23.0 11737.726002 902.500000 \n", "4 12.0 448.000000 11737.726002 \n", "... ... ... ... \n", "75162 20.0 0.000000 5.000000 \n", "75163 350.0 0.000000 800.000000 \n", "75164 400.0 0.000000 800.000000 \n", "75165 20.0 400.000000 500.000000 \n", "75166 20.0 500.000000 400.000000 \n", "\n", "[75167 rows x 9 columns]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "combined" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "source = combined.source.values\n", "target = combined.target.values\n", "# remove the source and target variables for clustering\n", "del combined['source']\n", "del combined['target']" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "# create dummy variables of the categorical variables \n", "updated = pd.get_dummies(combined)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# define how many clusters to test\n", "clustersToTest = [10,20,25,30,40,50]\n", "# calculate the optimal number of clusters using the Gap Statistic -https://statweb.stanford.edu/~gwalther/gap\n", "optimalK = OptimalK(parallel_backend='joblib')\n", "n_clusters = optimalK(X=updated, cluster_array=clustersToTest)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>n_clusters</th>\n", " <th>gap_value</th>\n", " <th>gap*</th>\n", " <th>ref_dispersion_std</th>\n", " <th>sk</th>\n", " <th>sk*</th>\n", " <th>diff</th>\n", " <th>diff*</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>10.0</td>\n", " <td>3.363615</td>\n", " <td>1.414036e+14</td>\n", " <td>2.510135e+12</td>\n", " <td>0.019816</td>\n", " <td>1.633046e+14</td>\n", " <td>0.200252</td>\n", " <td>1.555745e+14</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>20.0</td>\n", " <td>3.177815</td>\n", " <td>9.154344e+13</td>\n", " <td>1.200491e+12</td>\n", " <td>0.014451</td>\n", " <td>1.057143e+14</td>\n", " <td>0.187308</td>\n", " <td>1.033105e+14</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>25.0</td>\n", " <td>3.001553</td>\n", " <td>7.603468e+13</td>\n", " <td>7.675192e+11</td>\n", " <td>0.011046</td>\n", " <td>8.780176e+13</td>\n", " <td>0.106216</td>\n", " <td>8.643467e+13</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>30.0</td>\n", " <td>2.904411</td>\n", " <td>6.720920e+13</td>\n", " <td>5.602132e+11</td>\n", " <td>0.009074</td>\n", " <td>7.760920e+13</td>\n", " <td>0.230329</td>\n", " <td>7.539618e+13</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>40.0</td>\n", " <td>2.686358</td>\n", " <td>5.289592e+13</td>\n", " <td>6.017818e+11</td>\n", " <td>0.012277</td>\n", " <td>6.108290e+13</td>\n", " <td>-1.248115</td>\n", " <td>6.018132e+13</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " n_clusters gap_value gap* ref_dispersion_std sk \\\n", "0 10.0 3.363615 1.414036e+14 2.510135e+12 0.019816 \n", "1 20.0 3.177815 9.154344e+13 1.200491e+12 0.014451 \n", "2 25.0 3.001553 7.603468e+13 7.675192e+11 0.011046 \n", "3 30.0 2.904411 6.720920e+13 5.602132e+11 0.009074 \n", "4 40.0 2.686358 5.289592e+13 6.017818e+11 0.012277 \n", "\n", " sk* diff diff* \n", "0 1.633046e+14 0.200252 1.555745e+14 \n", "1 1.057143e+14 0.187308 1.033105e+14 \n", "2 8.780176e+13 0.106216 8.643467e+13 \n", "3 7.760920e+13 0.230329 7.539618e+13 \n", "4 6.108290e+13 -1.248115 6.018132e+13 " ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "optimalK.gap_df.head()" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(optimalK.gap_df.n_clusters, optimalK.gap_df.gap_value, linewidth=3)\n", "plt.scatter(optimalK.gap_df[optimalK.gap_df.n_clusters == n_clusters].n_clusters,\n", " optimalK.gap_df[optimalK.gap_df.n_clusters == n_clusters].gap_value, s=250, c='r')\n", "plt.grid(True)\n", "plt.text(20, 4, 'Clusters: {}'.format(str(clustersToTest)), horizontalalignment='center',verticalalignment='center')\n", "plt.xlabel('Cluster Count')\n", "plt.ylabel('Gap Value')\n", "plt.title('Gap Values by Cluster Count')\n", "plt.savefig('gap_statistic.png')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compute clusters based off of the following features:\n", "* s_location\n", "* s_business_type\n", "* t_location\n", "* t_business_type\n", "* weight, which is tokens exchange\n", "* s_bal\n", "* t_bal\n", "\n", "\n", "\"The KMeans algorithm clusters data by trying to separate samples in n groups of equal variance, minimizing a criterion known as the inertia or within-cluster sum-of-squares (see below). This algorithm requires the number of clusters to be specified. It scales well to large number of samples and has been used across a large range of application areas in many different fields.\n", "\n", "The k-means algorithm divides a set of samples into disjoint clusters , each described by the mean \n", " of the samples in the cluster. The means are commonly called the cluster “centroids”; note that they are not, in general, points from , although they live in the same space.\" - https://scikit-learn.org/stable/modules/clustering.html#k-means" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/aclarkdata/anaconda3/lib/python3.7/site-packages/sklearn/cluster/_kmeans.py:974: FutureWarning: 'n_jobs' was deprecated in version 0.23 and will be removed in 0.25.\n", " \" removed in 0.25.\", FutureWarning)\n" ] } ], "source": [ "kmeans = KMeans(n_clusters=50, random_state=1,n_jobs=-1).fit(updated.values)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/aclarkdata/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " \n" ] } ], "source": [ "# add the clusters back to the combined dataframe\n", "combined['cluster'] = kmeans.labels_" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/aclarkdata/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " \n", "/home/aclarkdata/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:3: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " This is separate from the ipykernel package so we can avoid doing imports until\n" ] } ], "source": [ "# add back the source and target variables\n", "combined['source'] = source\n", "combined['target'] = target" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>s_location</th>\n", " <th>s_business_type</th>\n", " <th>t_location</th>\n", " <th>t_business_type</th>\n", " <th>weight</th>\n", " <th>s_bal</th>\n", " <th>t_bal</th>\n", " <th>cluster</th>\n", " <th>source</th>\n", " <th>target</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>9007.0</td>\n", " <td>56.660892</td>\n", " <td>11737.726002</td>\n", " <td>13</td>\n", " <td>0xC1697C1326fD192438515fE2F7E4cCb0C705C5d2</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>Home</td>\n", " <td>Farming/Labour</td>\n", " <td>100.0</td>\n", " <td>11737.726002</td>\n", " <td>902.500000</td>\n", " <td>12</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>G.E</td>\n", " <td>Farming/Labour</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>2.0</td>\n", " <td>7297.262576</td>\n", " <td>11737.726002</td>\n", " <td>48</td>\n", " <td>0xD95954e3fCd2f09A6Be5931D24f731eFa63BF435</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>Home</td>\n", " <td>Farming/Labour</td>\n", " <td>23.0</td>\n", " <td>11737.726002</td>\n", " <td>902.500000</td>\n", " <td>12</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " <td>0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>Test</td>\n", " <td>Health</td>\n", " <td>GE Nairobi</td>\n", " <td>Farming/Labour</td>\n", " <td>12.0</td>\n", " <td>448.000000</td>\n", " <td>11737.726002</td>\n", " <td>13</td>\n", " <td>0x4AfD04b9eD17759B362c8C929207Fe7ad81C39d3</td>\n", " <td>0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " s_location s_business_type t_location t_business_type weight \\\n", "0 GE Nairobi Farming/Labour GE Nairobi Farming/Labour 9007.0 \n", "1 GE Nairobi Farming/Labour Home Farming/Labour 100.0 \n", "2 G.E Farming/Labour GE Nairobi Farming/Labour 2.0 \n", "3 GE Nairobi Farming/Labour Home Farming/Labour 23.0 \n", "4 Test Health GE Nairobi Farming/Labour 12.0 \n", "\n", " s_bal t_bal cluster \\\n", "0 56.660892 11737.726002 13 \n", "1 11737.726002 902.500000 12 \n", "2 7297.262576 11737.726002 48 \n", "3 11737.726002 902.500000 12 \n", "4 448.000000 11737.726002 13 \n", "\n", " source \\\n", "0 0xC1697C1326fD192438515fE2F7E4cCb0C705C5d2 \n", "1 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 \n", "2 0xD95954e3fCd2f09A6Be5931D24f731eFa63BF435 \n", "3 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 \n", "4 0x4AfD04b9eD17759B362c8C929207Fe7ad81C39d3 \n", "\n", " target \n", "0 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 \n", "1 0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72 \n", "2 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 \n", "3 0x4AB73CfaC1732a9DcD74BdB4C9605f21832D7C72 \n", "4 0xBAB77A20a757e8438DfaBF01D5F36DD12d862B31 " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "combined.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Calculate and plot Two PCA components of the data." ] }, { "cell_type": "code", "execution_count": 165, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZQAAAD8CAYAAABQFVIjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi41LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvSM8oowAAIABJREFUeJzsnXmclNWV97+31l7phYaWnUYFZBGEFlBAwQ0dnSQmajQmaiJj5lWTODNJdOadRMfRCc4YE2OIeZ1olMTEBKLRLIoaaRXjAnQAAUGQvVmaXumt1ue+f9ynuqtr6a7url7oPt/Ppz5dde7z3KXQ51f3nnPPVVprBEEQBKGnOPq7A4IgCMLgQARFEARBSAsiKIIgCEJaEEERBEEQ0oIIiiAIgpAWRFAEQRCEtCCCIgiCIKQFERRBEAQhLYigCIIgCGnB1d8dSDdFRUV64sSJfd5uU1MT2dnZfd5ufyBjHZwMpbHC0BpvKmPdtGlTldZ6RE/aGXSCMnHiRDZu3Njn7ZaVlbFkyZI+b7c/kLEOTobSWGFojTeVsSqlDvS0HVnyEgRBENKCCIogCIKQFkRQBEEQhLQggiIIgiCkBREUQRAEIS2IoAiCIAhpQQRFEARBSAuDbh9Kv1JTA6EQuFyQnw8OW68tC+rqEpelUi4IgnAKIILSE5qbobwc1q+HUaNg1SpQCrQ25W63+RsKGVukzOWCsWOhqAiqq+HQIXNNdPmkSbBoEcydC5mZ/TdGYUhw7Ngx7r//fm699Vby8/MpLi7mhz/8IR6Ph6uuuopt27Z1uc6nn36ayy67jNGjR/dCj9NHbD8jm6OLior6tA8bN27kxz/+cYfXdda3uro6fvWrX3H77bf3Rjc7RQSlO4TDsG4drF4NgQAMGwbjx5uXZcG+fbB9O7S0mOszMmDmTIikhNmzx9zr84HXC7Nmwemnt81KQiE4ehSefBJ+8Qu49lpYuhSczn4ZrjC40Vpz9dVXc9555/HGG28AsGXLFo4fP864ceO6Xe/TTz/NjBkzuiQooVAIl6vnjyWtNVprHCnM9LvTz1RI11i6Ql1dHT/5yU/6TVBkXaWr1NfDQw+Z2UhhIUyYAAUFZnbh88E778DWrZCVBcXF5pWdDVu2wJtvmtf27ZCXB2PGmOWtbdvMfT6facPlMnVOmGDaWLXKtFlf379jFwYl69atw+1286lPfarVNmvWLBYvXtzuuqeffpo777yz9fNVV11FWVkZ4XCYW265hRkzZjBz5kx+8IMfsGbNGjZu3MiNN97I7NmzaWlpYdOmTVx44YXMnTuXZcuWcfToUQCWLFnCXXfdRWlpKY8++iirV69mxowZzJo1iwsuuCCuv42NjVx88cXMmTOHmTNn8uKLLwKwf/9+pkyZwk033cSMGTM4dOgQr776Kueddx5z5szh2muvpbGxsV1difoJ8Nhjj7XWv3PnTsDkw/rKV77CvHnzOOecc1rbjaasrIzFixfzqU99imnTpgHwy1/+knnz5jF79my++tWvEg6HAfj5z3/O5MmTmTdvHu+8807Cf5vq6mouu+wypk+fzvLly9GR1Q/gkUceYcaMGcyYMYMf/vCHANxzzz188sknzJ49m29961scPXqUCy64gOXLlzNjxgzefvvthO2kC5mhdIX6elixAqqqoKTEiEgEyzJLX83NRiSiy1wuyMmBXbvM59NPN7ZIWX4+1Naa+xctMjOaCF6vaWvfPtP2PfcYMRKENLFt2zbmzp3b7fs3b95MRUVF67JYXV0d+fn5/PjHP+bhhx+mtLSUYDDI1772NV588UVGjBjBb37zG/7v//2/PPXUUwAEAoHWHHwzZ85k7dq1jBkzhrq6urj2MjIyeOGFFxg2bBhVVVUsWLCgVQx3797NM888w4IFC6iqquKBBx7g9ddfJzs7m4ceeohHHnmE7373u611XXPNNe36GaGoqIjy8nJ+8pOf8PDDD/Ozn/2MBx98kIsuuoinnnqKuro65s2bxyWXXBKXdLG8vJxt27ZRUlLCRx99xG9+8xveeecd3G43t99+O88++yyXXnop9957L5s2bSIvL4+lS5dyzjnnxI31P/7jP1i0aBHf/e53+dOf/sSTTz4JwKZNm/j5z3/O+++/j9aa+fPnc+GFF7JixQq2bdvG5s2bAfj+97/PsmXLWLhwIYsXL6a5ubnb/86pIIKSKuEwrFxpxGTMmPZllgVNTUZMhg2Lv1drOHKkTWSOHDHLY5HPSpn7Tp6EDRtg4cL2TnmlTJsVFaYPd98ty1/CgGHSpEns3buXr33ta1x55ZVcdtllcdfs2rWLbdu2cemllwIQDocZNWpUa/nnP//51vcLFy7klltu4brrruOzn/1sXF1aa/7t3/6N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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Create a PCA instance: pca\n", "pca = PCA(n_components=2)\n", "principalComponents = pca.fit_transform(updated\n", " )\n", "df = pd.DataFrame(principalComponents)\n", "\n", "df['label'] = kmeans.labels_\n", "colors = plt.cm.Spectral(np.linspace(0, 1, len(df.label.unique())))\n", "\n", "for color, label in zip(colors, df.label.unique()):\n", " \n", " tempdf = df[df.label == label]\n", " plt.scatter(tempdf[0], tempdf[1], c=color)\n", " \n", "plt.scatter(kmeans.cluster_centers_[:,0], kmeans.cluster_centers_[:, 1], c='r', s=500, alpha=0.5,)\n", "plt.grid(True)\n", "plt.text(200000, 260000, 'Clusters are the red dots', horizontalalignment='center',verticalalignment='center')\n", "plt.savefig('pca.png')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Descriptive statistics \n", "\n", "Calculate relevant statistics, such as median, mean, etc for creating probability distributions in the subpopulation model." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>weight</th>\n", " <th>s_bal</th>\n", " <th>t_bal</th>\n", " </tr>\n", " <tr>\n", " <th>cluster</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>217.737536</td>\n", " <td>332.674357</td>\n", " <td>3122.710726</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>588.111940</td>\n", " <td>793.864819</td>\n", " <td>251651.998315</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>957.820312</td>\n", " <td>7089.179214</td>\n", " <td>21755.181601</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>349.925309</td>\n", " <td>516.042937</td>\n", " <td>64166.491418</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>455.317844</td>\n", " <td>64995.360511</td>\n", " <td>751.148124</td>\n", " </tr>\n", " <tr>\n", " <th>5</th>\n", " <td>2443.890625</td>\n", " <td>251651.998315</td>\n", " <td>1746.597767</td>\n", " </tr>\n", " <tr>\n", " <th>6</th>\n", " <td>586.917409</td>\n", " <td>1022.866799</td>\n", " <td>38404.821609</td>\n", " </tr>\n", " <tr>\n", " <th>7</th>\n", " <td>1533.448040</td>\n", " <td>23214.200804</td>\n", " <td>1469.670862</td>\n", " </tr>\n", " <tr>\n", " <th>8</th>\n", " <td>408.100000</td>\n", " <td>895.817336</td>\n", " <td>100579.182676</td>\n", " </tr>\n", " <tr>\n", " <th>9</th>\n", " <td>1468.701299</td>\n", " <td>64148.612782</td>\n", " <td>22314.167052</td>\n", " </tr>\n", " <tr>\n", " <th>10</th>\n", " <td>271.261258</td>\n", " <td>573.611940</td>\n", " <td>1152.574038</td>\n", " </tr>\n", " <tr>\n", " <th>11</th>\n", " <td>365.099390</td>\n", " <td>406.400941</td>\n", " <td>14410.774177</td>\n", " </tr>\n", " <tr>\n", " <th>12</th>\n", " <td>790.907135</td>\n", " <td>11235.023756</td>\n", " <td>956.054517</td>\n", " </tr>\n", " <tr>\n", " <th>13</th>\n", " <td>433.822322</td>\n", " <td>537.032863</td>\n", " <td>9837.111302</td>\n", " </tr>\n", " <tr>\n", " <th>14</th>\n", " <td>8074.000000</td>\n", " <td>251651.998315</td>\n", " <td>121082.429001</td>\n", " </tr>\n", " <tr>\n", " <th>15</th>\n", " <td>1187.972973</td>\n", " <td>9402.471887</td>\n", " <td>55225.482860</td>\n", " </tr>\n", " <tr>\n", " <th>16</th>\n", " <td>15562.500000</td>\n", " <td>121082.429001</td>\n", " <td>50899.750788</td>\n", " </tr>\n", " <tr>\n", " <th>17</th>\n", " <td>389.501989</td>\n", " <td>401.109603</td>\n", " <td>25436.848041</td>\n", " </tr>\n", " <tr>\n", " <th>18</th>\n", " <td>4298.095238</td>\n", " <td>34136.137502</td>\n", " <td>62137.100395</td>\n", " </tr>\n", " <tr>\n", " <th>19</th>\n", " <td>80000.000000</td>\n", " <td>63145.960000</td>\n", " <td>121082.429001</td>\n", " </tr>\n", " <tr>\n", " <th>20</th>\n", " <td>8978.181818</td>\n", " <td>44220.000308</td>\n", " <td>121082.429001</td>\n", " </tr>\n", " <tr>\n", " <th>21</th>\n", " <td>1039.047619</td>\n", " <td>100579.182676</td>\n", " <td>1313.687026</td>\n", " </tr>\n", " <tr>\n", " <th>22</th>\n", " <td>302.688709</td>\n", " <td>2335.376506</td>\n", " <td>576.133882</td>\n", " </tr>\n", " <tr>\n", " <th>23</th>\n", " <td>374.248656</td>\n", " <td>529.628969</td>\n", " <td>31342.309668</td>\n", " </tr>\n", " <tr>\n", " <th>24</th>\n", " <td>1631.845550</td>\n", " <td>38576.683107</td>\n", " <td>1335.521733</td>\n", " </tr>\n", " <tr>\n", " <th>25</th>\n", " <td>1962.083333</td>\n", " <td>63573.309892</td>\n", " <td>43986.716465</td>\n", " </tr>\n", " <tr>\n", " <th>26</th>\n", " <td>285.848711</td>\n", " <td>848.769339</td>\n", " <td>18260.218613</td>\n", " </tr>\n", " <tr>\n", " <th>27</th>\n", " <td>37712.500000</td>\n", " <td>15293.127761</td>\n", " <td>6721.732034</td>\n", " </tr>\n", " <tr>\n", " <th>28</th>\n", " <td>1941.818182</td>\n", " <td>45110.659482</td>\n", " <td>251651.998315</td>\n", " </tr>\n", " <tr>\n", " <th>29</th>\n", " <td>468.716263</td>\n", " <td>17535.443217</td>\n", " <td>791.779968</td>\n", " </tr>\n", " <tr>\n", " <th>30</th>\n", " <td>3240.503052</td>\n", " <td>862.117155</td>\n", " <td>993.258934</td>\n", " </tr>\n", " <tr>\n", " <th>31</th>\n", " <td>1236.973333</td>\n", " <td>15340.314634</td>\n", " <td>39194.641356</td>\n", " </tr>\n", " <tr>\n", " <th>32</th>\n", " <td>1408.134556</td>\n", " <td>15404.220436</td>\n", " <td>68353.725751</td>\n", " </tr>\n", " <tr>\n", " <th>33</th>\n", " <td>317.344987</td>\n", " <td>336.022102</td>\n", " <td>6084.374342</td>\n", " </tr>\n", " <tr>\n", " <th>34</th>\n", " <td>404.778700</td>\n", " <td>594.851729</td>\n", " <td>44619.093968</td>\n", " </tr>\n", " <tr>\n", " <th>35</th>\n", " <td>482.002628</td>\n", " <td>4479.433066</td>\n", " <td>4557.371287</td>\n", " </tr>\n", " <tr>\n", " <th>36</th>\n", " <td>3593.148148</td>\n", " <td>3569.248851</td>\n", " <td>121082.429001</td>\n", " </tr>\n", " <tr>\n", " <th>37</th>\n", " <td>9354.545455</td>\n", " <td>121082.429001</td>\n", " <td>2014.247057</td>\n", " </tr>\n", " <tr>\n", " <th>38</th>\n", " <td>14338.571429</td>\n", " <td>251651.998315</td>\n", " <td>60154.599923</td>\n", " </tr>\n", " <tr>\n", " <th>39</th>\n", " <td>503.700787</td>\n", " <td>928.528786</td>\n", " <td>71742.725832</td>\n", " </tr>\n", " <tr>\n", " <th>40</th>\n", " <td>175.678483</td>\n", " <td>294.939972</td>\n", " <td>271.114703</td>\n", " </tr>\n", " <tr>\n", " <th>41</th>\n", " <td>1302.072607</td>\n", " <td>12999.924780</td>\n", " <td>7072.339809</td>\n", " </tr>\n", " <tr>\n", " <th>42</th>\n", " <td>387.122709</td>\n", " <td>697.305678</td>\n", " <td>21694.464157</td>\n", " </tr>\n", " <tr>\n", " <th>43</th>\n", " <td>437.794249</td>\n", " <td>568.978270</td>\n", " <td>55748.221328</td>\n", " </tr>\n", " <tr>\n", " <th>44</th>\n", " <td>11678.857143</td>\n", " <td>4067.108100</td>\n", " <td>4226.813826</td>\n", " </tr>\n", " <tr>\n", " <th>45</th>\n", " <td>548.573207</td>\n", " <td>6283.897324</td>\n", " <td>679.334775</td>\n", " </tr>\n", " <tr>\n", " <th>46</th>\n", " <td>13100.037736</td>\n", " <td>4238.100340</td>\n", " <td>28746.781097</td>\n", " </tr>\n", " <tr>\n", " <th>47</th>\n", " <td>32377.777778</td>\n", " <td>59578.441515</td>\n", " <td>14515.326330</td>\n", " </tr>\n", " <tr>\n", " <th>48</th>\n", " <td>772.342169</td>\n", " <td>4772.491359</td>\n", " <td>12047.885243</td>\n", " </tr>\n", " <tr>\n", " <th>49</th>\n", " <td>3661.085106</td>\n", " <td>30063.054365</td>\n", " <td>19776.065227</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " weight s_bal t_bal\n", "cluster \n", "0 217.737536 332.674357 3122.710726\n", "1 588.111940 793.864819 251651.998315\n", "2 957.820312 7089.179214 21755.181601\n", "3 349.925309 516.042937 64166.491418\n", "4 455.317844 64995.360511 751.148124\n", "5 2443.890625 251651.998315 1746.597767\n", "6 586.917409 1022.866799 38404.821609\n", "7 1533.448040 23214.200804 1469.670862\n", "8 408.100000 895.817336 100579.182676\n", "9 1468.701299 64148.612782 22314.167052\n", "10 271.261258 573.611940 1152.574038\n", "11 365.099390 406.400941 14410.774177\n", "12 790.907135 11235.023756 956.054517\n", "13 433.822322 537.032863 9837.111302\n", "14 8074.000000 251651.998315 121082.429001\n", "15 1187.972973 9402.471887 55225.482860\n", "16 15562.500000 121082.429001 50899.750788\n", "17 389.501989 401.109603 25436.848041\n", "18 4298.095238 34136.137502 62137.100395\n", "19 80000.000000 63145.960000 121082.429001\n", "20 8978.181818 44220.000308 121082.429001\n", "21 1039.047619 100579.182676 1313.687026\n", "22 302.688709 2335.376506 576.133882\n", "23 374.248656 529.628969 31342.309668\n", "24 1631.845550 38576.683107 1335.521733\n", "25 1962.083333 63573.309892 43986.716465\n", "26 285.848711 848.769339 18260.218613\n", "27 37712.500000 15293.127761 6721.732034\n", "28 1941.818182 45110.659482 251651.998315\n", "29 468.716263 17535.443217 791.779968\n", "30 3240.503052 862.117155 993.258934\n", "31 1236.973333 15340.314634 39194.641356\n", "32 1408.134556 15404.220436 68353.725751\n", "33 317.344987 336.022102 6084.374342\n", "34 404.778700 594.851729 44619.093968\n", "35 482.002628 4479.433066 4557.371287\n", "36 3593.148148 3569.248851 121082.429001\n", "37 9354.545455 121082.429001 2014.247057\n", "38 14338.571429 251651.998315 60154.599923\n", "39 503.700787 928.528786 71742.725832\n", "40 175.678483 294.939972 271.114703\n", "41 1302.072607 12999.924780 7072.339809\n", "42 387.122709 697.305678 21694.464157\n", "43 437.794249 568.978270 55748.221328\n", "44 11678.857143 4067.108100 4226.813826\n", "45 548.573207 6283.897324 679.334775\n", "46 13100.037736 4238.100340 28746.781097\n", "47 32377.777778 59578.441515 14515.326330\n", "48 772.342169 4772.491359 12047.885243\n", "49 3661.085106 30063.054365 19776.065227" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "combined.groupby('cluster').mean()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# compute median, Q1,Q3, mean, and sigma\n", "clustersMedianSourceBalance = []\n", "clusters1stQSourceBalance = []\n", "clusters3rdQSourceBalance = []\n", "clustersMu = []\n", "clustersSigma = []\n", "for i in range(0,len(combined.cluster.unique())):\n", " temp = combined[combined['cluster']==i]\n", " clustersMu.append(round(temp.weight.mean(),2))\n", " clustersSigma.append(round(temp.weight.std(),2))\n", " clustersMedianSourceBalance.append(round(temp.weight.median(),2))\n", " clusters1stQSourceBalance.append(round(temp.s_bal.quantile(0.25),2))\n", " clusters3rdQSourceBalance.append(round(temp.s_bal.quantile(0.75),2))\n", " \n" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "clusters = []\n", "for i in range(0,len(combined.cluster.unique())):\n", " clusters.append(str(i))\n", " \n", " \n", "mixingAgents = clusters.copy()\n", "mixingAgents.append('external')" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "UtilityTypesOrdered = {}\n", "for i in range(0,len(combined.cluster.unique())):\n", " UtilityTypesOrdered[str(i)] = dict(zip(list(combined[combined['cluster']==i].t_business_type.value_counts(normalize=True).to_dict().keys()),list(combined[combined['cluster']==i].t_business_type.value_counts(normalize=True).to_dict().values())))\n", " \n", "UtilityTypesOrdered['external'] = {'Food/Water':1,\n", " 'Fuel/Energy':2,\n", " 'Health':3,\n", " 'Education':4,\n", " 'Savings Group':5,\n", " 'Shop':6}\n" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "utilityTypesProbability = {}\n", "for i in range(0,len(combined.cluster.unique())):\n", " utilityTypesProbability[str(i)] = combined[combined['cluster']==i].t_business_type.value_counts(normalize=True).to_dict()\n", " \n", " \n", "utilityTypesProbability['external'] = {'Food/Water':0.6,\n", " 'Fuel/Energy':0.10,\n", " 'Health':0.03,\n", " 'Education':0.015,\n", " 'Savings Group':0.065,\n", " 'Shop':0.19}\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Create initilization file (copy from here) \n", "\n", "clusters = ['0',\n", " '1',\n", " '2',\n", " '3',\n", " '4',\n", " '5',\n", " '6',\n", " '7',\n", " '8',\n", " '9',\n", " '10',\n", " '11',\n", " '12',\n", " '13',\n", " '14',\n", " '15',\n", " '16',\n", " '17',\n", " '18',\n", " '19',\n", " '20',\n", " '21',\n", " '22',\n", " '23',\n", " '24',\n", " '25',\n", " '26',\n", " '27',\n", " '28',\n", " '29',\n", " '30',\n", " '31',\n", " '32',\n", " '33',\n", " '34',\n", " '35',\n", " '36',\n", " '37',\n", " '38',\n", " '39',\n", " '40',\n", " '41',\n", " '42',\n", " '43',\n", " '44',\n", " '45',\n", " '46',\n", " '47',\n", " '48',\n", " '49']\n", "\n", "mixingAgents = ['0',\n", " '1',\n", " '2',\n", " '3',\n", " '4',\n", " '5',\n", " '6',\n", " '7',\n", " '8',\n", " '9',\n", " '10',\n", " '11',\n", " '12',\n", " '13',\n", " '14',\n", " '15',\n", " '16',\n", " '17',\n", " '18',\n", " '19',\n", " '20',\n", " '21',\n", " '22',\n", " '23',\n", " '24',\n", " '25',\n", " '26',\n", " '27',\n", " '28',\n", " '29',\n", " '30',\n", " '31',\n", " '32',\n", " '33',\n", " '34',\n", " '35',\n", " '36',\n", " '37',\n", " '38',\n", " '39',\n", " '40',\n", " '41',\n", " '42',\n", " '43',\n", " '44',\n", " '45',\n", " '46',\n", " '47',\n", " '48',\n", " '49',\n", " 'external']\n", "\n", "\n", "clustersMedianSourceBalance = [150.0,\n", " 340.0,\n", " 250.0,\n", " 20.0,\n", " 330.0,\n", " 320.0,\n", " 240.0,\n", " 300.0,\n", " 300.0,\n", " 50.0,\n", " 900.0,\n", " 120.0,\n", " 400.0,\n", " 180.0,\n", " 300.0,\n", " 6000.0,\n", " 132.5,\n", " 130.0,\n", " 160.0,\n", " 5000.0,\n", " 150.0,\n", " 10000.0,\n", " 200.0,\n", " 10000.0,\n", " 200.0,\n", " 200.0,\n", " 35000.0,\n", " 20000.0,\n", " 100.0,\n", " 500.0,\n", " 425.0,\n", " 13320.0,\n", " 500.0,\n", " 500.0,\n", " 1000.0,\n", " 390.0,\n", " 150.0,\n", " 250.0,\n", " 45000.0,\n", " 36300.0,\n", " 960.0,\n", " 120.0,\n", " 200.0,\n", " 100.0,\n", " 220.0,\n", " 600.0,\n", " 62000.0,\n", " 500.0,\n", " 900.0,\n", " 486.0]\n", "\n", "clusters1stQSourceBalance = [56.0,\n", " 118.46,\n", " 105.0,\n", " 64767.51,\n", " 251652.0,\n", " 124.5,\n", " 4139.28,\n", " 146.1,\n", " 1002.5,\n", " 17145.78,\n", " 52676.2,\n", " 100.0,\n", " 121082.43,\n", " 112.0,\n", " 28849.43,\n", " 27619.22,\n", " 66.36,\n", " 251652.0,\n", " 148.0,\n", " 38653.54,\n", " 67.22,\n", " 121082.43,\n", " 6429.46,\n", " 555.04,\n", " 104.48,\n", " 96.43,\n", " 52676.2,\n", " 251652.0,\n", " 64.73,\n", " 36824.5,\n", " 15182.03,\n", " 485.94,\n", " 21660.89,\n", " 11210.0,\n", " 100579.18,\n", " 100.46,\n", " 2845.01,\n", " 3338.98,\n", " 1274.91,\n", " 6724.88,\n", " 38653.54,\n", " 114.5,\n", " 68.0,\n", " 100.0,\n", " 20.93,\n", " 14050.3,\n", " 63145.96,\n", " 9276.23,\n", " 63234.8,\n", " 64767.51]\n", "\n", "clusters3rdQSourceBalance = [403.96,\n", " 506.6,\n", " 592.96,\n", " 64767.51,\n", " 251652.0,\n", " 1501.41,\n", " 7214.9,\n", " 869.82,\n", " 1557.01,\n", " 18304.36,\n", " 55142.93,\n", " 419.96,\n", " 121082.43,\n", " 816.3,\n", " 38653.54,\n", " 37106.89,\n", " 770.65,\n", " 251652.0,\n", " 838.46,\n", " 38653.54,\n", " 315.0,\n", " 121082.43,\n", " 9074.79,\n", " 5726.66,\n", " 602.02,\n", " 437.96,\n", " 63234.8,\n", " 251652.0,\n", " 425.0,\n", " 40953.15,\n", " 17145.78,\n", " 6349.27,\n", " 25695.83,\n", " 13156.46,\n", " 100579.18,\n", " 819.33,\n", " 4158.5,\n", " 5597.38,\n", " 2823.81,\n", " 20030.91,\n", " 51710.52,\n", " 537.94,\n", " 542.92,\n", " 415.43,\n", " 895.66,\n", " 18304.36,\n", " 63145.96,\n", " 14050.3,\n", " 64767.51,\n", " 64767.51]\n", "\n", "clustersMu = [329.98,\n", " 588.11,\n", " 469.93,\n", " 492.32,\n", " 2443.89,\n", " 565.21,\n", " 1120.5,\n", " 408.1,\n", " 550.09,\n", " 503.42,\n", " 2478.89,\n", " 349.93,\n", " 9354.55,\n", " 453.69,\n", " 4298.1,\n", " 7508.1,\n", " 376.86,\n", " 8074.0,\n", " 333.75,\n", " 7691.43,\n", " 362.68,\n", " 15562.5,\n", " 672.28,\n", " 10809.6,\n", " 274.98,\n", " 405.46,\n", " 34555.56,\n", " 14338.57,\n", " 255.48,\n", " 1229.44,\n", " 1470.23,\n", " 14590.61,\n", " 1527.75,\n", " 770.73,\n", " 1039.05,\n", " 503.7,\n", " 362.11,\n", " 499.51,\n", " 45000.0,\n", " 37504.55,\n", " 1941.82,\n", " 262.96,\n", " 702.23,\n", " 168.57,\n", " 2000.58,\n", " 1383.32,\n", " 65333.33,\n", " 1454.43,\n", " 1483.11,\n", " 1853.03]\n", "\n", "clustersSigma = [583.23,\n", " 1501.26,\n", " 966.32,\n", " 1452.2,\n", " 6789.39,\n", " 847.29,\n", " 2228.12,\n", " 483.5,\n", " 852.2,\n", " 1170.38,\n", " 3256.26,\n", " 1174.55,\n", " 16235.99,\n", " 841.35,\n", " 7696.91,\n", " 6814.68,\n", " 785.21,\n", " 10886.9,\n", " 712.65,\n", " 8713.11,\n", " 708.54,\n", " 18542.24,\n", " 1164.0,\n", " 3682.08,\n", " 340.99,\n", " 624.76,\n", " 8171.77,\n", " 15060.34,\n", " 461.52,\n", " 1774.39,\n", " 4617.97,\n", " 4770.82,\n", " 2641.75,\n", " 1133.41,\n", " 767.87,\n", " 437.68,\n", " 652.72,\n", " 761.07,\n", " 7071.07,\n", " 5274.96,\n", " 2716.8,\n", " 572.43,\n", " 1553.21,\n", " 210.61,\n", " 4477.94,\n", " 1798.73,\n", " 31134.12,\n", " 2147.9,\n", " 1900.27,\n", " 2909.68]\n", "\n", "\n", "# nested dictionary\n", "UtilityTypesOrdered = {'0': {'Food/Water': 0.4119323241317899,\n", " 'Farming/Labour': 0.26090828138913624,\n", " 'Shop': 0.17916295636687443,\n", " 'Savings Group': 0.07266251113089937,\n", " 'Fuel/Energy': 0.034194122885129116,\n", " 'Transport': 0.02617987533392698,\n", " 'Health': 0.006767586821015138,\n", " 'Education': 0.004096170970614425,\n", " 'None': 0.004096170970614425},\n", " '1': {'Food/Water': 1.0},\n", " '2': {'Savings Group': 0.87890625,\n", " 'Health': 0.08984375,\n", " 'Food/Water': 0.03125},\n", " '3': {'Savings Group': 0.4905964535196131,\n", " 'Farming/Labour': 0.3610961848468565,\n", " 'Food/Water': 0.14830736163353037},\n", " '4': {'Farming/Labour': 0.2843866171003718,\n", " 'Shop': 0.25650557620817843,\n", " 'Fuel/Energy': 0.17843866171003717,\n", " 'Food/Water': 0.16171003717472118,\n", " 'None': 0.10966542750929369,\n", " 'Savings Group': 0.0055762081784386614,\n", " 'Transport': 0.0037174721189591076},\n", " '5': {'Farming/Labour': 0.421875,\n", " 'Food/Water': 0.421875,\n", " 'Shop': 0.0625,\n", " 'Savings Group': 0.03125,\n", " 'Fuel/Energy': 0.03125,\n", " 'Transport': 0.03125},\n", " '6': {'Savings Group': 0.6008097165991902,\n", " 'Food/Water': 0.35870445344129553,\n", " 'Shop': 0.04048582995951417},\n", " '7': {'Farming/Labour': 0.4346590909090909,\n", " 'Food/Water': 0.2869318181818182,\n", " 'Shop': 0.1278409090909091,\n", " 'Fuel/Energy': 0.07670454545454546,\n", " 'Savings Group': 0.03977272727272727,\n", " 'Education': 0.017045454545454544,\n", " 'None': 0.011363636363636364,\n", " 'Transport': 0.002840909090909091,\n", " 'Health': 0.002840909090909091},\n", " '8': {'Savings Group': 1.0},\n", " '9': {'Savings Group': 0.7142857142857143,\n", " 'Food/Water': 0.18181818181818182,\n", " 'Farming/Labour': 0.07792207792207792,\n", " 'Education': 0.025974025974025976},\n", " '10': {'Food/Water': 0.3499875508340941,\n", " 'Farming/Labour': 0.3162088140094614,\n", " 'Shop': 0.21047389824881732,\n", " 'Transport': 0.03950535314133953,\n", " 'None': 0.03386173126400531,\n", " 'Fuel/Energy': 0.022491493069964313,\n", " 'Education': 0.01709685451074778,\n", " 'Savings Group': 0.006473566271059839,\n", " 'Environment': 0.002157855423686613,\n", " 'Health': 0.0016598887874512407,\n", " 'Chama': 8.299443937256204e-05},\n", " '11': {'Savings Group': 0.4873417721518987,\n", " 'Food/Water': 0.3377445339470656,\n", " 'Education': 0.09723820483314154,\n", " 'Farming/Labour': 0.06271576524741082,\n", " 'Shop': 0.014959723820483314},\n", " '12': {'Food/Water': 0.34994337485843713,\n", " 'Shop': 0.2332955832389581,\n", " 'Farming/Labour': 0.19592298980747452,\n", " 'Fuel/Energy': 0.057757644394110984,\n", " 'Savings Group': 0.053227633069082674,\n", " 'Education': 0.05096262740656852,\n", " 'None': 0.026047565118912798,\n", " 'Transport': 0.020385050962627407,\n", " 'Health': 0.011325028312570781,\n", " 'Environment': 0.0011325028312570782},\n", " '13': {'Savings Group': 0.3712871287128713,\n", " 'Food/Water': 0.247974797479748,\n", " 'Shop': 0.19801980198019803,\n", " 'Fuel/Energy': 0.08235823582358236,\n", " 'Health': 0.07605760576057606,\n", " 'Farming/Labour': 0.024302430243024302},\n", " '14': {'Savings Group': 1.0},\n", " '15': {'Savings Group': 1.0},\n", " '16': {'Savings Group': 0.5, 'Food/Water': 0.5},\n", " '17': {'Savings Group': 0.7335701598579041,\n", " 'Shop': 0.17584369449378331,\n", " 'Food/Water': 0.0905861456483126},\n", " '18': {'Savings Group': 0.6984126984126984,\n", " 'Food/Water': 0.23809523809523808,\n", " 'Farming/Labour': 0.06349206349206349},\n", " '19': {'Savings Group': 1.0},\n", " '20': {'Savings Group': 1.0},\n", " '21': {'Farming/Labour': 0.47619047619047616,\n", " 'Food/Water': 0.3333333333333333,\n", " 'Shop': 0.09523809523809523,\n", " 'Fuel/Energy': 0.047619047619047616,\n", " 'Transport': 0.047619047619047616},\n", " '22': {'Food/Water': 0.33040588654165676,\n", " 'Farming/Labour': 0.3209114645145977,\n", " 'Shop': 0.164016140517446,\n", " 'None': 0.06147638262520769,\n", " 'Fuel/Energy': 0.05008307619273677,\n", " 'Transport': 0.028957987182530263,\n", " 'Savings Group': 0.023973415618324233,\n", " 'Education': 0.014478993591265131,\n", " 'Health': 0.0035604082601471635,\n", " 'Environment': 0.0011868027533823878,\n", " 'Staff': 0.00047472110135295516,\n", " 'Chama': 0.00023736055067647758,\n", " 'Game': 0.00023736055067647758},\n", " '23': {'Savings Group': 0.8323424494649228,\n", " 'Farming/Labour': 0.16765755053507728},\n", " '24': {'Farming/Labour': 0.38481675392670156,\n", " 'Food/Water': 0.3717277486910995,\n", " 'Shop': 0.1387434554973822,\n", " 'Fuel/Energy': 0.05235602094240838,\n", " 'Transport': 0.02356020942408377,\n", " 'Savings Group': 0.01832460732984293,\n", " 'Education': 0.007853403141361256,\n", " 'Staff': 0.002617801047120419},\n", " '25': {'Savings Group': 0.7916666666666666,\n", " 'Food/Water': 0.20833333333333334},\n", " '26': {'Savings Group': 0.7442348008385744, 'Food/Water': 0.2557651991614256},\n", " '27': {'Food/Water': 0.3333333333333333,\n", " 'Farming/Labour': 0.25,\n", " 'Health': 0.25,\n", " 'Savings Group': 0.08333333333333333,\n", " 'Fuel/Energy': 0.08333333333333333},\n", " '28': {'Food/Water': 1.0},\n", " '29': {'Food/Water': 0.27335640138408307,\n", " 'Farming/Labour': 0.23529411764705882,\n", " 'Shop': 0.21972318339100347,\n", " 'Fuel/Energy': 0.21280276816608998,\n", " 'None': 0.03806228373702422,\n", " 'Education': 0.006920415224913495,\n", " 'Transport': 0.006920415224913495,\n", " 'Savings Group': 0.005190311418685121,\n", " 'Staff': 0.0017301038062283738},\n", " '30': {'Food/Water': 0.36228287841191065,\n", " 'Shop': 0.2679900744416873,\n", " 'Farming/Labour': 0.21712158808933002,\n", " 'Savings Group': 0.08436724565756824,\n", " 'Education': 0.02481389578163772,\n", " 'Fuel/Energy': 0.018610421836228287,\n", " 'Transport': 0.017369727047146403,\n", " 'None': 0.0037220843672456576,\n", " 'Health': 0.0024813895781637717,\n", " 'Environment': 0.0012406947890818859},\n", " '31': {'Savings Group': 0.8,\n", " 'Food/Water': 0.13333333333333333,\n", " 'Shop': 0.06666666666666667},\n", " '32': {'Savings Group': 0.7444444444444445,\n", " 'Farming/Labour': 0.2,\n", " 'Food/Water': 0.05555555555555555},\n", " '33': {'Food/Water': 0.33343474292668085,\n", " 'Farming/Labour': 0.28414968055978096,\n", " 'Savings Group': 0.18892607240644965,\n", " 'Shop': 0.1146942500760572,\n", " 'Fuel/Energy': 0.06936416184971098,\n", " 'None': 0.006693033160937024,\n", " 'Education': 0.0027380590203833284},\n", " '34': {'Savings Group': 1.0},\n", " '35': {'Food/Water': 0.3829787234042553,\n", " 'Farming/Labour': 0.2390488110137672,\n", " 'Shop': 0.1902377972465582,\n", " 'Savings Group': 0.07259073842302878,\n", " 'Transport': 0.060075093867334166,\n", " 'Health': 0.030037546933667083,\n", " 'Fuel/Energy': 0.016270337922403004,\n", " 'None': 0.0050062578222778474,\n", " 'Education': 0.0037546933667083854},\n", " '36': {'Savings Group': 1.0},\n", " '37': {'Farming/Labour': 0.5454545454545454,\n", " 'Food/Water': 0.36363636363636365,\n", " 'Savings Group': 0.045454545454545456,\n", " 'Shop': 0.045454545454545456},\n", " '38': {'Savings Group': 1.0},\n", " '39': {'Savings Group': 1.0},\n", " '40': {'Farming/Labour': 0.3595236417447678,\n", " 'Food/Water': 0.3165386512578395,\n", " 'Shop': 0.18842928616728913,\n", " 'Fuel/Energy': 0.05108871820167712,\n", " 'None': 0.0360439715312522,\n", " 'Transport': 0.022443802409978154,\n", " 'Education': 0.01039391163413431,\n", " 'Savings Group': 0.00842083010358678,\n", " 'Health': 0.004545134240011275,\n", " 'Staff': 0.0011627087590726517,\n", " 'Environment': 0.0010570079627933197,\n", " 'System': 0.00035233598759777326},\n", " '41': {'Food/Water': 0.33003300330033003,\n", " 'Farming/Labour': 0.2739273927392739,\n", " 'Shop': 0.1782178217821782,\n", " 'Savings Group': 0.13861386138613863,\n", " 'Health': 0.0429042904290429,\n", " 'Fuel/Energy': 0.0165016501650165,\n", " 'Transport': 0.0165016501650165,\n", " 'Education': 0.0033003300330033004},\n", " '42': {'Savings Group': 0.8661740558292282, 'Health': 0.13382594417077176},\n", " '43': {'Savings Group': 1.0},\n", " '44': {'Food/Water': 0.4805194805194805,\n", " 'Shop': 0.14285714285714285,\n", " 'Savings Group': 0.14285714285714285,\n", " 'Farming/Labour': 0.13636363636363635,\n", " 'Health': 0.06493506493506493,\n", " 'Transport': 0.012987012987012988,\n", " 'Environment': 0.012987012987012988,\n", " 'Fuel/Energy': 0.006493506493506494},\n", " '45': {'Food/Water': 0.35471100554235946,\n", " 'Farming/Labour': 0.2414885193982581,\n", " 'Shop': 0.23198733174980204,\n", " 'Education': 0.03800475059382423,\n", " 'None': 0.035629453681710214,\n", " 'Transport': 0.035629453681710214,\n", " 'Fuel/Energy': 0.028503562945368172,\n", " 'Savings Group': 0.02454473475851148,\n", " 'Health': 0.006334125098970704,\n", " 'Environment': 0.001583531274742676,\n", " 'Staff': 0.000791765637371338,\n", " 'System': 0.000791765637371338},\n", " '46': {'Savings Group': 0.6981132075471698,\n", " 'Health': 0.18867924528301888,\n", " 'Food/Water': 0.09433962264150944,\n", " 'Shop': 0.018867924528301886},\n", " '47': {'Savings Group': 0.5555555555555556,\n", " 'Farming/Labour': 0.2222222222222222,\n", " 'Food/Water': 0.2222222222222222},\n", " '48': {'Food/Water': 0.38795180722891565,\n", " 'Savings Group': 0.38313253012048193,\n", " 'Health': 0.10120481927710843,\n", " 'Shop': 0.09879518072289156,\n", " 'Fuel/Energy': 0.016867469879518072,\n", " 'Farming/Labour': 0.012048192771084338},\n", " '49': {'Food/Water': 0.3829787234042553,\n", " 'Savings Group': 0.3829787234042553,\n", " 'Education': 0.19148936170212766,\n", " 'Fuel/Energy': 0.0425531914893617},\n", " 'external': {'Food/Water': 1,\n", " 'Fuel/Energy': 2,\n", " 'Health': 3,\n", " 'Education': 4,\n", " 'Savings Group': 5,\n", " 'Shop': 6}}\n", " \n", "# nested dictionary \n", "utilityTypesProbability = {'0': {'Food/Water': 0.4119323241317899,\n", " 'Farming/Labour': 0.26090828138913624,\n", " 'Shop': 0.17916295636687443,\n", " 'Savings Group': 0.07266251113089937,\n", " 'Fuel/Energy': 0.034194122885129116,\n", " 'Transport': 0.02617987533392698,\n", " 'Health': 0.006767586821015138,\n", " 'Education': 0.004096170970614425,\n", " 'None': 0.004096170970614425},\n", " '1': {'Food/Water': 1.0},\n", " '2': {'Savings Group': 0.87890625,\n", " 'Health': 0.08984375,\n", " 'Food/Water': 0.03125},\n", " '3': {'Savings Group': 0.4905964535196131,\n", " 'Farming/Labour': 0.3610961848468565,\n", " 'Food/Water': 0.14830736163353037},\n", " '4': {'Farming/Labour': 0.2843866171003718,\n", " 'Shop': 0.25650557620817843,\n", " 'Fuel/Energy': 0.17843866171003717,\n", " 'Food/Water': 0.16171003717472118,\n", " 'None': 0.10966542750929369,\n", " 'Savings Group': 0.0055762081784386614,\n", " 'Transport': 0.0037174721189591076},\n", " '5': {'Farming/Labour': 0.421875,\n", " 'Food/Water': 0.421875,\n", " 'Shop': 0.0625,\n", " 'Savings Group': 0.03125,\n", " 'Fuel/Energy': 0.03125,\n", " 'Transport': 0.03125},\n", " '6': {'Savings Group': 0.6008097165991902,\n", " 'Food/Water': 0.35870445344129553,\n", " 'Shop': 0.04048582995951417},\n", " '7': {'Farming/Labour': 0.4346590909090909,\n", " 'Food/Water': 0.2869318181818182,\n", " 'Shop': 0.1278409090909091,\n", " 'Fuel/Energy': 0.07670454545454546,\n", " 'Savings Group': 0.03977272727272727,\n", " 'Education': 0.017045454545454544,\n", " 'None': 0.011363636363636364,\n", " 'Transport': 0.002840909090909091,\n", " 'Health': 0.002840909090909091},\n", " '8': {'Savings Group': 1.0},\n", " '9': {'Savings Group': 0.7142857142857143,\n", " 'Food/Water': 0.18181818181818182,\n", " 'Farming/Labour': 0.07792207792207792,\n", " 'Education': 0.025974025974025976},\n", " '10': {'Food/Water': 0.3499875508340941,\n", " 'Farming/Labour': 0.3162088140094614,\n", " 'Shop': 0.21047389824881732,\n", " 'Transport': 0.03950535314133953,\n", " 'None': 0.03386173126400531,\n", " 'Fuel/Energy': 0.022491493069964313,\n", " 'Education': 0.01709685451074778,\n", " 'Savings Group': 0.006473566271059839,\n", " 'Environment': 0.002157855423686613,\n", " 'Health': 0.0016598887874512407,\n", " 'Chama': 8.299443937256204e-05},\n", " '11': {'Savings Group': 0.4873417721518987,\n", " 'Food/Water': 0.3377445339470656,\n", " 'Education': 0.09723820483314154,\n", " 'Farming/Labour': 0.06271576524741082,\n", " 'Shop': 0.014959723820483314},\n", " '12': {'Food/Water': 0.34994337485843713,\n", " 'Shop': 0.2332955832389581,\n", " 'Farming/Labour': 0.19592298980747452,\n", " 'Fuel/Energy': 0.057757644394110984,\n", " 'Savings Group': 0.053227633069082674,\n", " 'Education': 0.05096262740656852,\n", " 'None': 0.026047565118912798,\n", " 'Transport': 0.020385050962627407,\n", " 'Health': 0.011325028312570781,\n", " 'Environment': 0.0011325028312570782},\n", " '13': {'Savings Group': 0.3712871287128713,\n", " 'Food/Water': 0.247974797479748,\n", " 'Shop': 0.19801980198019803,\n", " 'Fuel/Energy': 0.08235823582358236,\n", " 'Health': 0.07605760576057606,\n", " 'Farming/Labour': 0.024302430243024302},\n", " '14': {'Savings Group': 1.0},\n", " '15': {'Savings Group': 1.0},\n", " '16': {'Savings Group': 0.5, 'Food/Water': 0.5},\n", " '17': {'Savings Group': 0.7335701598579041,\n", " 'Shop': 0.17584369449378331,\n", " 'Food/Water': 0.0905861456483126},\n", " '18': {'Savings Group': 0.6984126984126984,\n", " 'Food/Water': 0.23809523809523808,\n", " 'Farming/Labour': 0.06349206349206349},\n", " '19': {'Savings Group': 1.0},\n", " '20': {'Savings Group': 1.0},\n", " '21': {'Farming/Labour': 0.47619047619047616,\n", " 'Food/Water': 0.3333333333333333,\n", " 'Shop': 0.09523809523809523,\n", " 'Fuel/Energy': 0.047619047619047616,\n", " 'Transport': 0.047619047619047616},\n", " '22': {'Food/Water': 0.33040588654165676,\n", " 'Farming/Labour': 0.3209114645145977,\n", " 'Shop': 0.164016140517446,\n", " 'None': 0.06147638262520769,\n", " 'Fuel/Energy': 0.05008307619273677,\n", " 'Transport': 0.028957987182530263,\n", " 'Savings Group': 0.023973415618324233,\n", " 'Education': 0.014478993591265131,\n", " 'Health': 0.0035604082601471635,\n", " 'Environment': 0.0011868027533823878,\n", " 'Staff': 0.00047472110135295516,\n", " 'Chama': 0.00023736055067647758,\n", " 'Game': 0.00023736055067647758},\n", " '23': {'Savings Group': 0.8323424494649228,\n", " 'Farming/Labour': 0.16765755053507728},\n", " '24': {'Farming/Labour': 0.38481675392670156,\n", " 'Food/Water': 0.3717277486910995,\n", " 'Shop': 0.1387434554973822,\n", " 'Fuel/Energy': 0.05235602094240838,\n", " 'Transport': 0.02356020942408377,\n", " 'Savings Group': 0.01832460732984293,\n", " 'Education': 0.007853403141361256,\n", " 'Staff': 0.002617801047120419},\n", " '25': {'Savings Group': 0.7916666666666666,\n", " 'Food/Water': 0.20833333333333334},\n", " '26': {'Savings Group': 0.7442348008385744, 'Food/Water': 0.2557651991614256},\n", " '27': {'Food/Water': 0.3333333333333333,\n", " 'Farming/Labour': 0.25,\n", " 'Health': 0.25,\n", " 'Savings Group': 0.08333333333333333,\n", " 'Fuel/Energy': 0.08333333333333333},\n", " '28': {'Food/Water': 1.0},\n", " '29': {'Food/Water': 0.27335640138408307,\n", " 'Farming/Labour': 0.23529411764705882,\n", " 'Shop': 0.21972318339100347,\n", " 'Fuel/Energy': 0.21280276816608998,\n", " 'None': 0.03806228373702422,\n", " 'Education': 0.006920415224913495,\n", " 'Transport': 0.006920415224913495,\n", " 'Savings Group': 0.005190311418685121,\n", " 'Staff': 0.0017301038062283738},\n", " '30': {'Food/Water': 0.36228287841191065,\n", " 'Shop': 0.2679900744416873,\n", " 'Farming/Labour': 0.21712158808933002,\n", " 'Savings Group': 0.08436724565756824,\n", " 'Education': 0.02481389578163772,\n", " 'Fuel/Energy': 0.018610421836228287,\n", " 'Transport': 0.017369727047146403,\n", " 'None': 0.0037220843672456576,\n", " 'Health': 0.0024813895781637717,\n", " 'Environment': 0.0012406947890818859},\n", " '31': {'Savings Group': 0.8,\n", " 'Food/Water': 0.13333333333333333,\n", " 'Shop': 0.06666666666666667},\n", " '32': {'Savings Group': 0.7444444444444445,\n", " 'Farming/Labour': 0.2,\n", " 'Food/Water': 0.05555555555555555},\n", " '33': {'Food/Water': 0.33343474292668085,\n", " 'Farming/Labour': 0.28414968055978096,\n", " 'Savings Group': 0.18892607240644965,\n", " 'Shop': 0.1146942500760572,\n", " 'Fuel/Energy': 0.06936416184971098,\n", " 'None': 0.006693033160937024,\n", " 'Education': 0.0027380590203833284},\n", " '34': {'Savings Group': 1.0},\n", " '35': {'Food/Water': 0.3829787234042553,\n", " 'Farming/Labour': 0.2390488110137672,\n", " 'Shop': 0.1902377972465582,\n", " 'Savings Group': 0.07259073842302878,\n", " 'Transport': 0.060075093867334166,\n", " 'Health': 0.030037546933667083,\n", " 'Fuel/Energy': 0.016270337922403004,\n", " 'None': 0.0050062578222778474,\n", " 'Education': 0.0037546933667083854},\n", " '36': {'Savings Group': 1.0},\n", " '37': {'Farming/Labour': 0.5454545454545454,\n", " 'Food/Water': 0.36363636363636365,\n", " 'Savings Group': 0.045454545454545456,\n", " 'Shop': 0.045454545454545456},\n", " '38': {'Savings Group': 1.0},\n", " '39': {'Savings Group': 1.0},\n", " '40': {'Farming/Labour': 0.3595236417447678,\n", " 'Food/Water': 0.3165386512578395,\n", " 'Shop': 0.18842928616728913,\n", " 'Fuel/Energy': 0.05108871820167712,\n", " 'None': 0.0360439715312522,\n", " 'Transport': 0.022443802409978154,\n", " 'Education': 0.01039391163413431,\n", " 'Savings Group': 0.00842083010358678,\n", " 'Health': 0.004545134240011275,\n", " 'Staff': 0.0011627087590726517,\n", " 'Environment': 0.0010570079627933197,\n", " 'System': 0.00035233598759777326},\n", " '41': {'Food/Water': 0.33003300330033003,\n", " 'Farming/Labour': 0.2739273927392739,\n", " 'Shop': 0.1782178217821782,\n", " 'Savings Group': 0.13861386138613863,\n", " 'Health': 0.0429042904290429,\n", " 'Fuel/Energy': 0.0165016501650165,\n", " 'Transport': 0.0165016501650165,\n", " 'Education': 0.0033003300330033004},\n", " '42': {'Savings Group': 0.8661740558292282, 'Health': 0.13382594417077176},\n", " '43': {'Savings Group': 1.0},\n", " '44': {'Food/Water': 0.4805194805194805,\n", " 'Shop': 0.14285714285714285,\n", " 'Savings Group': 0.14285714285714285,\n", " 'Farming/Labour': 0.13636363636363635,\n", " 'Health': 0.06493506493506493,\n", " 'Transport': 0.012987012987012988,\n", " 'Environment': 0.012987012987012988,\n", " 'Fuel/Energy': 0.006493506493506494},\n", " '45': {'Food/Water': 0.35471100554235946,\n", " 'Farming/Labour': 0.2414885193982581,\n", " 'Shop': 0.23198733174980204,\n", " 'Education': 0.03800475059382423,\n", " 'None': 0.035629453681710214,\n", " 'Transport': 0.035629453681710214,\n", " 'Fuel/Energy': 0.028503562945368172,\n", " 'Savings Group': 0.02454473475851148,\n", " 'Health': 0.006334125098970704,\n", " 'Environment': 0.001583531274742676,\n", " 'Staff': 0.000791765637371338,\n", " 'System': 0.000791765637371338},\n", " '46': {'Savings Group': 0.6981132075471698,\n", " 'Health': 0.18867924528301888,\n", " 'Food/Water': 0.09433962264150944,\n", " 'Shop': 0.018867924528301886},\n", " '47': {'Savings Group': 0.5555555555555556,\n", " 'Farming/Labour': 0.2222222222222222,\n", " 'Food/Water': 0.2222222222222222},\n", " '48': {'Food/Water': 0.38795180722891565,\n", " 'Savings Group': 0.38313253012048193,\n", " 'Health': 0.10120481927710843,\n", " 'Shop': 0.09879518072289156,\n", " 'Fuel/Energy': 0.016867469879518072,\n", " 'Farming/Labour': 0.012048192771084338},\n", " '49': {'Food/Water': 0.3829787234042553,\n", " 'Savings Group': 0.3829787234042553,\n", " 'Education': 0.19148936170212766,\n", " 'Fuel/Energy': 0.0425531914893617},\n", " 'external': {'Food/Water': 0.6,\n", " 'Fuel/Energy': 0.1,\n", " 'Health': 0.03,\n", " 'Education': 0.015,\n", " 'Savings Group': 0.065,\n", " 'Shop': 0.19}}\n", "\n", "# agent:[centrality,allocationValue]\n", "agentAllocation = {'0': [1, 1],\n", " '1': [1, 1],\n", " '2': [1, 1],\n", " '3': [1, 1],\n", " '4': [1, 1],\n", " '5': [1, 1],\n", " '6': [1, 1],\n", " '7': [1, 1],\n", " '8': [1, 1],\n", " '9': [1, 1],\n", " '10': [1, 1],\n", " '11': [1, 1],\n", " '12': [1, 1],\n", " '13': [1, 1],\n", " '14': [1, 1],\n", " '15': [1, 1],\n", " '16': [1, 1],\n", " '17': [1, 1],\n", " '18': [1, 1],\n", " '19': [1, 1],\n", " '20': [1, 1],\n", " '21': [1, 1],\n", " '22': [1, 1],\n", " '23': [1, 1],\n", " '24': [1, 1],\n", " '25': [1, 1],\n", " '26': [1, 1],\n", " '27': [1, 1],\n", " '28': [1, 1],\n", " '29': [1, 1],\n", " '30': [1, 1],\n", " '31': [1, 1],\n", " '32': [1, 1],\n", " '33': [1, 1],\n", " '34': [1, 1],\n", " '35': [1, 1],\n", " '36': [1, 1],\n", " '37': [1, 1],\n", " '38': [1, 1],\n", " '39': [1, 1],\n", " '40': [1, 1],\n", " '41': [1, 1],\n", " '42': [1, 1],\n", " '43': [1, 1],\n", " '44': [1, 1],\n", " '45': [1, 1],\n", " '46': [1, 1],\n", " '47': [1, 1],\n", " '48': [1, 1],\n", " '49': [1, 1]}\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.5" } }, "nbformat": 4, "nbformat_minor": 2 }