Commit 7d8eb475 authored by Iker Martín Álvarez's avatar Iker Martín Álvarez
Browse files

The analyser is a huge monster to be converted into a python code...

parent fe94510f
......@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
"execution_count": 3,
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
......@@ -18,8 +18,10 @@
"from matplotlib.legend_handler import HandlerLine2D, HandlerTuple\n",
"from matplotlib.colors import LinearSegmentedColormap\n",
"from scipy import stats\n",
"#import scikit_posthocs as sp\n",
"import sys"
"import scikit_posthocs as sp\n",
"import sys\n",
"\n",
"from mpl_toolkits.mplot3d import axes3d"
]
},
{
......@@ -32,69 +34,43 @@
"ResizesName=\"dataM.pkl\"\n",
"matrixIt=\"dataL.pkl\"\n",
"matrixIt_Total=\"data_L_Total.csv\"\n",
"n_qty=8 #CAMBIAR SEGUN LA CANTIDAD DE NODOS USADOS\n",
"n_groups= 2\n",
"n_cores=20\n",
"repet = 5 #CAMBIAR EL NUMERO SEGUN NUMERO DE EJECUCIONES POR CONFIG\n",
"time_constant = False # Cambiar segun el speedUp usado\n",
"speedup = 0.66 # Porcentaje del speedup ideal\n",
"\n",
"p_value = 0.05\n",
"values = [2, 10, 20, 40, 80, 120, 160, 180]\n",
"# WORST BEST\n",
"dist_names = ['null', 'BalancedFit', 'CompactFit']\n",
"\n",
"processes = [2,10,20,40,80,120,160,180]\n",
"processes = [2,10,20,40,80,120,160]\n",
"\n",
"labelsP = [['(2,2)', '(2,10)', '(2,20)', '(2,40)'],['(10,2)', '(10,10)', '(10,20)', '(10,40)'],\n",
" ['(20,2)', '(20,10)', '(20,20)', '(20,40)'],['(40,2)', '(40,10)', '(40,20)', '(40,40)']]\n",
"labelsP_J = ['(2,2)', '(2,10)', '(2,20)', '(2,40)','(10,2)', '(10,10)', '(10,20)', '(10,40)',\n",
" '(20,2)', '(20,10)', '(20,20)', '(20,40)','(40,2)', '(40,10)', '(40,20)', '(40,40)']\n",
"positions = [321, 322, 323, 324, 325]\n",
"positions_small = [221, 222, 223, 224]\n",
"\n",
"labels = ['(1,10)', '(1,20)', '(1,40)','(1,80)','(1,120)',\n",
" '(10,1)', '(10,20)', '(10,40)','(10,80)','(10,120)',\n",
" '(20,1)', '(20,10)','(20,40)','(20,80)','(20,120)',\n",
" '(40,1)', '(40,10)', '(40,20)','(40,80)','(40,120)',\n",
" '(80,1)', '(80,10)', '(80,20)', '(80,40)','(80,120)',\n",
" '(120,1)', '(120,10)', '(120,20)','(120,40)','(120,80)']\n",
"labels = ['(1,10)', '(1,20)', '(1,40)', '(1,80)', '(1,120)','(1,160)',\n",
" '(10,1)', '(10,20)', '(10,40)', '(10,80)', '(10,120)','(10,160)',\n",
" '(20,1)', '(20,10)', '(20,40)', '(20,80)', '(20,120)','(20,160)',\n",
" '(40,1)', '(40,10)', '(40,20)', '(40,80)', '(40,120)','(40,160)',\n",
" '(80,1)', '(80,10)', '(80,20)', '(80,40)', '(80,120)','(80,160)',\n",
" '(120,1)','(120,10)', '(120,20)','(120,40)','(120,80)','(120,160)',\n",
" '(160,1)','(160,10)', '(160,20)','(160,40)','(160,80)','(160,120)']\n",
"\n",
"labelsExpand = ['(1,10)', '(1,20)', '(1,40)','(1,80)','(1,120)',\n",
" '(10,20)', '(10,40)','(10,80)','(10,120)',\n",
" '(20,40)','(20,80)','(20,120)',\n",
" '(40,80)','(40,120)',\n",
" '(80,120)']\n",
"labelsExpand = ['(1,10)', '(1,20)', '(1,40)', '(1,80)', '(1,120)','(1,160)',\n",
" '(10,20)', '(10,40)', '(10,80)', '(10,120)','(10,160)',\n",
" '(20,40)', '(20,80)', '(20,120)','(20,160)',\n",
" '(40,80)', '(40,120)','(40,160)',\n",
" '(80,120)','(80,160)',\n",
" '(120,160)']\n",
"labelsShrink = ['(10,1)', \n",
" '(20,1)', '(20,10)', \n",
" '(40,1)', '(40,10)', '(40,20)',\n",
" '(80,1)', '(80,10)', '(80,20)', '(80,40)',\n",
" '(120,1)', '(120,10)', '(120,20)','(120,40)','(120,80)']\n",
"\n",
"labelsExpandOrdered = ['(1,10)', '(1,20)', '(10,20)',\n",
" '(1,40)','(10,40)','(20,40)',\n",
" '(1,80)','(10,80)','(20,80)','(40,80)',\n",
" '(1,120)', '(10,120)', '(20,120)','(40,120)','(80,120)']\n",
"labelsShrinkOrdered = ['(10,1)', '(20,1)', '(40,1)', '(80,1)', '(120,1)',\n",
" '(20,10)', '(40,10)', '(80,10)', '(120,10)', \n",
" '(40,20)', '(80,20)', '(120,20)',\n",
" '(80,40)','(120,40)',\n",
" '(120,80)']\n",
" '(20,1)', '(20,10)',\n",
" '(40,1)', '(40,10)', '(40,20)',\n",
" '(80,1)', '(80,10)', '(80,20)', '(80,40)',\n",
" '(120,1)','(120,10)', '(120,20)','(120,40)','(120,80)',\n",
" '(160,1)','(160,10)', '(160,20)','(160,40)','(160,80)','(160,120)']\n",
"\n",
"labelsExpandIntra = ['(1,10)', '(1,20)','(10,20)']\n",
"labelsShrinkIntra = ['(10,1)', '(20,1)', '(20,10)']\n",
"labelsExpandInter = ['(1,40)','(1,80)', '(1,160)',\n",
" '(10,40)','(10,80)', '(10,160)',\n",
" '(20,40)','(20,80)', '(20,160)',\n",
" '(40,80)', '(40,160)',\n",
" '(80,160)']\n",
"labelsShrinkInter = ['(40,1)', '(40,10)', '(40,20)',\n",
" '(80,1)', '(80,10)', '(80,20)','(80,40)',\n",
" '(160,1)', '(160,10)', '(160,20)','(160,40)', '(160,80)']\n",
"\n",
" #0 #1 #2 #3\n",
"# WORST BEST\n",
"labels_dist = ['null', 'SpreadFit', 'CompactFit']\n",
" #0 #1 #2 #3\n",
"labelsMethods = ['Baseline', 'Baseline single','Baseline - Asynchronous','Baseline single - Asynchronous',\n",
" 'Merge','Merge single','Merge - Asynchronous','Merge single - Asynchronous']\n",
" #4 #5 #6 #7\n",
" #4 #5 #6 #7\n",
" \n",
"colors_spawn = ['green','springgreen','blue','darkblue','red','darkred','darkgoldenrod','olive','violet']\n",
"linestyle_spawn = ['-', '--', '-.', ':']\n",
"markers_spawn = ['.','v','s','p', 'h','d','X','P','^']\n",
......@@ -115,138 +91,561 @@
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "unhashable type: 'list'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/groupby.py\u001b[0m in \u001b[0;36mmedian\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 1230\u001b[0m \u001b[0malt\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mSeries\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmedian\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1231\u001b[0;31m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1232\u001b[0m )\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/groupby.py\u001b[0m in \u001b[0;36m_cython_agg_general\u001b[0;34m(self, how, alt, numeric_only, min_count)\u001b[0m\n\u001b[1;32m 880\u001b[0m result, names = self.grouper.aggregate(\n\u001b[0;32m--> 881\u001b[0;31m \u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhow\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmin_count\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmin_count\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 882\u001b[0m )\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py\u001b[0m in \u001b[0;36maggregate\u001b[0;34m(self, values, how, axis, min_count)\u001b[0m\n\u001b[1;32m 595\u001b[0m return self._cython_operation(\n\u001b[0;32m--> 596\u001b[0;31m \u001b[0;34m\"aggregate\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhow\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmin_count\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmin_count\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 597\u001b[0m )\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py\u001b[0m in \u001b[0;36m_cython_operation\u001b[0;34m(self, kind, values, how, axis, min_count, **kwargs)\u001b[0m\n\u001b[1;32m 484\u001b[0m \u001b[0mvalues\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 485\u001b[0;31m \u001b[0mout_shape\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mngroups\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marity\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 486\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32mpandas/_libs/properties.pyx\u001b[0m in \u001b[0;36mpandas._libs.properties.CachedProperty.__get__\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py\u001b[0m in \u001b[0;36mngroups\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mngroups\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 322\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresult_index\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 323\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32mpandas/_libs/properties.pyx\u001b[0m in \u001b[0;36mpandas._libs.properties.CachedProperty.__get__\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py\u001b[0m in \u001b[0;36mresult_index\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 334\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 335\u001b[0;31m \u001b[0mcodes\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrecons_labels\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 336\u001b[0m \u001b[0mlevels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mping\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresult_index\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mping\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupings\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py\u001b[0m in \u001b[0;36mrecons_labels\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 325\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrecons_labels\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 326\u001b[0;31m \u001b[0mcomp_ids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobs_ids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroup_info\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 327\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mping\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlabels\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mping\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupings\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32mpandas/_libs/properties.pyx\u001b[0m in \u001b[0;36mpandas._libs.properties.CachedProperty.__get__\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py\u001b[0m in \u001b[0;36mgroup_info\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 295\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mgroup_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 296\u001b[0;31m \u001b[0mcomp_ids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobs_group_ids\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_compressed_labels\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 297\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py\u001b[0m in \u001b[0;36m_get_compressed_labels\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 311\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_compressed_labels\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 312\u001b[0;31m \u001b[0mall_labels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mping\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlabels\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mping\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupings\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 313\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall_labels\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 311\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_compressed_labels\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 312\u001b[0;31m \u001b[0mall_labels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mping\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlabels\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mping\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupings\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 313\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall_labels\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/grouper.py\u001b[0m in \u001b[0;36mlabels\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 396\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_labels\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 397\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_labels\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 398\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_labels\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/grouper.py\u001b[0m in \u001b[0;36m_make_labels\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 420\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 421\u001b[0;31m \u001b[0mlabels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0muniques\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0malgorithms\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfactorize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgrouper\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msort\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 422\u001b[0m \u001b[0muniques\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mIndex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muniques\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/util/_decorators.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 207\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnew_arg_name\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnew_arg_value\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 208\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 209\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/algorithms.py\u001b[0m in \u001b[0;36mfactorize\u001b[0;34m(values, sort, order, na_sentinel, size_hint)\u001b[0m\n\u001b[1;32m 671\u001b[0m labels, uniques = _factorize_array(\n\u001b[0;32m--> 672\u001b[0;31m \u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mna_sentinel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mna_sentinel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msize_hint\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msize_hint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mna_value\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mna_value\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 673\u001b[0m )\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/algorithms.py\u001b[0m in \u001b[0;36m_factorize_array\u001b[0;34m(values, na_sentinel, size_hint, na_value)\u001b[0m\n\u001b[1;32m 507\u001b[0m uniques, labels = table.factorize(\n\u001b[0;32m--> 508\u001b[0;31m \u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mna_sentinel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mna_sentinel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mna_value\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mna_value\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 509\u001b[0m )\n",
"\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.factorize\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable._unique\u001b[0;34m()\u001b[0m\n",
"\u001b[0;31mTypeError\u001b[0m: unhashable type: 'list'",
"\nDuring handling of the above exception, another exception occurred:\n",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-14-8f3f554db108>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mgroup\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdfG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Redistribution_Method'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Redistribution_Strategy'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Groups'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'T_total'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mgrouped_aggG\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgroup\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0magg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'median'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0mgrouped_aggG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrename\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m'median'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m'T_total'\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minplace\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/generic.py\u001b[0m in \u001b[0;36maggregate\u001b[0;34m(self, func_or_funcs, *args, **kwargs)\u001b[0m\n\u001b[1;32m 849\u001b[0m \u001b[0;31m# but not the class list / tuple itself.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 850\u001b[0m \u001b[0mfunc_or_funcs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_maybe_mangle_lambdas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc_or_funcs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 851\u001b[0;31m \u001b[0mret\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_aggregate_multiple_funcs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc_or_funcs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0m_level\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 852\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrelabeling\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 853\u001b[0m \u001b[0mret\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/generic.py\u001b[0m in \u001b[0;36m_aggregate_multiple_funcs\u001b[0;34m(self, arg, _level)\u001b[0m\n\u001b[1;32m 928\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reset_cache\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 929\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_selection\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 930\u001b[0;31m \u001b[0mresults\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maggregate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 931\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 932\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0many\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mDataFrame\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/generic.py\u001b[0m in \u001b[0;36maggregate\u001b[0;34m(self, func_or_funcs, *args, **kwargs)\u001b[0m\n\u001b[1;32m 843\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 844\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc_or_funcs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 845\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc_or_funcs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 846\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 847\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc_or_funcs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mabc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mIterable\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/groupby.py\u001b[0m in \u001b[0;36mmedian\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 1241\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1242\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0m_group_selection_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1243\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_python_agg_general\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1244\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1245\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mSubstitution\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"groupby\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/groupby.py\u001b[0m in \u001b[0;36m_python_agg_general\u001b[0;34m(self, func, *args, **kwargs)\u001b[0m\n\u001b[1;32m 904\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 905\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutput\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 906\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_python_apply_general\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 907\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 908\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgrouper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_filter_empty_groups\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/groupby.py\u001b[0m in \u001b[0;36m_python_apply_general\u001b[0;34m(self, f)\u001b[0m\n\u001b[1;32m 740\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 741\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_python_apply_general\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 742\u001b[0;31m \u001b[0mkeys\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmutated\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgrouper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_selected_obj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 743\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 744\u001b[0m return self._wrap_applied_output(\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py\u001b[0m in \u001b[0;36mapply\u001b[0;34m(self, f, data, axis)\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mapply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 190\u001b[0m \u001b[0mmutated\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmutated\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 191\u001b[0;31m \u001b[0msplitter\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_splitter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 192\u001b[0m \u001b[0mgroup_keys\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_group_keys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 193\u001b[0m \u001b[0mresult_values\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py\u001b[0m in \u001b[0;36m_get_splitter\u001b[0;34m(self, data, axis)\u001b[0m\n\u001b[1;32m 166\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 167\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_splitter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 168\u001b[0;31m \u001b[0mcomp_ids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mngroups\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroup_info\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 169\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mget_splitter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcomp_ids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mngroups\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 170\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32mpandas/_libs/properties.pyx\u001b[0m in \u001b[0;36mpandas._libs.properties.CachedProperty.__get__\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py\u001b[0m in \u001b[0;36mgroup_info\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 294\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mcache_readonly\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 295\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mgroup_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 296\u001b[0;31m \u001b[0mcomp_ids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobs_group_ids\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_compressed_labels\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 297\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 298\u001b[0m \u001b[0mngroups\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobs_group_ids\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py\u001b[0m in \u001b[0;36m_get_compressed_labels\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 310\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 311\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_compressed_labels\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 312\u001b[0;31m \u001b[0mall_labels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mping\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlabels\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mping\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupings\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 313\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall_labels\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 314\u001b[0m \u001b[0mgroup_index\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_group_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall_labels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msort\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mxnull\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 310\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 311\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_compressed_labels\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 312\u001b[0;31m \u001b[0mall_labels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mping\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlabels\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mping\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupings\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 313\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall_labels\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 314\u001b[0m \u001b[0mgroup_index\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_group_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall_labels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msort\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mxnull\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/grouper.py\u001b[0m in \u001b[0;36mlabels\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 395\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mlabels\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 396\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_labels\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 397\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_labels\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 398\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_labels\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 399\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/grouper.py\u001b[0m in \u001b[0;36m_make_labels\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 419\u001b[0m \u001b[0muniques\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgrouper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresult_index\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 420\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 421\u001b[0;31m \u001b[0mlabels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0muniques\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0malgorithms\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfactorize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgrouper\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msort\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 422\u001b[0m \u001b[0muniques\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mIndex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muniques\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 423\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_labels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlabels\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/util/_decorators.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 206\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 207\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnew_arg_name\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnew_arg_value\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 208\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 209\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 210\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/algorithms.py\u001b[0m in \u001b[0;36mfactorize\u001b[0;34m(values, sort, order, na_sentinel, size_hint)\u001b[0m\n\u001b[1;32m 670\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 671\u001b[0m labels, uniques = _factorize_array(\n\u001b[0;32m--> 672\u001b[0;31m \u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mna_sentinel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mna_sentinel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msize_hint\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msize_hint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mna_value\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mna_value\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 673\u001b[0m )\n\u001b[1;32m 674\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/algorithms.py\u001b[0m in \u001b[0;36m_factorize_array\u001b[0;34m(values, na_sentinel, size_hint, na_value)\u001b[0m\n\u001b[1;32m 506\u001b[0m \u001b[0mtable\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhash_klass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msize_hint\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 507\u001b[0m uniques, labels = table.factorize(\n\u001b[0;32m--> 508\u001b[0;31m \u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mna_sentinel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mna_sentinel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mna_value\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mna_value\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 509\u001b[0m )\n\u001b[1;32m 510\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.factorize\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable._unique\u001b[0;34m()\u001b[0m\n",
"\u001b[0;31mTypeError\u001b[0m: unhashable type: 'list'"
]
}
],
"outputs": [],
"source": [
"dfG = pd.read_pickle( AllName )\n",
"\n",
"dfG['ADR'] = (dfG['ADR'] / dfG['DR']) * 100\n",
"dfG['SDR'] = (dfG['SDR'] / dfG['DR']) * 100\n",
" \n",
"group = dfG.groupby(['Redistribution_Method', 'Redistribution_Strategy', 'Groups'])['T_total']\n",
"group = dfG.groupby(['Groups','ADR','Spawn_Method','Redistribution_Method', 'Redistribution_Strategy'])['T_total']\n",
"\n",
"grouped_aggG = group.agg(['median'])\n",
"grouped_aggG.rename(columns={'median':'T_total'}, inplace=True)"
"grouped_aggG.rename(columns={'median':'T_total'}, inplace=True)\n",
"grouped_aggG.to_excel(\"resultG.xlsx\") "
]
},
{
"cell_type": "code",
"execution_count": 12,
"execution_count": 23,
"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></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th>T_total</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Groups</th>\n",
" <th>ADR</th>\n",
" <th>Spawn_Method</th>\n",
" <th>Redistribution_Method</th>\n",
" <th>Redistribution_Strategy</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"5\" valign=\"top\">(2, 10)</th>\n",
" <th rowspan=\"2\" valign=\"top\">0.0</th>\n",
" <th rowspan=\"2\" valign=\"top\">(0, 0)</th>\n",
" <th>(0, 0)</th>\n",
" <th>(1, 1)</th>\n",
" <td>389.577585</td>\n",
" </tr>\n",
" <tr>\n",
" <th>(0, 1)</th>\n",
" <th>(1, 1)</th>\n",
" <td>389.559350</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">96.6</th>\n",
" <th rowspan=\"3\" valign=\"top\">(0, 0)</th>\n",
" <th rowspan=\"2\" valign=\"top\">(0, 0)</th>\n",
" <th>(1, 1)</th>\n",
" <td>390.670604</td>\n",
" </tr>\n",
" <tr>\n",
" <th>(1, 2)</th>\n",
" <td>390.207550</td>\n",
" </tr>\n",
" <tr>\n",
" <th>(0, 1)</th>\n",
" <th>(1, 1)</th>\n",
" <td>390.094789</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <th>...</th>\n",
" <th>...</th>\n",
" <th>...</th>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"5\" valign=\"top\">(160, 120)</th>\n",
" <th>0.0</th>\n",
" <th>(0, 0)</th>\n",
" <th>(0, 1)</th>\n",
" <th>(1, 1)</th>\n",
" <td>143.140648</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"4\" valign=\"top\">96.6</th>\n",
" <th rowspan=\"4\" valign=\"top\">(0, 0)</th>\n",
" <th rowspan=\"2\" valign=\"top\">(0, 0)</th>\n",
" <th>(1, 1)</th>\n",
" <td>147.587313</td>\n",
" </tr>\n",
" <tr>\n",
" <th>(1, 2)</th>\n",
" <td>146.947540</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">(0, 1)</th>\n",
" <th>(1, 1)</th>\n",
" <td>142.850494</td>\n",
" </tr>\n",
" <tr>\n",
" <th>(1, 2)</th>\n",
" <td>143.274009</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>252 rows × 1 columns</p>\n",
"</div>"
],
"text/plain": [
"0 0.0\n",
"1 0.0\n",
"2 0.0\n",
"3 0.0\n",
"4 0.0\n",
"5 0.0\n",
"6 0.0\n",
"7 0.0\n",
"8 0.0\n",
"9 0.0\n",
"10 0.0\n",
"11 0.0\n",
"12 0.0\n",
"13 0.0\n",
"14 0.0\n",
"15 0.0\n",
"16 0.0\n",
"17 0.0\n",
"18 0.0\n",
"19 0.0\n",
"20 0.0\n",
"21 0.0\n",
"22 0.0\n",
"23 0.0\n",
"24 0.0\n",
"25 0.0\n",
"26 0.0\n",
"27 0.0\n",
"28 0.0\n",
"29 0.0\n",
"30 0.0\n",
"31 0.0\n",
"32 0.0\n",
"33 0.0\n",
"34 0.0\n",
"35 0.0\n",
"36 0.0\n",
"37 0.0\n",
"38 0.0\n",
"39 0.0\n",
"40 0.0\n",
"41 0.0\n",
"42 0.0\n",
"43 0.0\n",
"44 0.0\n",
"45 0.0\n",
"46 0.0\n",
"47 0.0\n",
"48 0.0\n",
"49 0.0\n",
"50 0.0\n",
"51 0.0\n",
"52 0.0\n",
"53 0.0\n",
"dtype: float64"
" T_total\n",
"Groups ADR Spawn_Method Redistribution_Method Redistribution_Strategy \n",
"(2, 10) 0.0 (0, 0) (0, 0) (1, 1) 389.577585\n",
" (0, 1) (1, 1) 389.559350\n",
" 96.6 (0, 0) (0, 0) (1, 1) 390.670604\n",
" (1, 2) 390.207550\n",
" (0, 1) (1, 1) 390.094789\n",
"... ...\n",
"(160, 120) 0.0 (0, 0) (0, 1) (1, 1) 143.140648\n",
" 96.6 (0, 0) (0, 0) (1, 1) 147.587313\n",
" (1, 2) 146.947540\n",
" (0, 1) (1, 1) 142.850494\n",
" (1, 2) 143.274009\n",
"\n",
"[252 rows x 1 columns]"
]
},
"execution_count": 12,
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grouped_aggG"
]
},
{
"cell_type": "code",
"execution_count": 10,
"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>Total_Groups</th>\n",
" <th>Total_Stages</th>\n",
" <th>Granularity</th>\n",
" <th>SDR</th>\n",
" <th>ADR</th>\n",
" <th>DR</th>\n",
" <th>Redistribution_Method</th>\n",
" <th>Redistribution_Strategy</th>\n",
" <th>Spawn_Method</th>\n",
" <th>Spawn_Strategy</th>\n",
" <th>...</th>\n",
" <th>Stage_Bytes</th>\n",
" <th>Iters</th>\n",
" <th>Asynch_Iters</th>\n",
" <th>T_iter</th>\n",
" <th>T_stages</th>\n",
" <th>T_spawn</th>\n",
" <th>T_spawn_real</th>\n",
" <th>T_SR</th>\n",
" <th>T_AR</th>\n",
" <th>T_total</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>3947883504</td>\n",
" <td>0.0</td>\n",
" <td>3947883504</td>\n",
" <td>(0, 1)</td>\n",
" <td>(1, 1)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 1)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(0, 0)</td>\n",
" <td>((0.317149, 0.217414, 0.134276, 0.148773, 0.15...</td>\n",
" <td>(((0.010701, 0.015691, 0.005213, 0.280889), (0...</td>\n",
" <td>(2.954793,)</td>\n",
" <td>(0,)</td>\n",
" <td>(0.604612,)</td>\n",
" <td>(0,)</td>\n",
" <td>132.377707</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>3947883504</td>\n",
" <td>0.0</td>\n",
" <td>3947883504</td>\n",
" <td>(0, 1)</td>\n",
" <td>(1, 1)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 1)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(0, 0)</td>\n",
" <td>((0.234715, 0.150659, 0.147628, 0.130321, 0.13...</td>\n",
" <td>(((0.010705, 0.020385, 0.016089, 0.171352), (0...</td>\n",
" <td>(2.997034,)</td>\n",
" <td>(0,)</td>\n",
" <td>(0.521934,)</td>\n",
" <td>(0,)</td>\n",
" <td>138.576342</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>3947883504</td>\n",
" <td>0.0</td>\n",
" <td>3947883504</td>\n",
" <td>(0, 1)</td>\n",
" <td>(1, 1)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 1)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(0, 0)</td>\n",
" <td>((0.224323, 0.165911, 0.147396, 0.139989, 0.12...</td>\n",
" <td>(((0.011214, 0.003196, 0.004736, 0.187174), (0...</td>\n",
" <td>(2.962994,)</td>\n",
" <td>(0,)</td>\n",
" <td>(0.558318,)</td>\n",
" <td>(0,)</td>\n",
" <td>154.978141</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>3947883504</td>\n",
" <td>0.0</td>\n",
" <td>3947883504</td>\n",
" <td>(0, 1)</td>\n",
" <td>(1, 1)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 1)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(0, 0)</td>\n",
" <td>((0.211829, 0.151569, 0.152718, 0.128219, 0.11...</td>\n",
" <td>(((0.0107, 0.020957, 0.00406, 0.174168), (0.01...</td>\n",
" <td>(3.049718,)</td>\n",
" <td>(0,)</td>\n",
" <td>(0.509169,)</td>\n",
" <td>(0,)</td>\n",
" <td>137.381302</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>3947883504</td>\n",
" <td>0.0</td>\n",
" <td>3947883504</td>\n",
" <td>(0, 1)</td>\n",
" <td>(1, 1)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 1)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(0, 0)</td>\n",
" <td>((0.211283, 0.148917, 0.133463, 0.135542, 0.13...</td>\n",
" <td>(((0.010703, 0.010967, 0.000106, 0.171724), (0...</td>\n",
" <td>(3.106215,)</td>\n",
" <td>(0,)</td>\n",
" <td>(0.637513,)</td>\n",
" <td>(0,)</td>\n",
" <td>142.663098</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",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>835</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>134228039</td>\n",
" <td>96.6</td>\n",
" <td>3947883503</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(2, 0)</td>\n",
" <td>((0.161252, 0.143764, 0.143709, 0.143632, 0.14...</td>\n",
" <td>(((0.124864, 0.000256, 4.5e-05, 0.036086), (0....</td>\n",
" <td>(2.302374,)</td>\n",
" <td>(2.236232,)</td>\n",
" <td>(0.111917,)</td>\n",
" <td>(1.997651,)</td>\n",
" <td>146.363428</td>\n",
" </tr>\n",
" <tr>\n",
" <th>836</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>134228039</td>\n",
" <td>96.6</td>\n",
" <td>3947883503</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(2, 0)</td>\n",
" <td>((0.159672, 0.142413, 0.142332, 0.142328, 0.14...</td>\n",
" <td>(((0.124902, 0.000214, 2.8e-05, 0.034524), (0....</td>\n",
" <td>(5.546667,)</td>\n",
" <td>(2.110774,)</td>\n",
" <td>(0.551958,)</td>\n",
" <td>(1.983407,)</td>\n",
" <td>150.696184</td>\n",
" </tr>\n",
" <tr>\n",
" <th>837</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>134228039</td>\n",
" <td>96.6</td>\n",
" <td>3947883503</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(2, 0)</td>\n",
" <td>((0.161999, 0.144079, 0.144051, 0.144055, 0.14...</td>\n",
" <td>(((0.124852, 0.00023, 7.5e-05, 0.036838), (0.1...</td>\n",
" <td>(3.725691,)</td>\n",
" <td>(2.051036,)</td>\n",
" <td>(0.12372,)</td>\n",
" <td>(2.11543,)</td>\n",
" <td>144.347781</td>\n",
" </tr>\n",
" <tr>\n",
" <th>838</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>134228039</td>\n",
" <td>96.6</td>\n",
" <td>3947883503</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(2, 0)</td>\n",
" <td>((0.159451, 0.142453, 0.142414, 0.142388, 0.14...</td>\n",
" <td>(((0.124922, 0.000181, 4.6e-05, 0.0343), (0.12...</td>\n",
" <td>(3.066206,)</td>\n",
" <td>(1.990711,)</td>\n",
" <td>(0.119849,)</td>\n",
" <td>(2.015445,)</td>\n",
" <td>144.380533</td>\n",
" </tr>\n",
" <tr>\n",
" <th>839</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>134228039</td>\n",
" <td>96.6</td>\n",
" <td>3947883503</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(2, 0)</td>\n",
" <td>((0.161346, 0.143941, 0.14389, 0.143897, 0.143...</td>\n",
" <td>(((0.124865, 0.000212, 8.1e-05, 0.036188), (0....</td>\n",
" <td>(3.480278,)</td>\n",
" <td>(2.165749,)</td>\n",
" <td>(0.119847,)</td>\n",
" <td>(1.868907,)</td>\n",
" <td>142.924103</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1260 rows × 25 columns</p>\n",
"</div>"
],
"text/plain": [
" Total_Groups Total_Stages Granularity SDR ADR DR \\\n",
"0 2 4 100000 3947883504 0.0 3947883504 \n",
"1 2 4 100000 3947883504 0.0 3947883504 \n",
"2 2 4 100000 3947883504 0.0 3947883504 \n",
"3 2 4 100000 3947883504 0.0 3947883504 \n",
"4 2 4 100000 3947883504 0.0 3947883504 \n",
".. ... ... ... ... ... ... \n",
"835 2 4 100000 134228039 96.6 3947883503 \n",
"836 2 4 100000 134228039 96.6 3947883503 \n",
"837 2 4 100000 134228039 96.6 3947883503 \n",
"838 2 4 100000 134228039 96.6 3947883503 \n",
"839 2 4 100000 134228039 96.6 3947883503 \n",
"\n",
" Redistribution_Method Redistribution_Strategy Spawn_Method Spawn_Strategy \\\n",
"0 (0, 1) (1, 1) (0, 0) (1, 1) \n",
"1 (0, 1) (1, 1) (0, 0) (1, 1) \n",
"2 (0, 1) (1, 1) (0, 0) (1, 1) \n",
"3 (0, 1) (1, 1) (0, 0) (1, 1) \n",
"4 (0, 1) (1, 1) (0, 0) (1, 1) \n",
".. ... ... ... ... \n",
"835 (0, 0) (1, 2) (0, 0) (1, 2) \n",
"836 (0, 0) (1, 2) (0, 0) (1, 2) \n",
"837 (0, 0) (1, 2) (0, 0) (1, 2) \n",
"838 (0, 0) (1, 2) (0, 0) (1, 2) \n",
"839 (0, 0) (1, 2) (0, 0) (1, 2) \n",
"\n",
" ... Stage_Bytes Iters Asynch_Iters \\\n",
"0 ... (0, 8, 8, 33176880) (500, 500) (0, 0) \n",
"1 ... (0, 8, 8, 33176880) (500, 500) (0, 0) \n",
"2 ... (0, 8, 8, 33176880) (500, 500) (0, 0) \n",
"3 ... (0, 8, 8, 33176880) (500, 500) (0, 0) \n",
"4 ... (0, 8, 8, 33176880) (500, 500) (0, 0) \n",
".. ... ... ... ... \n",
"835 ... (0, 8, 8, 33176880) (500, 500) (2, 0) \n",
"836 ... (0, 8, 8, 33176880) (500, 500) (2, 0) \n",
"837 ... (0, 8, 8, 33176880) (500, 500) (2, 0) \n",
"838 ... (0, 8, 8, 33176880) (500, 500) (2, 0) \n",
"839 ... (0, 8, 8, 33176880) (500, 500) (2, 0) \n",
"\n",
" T_iter \\\n",
"0 ((0.317149, 0.217414, 0.134276, 0.148773, 0.15... \n",
"1 ((0.234715, 0.150659, 0.147628, 0.130321, 0.13... \n",
"2 ((0.224323, 0.165911, 0.147396, 0.139989, 0.12... \n",
"3 ((0.211829, 0.151569, 0.152718, 0.128219, 0.11... \n",
"4 ((0.211283, 0.148917, 0.133463, 0.135542, 0.13... \n",
".. ... \n",
"835 ((0.161252, 0.143764, 0.143709, 0.143632, 0.14... \n",
"836 ((0.159672, 0.142413, 0.142332, 0.142328, 0.14... \n",
"837 ((0.161999, 0.144079, 0.144051, 0.144055, 0.14... \n",
"838 ((0.159451, 0.142453, 0.142414, 0.142388, 0.14... \n",
"839 ((0.161346, 0.143941, 0.14389, 0.143897, 0.143... \n",
"\n",
" T_stages T_spawn \\\n",
"0 (((0.010701, 0.015691, 0.005213, 0.280889), (0... (2.954793,) \n",
"1 (((0.010705, 0.020385, 0.016089, 0.171352), (0... (2.997034,) \n",
"2 (((0.011214, 0.003196, 0.004736, 0.187174), (0... (2.962994,) \n",
"3 (((0.0107, 0.020957, 0.00406, 0.174168), (0.01... (3.049718,) \n",
"4 (((0.010703, 0.010967, 0.000106, 0.171724), (0... (3.106215,) \n",
".. ... ... \n",
"835 (((0.124864, 0.000256, 4.5e-05, 0.036086), (0.... (2.302374,) \n",
"836 (((0.124902, 0.000214, 2.8e-05, 0.034524), (0.... (5.546667,) \n",
"837 (((0.124852, 0.00023, 7.5e-05, 0.036838), (0.1... (3.725691,) \n",
"838 (((0.124922, 0.000181, 4.6e-05, 0.0343), (0.12... (3.066206,) \n",
"839 (((0.124865, 0.000212, 8.1e-05, 0.036188), (0.... (3.480278,) \n",
"\n",
" T_spawn_real T_SR T_AR T_total \n",
"0 (0,) (0.604612,) (0,) 132.377707 \n",
"1 (0,) (0.521934,) (0,) 138.576342 \n",
"2 (0,) (0.558318,) (0,) 154.978141 \n",
"3 (0,) (0.509169,) (0,) 137.381302 \n",
"4 (0,) (0.637513,) (0,) 142.663098 \n",
".. ... ... ... ... \n",
"835 (2.236232,) (0.111917,) (1.997651,) 146.363428 \n",
"836 (2.110774,) (0.551958,) (1.983407,) 150.696184 \n",
"837 (2.051036,) (0.12372,) (2.11543,) 144.347781 \n",
"838 (1.990711,) (0.119849,) (2.015445,) 144.380533 \n",
"839 (2.165749,) (0.119847,) (1.868907,) 142.924103 \n",
"\n",
"[1260 rows x 25 columns]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
......@@ -255,6 +654,211 @@
"dfG"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"used_direction='s'\n",
"test_parameter='T_total'\n",
" \n",
"if used_direction=='s':\n",
" df_aux=grouped_aggG.query('NP > NS')\n",
" used_labels=labelsShrink\n",
" name_fig=\"Shrink\"\n",
" np_aux = [10, 20,20, 40,40,40, 80,80,80,80, 120,120,120,120,120]\n",
" nc_aux = [1, 1,10, 1,10,20, 1,10,20,40, 1,10,20,40,80]\n",
"elif used_direction=='e':\n",
" df_aux=grouped_aggM.query('NP < NS')\n",
" used_labels=labelsExpand\n",
" name_fig=\"Expand\"\n",
" np_aux = [1,1,1,1,1, 10,10,10,10, 20,20,20, 40,40, 80 ]\n",
" nc_aux = [10,20,40,80,120, 20,40,80,120, 40,80,120, 80,120, 120]\n",
"elif used_direction=='a':\n",
" df_aux=grouped_aggM\n",
" used_labels=labels\n",
" name_fig=\"All\"\n",
" np_aux = [1,1,1,1,1, 10,10,10,10,10, 20,20,20,20,20, 40,40,40,40,40, 80,80,80,80,80, 120,120,120,120,120]\n",
" nc_aux = [10,20,40,80,120, 1,20,40,80,120, 1,10,40,80,120, 1,10,20,80,120, 1,10,20,40,120, 1,10,20,40,80]\n",
" \n",
"x = np.arange(len(used_labels))\n",
"handles = []\n",
"\n",
"f=plt.figure(figsize=(20, 12))\n",
"#ax=f.add_subplot(111)\n",
"ax = plt.axes(projection='3d')\n",
"ax.azim = -60\n",
"ax.dist = 10\n",
"ax.elev = 10\n",
"ax.set_xlabel(\"NP\", fontsize=20)\n",
"ax.set_ylabel(\"NC\", fontsize=20)\n",
"ax.set_zlabel(\"Alpha\", fontsize=20)\n",
"ax.tick_params(axis='both', which='major', labelsize=24)\n",
"ax.tick_params(axis='both', which='minor', labelsize=22)\n",
"\n",
"for cst_aux in [1,3]:\n",
" df_aux2 = df_aux.query('Cst == @cst_aux')\n",
" for css_aux in [0,1]:\n",
" array_aux = df_aux2.query('Css == @css_aux')['alpha'].values\n",
" ax.plot3D(np_aux, nc_aux, array_aux, colors_spawn[cst_aux*2 + css_aux])\n",
" \n",
" handles.append(handles_spawn[cst_aux*2 + css_aux])\n",
" \n",
"#ax.set_zlim(0,4)\n",
"plt.legend(handles=handles, loc='best', fontsize=20,ncol=2,framealpha=1)\n",
" \n",
"f.tight_layout()\n",
"f.savefig(\"Images/Spawn/3dPlot_\"+name_fig+'_'+test_parameter+\".png\", format=\"png\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"class MalleabilityIterator:\n",
" def __init__(self):\n",
" self._sm = [0,1]\n",
" self._rm = [0,1]\n",
" self._rs = [1,2]\n",
" self._adr = [0,96.6]\n",
" self._arrays = [self._sm, self._rm, self._rs, self._adr]\n",
" self._max_index = len(self._sm) * len(self._rm) * len(self._rs) * len(self._adr)\n",
" self._in_use = [0]*4\n",
" self._index = 0\n",
"\n",
" def __iter__(self):\n",
" return self\n",
"\n",
" def __next__(self):\n",
" if self._index < self._max_index:\n",
" for index in len(self._arrays):\n",
" if self._in_use[index] < len(self._arrays[index])-1:\n",
" self._in_use[index]+=1\n",
" break\n",
" elif index == len(self._arrays) - 1 && self._in_use[index] == len(self._arrays[index])-1:\n",
" result = []\n",
" for index in len(self._arrays):\n",
" result.append(self._arrays[index][self._in_use[index]])\n",
" \n",
" self._index += 1\n",
" return tuple(result)\n",
" else:\n",
" raise StopIteration"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for sp_method in [0,1]:\n",
" df_aux = grouped_aggG.query('Spawn_Method == @sp_method')\n",
" for rp_method in [0,1]:\n",
" df_aux = grouped_aggG.query('Redistribution_Method == @rp_method')"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[-0.00982064 -0.0113957 -0.01319036 ... -0.01522953 -0.01319036\n",
" -0.0113957 ]\n",
" [-0.0113957 -0.01322338 -0.01530587 ... -0.01767209 -0.01530587\n",
" -0.01322338]\n",
" [-0.01319036 -0.01530587 -0.01771632 ... -0.02045518 -0.01771632\n",
" -0.01530587]\n",
" ...\n",
" [-0.01200234 -0.01414685 -0.01660867 ... 0.02918791 0.03019517\n",
" 0.03085725]\n",
" [-0.01097235 -0.01288301 -0.01507265 ... 0.01583738 0.01709512\n",
" 0.01804782]\n",
" [-0.00988645 -0.01157475 -0.01350698 ... 0.00702321 0.0083816\n",
" 0.00947216]]\n"
]
},
{
"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": [
"fig, ax = plt.subplots(1, 1, subplot_kw={'projection': '3d'})\n",
"\n",
"# Get the test data\n",
"X, Y, Z = axes3d.get_test_data(0.05)\n",
"\n",
"\n",
"Z[0] = 200\n",
"\n",
"ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)\n",
"ax.set_proj_type('ortho') # FOV = 0 deg\n",
"ax.set_title(\"'ortho'\\nfocal_length = ∞\", fontsize=10)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-3.0000000e+01 -2.9500000e+01 -2.9000000e+01 -2.8500000e+01\n",
" -2.8000000e+01 -2.7500000e+01 -2.7000000e+01 -2.6500000e+01\n",
" -2.6000000e+01 -2.5500000e+01 -2.5000000e+01 -2.4500000e+01\n",
" -2.4000000e+01 -2.3500000e+01 -2.3000000e+01 -2.2500000e+01\n",
" -2.2000000e+01 -2.1500000e+01 -2.1000000e+01 -2.0500000e+01\n",
" -2.0000000e+01 -1.9500000e+01 -1.9000000e+01 -1.8500000e+01\n",
" -1.8000000e+01 -1.7500000e+01 -1.7000000e+01 -1.6500000e+01\n",
" -1.6000000e+01 -1.5500000e+01 -1.5000000e+01 -1.4500000e+01\n",
" -1.4000000e+01 -1.3500000e+01 -1.3000000e+01 -1.2500000e+01\n",
" -1.2000000e+01 -1.1500000e+01 -1.1000000e+01 -1.0500000e+01\n",
" -1.0000000e+01 -9.5000000e+00 -9.0000000e+00 -8.5000000e+00\n",
" -8.0000000e+00 -7.5000000e+00 -7.0000000e+00 -6.5000000e+00\n",
" -6.0000000e+00 -5.5000000e+00 -5.0000000e+00 -4.5000000e+00\n",
" -4.0000000e+00 -3.5000000e+00 -3.0000000e+00 -2.5000000e+00\n",
" -2.0000000e+00 -1.5000000e+00 -1.0000000e+00 -5.0000000e-01\n",
" -1.0658141e-13 5.0000000e-01 1.0000000e+00 1.5000000e+00\n",
" 2.0000000e+00 2.5000000e+00 3.0000000e+00 3.5000000e+00\n",
" 4.0000000e+00 4.5000000e+00 5.0000000e+00 5.5000000e+00\n",
" 6.0000000e+00 6.5000000e+00 7.0000000e+00 7.5000000e+00\n",
" 8.0000000e+00 8.5000000e+00 9.0000000e+00 9.5000000e+00\n",
" 1.0000000e+01 1.0500000e+01 1.1000000e+01 1.1500000e+01\n",
" 1.2000000e+01 1.2500000e+01 1.3000000e+01 1.3500000e+01\n",
" 1.4000000e+01 1.4500000e+01 1.5000000e+01 1.5500000e+01\n",
" 1.6000000e+01 1.6500000e+01 1.7000000e+01 1.7500000e+01\n",
" 1.8000000e+01 1.8500000e+01 1.9000000e+01 1.9500000e+01\n",
" 2.0000000e+01 2.0500000e+01 2.1000000e+01 2.1500000e+01\n",
" 2.2000000e+01 2.2500000e+01 2.3000000e+01 2.3500000e+01\n",
" 2.4000000e+01 2.4500000e+01 2.5000000e+01 2.5500000e+01\n",
" 2.6000000e+01 2.6500000e+01 2.7000000e+01 2.7500000e+01\n",
" 2.8000000e+01 2.8500000e+01 2.9000000e+01 2.9500000e+01]\n"
]
}
],
"source": [
"print(X[1])"
]
},
{
"cell_type": "code",
"execution_count": null,
......@@ -265,7 +869,7 @@
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
......@@ -279,7 +883,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
"version": "3.9.7"
}
},
"nbformat": 4,
......
%% Cell type:code id: tags:
``` python
%matplotlib inline
import pandas as pd
from pandas import DataFrame, Series
import numpy as np
import math
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import matplotlib.colors as colors
from matplotlib.legend_handler import HandlerLine2D, HandlerTuple
from matplotlib.colors import LinearSegmentedColormap
from scipy import stats
#import scikit_posthocs as sp
import scikit_posthocs as sp
import sys
from mpl_toolkits.mplot3d import axes3d
```
%% Cell type:code id: tags:
``` python
AllName="dataG.pkl"
ResizesName="dataM.pkl"
matrixIt="dataL.pkl"
matrixIt_Total="data_L_Total.csv"
n_qty=8 #CAMBIAR SEGUN LA CANTIDAD DE NODOS USADOS
n_groups= 2
n_cores=20
repet = 5 #CAMBIAR EL NUMERO SEGUN NUMERO DE EJECUCIONES POR CONFIG
time_constant = False # Cambiar segun el speedUp usado
speedup = 0.66 # Porcentaje del speedup ideal
p_value = 0.05
values = [2, 10, 20, 40, 80, 120, 160, 180]
# WORST BEST
dist_names = ['null', 'BalancedFit', 'CompactFit']
processes = [2,10,20,40,80,120,160,180]
labelsP = [['(2,2)', '(2,10)', '(2,20)', '(2,40)'],['(10,2)', '(10,10)', '(10,20)', '(10,40)'],
['(20,2)', '(20,10)', '(20,20)', '(20,40)'],['(40,2)', '(40,10)', '(40,20)', '(40,40)']]
labelsP_J = ['(2,2)', '(2,10)', '(2,20)', '(2,40)','(10,2)', '(10,10)', '(10,20)', '(10,40)',
'(20,2)', '(20,10)', '(20,20)', '(20,40)','(40,2)', '(40,10)', '(40,20)', '(40,40)']
processes = [2,10,20,40,80,120,160]
positions = [321, 322, 323, 324, 325]
positions_small = [221, 222, 223, 224]
labels = ['(1,10)', '(1,20)', '(1,40)','(1,80)','(1,120)',
'(10,1)', '(10,20)', '(10,40)','(10,80)','(10,120)',
'(20,1)', '(20,10)','(20,40)','(20,80)','(20,120)',
'(40,1)', '(40,10)', '(40,20)','(40,80)','(40,120)',
'(80,1)', '(80,10)', '(80,20)', '(80,40)','(80,120)',
'(120,1)', '(120,10)', '(120,20)','(120,40)','(120,80)']
labelsExpand = ['(1,10)', '(1,20)', '(1,40)','(1,80)','(1,120)',
'(10,20)', '(10,40)','(10,80)','(10,120)',
'(20,40)','(20,80)','(20,120)',
'(40,80)','(40,120)',
'(80,120)']
labels = ['(1,10)', '(1,20)', '(1,40)', '(1,80)', '(1,120)','(1,160)',
'(10,1)', '(10,20)', '(10,40)', '(10,80)', '(10,120)','(10,160)',
'(20,1)', '(20,10)', '(20,40)', '(20,80)', '(20,120)','(20,160)',
'(40,1)', '(40,10)', '(40,20)', '(40,80)', '(40,120)','(40,160)',
'(80,1)', '(80,10)', '(80,20)', '(80,40)', '(80,120)','(80,160)',
'(120,1)','(120,10)', '(120,20)','(120,40)','(120,80)','(120,160)',
'(160,1)','(160,10)', '(160,20)','(160,40)','(160,80)','(160,120)']
labelsExpand = ['(1,10)', '(1,20)', '(1,40)', '(1,80)', '(1,120)','(1,160)',
'(10,20)', '(10,40)', '(10,80)', '(10,120)','(10,160)',
'(20,40)', '(20,80)', '(20,120)','(20,160)',
'(40,80)', '(40,120)','(40,160)',
'(80,120)','(80,160)',
'(120,160)']
labelsShrink = ['(10,1)',
'(20,1)', '(20,10)',
'(40,1)', '(40,10)', '(40,20)',
'(80,1)', '(80,10)', '(80,20)', '(80,40)',
'(120,1)', '(120,10)', '(120,20)','(120,40)','(120,80)']
labelsExpandOrdered = ['(1,10)', '(1,20)', '(10,20)',
'(1,40)','(10,40)','(20,40)',
'(1,80)','(10,80)','(20,80)','(40,80)',
'(1,120)', '(10,120)', '(20,120)','(40,120)','(80,120)']
labelsShrinkOrdered = ['(10,1)', '(20,1)', '(40,1)', '(80,1)', '(120,1)',
'(20,10)', '(40,10)', '(80,10)', '(120,10)',
'(40,20)', '(80,20)', '(120,20)',
'(80,40)','(120,40)',
'(120,80)']
labelsExpandIntra = ['(1,10)', '(1,20)','(10,20)']
labelsShrinkIntra = ['(10,1)', '(20,1)', '(20,10)']
labelsExpandInter = ['(1,40)','(1,80)', '(1,160)',
'(10,40)','(10,80)', '(10,160)',
'(20,40)','(20,80)', '(20,160)',
'(40,80)', '(40,160)',
'(80,160)']
labelsShrinkInter = ['(40,1)', '(40,10)', '(40,20)',
'(80,1)', '(80,10)', '(80,20)','(80,40)',
'(160,1)', '(160,10)', '(160,20)','(160,40)', '(160,80)']
#0 #1 #2 #3
'(20,1)', '(20,10)',
'(40,1)', '(40,10)', '(40,20)',
'(80,1)', '(80,10)', '(80,20)', '(80,40)',
'(120,1)','(120,10)', '(120,20)','(120,40)','(120,80)',
'(160,1)','(160,10)', '(160,20)','(160,40)','(160,80)','(160,120)']
# WORST BEST
labels_dist = ['null', 'SpreadFit', 'CompactFit']
#0 #1 #2 #3
labelsMethods = ['Baseline', 'Baseline single','Baseline - Asynchronous','Baseline single - Asynchronous',
'Merge','Merge single','Merge - Asynchronous','Merge single - Asynchronous']
#4 #5 #6 #7
#4 #5 #6 #7
colors_spawn = ['green','springgreen','blue','darkblue','red','darkred','darkgoldenrod','olive','violet']
linestyle_spawn = ['-', '--', '-.', ':']
markers_spawn = ['.','v','s','p', 'h','d','X','P','^']
OrMult_patch = mpatches.Patch(hatch='', facecolor='green', label='Baseline')
OrSing_patch = mpatches.Patch(hatch='', facecolor='springgreen', label='Baseline single')
OrPthMult_patch = mpatches.Patch(hatch='//', facecolor='blue', label='Baseline - Asyncrhonous')
OrPthSing_patch = mpatches.Patch(hatch='\\', facecolor='darkblue', label='Baseline single - Asyncrhonous')
MergeMult_patch = mpatches.Patch(hatch='||', facecolor='red', label='Merge')
MergeSing_patch = mpatches.Patch(hatch='...', facecolor='darkred', label='Merge single')
MergePthMult_patch = mpatches.Patch(hatch='xx', facecolor='yellow', label='Merge - Asyncrhonous')
MergePthSing_patch = mpatches.Patch(hatch='++', facecolor='olive', label='Merge single - Asyncrhonous')
handles_spawn = [OrMult_patch,OrSing_patch,OrPthMult_patch,OrPthSing_patch,MergeMult_patch,MergeSing_patch,MergePthMult_patch,MergePthSing_patch]
```
%% Cell type:code id: tags:
``` python
dfG = pd.read_pickle( AllName )
dfG['ADR'] = (dfG['ADR'] / dfG['DR']) * 100
dfG['SDR'] = (dfG['SDR'] / dfG['DR']) * 100
group = dfG.groupby(['Redistribution_Method', 'Redistribution_Strategy', 'Groups'])['T_total']
group = dfG.groupby(['Groups','ADR','Spawn_Method','Redistribution_Method', 'Redistribution_Strategy'])['T_total']
grouped_aggG = group.agg(['median'])
grouped_aggG.rename(columns={'median':'T_total'}, inplace=True)
grouped_aggG.to_excel("resultG.xlsx")
```
%%%% Output: error
%% Cell type:code id: tags:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/groupby.py in median(self, **kwargs)
1230 alt=lambda x, axis: Series(x).median(axis=axis, **kwargs),
-> 1231 **kwargs
1232 )
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/groupby.py in _cython_agg_general(self, how, alt, numeric_only, min_count)
880 result, names = self.grouper.aggregate(
--> 881 obj.values, how, min_count=min_count
882 )
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py in aggregate(self, values, how, axis, min_count)
595 return self._cython_operation(
--> 596 "aggregate", values, how, axis, min_count=min_count
597 )
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py in _cython_operation(self, kind, values, how, axis, min_count, **kwargs)
484 values = values[:, None]
--> 485 out_shape = (self.ngroups, arity)
486 else:
pandas/_libs/properties.pyx in pandas._libs.properties.CachedProperty.__get__()
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py in ngroups(self)
321 def ngroups(self):
--> 322 return len(self.result_index)
323
pandas/_libs/properties.pyx in pandas._libs.properties.CachedProperty.__get__()
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py in result_index(self)
334
--> 335 codes = self.recons_labels
336 levels = [ping.result_index for ping in self.groupings]
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py in recons_labels(self)
325 def recons_labels(self):
--> 326 comp_ids, obs_ids, _ = self.group_info
327 labels = (ping.labels for ping in self.groupings)
pandas/_libs/properties.pyx in pandas._libs.properties.CachedProperty.__get__()
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py in group_info(self)
295 def group_info(self):
--> 296 comp_ids, obs_group_ids = self._get_compressed_labels()
297
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py in _get_compressed_labels(self)
311 def _get_compressed_labels(self):
--> 312 all_labels = [ping.labels for ping in self.groupings]
313 if len(all_labels) > 1:
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py in <listcomp>(.0)
311 def _get_compressed_labels(self):
--> 312 all_labels = [ping.labels for ping in self.groupings]
313 if len(all_labels) > 1:
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/grouper.py in labels(self)
396 if self._labels is None:
--> 397 self._make_labels()
398 return self._labels
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/grouper.py in _make_labels(self)
420 else:
--> 421 labels, uniques = algorithms.factorize(self.grouper, sort=self.sort)
422 uniques = Index(uniques, name=self.name)
~/anaconda3/lib/python3.7/site-packages/pandas/util/_decorators.py in wrapper(*args, **kwargs)
207 kwargs[new_arg_name] = new_arg_value
--> 208 return func(*args, **kwargs)
209
~/anaconda3/lib/python3.7/site-packages/pandas/core/algorithms.py in factorize(values, sort, order, na_sentinel, size_hint)
671 labels, uniques = _factorize_array(
--> 672 values, na_sentinel=na_sentinel, size_hint=size_hint, na_value=na_value
673 )
~/anaconda3/lib/python3.7/site-packages/pandas/core/algorithms.py in _factorize_array(values, na_sentinel, size_hint, na_value)
507 uniques, labels = table.factorize(
--> 508 values, na_sentinel=na_sentinel, na_value=na_value
509 )
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.factorize()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable._unique()
TypeError: unhashable type: 'list'
During handling of the above exception, another exception occurred:
TypeError Traceback (most recent call last)
<ipython-input-14-8f3f554db108> in <module>
5 group = dfG.groupby(['Redistribution_Method', 'Redistribution_Strategy', 'Groups'])['T_total']
6
----> 7 grouped_aggG = group.agg(['median'])
8 grouped_aggG.rename(columns={'median':'T_total'}, inplace=True)
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/generic.py in aggregate(self, func_or_funcs, *args, **kwargs)
849 # but not the class list / tuple itself.
850 func_or_funcs = _maybe_mangle_lambdas(func_or_funcs)
--> 851 ret = self._aggregate_multiple_funcs(func_or_funcs, (_level or 0) + 1)
852 if relabeling:
853 ret.columns = columns
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/generic.py in _aggregate_multiple_funcs(self, arg, _level)
928 obj._reset_cache()
929 obj._selection = name
--> 930 results[name] = obj.aggregate(func)
931
932 if any(isinstance(x, DataFrame) for x in results.values()):
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/generic.py in aggregate(self, func_or_funcs, *args, **kwargs)
843
844 if isinstance(func_or_funcs, str):
--> 845 return getattr(self, func_or_funcs)(*args, **kwargs)
846
847 if isinstance(func_or_funcs, abc.Iterable):
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/groupby.py in median(self, **kwargs)
1241
1242 with _group_selection_context(self):
-> 1243 return self._python_agg_general(f)
1244
1245 @Substitution(name="groupby")
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/groupby.py in _python_agg_general(self, func, *args, **kwargs)
904
905 if len(output) == 0:
--> 906 return self._python_apply_general(f)
907
908 if self.grouper._filter_empty_groups:
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/groupby.py in _python_apply_general(self, f)
740
741 def _python_apply_general(self, f):
--> 742 keys, values, mutated = self.grouper.apply(f, self._selected_obj, self.axis)
743
744 return self._wrap_applied_output(
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py in apply(self, f, data, axis)
189 def apply(self, f, data, axis=0):
190 mutated = self.mutated
--> 191 splitter = self._get_splitter(data, axis=axis)
192 group_keys = self._get_group_keys()
193 result_values = None
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py in _get_splitter(self, data, axis)
166
167 def _get_splitter(self, data, axis=0):
--> 168 comp_ids, _, ngroups = self.group_info
169 return get_splitter(data, comp_ids, ngroups, axis=axis)
170
pandas/_libs/properties.pyx in pandas._libs.properties.CachedProperty.__get__()
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py in group_info(self)
294 @cache_readonly
295 def group_info(self):
--> 296 comp_ids, obs_group_ids = self._get_compressed_labels()
297
298 ngroups = len(obs_group_ids)
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py in _get_compressed_labels(self)
310
311 def _get_compressed_labels(self):
--> 312 all_labels = [ping.labels for ping in self.groupings]
313 if len(all_labels) > 1:
314 group_index = get_group_index(all_labels, self.shape, sort=True, xnull=True)
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/ops.py in <listcomp>(.0)
310
311 def _get_compressed_labels(self):
--> 312 all_labels = [ping.labels for ping in self.groupings]
313 if len(all_labels) > 1:
314 group_index = get_group_index(all_labels, self.shape, sort=True, xnull=True)
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/grouper.py in labels(self)
395 def labels(self):
396 if self._labels is None:
--> 397 self._make_labels()
398 return self._labels
399
~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/grouper.py in _make_labels(self)
419 uniques = self.grouper.result_index
420 else:
--> 421 labels, uniques = algorithms.factorize(self.grouper, sort=self.sort)
422 uniques = Index(uniques, name=self.name)
423 self._labels = labels
~/anaconda3/lib/python3.7/site-packages/pandas/util/_decorators.py in wrapper(*args, **kwargs)
206 else:
207 kwargs[new_arg_name] = new_arg_value
--> 208 return func(*args, **kwargs)
209
210 return wrapper
~/anaconda3/lib/python3.7/site-packages/pandas/core/algorithms.py in factorize(values, sort, order, na_sentinel, size_hint)
670
671 labels, uniques = _factorize_array(
--> 672 values, na_sentinel=na_sentinel, size_hint=size_hint, na_value=na_value
673 )
674
~/anaconda3/lib/python3.7/site-packages/pandas/core/algorithms.py in _factorize_array(values, na_sentinel, size_hint, na_value)
506 table = hash_klass(size_hint or len(values))
507 uniques, labels = table.factorize(
--> 508 values, na_sentinel=na_sentinel, na_value=na_value
509 )
510
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.factorize()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable._unique()
TypeError: unhashable type: 'list'
``` python
grouped_aggG
```
%%%% Output: execute_result
T_total
Groups ADR Spawn_Method Redistribution_Method Redistribution_Strategy
(2, 10) 0.0 (0, 0) (0, 0) (1, 1) 389.577585
(0, 1) (1, 1) 389.559350
96.6 (0, 0) (0, 0) (1, 1) 390.670604
(1, 2) 390.207550
(0, 1) (1, 1) 390.094789
... ...
(160, 120) 0.0 (0, 0) (0, 1) (1, 1) 143.140648
96.6 (0, 0) (0, 0) (1, 1) 147.587313
(1, 2) 146.947540
(0, 1) (1, 1) 142.850494
(1, 2) 143.274009
[252 rows x 1 columns]
%% Cell type:code id: tags:
``` python
dfG
```
%%%% Output: execute_result
0 0.0
1 0.0
2 0.0
3 0.0
4 0.0
5 0.0
6 0.0
7 0.0
8 0.0
9 0.0
10 0.0
11 0.0
12 0.0
13 0.0
14 0.0
15 0.0
16 0.0
17 0.0
18 0.0
19 0.0
20 0.0
21 0.0
22 0.0
23 0.0
24 0.0
25 0.0
26 0.0
27 0.0
28 0.0
29 0.0
30 0.0
31 0.0
32 0.0
33 0.0
34 0.0
35 0.0
36 0.0
37 0.0
38 0.0
39 0.0
40 0.0
41 0.0
42 0.0
43 0.0
44 0.0
45 0.0
46 0.0
47 0.0
48 0.0
49 0.0
50 0.0
51 0.0
52 0.0
53 0.0
dtype: float64
Total_Groups Total_Stages Granularity SDR ADR DR \
0 2 4 100000 3947883504 0.0 3947883504
1 2 4 100000 3947883504 0.0 3947883504
2 2 4 100000 3947883504 0.0 3947883504
3 2 4 100000 3947883504 0.0 3947883504
4 2 4 100000 3947883504 0.0 3947883504
.. ... ... ... ... ... ...
835 2 4 100000 134228039 96.6 3947883503
836 2 4 100000 134228039 96.6 3947883503
837 2 4 100000 134228039 96.6 3947883503
838 2 4 100000 134228039 96.6 3947883503
839 2 4 100000 134228039 96.6 3947883503
Redistribution_Method Redistribution_Strategy Spawn_Method Spawn_Strategy \
0 (0, 1) (1, 1) (0, 0) (1, 1)
1 (0, 1) (1, 1) (0, 0) (1, 1)
2 (0, 1) (1, 1) (0, 0) (1, 1)
3 (0, 1) (1, 1) (0, 0) (1, 1)
4 (0, 1) (1, 1) (0, 0) (1, 1)
.. ... ... ... ...
835 (0, 0) (1, 2) (0, 0) (1, 2)
836 (0, 0) (1, 2) (0, 0) (1, 2)
837 (0, 0) (1, 2) (0, 0) (1, 2)
838 (0, 0) (1, 2) (0, 0) (1, 2)
839 (0, 0) (1, 2) (0, 0) (1, 2)
... Stage_Bytes Iters Asynch_Iters \
0 ... (0, 8, 8, 33176880) (500, 500) (0, 0)
1 ... (0, 8, 8, 33176880) (500, 500) (0, 0)
2 ... (0, 8, 8, 33176880) (500, 500) (0, 0)
3 ... (0, 8, 8, 33176880) (500, 500) (0, 0)
4 ... (0, 8, 8, 33176880) (500, 500) (0, 0)
.. ... ... ... ...
835 ... (0, 8, 8, 33176880) (500, 500) (2, 0)
836 ... (0, 8, 8, 33176880) (500, 500) (2, 0)
837 ... (0, 8, 8, 33176880) (500, 500) (2, 0)
838 ... (0, 8, 8, 33176880) (500, 500) (2, 0)
839 ... (0, 8, 8, 33176880) (500, 500) (2, 0)
T_iter \
0 ((0.317149, 0.217414, 0.134276, 0.148773, 0.15...
1 ((0.234715, 0.150659, 0.147628, 0.130321, 0.13...
2 ((0.224323, 0.165911, 0.147396, 0.139989, 0.12...
3 ((0.211829, 0.151569, 0.152718, 0.128219, 0.11...
4 ((0.211283, 0.148917, 0.133463, 0.135542, 0.13...
.. ...
835 ((0.161252, 0.143764, 0.143709, 0.143632, 0.14...
836 ((0.159672, 0.142413, 0.142332, 0.142328, 0.14...
837 ((0.161999, 0.144079, 0.144051, 0.144055, 0.14...
838 ((0.159451, 0.142453, 0.142414, 0.142388, 0.14...
839 ((0.161346, 0.143941, 0.14389, 0.143897, 0.143...
T_stages T_spawn \
0 (((0.010701, 0.015691, 0.005213, 0.280889), (0... (2.954793,)
1 (((0.010705, 0.020385, 0.016089, 0.171352), (0... (2.997034,)
2 (((0.011214, 0.003196, 0.004736, 0.187174), (0... (2.962994,)
3 (((0.0107, 0.020957, 0.00406, 0.174168), (0.01... (3.049718,)
4 (((0.010703, 0.010967, 0.000106, 0.171724), (0... (3.106215,)
.. ... ...
835 (((0.124864, 0.000256, 4.5e-05, 0.036086), (0.... (2.302374,)
836 (((0.124902, 0.000214, 2.8e-05, 0.034524), (0.... (5.546667,)
837 (((0.124852, 0.00023, 7.5e-05, 0.036838), (0.1... (3.725691,)
838 (((0.124922, 0.000181, 4.6e-05, 0.0343), (0.12... (3.066206,)
839 (((0.124865, 0.000212, 8.1e-05, 0.036188), (0.... (3.480278,)
T_spawn_real T_SR T_AR T_total
0 (0,) (0.604612,) (0,) 132.377707
1 (0,) (0.521934,) (0,) 138.576342
2 (0,) (0.558318,) (0,) 154.978141
3 (0,) (0.509169,) (0,) 137.381302
4 (0,) (0.637513,) (0,) 142.663098
.. ... ... ... ...
835 (2.236232,) (0.111917,) (1.997651,) 146.363428
836 (2.110774,) (0.551958,) (1.983407,) 150.696184
837 (2.051036,) (0.12372,) (2.11543,) 144.347781
838 (1.990711,) (0.119849,) (2.015445,) 144.380533
839 (2.165749,) (0.119847,) (1.868907,) 142.924103
[1260 rows x 25 columns]
%% Cell type:code id: tags:
``` python
used_direction='s'
test_parameter='T_total'
if used_direction=='s':
df_aux=grouped_aggG.query('NP > NS')
used_labels=labelsShrink
name_fig="Shrink"
np_aux = [10, 20,20, 40,40,40, 80,80,80,80, 120,120,120,120,120]
nc_aux = [1, 1,10, 1,10,20, 1,10,20,40, 1,10,20,40,80]
elif used_direction=='e':
df_aux=grouped_aggM.query('NP < NS')
used_labels=labelsExpand
name_fig="Expand"
np_aux = [1,1,1,1,1, 10,10,10,10, 20,20,20, 40,40, 80 ]
nc_aux = [10,20,40,80,120, 20,40,80,120, 40,80,120, 80,120, 120]
elif used_direction=='a':
df_aux=grouped_aggM
used_labels=labels
name_fig="All"
np_aux = [1,1,1,1,1, 10,10,10,10,10, 20,20,20,20,20, 40,40,40,40,40, 80,80,80,80,80, 120,120,120,120,120]
nc_aux = [10,20,40,80,120, 1,20,40,80,120, 1,10,40,80,120, 1,10,20,80,120, 1,10,20,40,120, 1,10,20,40,80]
x = np.arange(len(used_labels))
handles = []
f=plt.figure(figsize=(20, 12))
#ax=f.add_subplot(111)
ax = plt.axes(projection='3d')
ax.azim = -60
ax.dist = 10
ax.elev = 10
ax.set_xlabel("NP", fontsize=20)
ax.set_ylabel("NC", fontsize=20)
ax.set_zlabel("Alpha", fontsize=20)
ax.tick_params(axis='both', which='major', labelsize=24)
ax.tick_params(axis='both', which='minor', labelsize=22)
for cst_aux in [1,3]:
df_aux2 = df_aux.query('Cst == @cst_aux')
for css_aux in [0,1]:
array_aux = df_aux2.query('Css == @css_aux')['alpha'].values
ax.plot3D(np_aux, nc_aux, array_aux, colors_spawn[cst_aux*2 + css_aux])
handles.append(handles_spawn[cst_aux*2 + css_aux])
#ax.set_zlim(0,4)
plt.legend(handles=handles, loc='best', fontsize=20,ncol=2,framealpha=1)
f.tight_layout()
f.savefig("Images/Spawn/3dPlot_"+name_fig+'_'+test_parameter+".png", format="png")
```
%% Cell type:code id: tags:
``` python
class MalleabilityIterator:
def __init__(self):
self._sm = [0,1]
self._rm = [0,1]
self._rs = [1,2]
self._adr = [0,96.6]
self._arrays = [self._sm, self._rm, self._rs, self._adr]
self._max_index = len(self._sm) * len(self._rm) * len(self._rs) * len(self._adr)
self._in_use = [0]*4
self._index = 0
def __iter__(self):
return self
def __next__(self):
if self._index < self._max_index:
for index in len(self._arrays):
if self._in_use[index] < len(self._arrays[index])-1:
self._in_use[index]+=1
break
elif index == len(self._arrays) - 1 && self._in_use[index] == len(self._arrays[index])-1:
result = []
for index in len(self._arrays):
result.append(self._arrays[index][self._in_use[index]])
self._index += 1
return tuple(result)
else:
raise StopIteration
```
%% Cell type:code id: tags:
``` python
for sp_method in [0,1]:
df_aux = grouped_aggG.query('Spawn_Method == @sp_method')
for rp_method in [0,1]:
df_aux = grouped_aggG.query('Redistribution_Method == @rp_method')
```
%% Cell type:code id: tags:
``` python
fig, ax = plt.subplots(1, 1, subplot_kw={'projection': '3d'})
# Get the test data
X, Y, Z = axes3d.get_test_data(0.05)
Z[0] = 200
ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)
ax.set_proj_type('ortho') # FOV = 0 deg
ax.set_title("'ortho'\nfocal_length = ∞", fontsize=10)
plt.show()
```
%%%% Output: stream
[[-0.00982064 -0.0113957 -0.01319036 ... -0.01522953 -0.01319036
-0.0113957 ]
[-0.0113957 -0.01322338 -0.01530587 ... -0.01767209 -0.01530587
-0.01322338]
[-0.01319036 -0.01530587 -0.01771632 ... -0.02045518 -0.01771632
-0.01530587]
...
[-0.01200234 -0.01414685 -0.01660867 ... 0.02918791 0.03019517
0.03085725]
[-0.01097235 -0.01288301 -0.01507265 ... 0.01583738 0.01709512
0.01804782]
[-0.00988645 -0.01157475 -0.01350698 ... 0.00702321 0.0083816
0.00947216]]
%%%% Output: display_data
[Hidden Image Output]
%% Cell type:code id: tags:
``` python
print(X[1])
```
%%%% Output: stream
[-3.0000000e+01 -2.9500000e+01 -2.9000000e+01 -2.8500000e+01
-2.8000000e+01 -2.7500000e+01 -2.7000000e+01 -2.6500000e+01
-2.6000000e+01 -2.5500000e+01 -2.5000000e+01 -2.4500000e+01
-2.4000000e+01 -2.3500000e+01 -2.3000000e+01 -2.2500000e+01
-2.2000000e+01 -2.1500000e+01 -2.1000000e+01 -2.0500000e+01
-2.0000000e+01 -1.9500000e+01 -1.9000000e+01 -1.8500000e+01
-1.8000000e+01 -1.7500000e+01 -1.7000000e+01 -1.6500000e+01
-1.6000000e+01 -1.5500000e+01 -1.5000000e+01 -1.4500000e+01
-1.4000000e+01 -1.3500000e+01 -1.3000000e+01 -1.2500000e+01
-1.2000000e+01 -1.1500000e+01 -1.1000000e+01 -1.0500000e+01
-1.0000000e+01 -9.5000000e+00 -9.0000000e+00 -8.5000000e+00
-8.0000000e+00 -7.5000000e+00 -7.0000000e+00 -6.5000000e+00
-6.0000000e+00 -5.5000000e+00 -5.0000000e+00 -4.5000000e+00
-4.0000000e+00 -3.5000000e+00 -3.0000000e+00 -2.5000000e+00
-2.0000000e+00 -1.5000000e+00 -1.0000000e+00 -5.0000000e-01
-1.0658141e-13 5.0000000e-01 1.0000000e+00 1.5000000e+00
2.0000000e+00 2.5000000e+00 3.0000000e+00 3.5000000e+00
4.0000000e+00 4.5000000e+00 5.0000000e+00 5.5000000e+00
6.0000000e+00 6.5000000e+00 7.0000000e+00 7.5000000e+00
8.0000000e+00 8.5000000e+00 9.0000000e+00 9.5000000e+00
1.0000000e+01 1.0500000e+01 1.1000000e+01 1.1500000e+01
1.2000000e+01 1.2500000e+01 1.3000000e+01 1.3500000e+01
1.4000000e+01 1.4500000e+01 1.5000000e+01 1.5500000e+01
1.6000000e+01 1.6500000e+01 1.7000000e+01 1.7500000e+01
1.8000000e+01 1.8500000e+01 1.9000000e+01 1.9500000e+01
2.0000000e+01 2.0500000e+01 2.1000000e+01 2.1500000e+01
2.2000000e+01 2.2500000e+01 2.3000000e+01 2.3500000e+01
2.4000000e+01 2.4500000e+01 2.5000000e+01 2.5500000e+01
2.6000000e+01 2.6500000e+01 2.7000000e+01 2.7500000e+01
2.8000000e+01 2.8500000e+01 2.9000000e+01 2.9500000e+01]
%% Cell type:code id: tags:
``` python
```
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment