{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import pandas as pd\n",
"from pandas import DataFrame, Series\n",
"import numpy as np\n",
"import math\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.patches as mpatches\n",
"import matplotlib.colors as colors\n",
"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"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"matrixMalEX=\"data_GG.csv\"\n",
"matrixMal=\"data_GM.csv\"\n",
"matrixIt=\"data_L.csv\"\n",
"matrixIt_Total=\"data_L_Total.csv\"\n",
"n_qty=6 #CAMBIAR SEGUN LA CANTIDAD DE NODOS USADOS\n",
"n_groups= 2\n",
"repet = 10 #CAMBIAR EL NUMERO SEGUN NUMERO DE EJECUCIONES POR CONFIG\n",
"time_constant = True # Cambiar segun el speedUp usado\n",
"\n",
"p_value = 0.05\n",
"values = [2, 10, 20, 40]\n",
"# WORST BEST\n",
"dist_names = ['null', 'BalancedFit', 'CompactFit']\n",
"\n",
"processes = [1,10,20,40,80,120]\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",
"\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",
"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",
"\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",
"labelsMethods = ['Baseline', 'Baseline single','Baseline - Asynchronous','Baseline single - Asynchronous',\n",
" 'Merge','Merge single','Merge - Asynchronous','Merge single - Asynchronous']\n",
" #4 #5 #6 #7\n",
"colors_spawn = ['green','springgreen','blue','darkblue','red','darkred','darkgoldenrod','olive']\n",
"linestyle_spawn = ['-', '--', '-.', ':']\n",
"markers_spawn = ['.','1','s','p', 'h','d','X','P']\n",
"\n",
"OrMult_patch = mpatches.Patch(hatch='', facecolor='green', label='Baseline')\n",
"OrSing_patch = mpatches.Patch(hatch='', facecolor='springgreen', label='Baseline single')\n",
"OrPthMult_patch = mpatches.Patch(hatch='//', facecolor='blue', label='Baseline - Asyncrhonous')\n",
"OrPthSing_patch = mpatches.Patch(hatch='\\\\', facecolor='darkblue', label='Baseline single - Asyncrhonous')\n",
"MergeMult_patch = mpatches.Patch(hatch='||', facecolor='red', label='Merge')\n",
"MergeSing_patch = mpatches.Patch(hatch='...', facecolor='darkred', label='Merge single')\n",
"MergePthMult_patch = mpatches.Patch(hatch='xx', facecolor='yellow', label='Merge - Asyncrhonous')\n",
"MergePthSing_patch = mpatches.Patch(hatch='++', facecolor='olive', label='Merge single - Asyncrhonous')\n",
"\n",
"handles_spawn = [OrMult_patch,OrSing_patch,OrPthMult_patch,OrPthSing_patch,MergeMult_patch,MergeSing_patch,MergePthMult_patch,MergePthSing_patch]"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"dfG = pd.read_csv( matrixMalEX )\n",
"\n",
"dfG = dfG.drop(columns=dfG.columns[0])\n",
"dfG['S'] = dfG['N']\n",
"dfG['N'] = dfG['S'] + dfG['%Async']\n",
"dfG['%Async'] = (dfG['%Async'] / dfG['N']) * 100\n",
"dfG['%Async'] = dfG['%Async'].fillna(0)\n",
"\n",
"if(n_qty == 1):\n",
" group = dfG.groupby(['%Async', 'Cst', 'Css', 'Groups'])['TE']\n",
" group2 = dfG.groupby(['%Async', 'Cst', 'Css', 'NP','NS'])['TE']\n",
"else: \n",
" group = dfG.groupby(['Dist', '%Async', 'Cst', 'Css', 'Groups'])['TE']\n",
" group2 = dfG.groupby(['Dist', '%Async', 'Cst', 'Css', 'NP','NS'])['TE']\n",
"\n",
"grouped_aggG = group.agg(['median'])\n",
"grouped_aggG.rename(columns={'median':'TE'}, inplace=True)\n",
"\n",
"grouped_aggG2 = group2.agg(['median'])\n",
"grouped_aggG2.rename(columns={'median':'TE'}, inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_9826/2056908859.py:18: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.\n",
" groupM = dfM.groupby(['Dist', '%Async', 'Cst', 'Css', 'NP', 'NS'])['TC', 'TH', 'TS', 'TA', 'TR', 'alpha']\n"
]
}
],
"source": [
"dfM = pd.read_csv( matrixMal )\n",
"dfM = dfM.drop(columns=dfM.columns[0])\n",
"\n",
"dfM['S'] = dfM['N']\n",
"dfM['N'] = dfM['S'] + dfM['%Async']\n",
"dfM[\"TR\"] = dfM[\"TC\"] + dfM[\"TH\"] + dfM[\"TS\"] + dfM[\"TA\"]\n",
"dfM['%Async'] = (dfM['%Async'] / dfM['N']) * 100\n",
"\n",
"dfM['%Async'] = dfM['%Async'].fillna(0)\n",
"dfM['alpha'] = 1\n",
"\n",
"#dfM = dfM.drop(dfM.loc[(dfM[\"Cst\"] == 3) & (dfM[\"Css\"] == 1) & (dfM[\"NP\"] > dfM[\"NS\"])].index)\n",
"#dfM = dfM.drop(dfM.loc[(dfM[\"Cst\"] == 2) & (dfM[\"Css\"] == 1) & (dfM[\"NP\"] > dfM[\"NS\"])].index)\n",
"\n",
"if(n_qty == 1):\n",
" groupM = dfM.groupby(['%Async', 'Cst', 'Css', 'NP', 'NS'])['TC', 'TH', 'TS', 'TA', 'TR', 'alpha']\n",
"else:\n",
" groupM = dfM.groupby(['Dist', '%Async', 'Cst', 'Css', 'NP', 'NS'])['TC', 'TH', 'TS', 'TA', 'TR', 'alpha']\n",
"\n",
"#group\n",
"grouped_aggM = groupM.agg(['median'])\n",
"grouped_aggM.columns = grouped_aggM.columns.get_level_values(0)\n",
"\n",
"for cst_aux in [1,3]:\n",
" for css_aux in [0,1]:\n",
" for np_aux in processes:\n",
" for ns_aux in processes:\n",
" if np_aux != ns_aux:\n",
" grouped_aggM.loc[('2,2',0, cst_aux, css_aux, np_aux,ns_aux)]['alpha'] = \\\n",
" grouped_aggM.loc[('2,2',0, cst_aux, css_aux, np_aux,ns_aux)]['TC'] / \\\n",
" grouped_aggM.loc[('2,2',0, cst_aux-1, css_aux, np_aux,ns_aux)]['TC']\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_9826/1294489315.py:13: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.\n",
" groupL = dfL[dfL['NS'] != 0].groupby(['Tt', 'Dist', '%Async', 'Cst', 'Css', 'NP', 'NS'])['Ti', 'To', 'omega']\n"
]
}
],
"source": [
"dfL = pd.read_csv( matrixIt )\n",
"dfL = dfL.drop(columns=dfL.columns[0])\n",
"\n",
"dfL['%Async'] = dfL['%Async'].fillna(0)\n",
"dfL['omega'] = 1\n",
"\n",
"#dfL = dfL.drop(dfL.loc[(dfL[\"Cst\"] == 3) & (dfL[\"Css\"] == 1) & (dfL[\"NP\"] > dfL[\"NS\"])].index)\n",
"#dfL = dfL.drop(dfL.loc[(dfL[\"Cst\"] == 2) & (dfL[\"Css\"] == 1) & (dfL[\"NP\"] > dfL[\"NS\"])].index)\n",
"\n",
"if(n_qty == 1):\n",
" groupL = dfL[dfL['NS'] != 0].groupby(['Tt', '%Async', 'Cst', 'Css', 'NP', 'NS'])['Ti', 'To', 'omega']\n",
"else:\n",
" groupL = dfL[dfL['NS'] != 0].groupby(['Tt', 'Dist', '%Async', 'Cst', 'Css', 'NP', 'NS'])['Ti', 'To', 'omega']\n",
"\n",
"#group\n",
"grouped_aggL = groupL.agg(['median', 'count'])\n",
"grouped_aggL.columns = grouped_aggL.columns.get_level_values(0)\n",
"grouped_aggL.set_axis(['Ti', 'Iters', 'To', 'Iters2', 'omega', 'omega2'], axis='columns', inplace=True)\n",
"grouped_aggL['Iters'] = np.round(grouped_aggL['Iters']/repet)\n",
"grouped_aggL['Iters2'] = np.round(grouped_aggL['Iters2']/repet)\n",
"\n",
"for cst_aux in [1,3]:\n",
" for css_aux in [0,1]:\n",
" for np_aux in processes:\n",
" for ns_aux in processes:\n",
" if np_aux != ns_aux:\n",
" grouped_aggL.loc[(1,2,0, cst_aux, css_aux, np_aux,ns_aux), 'omega'] = \\\n",
" grouped_aggL.loc[(1,2,0, cst_aux, css_aux, np_aux,ns_aux)]['Ti'] / \\\n",
" grouped_aggL.loc[(0,2,0, cst_aux, css_aux, np_aux,ns_aux)]['Ti']"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/usuario/miniconda3/lib/python3.9/site-packages/numpy/core/fromnumeric.py:3419: RuntimeWarning: Mean of empty slice.\n",
" return _methods._mean(a, axis=axis, dtype=dtype,\n",
"/tmp/ipykernel_9826/3028104048.py:17: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.\n",
" groupLT = dfLT[dfLT['NS'] != 0].groupby(['Dist', '%Async', 'Cst', 'Css', 'NP', 'NS'])['Sum', 'ItA']\n"
]
}
],
"source": [
"dfLT = pd.read_csv( matrixIt_Total )\n",
"dfLT = dfLT.drop(columns=dfLT.columns[0])\n",
"\n",
"dfLT['%Async'] = dfLT['%Async'].fillna(0)\n",
"dfLT['ItA']= dfLT.Ti.apply(lambda x: list(x.replace('(','').replace(')','').split(',')))\n",
"dfLT['TiA']= dfLT.ItA.apply(lambda x: np.median(list(map(float,[y for y in x if y]))) )\n",
"dfLT['TiA']= dfLT['TiA'].fillna(0)\n",
"dfLT['ItA']= dfLT.ItA.apply(lambda x: len([y for y in x if y]))\n",
"\n",
"\n",
"#dfL = dfL.drop(dfL.loc[(dfL[\"Cst\"] == 3) & (dfL[\"Css\"] == 1) & (dfL[\"NP\"] > dfL[\"NS\"])].index)\n",
"#dfL = dfL.drop(dfL.loc[(dfL[\"Cst\"] == 2) & (dfL[\"Css\"] == 1) & (dfL[\"NP\"] > dfL[\"NS\"])].index)\n",
"\n",
"if(n_qty == 1):\n",
" groupLT = dfLT[dfLT['NS'] != 0].groupby(['%Async', 'Cst', 'Css', 'NP', 'NS'])['Sum', 'ItA']\n",
"else:\n",
" groupLT = dfLT[dfLT['NS'] != 0].groupby(['Dist', '%Async', 'Cst', 'Css', 'NP', 'NS'])['Sum', 'ItA']\n",
"\n",
"#group\n",
"grouped_aggLT = groupLT.agg(['median'])\n",
"grouped_aggLT.columns = grouped_aggLT.columns.get_level_values(0)\n",
"grouped_aggLT.set_axis(['Sum','ItA'], axis='columns', inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_9826/2150887515.py:12: UserWarning: Boolean Series key will be reindexed to match DataFrame index.\n",
" dfLT_aux = dfLT[dfLT[\"NP\"] == np_aux][dfLT[\"NS\"] == ns_aux][dfLT[\"Cst\"] == cst_aux][dfLT[\"Css\"] == css_aux]\n",
"/tmp/ipykernel_9826/2150887515.py:13: UserWarning: Boolean Series key will be reindexed to match DataFrame index.\n",
" dfM_aux = dfM[dfM[\"NP\"] == np_aux][dfM[\"NS\"] == ns_aux][dfM[\"Css\"] == css_aux]\n"
]
}
],
"source": [
"tc_list = []\n",
"alpha_list = []\n",
"omega_list = []\n",
"ita_list = []\n",
"dfLT['index'] = dfLT.index\n",
"dfM['index'] = dfM.index\n",
"for cst_aux in [0,1,2,3]:\n",
" for css_aux in [0,1]:\n",
" for np_aux in processes:\n",
" for ns_aux in processes:\n",
" if np_aux != ns_aux:\n",
" dfLT_aux = dfLT[dfLT[\"NP\"] == np_aux][dfLT[\"NS\"] == ns_aux][dfLT[\"Cst\"] == cst_aux][dfLT[\"Css\"] == css_aux]\n",
" dfM_aux = dfM[dfM[\"NP\"] == np_aux][dfM[\"NS\"] == ns_aux][dfM[\"Css\"] == css_aux]\n",
" if cst_aux == 1 or cst_aux == 3:\n",
" dfM_aux2= dfM_aux[dfM_aux[\"Cst\"] == cst_aux-1]\n",
" dfM_aux2= dfM_aux2.sort_values(by=['TH'])\n",
" dfM_aux = dfM_aux[dfM_aux[\"Cst\"] == cst_aux]\n",
" dfM_aux= dfM_aux.sort_values(by=['TH'])\n",
" index1_aux = dfM_aux.iloc[4][\"index\"]\n",
" index2_aux = dfM_aux.iloc[5][\"index\"]\n",
" \n",
" # Comprobar que es un metodo asincrono\n",
" if cst_aux == 1 or cst_aux == 3:\n",
" value_aux1 = dfM_aux[dfM_aux[\"index\"] == index1_aux]['TC'].values\n",
" value_aux2 = dfM_aux[dfM_aux[\"index\"] == index2_aux]['TC'].values\n",
" valueS_aux1 = dfM_aux2.iloc[4]['TC']\n",
" valueS_aux2 = dfM_aux2.iloc[5]['TC']\n",
" value1_aux = (value_aux1 + value_aux2) / 2\n",
" value2_aux = (value_aux1/valueS_aux1 + value_aux2/valueS_aux2) / 2\n",
" else:\n",
" value1_aux = dfM_aux['TC'].median()\n",
" value2_aux = 1\n",
" tc_list.append(float(value1_aux))\n",
" alpha_list.append(float(value2_aux))\n",
" \n",
" value_aux1 = dfLT_aux[dfLT_aux[\"index\"] == index1_aux]['ItA'].values\n",
" value_aux2 = dfLT_aux[dfLT_aux[\"index\"] == index2_aux]['ItA'].values\n",
" value3_aux = (value_aux1 + value_aux2) / 2\n",
" ita_list.append(int(value3_aux))\n",
" \n",
" if cst_aux == 1 or cst_aux == 3:\n",
" iter_time_aux1 = dfLT_aux[dfLT_aux[\"index\"] == index1_aux]['Time'].values\n",
" iter_time_aux2 = dfLT_aux[dfLT_aux[\"index\"] == index2_aux]['Time'].values\n",
" if not time_constant:\n",
" iter_time_aux1 = iter_time_aux1 / np_aux\n",
" iter_time_aux2 = iter_time_aux2 / np_aux\n",
" iter_Atime_aux1 = dfLT_aux[dfLT_aux[\"index\"] == index1_aux]['TiA'].values\n",
" iter_Atime_aux2 = dfLT_aux[dfLT_aux[\"index\"] == index2_aux]['TiA'].values\n",
" value4_aux = (iter_Atime_aux1/iter_time_aux1 + iter_Atime_aux1/iter_time_aux2) / 2\n",
" else:\n",
" value4_aux = 1\n",
" omega_list.append(float(value4_aux))\n",
"grouped_aggM['TC_A'] = tc_list\n",
"grouped_aggM['ItA'] = ita_list\n",
"grouped_aggM['Alpha_A'] = alpha_list\n",
"grouped_aggM['Omega_A'] = omega_list"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"coherent_check_df = grouped_aggL.copy()\n",
"# Añadir suma total de iteraciones\n",
"coherent_check_df['Sum'] = 0\n",
"coherent_check_df.loc[(1,slice(None)),'Sum'] = grouped_aggLT[(grouped_aggLT['Sum'] != 0)].loc[(slice(None)),'Sum'].values\n",
"coherent_check_df = coherent_check_df[(coherent_check_df['Sum'] != 0)]\n",
"# Añadir tiempos TE y TC\n",
"coherent_check_df['TE'] = 0\n",
"coherent_check_df['TEA'] = 0\n",
"coherent_check_df['TR'] = 0\n",
"coherent_check_df['TRA'] = 0\n",
"for cst_aux in [1,3]:\n",
" coherent_check_df.loc[(1,2,0,cst_aux,slice(None)),'TE'] = grouped_aggG2.loc[('2,2',0,cst_aux-1,slice(None)),'TE'].values\n",
" coherent_check_df.loc[(1,2,0,cst_aux,slice(None)),'TR'] = grouped_aggM.loc[('2,2',0,cst_aux-1,slice(None)),'TC'].values\n",
" coherent_check_df.loc[(1,2,0,cst_aux,slice(None)),'TEA'] = grouped_aggG2.loc[('2,2',0,cst_aux,slice(None)),'TE'].values\n",
" coherent_check_df.loc[(1,2,0,cst_aux,slice(None)),'TRA'] = grouped_aggM.loc[('2,2',0,cst_aux,slice(None)),'TC'].values\n",
"# Calcular tiempos teoricos\n",
"#coherent_check_df['Teorico-S'] = coherent_check_df['Ti'] * 3 + coherent_check_df['TR'] + TIEMPOITERNS * 97\n",
"#coherent_check_df['Rel-S'] = np.round(coherent_check_df['Teorico-S'] / coherent_check_df['TE'],2)\n",
"#coherent_check_df['Teorico-A'] = coherent_check_df['Ti'] * 3 + coherent_check_df['Sum'] + TIEMPOITERNS * (97 - coherent_check_df['Iters'])\n",
"#coherent_check_df['Rel-A'] = np.round(coherent_check_df['Teorico-A'] / coherent_check_df['TEA'],2)\n",
"coherent_check_df=coherent_check_df.droplevel('Tt').droplevel('%Async').droplevel('Dist')\n",
"for cst_aux in [1,3]:\n",
" for css_aux in [0,1]:\n",
" aux_df = coherent_check_df.loc[(cst_aux, css_aux, slice(None))]\n",
" aux_df.to_excel(\"coherent\"+str(cst_aux)+\"_\"+str(css_aux)+\".xlsx\")"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"grouped_aggL.to_excel(\"resultL.xlsx\") \n",
"grouped_aggLT.to_excel(\"resultLT.xlsx\")\n",
"dfLT.to_excel(\"resultLT_all.xlsx\")\n",
"grouped_aggM.to_excel(\"resultM.xlsx\") \n",
"grouped_aggG2.to_excel(\"resultG.xlsx\") "
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" Sum | \n",
" ItA | \n",
"
\n",
" \n",
" Dist | \n",
" %Async | \n",
" Cst | \n",
" Css | \n",
" NP | \n",
" NS | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2 | \n",
" 0.0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 10 | \n",
" 0.000000 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 20 | \n",
" 0.000000 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 40 | \n",
" 0.000000 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 80 | \n",
" 0.000000 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 120 | \n",
" 0.000000 | \n",
" 0.0 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 3 | \n",
" 1 | \n",
" 120 | \n",
" 1 | \n",
" 0.603147 | \n",
" 2.0 | \n",
"
\n",
" \n",
" 10 | \n",
" 0.576215 | \n",
" 2.0 | \n",
"
\n",
" \n",
" 20 | \n",
" 0.584821 | \n",
" 2.0 | \n",
"
\n",
" \n",
" 40 | \n",
" 0.611443 | \n",
" 2.0 | \n",
"
\n",
" \n",
" 80 | \n",
" 0.604689 | \n",
" 2.0 | \n",
"
\n",
" \n",
"
\n",
"
240 rows × 2 columns
\n",
"
"
],
"text/plain": [
" Sum ItA\n",
"Dist %Async Cst Css NP NS \n",
"2 0.0 0 0 1 10 0.000000 0.0\n",
" 20 0.000000 0.0\n",
" 40 0.000000 0.0\n",
" 80 0.000000 0.0\n",
" 120 0.000000 0.0\n",
"... ... ...\n",
" 3 1 120 1 0.603147 2.0\n",
" 10 0.576215 2.0\n",
" 20 0.584821 2.0\n",
" 40 0.611443 2.0\n",
" 80 0.604689 2.0\n",
"\n",
"[240 rows x 2 columns]"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfG\n",
"dfM\n",
"dfL\n",
"dfLT\n",
"grouped_aggG\n",
"grouped_aggM\n",
"grouped_aggL\n",
"grouped_aggLT"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" TE | \n",
"
\n",
" \n",
" Groups | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 1,10 | \n",
" 6.369967 | \n",
"
\n",
" \n",
" 1,120 | \n",
" 7.105817 | \n",
"
\n",
" \n",
" 1,20 | \n",
" 6.795948 | \n",
"
\n",
" \n",
" 1,40 | \n",
" 6.937367 | \n",
"
\n",
" \n",
" 1,80 | \n",
" 6.966290 | \n",
"
\n",
" \n",
" 10,1 | \n",
" 6.056520 | \n",
"
\n",
" \n",
" 10,120 | \n",
" 6.979421 | \n",
"
\n",
" \n",
" 10,20 | \n",
" 6.574471 | \n",
"
\n",
" \n",
" 10,40 | \n",
" 6.838011 | \n",
"
\n",
" \n",
" 10,80 | \n",
" 6.981027 | \n",
"
\n",
" \n",
" 120,1 | \n",
" 6.348445 | \n",
"
\n",
" \n",
" 120,10 | \n",
" 6.292254 | \n",
"
\n",
" \n",
" 120,20 | \n",
" 6.327157 | \n",
"
\n",
" \n",
" 120,40 | \n",
" 6.321162 | \n",
"
\n",
" \n",
" 120,80 | \n",
" 6.423317 | \n",
"
\n",
" \n",
" 20,1 | \n",
" 6.072897 | \n",
"
\n",
" \n",
" 20,10 | \n",
" 6.073298 | \n",
"
\n",
" \n",
" 20,120 | \n",
" 7.171862 | \n",
"
\n",
" \n",
" 20,40 | \n",
" 6.991988 | \n",
"
\n",
" \n",
" 20,80 | \n",
" 7.069774 | \n",
"
\n",
" \n",
" 40,1 | \n",
" 6.090644 | \n",
"
\n",
" \n",
" 40,10 | \n",
" 5.739764 | \n",
"
\n",
" \n",
" 40,120 | \n",
" 7.113592 | \n",
"
\n",
" \n",
" 40,20 | \n",
" 6.218595 | \n",
"
\n",
" \n",
" 40,80 | \n",
" 6.992810 | \n",
"
\n",
" \n",
" 80,1 | \n",
" 6.305216 | \n",
"
\n",
" \n",
" 80,10 | \n",
" 6.259644 | \n",
"
\n",
" \n",
" 80,120 | \n",
" 7.032920 | \n",
"
\n",
" \n",
" 80,20 | \n",
" 6.302444 | \n",
"
\n",
" \n",
" 80,40 | \n",
" 6.434365 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" TE\n",
"Groups \n",
"1,10 6.369967\n",
"1,120 7.105817\n",
"1,20 6.795948\n",
"1,40 6.937367\n",
"1,80 6.966290\n",
"10,1 6.056520\n",
"10,120 6.979421\n",
"10,20 6.574471\n",
"10,40 6.838011\n",
"10,80 6.981027\n",
"120,1 6.348445\n",
"120,10 6.292254\n",
"120,20 6.327157\n",
"120,40 6.321162\n",
"120,80 6.423317\n",
"20,1 6.072897\n",
"20,10 6.073298\n",
"20,120 7.171862\n",
"20,40 6.991988\n",
"20,80 7.069774\n",
"40,1 6.090644\n",
"40,10 5.739764\n",
"40,120 7.113592\n",
"40,20 6.218595\n",
"40,80 6.992810\n",
"80,1 6.305216\n",
"80,10 6.259644\n",
"80,120 7.032920\n",
"80,20 6.302444\n",
"80,40 6.434365"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grouped_aggG.loc[('2,2',0,2,1)]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" TC | \n",
" TH | \n",
" TS | \n",
" TA | \n",
" TR | \n",
" alpha | \n",
" TC_A | \n",
" ItA | \n",
" Alpha_A | \n",
" Omega_A | \n",
"
\n",
" \n",
" NP | \n",
" NS | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 1 | \n",
" 10 | \n",
" 0.283736 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.283736 | \n",
" 1.0 | \n",
" 0.283736 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 20 | \n",
" 0.716209 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.716209 | \n",
" 1.0 | \n",
" 0.716209 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 40 | \n",
" 0.798951 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.798951 | \n",
" 1.0 | \n",
" 0.798951 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 80 | \n",
" 0.931771 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.931771 | \n",
" 1.0 | \n",
" 0.931771 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 120 | \n",
" 0.992033 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.992033 | \n",
" 1.0 | \n",
" 0.992033 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 10 | \n",
" 1 | \n",
" 0.000982 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.000982 | \n",
" 1.0 | \n",
" 0.000982 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 20 | \n",
" 0.477040 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.477040 | \n",
" 1.0 | \n",
" 0.477040 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 40 | \n",
" 0.766185 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.766185 | \n",
" 1.0 | \n",
" 0.766185 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 80 | \n",
" 0.860920 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.860920 | \n",
" 1.0 | \n",
" 0.860920 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 120 | \n",
" 0.890894 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.890894 | \n",
" 1.0 | \n",
" 0.890894 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 20 | \n",
" 1 | \n",
" 0.001005 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.001005 | \n",
" 1.0 | \n",
" 0.001005 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 10 | \n",
" 0.001025 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.001025 | \n",
" 1.0 | \n",
" 0.001025 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 40 | \n",
" 0.790193 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.790193 | \n",
" 1.0 | \n",
" 0.790193 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 80 | \n",
" 0.864170 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.864170 | \n",
" 1.0 | \n",
" 0.864170 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 120 | \n",
" 1.088929 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 1.088929 | \n",
" 1.0 | \n",
" 1.088929 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 40 | \n",
" 1 | \n",
" 0.029802 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.029802 | \n",
" 1.0 | \n",
" 0.029802 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 10 | \n",
" 0.024519 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.024519 | \n",
" 1.0 | \n",
" 0.024519 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 20 | \n",
" 0.116366 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.116366 | \n",
" 1.0 | \n",
" 0.116366 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 80 | \n",
" 0.893692 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.893692 | \n",
" 1.0 | \n",
" 0.893692 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 120 | \n",
" 0.922904 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.922904 | \n",
" 1.0 | \n",
" 0.922904 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 80 | \n",
" 1 | \n",
" 0.217198 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.217198 | \n",
" 1.0 | \n",
" 0.217198 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 10 | \n",
" 0.180846 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.180846 | \n",
" 1.0 | \n",
" 0.180846 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 20 | \n",
" 0.149038 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.149038 | \n",
" 1.0 | \n",
" 0.149038 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 40 | \n",
" 0.148336 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.148336 | \n",
" 1.0 | \n",
" 0.148336 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 120 | \n",
" 0.905912 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.905912 | \n",
" 1.0 | \n",
" 0.905912 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 120 | \n",
" 1 | \n",
" 0.231024 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.231024 | \n",
" 1.0 | \n",
" 0.231024 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 10 | \n",
" 0.148412 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.148412 | \n",
" 1.0 | \n",
" 0.148412 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 20 | \n",
" 0.177781 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.177781 | \n",
" 1.0 | \n",
" 0.177781 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 40 | \n",
" 0.350567 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.350567 | \n",
" 1.0 | \n",
" 0.350567 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 80 | \n",
" 0.156000 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.156000 | \n",
" 1.0 | \n",
" 0.156000 | \n",
" 0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" TC TH TS TA TR alpha TC_A ItA Alpha_A \\\n",
"NP NS \n",
"1 10 0.283736 0.0 0.0 0.0 0.283736 1.0 0.283736 0 1.0 \n",
" 20 0.716209 0.0 0.0 0.0 0.716209 1.0 0.716209 0 1.0 \n",
" 40 0.798951 0.0 0.0 0.0 0.798951 1.0 0.798951 0 1.0 \n",
" 80 0.931771 0.0 0.0 0.0 0.931771 1.0 0.931771 0 1.0 \n",
" 120 0.992033 0.0 0.0 0.0 0.992033 1.0 0.992033 0 1.0 \n",
"10 1 0.000982 0.0 0.0 0.0 0.000982 1.0 0.000982 0 1.0 \n",
" 20 0.477040 0.0 0.0 0.0 0.477040 1.0 0.477040 0 1.0 \n",
" 40 0.766185 0.0 0.0 0.0 0.766185 1.0 0.766185 0 1.0 \n",
" 80 0.860920 0.0 0.0 0.0 0.860920 1.0 0.860920 0 1.0 \n",
" 120 0.890894 0.0 0.0 0.0 0.890894 1.0 0.890894 0 1.0 \n",
"20 1 0.001005 0.0 0.0 0.0 0.001005 1.0 0.001005 0 1.0 \n",
" 10 0.001025 0.0 0.0 0.0 0.001025 1.0 0.001025 0 1.0 \n",
" 40 0.790193 0.0 0.0 0.0 0.790193 1.0 0.790193 0 1.0 \n",
" 80 0.864170 0.0 0.0 0.0 0.864170 1.0 0.864170 0 1.0 \n",
" 120 1.088929 0.0 0.0 0.0 1.088929 1.0 1.088929 0 1.0 \n",
"40 1 0.029802 0.0 0.0 0.0 0.029802 1.0 0.029802 0 1.0 \n",
" 10 0.024519 0.0 0.0 0.0 0.024519 1.0 0.024519 0 1.0 \n",
" 20 0.116366 0.0 0.0 0.0 0.116366 1.0 0.116366 0 1.0 \n",
" 80 0.893692 0.0 0.0 0.0 0.893692 1.0 0.893692 0 1.0 \n",
" 120 0.922904 0.0 0.0 0.0 0.922904 1.0 0.922904 0 1.0 \n",
"80 1 0.217198 0.0 0.0 0.0 0.217198 1.0 0.217198 0 1.0 \n",
" 10 0.180846 0.0 0.0 0.0 0.180846 1.0 0.180846 0 1.0 \n",
" 20 0.149038 0.0 0.0 0.0 0.149038 1.0 0.149038 0 1.0 \n",
" 40 0.148336 0.0 0.0 0.0 0.148336 1.0 0.148336 0 1.0 \n",
" 120 0.905912 0.0 0.0 0.0 0.905912 1.0 0.905912 0 1.0 \n",
"120 1 0.231024 0.0 0.0 0.0 0.231024 1.0 0.231024 0 1.0 \n",
" 10 0.148412 0.0 0.0 0.0 0.148412 1.0 0.148412 0 1.0 \n",
" 20 0.177781 0.0 0.0 0.0 0.177781 1.0 0.177781 0 1.0 \n",
" 40 0.350567 0.0 0.0 0.0 0.350567 1.0 0.350567 0 1.0 \n",
" 80 0.156000 0.0 0.0 0.0 0.156000 1.0 0.156000 0 1.0 \n",
"\n",
" Omega_A \n",
"NP NS \n",
"1 10 1.0 \n",
" 20 1.0 \n",
" 40 1.0 \n",
" 80 1.0 \n",
" 120 1.0 \n",
"10 1 1.0 \n",
" 20 1.0 \n",
" 40 1.0 \n",
" 80 1.0 \n",
" 120 1.0 \n",
"20 1 1.0 \n",
" 10 1.0 \n",
" 40 1.0 \n",
" 80 1.0 \n",
" 120 1.0 \n",
"40 1 1.0 \n",
" 10 1.0 \n",
" 20 1.0 \n",
" 80 1.0 \n",
" 120 1.0 \n",
"80 1 1.0 \n",
" 10 1.0 \n",
" 20 1.0 \n",
" 40 1.0 \n",
" 120 1.0 \n",
"120 1 1.0 \n",
" 10 1.0 \n",
" 20 1.0 \n",
" 40 1.0 \n",
" 80 1.0 "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grouped_aggM.loc[('2,2',0,2,0)]"
]
},
{
"cell_type": "code",
"execution_count": 96,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" Ti | \n",
" Iters | \n",
" To | \n",
" Iters2 | \n",
" alpha | \n",
" alpha2 | \n",
"
\n",
" \n",
" Tt | \n",
" Dist | \n",
" %Async | \n",
" Cst | \n",
" Css | \n",
" NP | \n",
" NS | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 0.0 | \n",
" 2 | \n",
" 0.0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 10 | \n",
" 3.999165 | \n",
" 3.0 | \n",
" 4485.0 | \n",
" 3.0 | \n",
" 1.000000 | \n",
" 30 | \n",
"
\n",
" \n",
" 20 | \n",
" 3.999194 | \n",
" 3.0 | \n",
" 4485.0 | \n",
" 3.0 | \n",
" 1.000000 | \n",
" 30 | \n",
"
\n",
" \n",
" 40 | \n",
" 3.999186 | \n",
" 3.0 | \n",
" 4485.0 | \n",
" 3.0 | \n",
" 1.000000 | \n",
" 30 | \n",
"
\n",
" \n",
" 80 | \n",
" 3.999236 | \n",
" 3.0 | \n",
" 4485.0 | \n",
" 3.0 | \n",
" 1.000000 | \n",
" 30 | \n",
"
\n",
" \n",
" 120 | \n",
" 3.999194 | \n",
" 3.0 | \n",
" 4485.0 | \n",
" 3.0 | \n",
" 1.000000 | \n",
" 30 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 1.0 | \n",
" 2 | \n",
" 0.0 | \n",
" 3 | \n",
" 1 | \n",
" 120 | \n",
" 1 | \n",
" 0.070046 | \n",
" 3.0 | \n",
" 37.0 | \n",
" 3.0 | \n",
" 2.108073 | \n",
" 30 | \n",
"
\n",
" \n",
" 10 | \n",
" 0.075896 | \n",
" 4.0 | \n",
" 37.0 | \n",
" 4.0 | \n",
" 2.292376 | \n",
" 40 | \n",
"
\n",
" \n",
" 20 | \n",
" 0.090617 | \n",
" 5.0 | \n",
" 37.0 | \n",
" 5.0 | \n",
" 2.733503 | \n",
" 54 | \n",
"
\n",
" \n",
" 40 | \n",
" 0.069103 | \n",
" 4.0 | \n",
" 37.0 | \n",
" 4.0 | \n",
" 2.089061 | \n",
" 37 | \n",
"
\n",
" \n",
" 80 | \n",
" 0.068959 | \n",
" 4.0 | \n",
" 37.0 | \n",
" 4.0 | \n",
" 2.083952 | \n",
" 39 | \n",
"
\n",
" \n",
"
\n",
"
360 rows × 6 columns
\n",
"
"
],
"text/plain": [
" Ti Iters To Iters2 alpha \\\n",
"Tt Dist %Async Cst Css NP NS \n",
"0.0 2 0.0 0 0 1 10 3.999165 3.0 4485.0 3.0 1.000000 \n",
" 20 3.999194 3.0 4485.0 3.0 1.000000 \n",
" 40 3.999186 3.0 4485.0 3.0 1.000000 \n",
" 80 3.999236 3.0 4485.0 3.0 1.000000 \n",
" 120 3.999194 3.0 4485.0 3.0 1.000000 \n",
"... ... ... ... ... ... \n",
"1.0 2 0.0 3 1 120 1 0.070046 3.0 37.0 3.0 2.108073 \n",
" 10 0.075896 4.0 37.0 4.0 2.292376 \n",
" 20 0.090617 5.0 37.0 5.0 2.733503 \n",
" 40 0.069103 4.0 37.0 4.0 2.089061 \n",
" 80 0.068959 4.0 37.0 4.0 2.083952 \n",
"\n",
" alpha2 \n",
"Tt Dist %Async Cst Css NP NS \n",
"0.0 2 0.0 0 0 1 10 30 \n",
" 20 30 \n",
" 40 30 \n",
" 80 30 \n",
" 120 30 \n",
"... ... \n",
"1.0 2 0.0 3 1 120 1 30 \n",
" 10 40 \n",
" 20 54 \n",
" 40 37 \n",
" 80 39 \n",
"\n",
"[360 rows x 6 columns]"
]
},
"execution_count": 96,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grouped_aggL"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"97.0\n"
]
}
],
"source": [
"auxIter = pd.DataFrame(dfM['Iters'].str.split(',',1).tolist(),columns = ['Iters0','Iters1'])\n",
"auxIter['Iters1'] = pd.to_numeric(auxIter['Iters1'], errors='coerce')\n",
"iters = auxIter['Iters1'].mean()\n",
"print(iters)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A partir de aquí se muestran gráficos"
]
},
{
"cell_type": "code",
"execution_count": 204,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0.21241231578947362, 0.21241231578947362, 0.21241231578947362, 0.21241231578947362, 0.04632109565217393, 0.04632109565217393, 0.04632109565217393, 0.04632109565217393, 0.025296672413793103, 0.025296672413793103, 0.025296672413793103, 0.025296672413793103, 0.0355868547008547, 0.0355868547008547, 0.0355868547008547, 0.0355868547008547], [0.1981199732142857, 0.1981199732142857, 0.1981199732142857, 0.1981199732142857, 0.06233977876106192, 0.06233977876106192, 0.06233977876106192, 0.06233977876106192, 0.026912142857142853, 0.026912142857142853, 0.026912142857142853, 0.026912142857142853, 0.0343439649122807, 0.0343439649122807, 0.0343439649122807, 0.0343439649122807]]\n",
"[[2.1241231578947364, 0.4632109565217393, 0.25296672413793103, 0.35586854700854703, 2.1241231578947364, 0.4632109565217393, 0.25296672413793103, 0.35586854700854703, 2.1241231578947364, 0.4632109565217393, 0.25296672413793103, 0.35586854700854703, 2.1241231578947364, 0.4632109565217393, 0.25296672413793103, 0.35586854700854703], [1.9811997321428572, 0.6233977876106191, 0.2691214285714285, 0.343439649122807, 1.9811997321428572, 0.6233977876106191, 0.2691214285714285, 0.343439649122807, 1.9811997321428572, 0.6233977876106191, 0.2691214285714285, 0.343439649122807, 1.9811997321428572, 0.6233977876106191, 0.2691214285714285, 0.343439649122807]]\n",
"[[0.22657399999999997, 0.22961033333333333, 0.37444533333333335, 1.0861523333333334, 0.18071299999999998, 0.2686593333333333, 0.48245, 1.8810366666666667, 0.22639533333333337, 0.31453400000000004, 0.564293, 2.4626886666666667, 0.4612826666666667, 1.0638560000000001, 1.5319243333333334, 2.1236686666666666], [0.21594133333333332, 0.36930899999999994, 1.1269756666666668, 1.1670603333333334, 0.22462733333333332, 0.47068400000000005, 1.5951943333333334, 1.693723, 0.7059706666666666, 1.368441, 1.8698483333333336, 2.2059883333333334, 0.4813296666666667, 1.3010543333333333, 1.8387883333333335, 2.1851773333333333]]\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/usuario/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:36: FutureWarning: set_axis currently defaults to operating inplace.\n",
"This will change in a future version of pandas, use inplace=True to avoid this warning.\n",
"/home/usuario/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:53: UserWarning: Boolean Series key will be reindexed to match DataFrame index.\n"
]
}
],
"source": [
"#Reserva de memoria para las estructuras\n",
"TP_data=[0]*2\n",
"TH_data=[0]*2\n",
"TM_data=[0]*2\n",
"\n",
"TP_A_data=[0]*2\n",
"TH_A_data=[0]*2\n",
"TM_A_data=[0]*2\n",
"\n",
"for dist in [1,2]:\n",
" dist_index=dist-1\n",
" \n",
" TP_data[dist_index]=[0]*len(values)*(len(values))\n",
" TH_data[dist_index]=[0]*len(values)*(len(values))\n",
" TM_data[dist_index]=[0]*len(values)*(len(values))\n",
"\n",
" TP_A_data[dist_index]=[0]*len(values)*(len(values))\n",
" TH_A_data[dist_index]=[0]*len(values)*(len(values))\n",
" TM_A_data[dist_index]=[0]*len(values)*(len(values))\n",
"\n",
"# Obtencion de los grupos del dataframe necesarios\n",
"\n",
"#ACTUALMENTE NO SE DIFERENCIAN LOS TIEMPOS DE ITERACIONES DE PADRES E HIJOS CUANDO COINCIDE EL NUMERO DE PROCESOS\n",
"if(n_qty == 1):\n",
" groupM_aux = dfM.groupby(['NP', 'NS'])['TC']\n",
" groupL_aux = dfL[dfL['Tt'] == 0].groupby(['NP'])['Ti']\n",
"else:\n",
" groupM_aux = dfM.groupby(['NP', 'NS', 'Dist'])['TC']\n",
" groupL_aux = dfL[dfL['Tt'] == 0].groupby(['Dist', 'NP'])['Ti']\n",
"\n",
"grouped_aggM_aux = groupM_aux.agg(['mean'])\n",
"grouped_aggM_aux.columns = grouped_aggM_aux.columns.get_level_values(0)\n",
"\n",
"grouped_aggL_aux = groupL_aux.agg(['mean'])\n",
"grouped_aggL_aux.columns = grouped_aggL_aux.columns.get_level_values(0)\n",
"grouped_aggL_aux.set_axis(['Ti'], axis='columns')\n",
"\n",
"#Calculo de los valores para las figuras\n",
"#1=Best Fit\n",
"#2=Worst Fit\n",
"dist=1\n",
"for dist in [1,2]:\n",
" dist_index=dist-1\n",
" dist_v = str(dist)+\",\"+str(dist)\n",
" i=0\n",
" r=0\n",
" for numP in values:\n",
" j=0\n",
" for numC in values:\n",
" \n",
" tc_real = grouped_aggM_aux.loc[(numP,numC,dist_v)]['mean']\n",
" for tipo in [0]: #TODO Poner a 0,100\n",
" iters_aux=dfM[(dfM[\"NP\"] == numP)][(dfM[\"NS\"] == numC)][(dfM[\"Dist\"] == dist_v)][(dfM[\"%Async\"] == tipo)]['Iters'].head(1).tolist()[0].split(',')\n",
" itersP_aux = int(iters_aux[0])\n",
" itersS_aux = int(iters_aux[1])\n",
" iters_mal_aux = 0\n",
" if tipo != 0:\n",
" iters_mal_aux = grouped_aggL['Iters'].loc[(1,dist,tipo,numP,numC)]\n",
" \n",
" t_iterP_aux = grouped_aggL_aux['Ti'].loc[(dist,numP)]\n",
" t_iterS_aux = grouped_aggL_aux['Ti'].loc[(dist,numC)]\n",
" \n",
" \n",
" p1 = t_iterP_aux * itersP_aux\n",
" p2 = t_iterS_aux * max((itersS_aux - iters_mal_aux),0)\n",
" \n",
" array_aux = grouped_aggM[['TS', 'TA']].loc[(dist_v,tipo,numP,numC)].tolist()\n",
" p3 = tc_real + array_aux[0] + array_aux[1]\n",
" \n",
" #Guardar datos\n",
" if tipo == 0:\n",
" TP_data[dist_index][i*len(values) + j] = p1\n",
" TH_data[dist_index][i*len(values) + j] = p2\n",
" TM_data[dist_index][i*len(values) + j] = p3\n",
" else:\n",
" TP_A_data[dist_index][i*len(values) + j] = p1\n",
" TH_A_data[dist_index][i*len(values) + j] = p2\n",
" TM_A_data[dist_index][i*len(values) + j] = p3\n",
" j+=1\n",
" i+=1\n",
"print(TP_data)\n",
"print(TH_data)\n",
"print(TM_data)"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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29dKssYYu2DBglTnxsbG2nvvvddKspMnT7ZxcXFJxw4cOGCrVatmAwICUvw3PHToUFLtzZo1sxcuXEhRS2hoqDXG2GPHjqW4VtOmTa2kVDUmn7N69er2119/TXHs1q1bdsOGDanOSU+lSpWsJLtx48ZUx4YOHWol2UceeSRp39dff20l2Ro1aqQaf/PmTVu9enUrKc2ffX535/e6c+Irve2wxP/m69M4vj7xWFg25sve/O59z77Zd9HR0anq8ETfnTx50t64ccNWqVLFSrL/+te/ksa4eq1t27YpzvVWD2bl3yYA+ccjjzyS4t93ACho+DsHAPmLpBibRp6aF5bIQAFmrdWxY8c0YsQIzZ8/X8YYDRw4MOl4zZo103zAVa1atfTqq68qNjY23bsFO3XqpMcffzzV/sWLF+uHH35Qjx49NHToUPn53fk1v+eeezR58mTFxsYm3RWZnL+/v2bPnq3ixYunqOWJJ56QtVYbN27M8ns/e/asJKl+/foqVapUimOFChVS8+bNszxXWn7++We99dZbevfddyVJzz//fIbjb9++rb1796pnz546cuSIBg8eXMAfLpbZ2senlHB3sms5C9fx6MR963Xn7uOszJfd+T2HvnN/3wUGBmrkyJGSpNGjRzuaw/d6EAAAAADgC7y+RAYKpurVq6faV7hwYU2bNi1VwBMXF6f169dr06ZNOnnypG7evClrrX755RdJ0qFDh9K8RqdOndLcv2bNGklS9+7d0zzuuv62bdvSrLt27dqp9rv2uWrKioiICIWEhGjp0qV655131KdPH5UvXz7L56clrXDMz89Po0aNUq9evVIdO3z4cNLyBcm99dZbGjZsWI5qKRiidGfNZNdqO9lZczkn87sffeeZvnPp37+/Jk2apNWrV2vTpk1q2rRppufQgwAAAACAgo6AGR7RvXt3FS1aVMYYFS1aVHXq1FHXrl1VsWLFFONOnDihTp06affu3enO5Vqr9G5Vq1ZNc//Ro0clSb1791bv3r3TnffcuXOp9lWpUiXNsaGhoZIS1orNqhIlSmj27NkaMGCAhgwZoiFDhqhmzZqKiopSnz599Oijj2Z5Lpf27durXLlyMsYoODhYtWrVUqdOnVSjRo106+7WrZsk6cqVK9q2bZtOnDih1157TQ0aNFDLli2zXUPel521kiVpmiR/JayZLCWsmzxNdwLm7M6X3fndh77zTN+5FCpUSKNHj9azzz6rUaNGad26dZme45s9CAAAAADwJQTM8IgpU6YoPDw803H9+/fX7t271b17dw0bNky1a9dWaGio/P399dVXX6ljx45KWOIltaCgoDT3x8fHS7oTxqbH9XCw5JJ/rN8d+vTpozZt2mjZsmX6+uuv9e2332r27NmaPXu2nn76aX344YfZmu/VV19Vs2bNsjy+XLlymjt3btJ2bGys/vrXv+r999/XU089pQMHDqhIkSLZqgF5F32XwN19l9xTTz2lN954Q+vXr9f69eszHU8PAgAAAAAKOgJmeM2lS5e0du1aVaxYUV988UWqkOnHH390NG/lypUlSQMHDlTnzp1zXGdOlSlTRv3791f//v0lSRs2bFCPHj300Ucf6ZlnnsnVOxgDAgL03nvvKTo6Wvv379e7776rV199NdeunzuWZHN7sO6suazE7wfnYL7szp+76Luc9Z2/v7/GjBmjvn37atSoURo7dmy2zveNHgQAAAAA+BIe8gevuXDhgqy1qlixYpp3MH7++eeO5m3Tpo2khIeOeVrhwoUlJdyVmFUtWrRIWi957969HqkrI4UKFdKECRMkSW+//bauXr2a6zXkHdFKueZylO6smRzt4fm9g77Led/17t1bdevW1aZNm7R69epsn08PAgAAAAAKEgJmeE2FChUUGhqqPXv2aNOmTUn7rbWaMGGCNm/e7Gjenj17qnbt2vroo4/0+uuvp1q/NS4uTitXrkxxTadca9seOHAg1bEdO3Zo8eLFunXrVor9V65c0YYNGySlv/asp3Xv3l3333+/fv31V73//vteqcHzuujOeshpbZdXwrrIrvDXdTwqcV/LxDFZnS+783tHQeq7I0eOpDqWG33n5+eXdOfyjBkzHM3hGz0IAAAAAPAFBMzwmkKFCumVV17R7du39cgjj6h169bq06eP7rnnHo0fP14vv/yy43mXLFmiqlWrauTIkapWrZratGmjXr16qWnTpgoLC1OHDh20a9euHL+HTp06SZJ69eqlnj176rnnntPAgQMlJYRf3bp1U9myZdWqVSv17dtXnTp1UtWqVbVnzx41a9ZMjz32WI5rcMIYozFjxkiSpk6dmq2HqBUM0ZJOK+GBe1FpHI9KPHZazu5kzsr83lGQ+m7IkCFe67vu3burXr16unbtmqPz6UEAAAAAQEHBGsweFBYmnT7t7Soyl8Yzt3LNa6+9pmrVqmnatGnaunWrAgMD1ahRI3344Ye6du2apk6d6mjeOnXqaPfu3Zo+fboWL16srVu3KjY2VhUqVFDDhg3VuXNn9eiR82UKevbsqZ9++kmzZ8/W0qVLdevWLfn7+2vmzJlq2rSpJk6cqPXr1+vgwYPatGmTihcvrnvuuUdPP/20+vfvr4AA77Vg165dVa9ePe3evVv/+Mc/9MILL3itFne682y6jNZGjpJ090Ps7h5/KpPjOZ3fewpC3+3cuVMLFy70Wt8ZYzRu3LgcrTddUHsQAAAAAOBbjLV3hyC+rUGDBjYmJibTcfv27VNEREQuVAQAuJtrWZratWt7uZK8hX+bgIIlKipKkhQdHe3VOgDAU/g7BwD5izFmh7W2wd37WSIDAAAAAAAAAOAIATMAAAAAAAAAwBECZgAAAAAAAACAIwTMAAAAAAAAAABHCJgBAAAAAAAAAI4QMAMAAAAAAAAAHCFgBgAAAAAAAAA4QsAMAAAAAAAAAHCEgBkAAAAAAAAA4AgBMwAAAAAAAADAEQJmAAAAAAAAAIAjBMwAAAAAAAAAAEcImAEAAAAAAAAAjhAwAwAAAAAAAAAcCfB2AQXaovLSjdPeriJzQWFSt1NumcoYk2pfaGioatWqpa5du2rIkCEKCQlxy7Wy48knn9Snn36qjRs3qlmzZrl+/bt98803atOmTYp9fn5+Kl26tOrXr68XXnhBf/zjH1Mcd72H5AIDA1WxYkW1aNFCw4YNU926dT1ee573WerfwfRE/yD1eE9a8KIUdW/6+5zKaP6zl2zOJk+Gvsua5H3XtGlTfffdd2mOc9U9b9489e7dO9X+5OhBAAAAAICvI2D2pPwQLkseqbN79+4qWrSorLU6ceKEtmzZop07d2rhwoX67rvvVLRoUbdfMz8KDQ1Vt27dJEm3bt3SDz/8oFWrVmnVqlUaPXq0xo0bl+qcyMhI3X///ZKkCxcuKCYmRh9++KHmz5+vlStXqmXLlrn6HvKzqHsTwl9XCCy5L1zObH5PoO+ybtOmTVq9erXatm2b7XPpQQAAAAAA7iBghkdMmTJF4eHhSduHDh1Ss2bNtGfPHr377rsaOXJkrtYzefJkvfbaa6pWrVquXjcz5cqV09y5c1Psmz17tv785z9r4sSJ6t27tyIiIlIc79atm1577bWk7Rs3buipp57SwoUL9cILL2jfvn25UXqe1eXthK9LhmRte9oqyd9PavnfCdthxRP2uQLm7M6X5fkn5ux9poW+y5rg4GBdv35do0aNchQw04MAAAAAANzBGszIFbVq1dKQIQmJ26pVq3L9+hUqVFCdOnUUHByc69fOrueee07NmzdXfHy8li1blun4oKAgTZs2TZK0f/9+HTt2zNMlIp+g79LWvHlz3X///dq+fbuWL1+e4/noQQAAAACALyNgRq5xrU165syZNI9ba/Xpp5+qZcuWKlmypIKCghQREaHx48fr+vXrqcZfuXJFb775purVq6cSJUqoSJEi+t3vfqfOnTtr4cKFKcY++eSTMsakWHPVtS+j1yeffJJinqtXr+r1119XvXr1VKRIEYWGhurhhx/Wxx9/nNMfTwqRkZGSpOPHj2dpfKVKlVS8eHFJ6f98fcWSIXfuHs7K9uB2Uly8tH5kwisuPmGf0/myO7+nFdS+69Wrl5YuXeroZ2KMSVp+ZvTo0bI25+th04MAAAAAAF/FEhnINZcvX5aUsCzE3eLj49WnTx998cUXKlq0qBo2bKgSJUooJiZGY8aM0cqVK7V+/XoFBQVJkmJjY9WqVStt27ZNpUuXVosWLRQSEqKffvpJ69ev182bN/X4449nWE+LFi0UEJB2C3z++ee6ceOG/P39k/adOnVKbdq00d69e1WhQgW1bNlScXFx2rJli55++mnt3LlT77zzjtMfTwqun1VgYGCWxsfFxenatWuS0v75Im1pPYQv+ZrJnnjIn2v+sx5YIiMtBbXvNm3apOHDh+vkyZOO+q5Lly6qX7++duzYoUWLFql79+7ZniM5ehAAAAAA4KsImJFrXB/Rb9cu9e2bkyZN0hdffKGWLVvqs88+U/ny5SVJN2/e1F/+8hfNnTtXEydO1MSJCalcdHS0tm3bpkaNGik6OjopAJOka9eu6d///nem9QwYMEADBgxItX/cuHG6ceOGGjdurK5duybt79evn/bu3avBgwfrzTffTAp/T548qccee0zTpk1Thw4d1KZNm2z8VFK7fv261q5dK0lJDxLLzLp163T79m1FRESoatWqObp+QZHZ2sjlX5BOX0y4qzjq3pTHF7yYsGZyWHHp1IyszZfd+XNLQe27jRs36i9/+UuO+m78+PHq2LGjxowZ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\n",
"text/plain": [
"