def plotHistogramas(dataframe, agruparUsuarios=True): import matplotlib.pyplot as plt from scripts.general import fechaLocal from IPython.display import display import numpy as np import pandas as pd from scripts.general import chkVersion chkVersion() # Agregamos la info de que categoria es el angulo que va a ser necesaria para las cuentas. display(dataframe.columns) dataframe[dataframe['anguloReferido'] == 5]['Categoria'] = "Grande" display(dataframe['anguloReferido'].unique()) display(dataframe.columns) # Armamos la lista de dataframes separados por usuario o no segun corresponda datos = [] if agruparUsuarios: datos = [dataframe] else: for usuario in dataframe['Alias'].unique(): datos = datos + [dataframe[dataframe['Alias'] == usuario]] # Ahora procesamos los datos estadistica = pd.DataFrame() for dato in datos: # Para cada angulo referido (unificando en todas las referencias y en todas las intancias) hacemos la estadistica # Angulo referido es el "x" de este grafico for anguloReferido in dato['anguloReferido'].unique(): pass
def plotHistogramas (dataframe, agruparUsuarios=True): import matplotlib.pyplot as plt from scripts.general import fechaLocal from IPython.display import display import numpy as np import pandas as pd from scripts.general import chkVersion chkVersion() # Agregamos la info de que categoria es el angulo que va a ser necesaria para las cuentas. display (dataframe.columns) dataframe[dataframe['anguloReferido']==5]['Categoria'] = "Grande" display (dataframe['anguloReferido'].unique()) display (dataframe.columns) # Armamos la lista de dataframes separados por usuario o no segun corresponda datos = [] if agruparUsuarios: datos = [dataframe] else: for usuario in dataframe['Alias'].unique(): datos = datos + [dataframe[dataframe['Alias']==usuario]] # Ahora procesamos los datos estadistica = pd.DataFrame() for dato in datos: # Para cada angulo referido (unificando en todas las referencias y en todas las intancias) hacemos la estadistica # Angulo referido es el "x" de este grafico for anguloReferido in dato['anguloReferido'].unique(): pass
def downloadFile (): """ Esta funcion descarga la base de datos en formato json del servidor y hace una backup del archivo anterior. """ import datetime import time import urllib import os from scripts.general import chkVersion chkVersion() url='http://turintur.dynu.com/db' filenameTemp = 'temp.json' filename = 'db.json' timestamp = time.time() st = datetime.datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S') filenameBackup = './backups/' + filename[:-5] + ' backup ' + st + '.json' print ('Starting download, please wait') # Bajamos el archivo urllib.request.urlretrieve(url, filenameTemp) # Renombramos el archivo viejo y dejamos el descargado con el nombre que corresponde si se descargo bien if os.path.isfile(filenameTemp): if os.path.isfile(filename): os.rename(filename,filenameBackup) os.rename(filenameTemp,filename) print ('Donload finish')
def join (filename='db.json'): from scripts.general import chkVersion import scripts.constants chkVersion() """ Este codigo sirve para ir acumulando los datos brutos tal cual salen de la base datos que se descarga, de forma de poder limpiar y reducir el tamaño del archivo online mas o menos seguido sin perder la coherencia de los datos. Esto es necesario porque el json-server no se banca bien manejar archivos muy grandes (empieza a tener delay) y el volumen de datos que se genera crece rapido. La idea es que guarda en archivos separados las listas de registros segun la categoria de envio para que despues puedan ser procesados segun corresponda """ from IPython.display import display import json import os import pickle # Transformamos el archivo en un json with open(filename) as data_file: db = json.load(data_file) # Seleccionamos los datos data = db['Envio'] # Buscamos la lista de todas las categorias de envios tiposDeEnvio = set([envio['tipoDeEnvio'] for envio in data]) # La info guardada en esta parte esta pensada como una lista de envios segun el tipo for tipoDeEnvio in tiposDeEnvio: filename = './Guardados/db.' + tipoDeEnvio enviosNuevos = [envio for envio in data if envio['tipoDeEnvio'] == tipoDeEnvio] # Sacamos el formato json a los envios for envio in enviosNuevos: envio['contenido'] = json.loads(envio['contenido']) if os.path.isfile(filename): with open(filename, 'rb') as f: enviosViejos = pickle.load(f) enviosExists = True display (tipoDeEnvio + ' tiene '+str(len(enviosViejos))+' entradas.') else: display ('Warning: no se encontro entradas previas para ' + tipoDeEnvio + ' se guardaran ' + str(len(enviosNuevos)) + ' entradas nuevas.') enviosExists = False if enviosExists: enviosUnificados = enviosViejos + [envioNuevo for envioNuevo in enviosNuevos if not envioNuevo['instance'] in set([envioViejo['instance'] for envioViejo in enviosViejos])] else: enviosUnificados = enviosNuevos display (tipoDeEnvio + ' paso a tener '+str(len(enviosUnificados))+' entradas.') with open(filename, 'wb+') as f: pickle.dump(enviosUnificados, f) joinUsers()
def plotUmbralVsReferencia (dataframe) : """ Muestra cuanto vale el umbral en funcion de la orientacion del angulo (toma como referencia el lado fijo) El cuadrante 1 se complementa con el 3 y el 2 con el 4. """ import matplotlib.pyplot as plt from scripts.general import fechaLocal from IPython.display import display import pandas as pd import numpy as np from scripts.general import chkVersion chkVersion() display(dataframe.keys()) # Iteramos sobre los usuarios for user in dataframe['Alias'].unique(): # Armamos los graficos fig, graficos = plt.subplots(2, 1, subplot_kw=dict(projection='polar')) fig.set_size_inches(10,20) graficos[0].set_title('Aproximacion desde angulos agudos') graficos[1].set_title('Aproximacion desde angulos obtusos') fig.suptitle('Nivel de umbral (en grados) de deteccion de angulos rectos\n en funcion de la oriertacion del lado fijo \n usuario: '+user) dataByUser=dataframe[dataframe['Alias']==user] # Iteramos sobre las referencias referencias = dataByUser['anguloDeReferencia'].unique() referencias.sort() umbralC1 = [] umbralC2 = [] umbralC3 = [] umbralC4 = [] for referencia in referencias: dataByUserByRef = dataByUser[dataByUser['anguloDeReferencia']==referencia] #display (dataByUserByRef[dataByUserByRef['cuadranteNumero']==3]) umbralC1 = umbralC1 + [90 - float(dataByUserByRef[dataByUserByRef['cuadranteNumero']==1]['anguloReferido'].tail(1))] umbralC2 = umbralC2 + [float(dataByUserByRef[dataByUserByRef['cuadranteNumero']==2]['anguloReferido'].tail(1)) - 90] umbralC3 = umbralC3 + [270 - float(dataByUserByRef[dataByUserByRef['cuadranteNumero']==3]['anguloReferido'].tail(1))] umbralC4 = umbralC4 + [float(dataByUserByRef[dataByUserByRef['cuadranteNumero']==4]['anguloReferido'].tail(1)) - 270] referenciasRadianes = [value * np.pi / 180 + np.pi/2 for value in referencias] referenciasRadianes2 = [value * np.pi / 180 + np.pi + np.pi/2 for value in referencias] graficos[0].plot(referenciasRadianes,umbralC1) graficos[0].plot(referenciasRadianes2,umbralC4) graficos[1].plot(referenciasRadianes,umbralC2) graficos[1].plot(referenciasRadianes2,umbralC3) fig.savefig('AngulosUmbral'+user+'.png') plt.show()
def loadLevels (): """ Esta funcion carga la info de las sesiones y levels pero sin cargar la de los trials y touchs. Sirve para cuando la info ya viene preprocesada en el programa online. Por ejemplo los analisis de umbral. """ import os import pandas as pd from scripts.settings import makeSettings from scripts.general import chkVersion chkVersion() makeSettings(basic=True,levels=True) # Primero se carga la info de la estructura json (los touchs y sounds vienen dentro de los trials) if os.path.isfile('./Guardados/db.sessions'): sessions = pd.read_pickle ('./Guardados/db.sessions') else: display ('Warning: no se encontro los session buscados') return if os.path.isfile('./Guardados/db.levels'): levels = pd.read_pickle ('./Guardados/db.levels') else: display ('Warning: no se encontro los levels buscados') return sessions = estetizarTabla(sessions,'sessions') levels = estetizarTabla(levels,'levels') levels = pd.merge(levels, sessions, on='sessionInstance') # Creamos los alias levels = renombrarUsuarios(levels) # Aplicamos los filtros level, code, etc levels = aplicarFiltros(levels) return levels
def recreateDb (): """ Funcion que reconstruye la base de datos acumulada en el tiempo a partir de los archivos de backup """ from scripts.general import chkVersion chkVersion() from scripts.extract import join from IPython.display import display import glob, os, time from os import path from datetime import datetime, timedelta #os.chdir('/backups/') for file in glob.glob("./backups/*.json"): display (file) fileCreation = datetime.fromtimestamp(path.getctime(file)) tiempolimite = datetime.now() - timedelta(days=14) display (fileCreation > tiempolimite) if fileCreation > tiempolimite: join(file) Display ('FIN!')
def makeTimeline(touchs, sounds): """ Esta es una funcion puramente para hacer un revision cualitativa de los datos, y verficar que este todo en orden. Toma el dataframe de touchs y sounds y hace un grafico que muestra la sucesion de eventos a lo largo del juego. """ from scripts.general import chkVersion chkVersion() import matplotlib.pyplot as plt import numpy as np import datetime from Scripts import fechaLocal from IPython.display import display juntar = False # Si es true, junta todos los levels de una misma sesion, sino separa por level for usuario in touchs['Alias'].unique(): # Genera el plot fig = plt.figure(figsize=(30, 5)) ax = fig.add_subplot(111) ax.set_title( 'Informacion de eventos para el usuario {}'.format(usuario), fontsize=10, fontweight='bold') ax.set_xlabel('Tiempo') ax.set_ylabel('') ax.get_yaxis().set_ticks([]) ax.set_ylim([0, 11]) # Procesa la info para graficar las sesiones del usuario fechas = touchs[touchs['Alias'] == usuario]['sessionInstance'] fechasFormateadas = [fechaLocal(fecha) for fecha in fechas] altura = np.ones(fechas.size) * 10 ax.plot(fechasFormateadas, altura, 'ro') touchsUsuario = touchs[touchs['Alias'] == usuario] soundsUsuario = sounds[sounds['Alias'] == usuario] # ahora para este usuario va a hacer un grafico por sesion for session in touchsUsuario['sessionInstance'].unique(): #Carga los touchs de cada session touchsSession = touchsUsuario[touchsUsuario['sessionInstance'] == session] soundsSession = soundsUsuario[soundsUsuario['sessionInstance'] == session] if juntar: #Crea un grafico nuevo si esta configurado asi if touchsSession.size > 0: # Genera el plot si se va a usar fig = plt.figure(figsize=(30, 5)) ax = fig.add_subplot(111) ax.set_title('Informacion de eventos para el usuario ' + str(usuario) + ' sesion del ' + str(fechaLocal(touchSession)), fontsize=14, fontweight='bold') ax.set_xlabel('Tiempo') ax.set_ylabel('') ax.get_yaxis().set_ticks([]) ax.set_ylim([0, 11]) # Procesa la info de los levels for level in touchsSession['levelInstance'].unique(): touchsLevel = touchsSession[touchsSession['levelInstance'] == level] soundsLevel = soundsSession[soundsSession['levelInstance'] == level] levelInfo = touchsLevel.iloc[0] if not juntar: #Crea un grafico nuevo si esta configurado asi # Genera el plot si se va a usar fig = plt.figure(figsize=(30, 5)) ax = fig.add_subplot(111) ax.set_title('Informacion de eventos para el usuario ' + str(usuario) + ', sesion del ' + str(fechaLocal(session)) + ', nivel: ' + str(levelInfo['levelId']), fontsize=14, fontweight='bold') ax.set_xlabel('Tiempo') ax.set_ylabel('') ax.get_yaxis().set_ticks([]) ax.set_ylim([0, 11]) # Configura el color segun este completado o no el nivel if levelInfo['levelCompleted'] == True: color = 'blue' else: color = 'red' # Grafica el segmento principal x = [ fechaLocal(levelInfo['timeLevelStarts']), fechaLocal(levelInfo['timeLevelExit']) ] y = [9, 9] ax.plot(x, y, color=color) # Grafica dos bordes para remarcar los inicios y los finales ax.plot([ fechaLocal(levelInfo['timeLevelStarts'] - 0.01), fechaLocal(levelInfo['timeLevelStarts'] + 0.01) ], [y[0] + 0.5, y[0] - 0.5], color=color) ax.plot([ fechaLocal(levelInfo['timeLevelExit'] - 0.01), fechaLocal(levelInfo['timeLevelExit'] + 0.01) ], [y[0] + 0.5, y[0] - 0.5], color=color) # Agrega el id del nivel xCenter = fechaLocal( (levelInfo['timeLevelStarts'] + levelInfo['timeLevelExit']) / 2) ax.text(xCenter, 8.5, levelInfo['levelInstance']) # Procesa la info de los trials del level en cuestion for trial in touchsLevel['trialInstance'].unique(): touchsTrial = touchsLevel[touchsLevel['trialInstance'] == trial] soundsTrial = soundsLevel[soundsLevel['trialInstance'] == trial] trialInfo = touchsTrial.iloc[0] # Configura el color segun el tipo de trial if trialInfo['tipoDeTrial'] == 'TUTORIAL': color = 'yellow' else: color = 'cyan' # Grafica el segmento principal x = [ fechaLocal(trialInfo['timeTrialStart']), fechaLocal(trialInfo['timeTrialExit']) ] y = [7, 7] ax.plot(x, y, color=color) # Grafica dos bordes para remarcar los inicios y los finales ax.plot([ fechaLocal(trialInfo['timeTrialStart'] - 0.01), fechaLocal(trialInfo['timeTrialStart'] + 0.01) ], [y[0] + 0.5, y[0] - 0.5], color=color) ax.plot([ fechaLocal(trialInfo['timeTrialExit'] - 0.01), fechaLocal(trialInfo['timeTrialExit'] + 0.01) ], [y[0] + 0.5, y[0] - 0.5], color=color) # Agrega el id del trial xCenter = fechaLocal((trialInfo['timeTrialStart'] + trialInfo['timeTrialExit']) / 2) ax.text(xCenter, 6.5, trialInfo['trialId']) # Procesa la info de los touchs del trial en cuestion for touchInstance in touchsTrial['touchInstance'].unique(): touch = touchsTrial[touchsTrial['touchInstance'] == touchInstance] touch = touch.iloc[0] # Configura el color segun sea un acierto o no if touch[ 'isTrue'] == True: # Ojo que aca un Nan es un false! color = 'green' else: color = 'red' y = [3, 3] # Grafica el segmento cuasivertical ax.plot([ fechaLocal(touch['touchInstance'] - 0.01), fechaLocal(touch['touchInstance'] + 0.01) ], [y[0] + 0.5, y[0] - 0.5], color=color) # Agrega el id del elemento tocado xCenter = fechaLocal(touch['touchInstance'] + 0.3) ax.text(xCenter, 2.5, touch['idResourceTouched']['id']) # Procesa los sounds en cada trial for soundInstance in soundsTrial['soundInstance'].unique(): sound = soundsTrial[soundsTrial['soundInstance'] == soundInstance] sound = sound.iloc[0] # Configura el color color = 'gray' y = [5, 5] # Grafica el segmento cuasivertical ax.plot([ fechaLocal(soundInstance - 0.01), fechaLocal(soundInstance + 0.01) ], [y[0] + 0.5, y[0] - 0.5], color=color) # Agrega el id del elemento tocado xCenter = fechaLocal(soundInstance + 0.3) ax.text(xCenter, 4.5, sound['soundSourceId']['id'])
import scripts.constants as cts from scripts.general import chkVersion from IPython.display import display chkVersion() def downloadFile(): """ Esta funcion descarga la base de datos en formato json del servidor y hace una backup del archivo anterior. """ import datetime import time import urllib import os import filecmp import progressbar def avance(bloques, tamanoBloque, tamanoTotal): avanzado = bloques * tamanoBloque progreso = avanzado / tamanoTotal * 100 if progreso > 100: progreso = 100 bar.update(progreso) timestamp = time.time() st = datetime.datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H:%M:%S") filenameBackup = cts.PathDirDbBackUp + cts.FileNameLocalDb[:-5] + " backup " + st + ".json"
import scripts.constants as cts from scripts.general import chkVersion from IPython.display import display from scripts.db import dataProcesada chkVersion() def plotByUser (specificData=False, alias=["Todos"], filtroCompletadoActivo=True, expList=cts.expList, onlyOneUser=True, number=-1, join=False, db=None): users, db = dataProcesada(specificData=specificData, alias=alias, filtroCompletadoActivo=filtroCompletadoActivo, expList=expList, onlyOneUser=onlyOneUser, number=number, join=join, db=db) """ excludedSessionInstance = [1473088663797] from scripts.db import pandasTransferencia if not specificData: db = pandasTransferencia() users = db[cts.P_Alias].unique() if alias == ["Todos"] else alias """ for user in users: """ if onlyOneUser: if user != users[number]: continue """
def plotConvergenciaAngulos (levels, completos=True): """ Esta función grafica el angulo en funcion del numero de trial para cada uno de los cuadrantes """ import matplotlib.pyplot as plt from IPython.display import display from scripts.general import fechaLocal import json from scripts.general import chkVersion chkVersion() mostrarReferencia = True mostrarNivel = False mostrarAngulo = False if completos: levels = levels[levels['levelCompleted']] for usuario in levels['Alias'].unique(): display ('Se hara la estadistica del usuario: '+usuario) levelsUsuario = levels[levels['Alias']==usuario] display ('El usuario '+usuario+' jugo '+str(len(levelsUsuario['sessionInstance'].unique()))+' veces') if mostrarReferencia: # Armamos el grafico de angulos refrenciados (esta aca porque queremos comparar entre todos los levels de todas las sesiones de un mismo usuario) # Armamos los colores # These are the "Tableau 20" colors as RGB. tableau20 = [(31, 119, 180), (174, 199, 232), (255, 187, 120), (44, 160, 44), (152, 223, 138), (214, 39, 40), (255, 152, 150), (148, 103, 189), (197, 176, 213), (140, 86, 75), (196, 156, 148), (227, 119, 194), (247, 182, 210), (127, 127, 127), (199, 199, 199), (188, 189, 34), (219, 219, 141), (23, 190, 207), (158, 218, 229), (255, 127, 14)] Color2 = ['0F3FFF','190EFE','530DFD','8D0CFD','C80BFC','FC0AF5','FB0AB9', 'FB097D','FA0841','FA0A07','F94506','F98006','F8BB05','F8F604','BCF703', '80F703','43F602','06F601','00F537','00F572'] # Scale the RGB values to the [0, 1] range, which is the format matplotlib accepts. for i in range(len(tableau20)): r, g, b = tableau20[i] tableau20[i] = (r / 255., g / 255., b / 255.) figC, (axC1, axC2, axC3, axC4) = plt.subplots(nrows=4) figC.set_size_inches(10, 18) title = 'Comparacion de la evolucion del delta angulo en funcion del trial\n' + 'Usuario: '+str(usuario) figC.suptitle (title, fontsize=10, fontweight='bold') figC.subplots_adjust(hspace=0.5) axC1.set_title("Cuadrante 1") axC1.set_xlabel('Numero de trial') axC1.set_ylabel('Delta angulo') axC1.set_color_cycle(tableau20) axC2.set_title("Cuadrante 2") axC2.set_xlabel('Numero de trial') axC2.set_ylabel('Delta angulo') axC2.set_color_cycle(tableau20) axC3.set_title("Cuadrante 3") axC3.set_xlabel('Numero de trial') axC3.set_ylabel('Delta angulo') axC3.set_color_cycle(tableau20) axC4.set_title("Cuadrante 4") axC4.set_xlabel('Numero de trial') axC4.set_ylabel('Delta angulo') axC4.set_color_cycle(tableau20) for session in levelsUsuario['sessionInstance'].unique(): levelSession = levelsUsuario[levelsUsuario['sessionInstance']==session] display ('En la session '+ str(fechaLocal(session))+ ' el usuario '+str(usuario)+' jugo '+str(len(levelSession['levelInstance'].unique())) + ' niveles') for level in levelSession['levelInstance'].unique(): levelLevel = levelSession[levelSession['levelInstance']==level] # display (levelLevel) levelInfo = levelLevel.iloc[0] convergencias = levelInfo['advance']['convergencias'] for convergencia in convergencias: if mostrarNivel: # Armamos el grafico de nivel fig1 = plt.figure(figsize=(10,3)) ax1 = fig1.add_subplot(111) title = 'Evolucion de la dificultad en funcion del trial \n' + 'Usuario: '+str(usuario) + ' en la referencia: ' + str(convergencia['anguloDeReferencia']) ax1.set_title(title, fontsize=10, fontweight='bold') ax1.set_xlabel('Numero de trial') ax1.set_ylabel('Nivel') if mostrarAngulo: # Armamos el grafico de angulo fig2 = plt.figure(figsize=(10,3)) ax2 = fig2.add_subplot(111) title = 'Evolucion del angulo en funcion del trial \n' + 'Usuario: '+str(usuario) + ' en la referencia: ' + str(convergencia['anguloDeReferencia']) ax2.set_title(title, fontsize=10, fontweight='bold') ax2.set_xlabel('Numero de trial') ax2.set_ylabel('Angulo') # Extraemos la info en forma de lista aciertos=[] angulosReferido=[] angulos=[] angulosNivel = [] for historial in convergencia['historial']: # Extraemos la lista de aciertos o errores de la info del historial if historial['acertado']: aciertos=aciertos+[True] else: aciertos=aciertos+[False] angulos = angulos + [historial['angulo']] # Corregimos el tema de cuadrante para que se vea mas lindo. if angulos[-1] < historial['anguloDeReferencia']: angulos[-1] = angulos[-1] + 360 angulosReferido = angulosReferido + [historial['anguloReferido']] angulosNivel = angulosNivel + [historial['nivel']] if mostrarNivel: # Dibujamos los niveles x = range(len(angulosNivel)) y = angulosNivel ax1.plot(x,y, label=convergencia['nombreDelCuadrante']) # marcamos aciertos y errores x = [i for i in range(len(aciertos)) if aciertos[i]] y = [angulosNivel[i] for i in range(len(aciertos)) if aciertos[i]] ax1.plot(x,y,'go') x = [i for i in range(len(aciertos)) if not aciertos[i]] y = [angulosNivel[i] for i in range(len(aciertos)) if not aciertos[i]] ax1.plot(x,y,'ro') # Marcamos el final si es convergencia o no. if convergencia['convergenciaAlcanzada']: ax1.plot([len(angulosNivel)-1],angulosNivel[-1],'bs', markersize=10) else: if len(angulosNivel) > 0: # Esto es porque hay datos malos, no deberia hacer falta en gral ax1.plot([len(angulosNivel)-1],angulosNivel[-1],'rs', markersize=10) ax1.legend(loc='center left', bbox_to_anchor=(1, 0.5)) if mostrarAngulo: # Dibujamos los angulos x = range(len(angulos)) y = angulos ax2.plot(x,y, label=convergencia['nombreDelCuadrante']) # marcamos aciertos y errores x = [i for i in range(len(aciertos)) if aciertos[i]] y = [angulos[i] for i in range(len(aciertos)) if aciertos[i]] ax2.plot(x,y,'go') x = [i for i in range(len(aciertos)) if not aciertos[i]] y = [angulos[i] for i in range(len(aciertos)) if not aciertos[i]] ax2.plot(x,y,'ro') # Marcamos el final si es convergencia o no. if convergencia['convergenciaAlcanzada']: ax2.plot([len(angulos)-1],angulos[-1],'bs', markersize=10) else: if len(angulos) > 0: # Esto es porque hay datos malos, no deberia hacer falta en gral ax2.plot([len(angulos)-1],angulos[-1],'rs', markersize=10) ax2.legend(loc='center left', bbox_to_anchor=(1, 0.5)) if mostrarReferencia: # Dibujamos los angulos referenciados if convergencia['numeroCuadrante']==1: axC=axC1 if convergencia['numeroCuadrante']==2: axC=axC2 if convergencia['numeroCuadrante']==3: axC=axC3 if convergencia['numeroCuadrante']==4: axC=axC4 x = range(len(angulos)) y = angulosReferido if 'ultimoMEANAngulo' in convergencia: Label = "Referencia "+str(convergencia['anguloDeReferencia']) + " mean(Angulo): " + str(convergencia['ultimoMEANAngulo']) else: Label = "Referencia "+str(convergencia['anguloDeReferencia']) + " mean(Level): " + str(convergencia['ultimoMEAN']) axC.plot(x,y,label=Label, lw=(convergencia['anguloDeReferencia']+45)/90*5) # marcamos aciertos y errores #x = [i for i in range(len(aciertos)) if aciertos[i]] #y = [angulosRef[i] for i in range(len(aciertos)) if aciertos[i]] #axC.plot(x,y,'go') #x = [i for i in range(len(aciertos)) if not aciertos[i]] #y = [angulosRef[i] for i in range(len(aciertos)) if not aciertos[i]] #axC.plot(x,y,'ro') # Marcamos el final si es convergencia o no. if convergencia['convergenciaAlcanzada']: axC.plot([len(angulosReferido)-1],angulosReferido[-1],'bs', markersize=10) else: if len(angulos) > 0: # Esto es porque hay datos malos, no deberia hacer falta en gral axC.plot([len(angulos)-1],angulosReferido[-1],'rs', markersize=10) axC.legend(loc='center left', bbox_to_anchor=(1, 0.5),prop={'size':10})
def makeTimeline (touchs, sounds): """ Esta es una funcion puramente para hacer un revision cualitativa de los datos, y verficar que este todo en orden. Toma el dataframe de touchs y sounds y hace un grafico que muestra la sucesion de eventos a lo largo del juego. """ from scripts.general import chkVersion chkVersion() import matplotlib.pyplot as plt import numpy as np import datetime from Scripts import fechaLocal from IPython.display import display juntar = False # Si es true, junta todos los levels de una misma sesion, sino separa por level for usuario in touchs['Alias'].unique(): # Genera el plot fig = plt.figure(figsize=(30,5)) ax = fig.add_subplot(111) ax.set_title('Informacion de eventos para el usuario {}'.format(usuario), fontsize=10, fontweight='bold') ax.set_xlabel('Tiempo') ax.set_ylabel('') ax.get_yaxis().set_ticks([]) ax.set_ylim([0,11]) # Procesa la info para graficar las sesiones del usuario fechas = touchs[touchs['Alias']==usuario]['sessionInstance'] fechasFormateadas = [fechaLocal(fecha) for fecha in fechas] altura = np.ones(fechas.size)*10 ax.plot(fechasFormateadas,altura,'ro') touchsUsuario = touchs[touchs['Alias'] == usuario] soundsUsuario = sounds[sounds['Alias'] == usuario] # ahora para este usuario va a hacer un grafico por sesion for session in touchsUsuario['sessionInstance'].unique(): #Carga los touchs de cada session touchsSession = touchsUsuario[touchsUsuario['sessionInstance']==session] soundsSession = soundsUsuario[soundsUsuario['sessionInstance']==session] if juntar: #Crea un grafico nuevo si esta configurado asi if touchsSession.size > 0: # Genera el plot si se va a usar fig = plt.figure(figsize=(30,5)) ax = fig.add_subplot(111) ax.set_title('Informacion de eventos para el usuario '+str(usuario)+' sesion del '+str(fechaLocal(touchSession)), fontsize=14, fontweight='bold') ax.set_xlabel('Tiempo') ax.set_ylabel('') ax.get_yaxis().set_ticks([]) ax.set_ylim([0,11]) # Procesa la info de los levels for level in touchsSession['levelInstance'].unique(): touchsLevel = touchsSession[touchsSession['levelInstance']==level] soundsLevel = soundsSession[soundsSession['levelInstance']==level] levelInfo = touchsLevel.iloc[0] if not juntar: #Crea un grafico nuevo si esta configurado asi # Genera el plot si se va a usar fig = plt.figure(figsize=(30,5)) ax = fig.add_subplot(111) ax.set_title('Informacion de eventos para el usuario '+str(usuario)+', sesion del '+str(fechaLocal(session))+', nivel: '+str(levelInfo['levelId']), fontsize=14, fontweight='bold') ax.set_xlabel('Tiempo') ax.set_ylabel('') ax.get_yaxis().set_ticks([]) ax.set_ylim([0,11]) # Configura el color segun este completado o no el nivel if levelInfo['levelCompleted'] == True: color = 'blue' else: color = 'red' # Grafica el segmento principal x = [fechaLocal(levelInfo['timeLevelStarts']),fechaLocal(levelInfo['timeLevelExit'])] y = [9,9] ax.plot(x,y,color=color) # Grafica dos bordes para remarcar los inicios y los finales ax.plot([fechaLocal(levelInfo['timeLevelStarts']-0.01),fechaLocal(levelInfo['timeLevelStarts']+0.01)],[y[0]+0.5,y[0]-0.5],color=color) ax.plot([fechaLocal(levelInfo['timeLevelExit']-0.01),fechaLocal(levelInfo['timeLevelExit']+0.01)],[y[0]+0.5,y[0]-0.5],color=color) # Agrega el id del nivel xCenter = fechaLocal((levelInfo['timeLevelStarts']+levelInfo['timeLevelExit'])/2) ax.text(xCenter, 8.5, levelInfo['levelInstance']) # Procesa la info de los trials del level en cuestion for trial in touchsLevel['trialInstance'].unique(): touchsTrial = touchsLevel[touchsLevel['trialInstance']==trial] soundsTrial = soundsLevel[soundsLevel['trialInstance']==trial] trialInfo = touchsTrial.iloc[0] # Configura el color segun el tipo de trial if trialInfo['tipoDeTrial'] == 'TUTORIAL': color = 'yellow' else: color = 'cyan' # Grafica el segmento principal x = [fechaLocal(trialInfo['timeTrialStart']),fechaLocal(trialInfo['timeTrialExit'])] y = [7,7] ax.plot(x,y,color=color) # Grafica dos bordes para remarcar los inicios y los finales ax.plot([fechaLocal(trialInfo['timeTrialStart']-0.01),fechaLocal(trialInfo['timeTrialStart']+0.01)],[y[0]+0.5,y[0]-0.5],color=color) ax.plot([fechaLocal(trialInfo['timeTrialExit']-0.01),fechaLocal(trialInfo['timeTrialExit']+0.01)],[y[0]+0.5,y[0]-0.5],color=color) # Agrega el id del trial xCenter = fechaLocal ((trialInfo['timeTrialStart']+trialInfo['timeTrialExit'])/2) ax.text(xCenter, 6.5, trialInfo['trialId']) # Procesa la info de los touchs del trial en cuestion for touchInstance in touchsTrial['touchInstance'].unique(): touch = touchsTrial[touchsTrial['touchInstance']==touchInstance] touch = touch.iloc[0] # Configura el color segun sea un acierto o no if touch['isTrue'] == True: # Ojo que aca un Nan es un false! color = 'green' else: color = 'red' y = [3,3] # Grafica el segmento cuasivertical ax.plot([fechaLocal(touch['touchInstance']-0.01),fechaLocal(touch['touchInstance']+0.01)],[y[0]+0.5,y[0]-0.5],color=color) # Agrega el id del elemento tocado xCenter = fechaLocal(touch['touchInstance']+0.3) ax.text(xCenter, 2.5, touch['idResourceTouched']['id']) # Procesa los sounds en cada trial for soundInstance in soundsTrial['soundInstance'].unique(): sound = soundsTrial[soundsTrial['soundInstance']==soundInstance] sound = sound.iloc[0] # Configura el color color = 'gray' y = [5,5] # Grafica el segmento cuasivertical ax.plot([fechaLocal(soundInstance-0.01),fechaLocal(soundInstance+0.01)],[y[0]+0.5,y[0]-0.5],color=color) # Agrega el id del elemento tocado xCenter = fechaLocal(soundInstance+0.3) ax.text(xCenter, 4.5, sound['soundSourceId']['id'])
def join (filename='db.json'): from scripts.general import chkVersion chkVersion() """ Este codigo sirve para ir acumulando los datos brutos tal cual salen de la base datos que se descarga, de forma de poder limpiar y reducir el tamaño del archivo online mas o menos seguid sin perder la coherencia de los datos. Esto es necesario porque el json-server no se banca bien manejar archivos muy grandes (empieza a tener delay) y el volumen de datos que se genera crece rapido. """ from IPython.display import display import json import pandas as pd import numpy as np import os with open(filename) as data_file: db = json.load(data_file) if db['SessionEnviables']!=[]: sessionsNuevos = pd.concat((pd.DataFrame(x) for x in db['SessionEnviables']), ignore_index=True) if os.path.isfile('./Guardados/db.sessions'): sessions = pd.read_pickle ('./Guardados/db.sessions') sessionsExists = True display ('Sessions tiene '+str(sessions.index.size)+' entradas') else: display ('Warning: no se encontro los session buscados') sessionsExists = False if sessionsExists: sessionsJoin = pd.concat([sessions, sessionsNuevos], axis=0, ignore_index=True) sessionsJoin.drop_duplicates(cols='id', inplace=True) display ('Se agregaron '+ str(sessionsJoin.index.size - sessions.index.size)+' registros al registro de sesiones.') else: sessionsJoin = sessionsNuevos display ('Se creo un archivo nuevo con registro de sesiones') sessionsJoin.to_pickle('./Guardados/db.sessions') if db['LevelEnviables']!=[]: levelsNuevos = pd.concat((pd.DataFrame(x) for x in db['LevelEnviables']), ignore_index=True) if os.path.isfile('./Guardados/db.levels'): levels = pd.read_pickle ('./Guardados/db.levels') levelsExists = True display ('Levels tiene '+str(levels.index.size)+' entradas') else: display ('Warning: no se encontro los levels buscados') levelsExists = False if levelsExists: levelsJoin = pd.concat([levels, levelsNuevos], axis=0, ignore_index=True) levelsJoin.drop_duplicates(cols='levelInstance', inplace=True) display ('Se agregaron '+ str(levelsJoin.index.size - levels.index.size)+' registros al registro de levels.') else: levelsJoin = levelsNuevos display ('Se creo un archivo nuevo con registro de levels') levelsJoin.to_pickle('./Guardados/db.levels') if db['TrialEnviables']!=[]: trialsNuevos = pd.concat((pd.DataFrame(x) for x in db['TrialEnviables']), ignore_index=True) if os.path.isfile('./Guardados/db.trials'): trials = pd.read_pickle ('./Guardados/db.trials') trialsExists = True display ('Trials tiene '+str(trials.index.size)+' entradas') else: display ('Warning: no se encontro los trials buscados') trialsExists = False if trialsExists: trialsJoin = pd.concat([trials, trialsNuevos], axis=0, ignore_index=True) trialsJoin.drop_duplicates(cols='trialInstance', inplace=True) display ('Se agregaron '+ str(trialsJoin.index.size - trials.index.size)+' registros al registro de trials.') else: trialsJoin = trialsNuevos display ('Se creo un archivo nuevo con registro de trials') trialsJoin.to_pickle('./Guardados/db.trials') display ('Datos del json cargados')
def loadTouchs (): """ Esta funcion extrae de la base de datos ya separada en registros de sesion, level y trials, y acumulada en archivos locales en formato json dos dataframes uno para touchs y uno para sounds. Para eso mergea los sub json que hay en la db.json del servidor unificando por instancias de level, sesion y trial. Los formatos en que se guardan los json que vienen de la aplicacion resultaron ser muy poco practicos por esa razon es importante reordenarlos. La funcion recibe como parametros un dict settings, que le indica que filtros utilizar para leer los datos y evitar problemas de compatibilidad entre experimentos, versiones de datos, etc. La funcion devuelve dos dataframes uno de touchs y uno de sounds que son la base de la estructura de datos para procesamientos posteriores. """ from scripts.general import chkVersion chkVersion() import pandas as pd import os import numpy as np from IPython.display import display makeSettings(basic=True,levels=False) # Primero se carga la info de la estructura json (los touchs y sounds vienen dentro de los trials) if os.path.isfile('./Guardados/db.sessions'): sessions = pd.read_pickle ('./Guardados/db.sessions') else: display ('Warning: no se encontro los session buscados') return if os.path.isfile('./Guardados/db.levels'): levels = pd.read_pickle ('./Guardados/db.levels') else: display ('Warning: no se encontro los levels buscados') return display ('Numero de sesiones totales encontradas:: ' + str(sessions.index.size)) display ('Numero de levels totales encontrados: ' + str(levels.index.size)) if os.path.isfile('./Guardados/db.trials'): trials = pd.read_pickle ('./Guardados/db.trials') else: display ('Warning: no se encontro los trials buscados') return display ('Numero de sesiones totales encontradas:: ' + str(sessions.index.size)) display ('Numero de levels totales encontrados: ' + str(levels.index.size)) display ('Numero de trials totales encontrados: ' + str(trials.index.size)) display ('Filtrando datos...') # Extraemos los datos de los touchs y sounds de dentro de los json de los trials touchs = pd.concat(pd.DataFrame(x) for x in list(trials['touchLog']) if type(x)==list) # NOTA! : revisar que pasa si vienen mas de un json en un trial sounds = pd.concat(pd.DataFrame(x) for x in list(trials['soundLog']) if type(x)==list) # NOTA! : revisar que pasa si vienen mas de un json en un trial # Procesamos un poco los datos para eliminar info redundante o innecesaria, o para unificar nombres. Para eso se usan los filtros prefijados y configurables. sessions = estetizarTabla(sessions,'sessions') levels = estetizarTabla(levels,'levels') trials = estetizarTabla(trials,'trials') touchs = estetizarTabla(touchs,'touchs') sounds = estetizarTabla(sounds,'sounds') # una vez bien formateada todas las tablas se mergean a travez de las instancias de sesion, level y trial touchs = pd.merge(touchs, trials, on='trialInstance') touchs = pd.merge(touchs, levels, on='levelInstance') touchs = pd.merge(touchs, sessions, on='sessionInstance') sounds = pd.merge(sounds, trials, on='trialInstance') sounds = pd.merge(sounds, levels, on='levelInstance') sounds = pd.merge(sounds, sessions, on='sessionInstance') # Creamos los alias touchs = renombrarUsuarios(touchs) sounds = renombrarUsuarios(sounds) # Aplicamos los filtros level, code, etc touchs = aplicarFiltros(touchs) sounds = aplicarFiltros(sounds) display ('Recursos cargados del archivo') display ('Touchs seleccionados: ' + str(touchs.index.size)) display ('Sounds seleccionados: ' + str(sounds.index.size)) return touchs, sounds
def join(filename='db.json'): from scripts.general import chkVersion import scripts.constants chkVersion() """ Este codigo sirve para ir acumulando los datos brutos tal cual salen de la base datos que se descarga, de forma de poder limpiar y reducir el tamaño del archivo online mas o menos seguido sin perder la coherencia de los datos. Esto es necesario porque el json-server no se banca bien manejar archivos muy grandes (empieza a tener delay) y el volumen de datos que se genera crece rapido. La idea es que guarda en archivos separados las listas de registros segun la categoria de envio para que despues puedan ser procesados segun corresponda """ from IPython.display import display import json import os import pickle # Transformamos el archivo en un json with open(filename) as data_file: db = json.load(data_file) # Seleccionamos los datos data = db['Envio'] # Buscamos la lista de todas las categorias de envios tiposDeEnvio = set([envio['tipoDeEnvio'] for envio in data]) # La info guardada en esta parte esta pensada como una lista de envios segun el tipo for tipoDeEnvio in tiposDeEnvio: filename = './Guardados/db.' + tipoDeEnvio enviosNuevos = [ envio for envio in data if envio['tipoDeEnvio'] == tipoDeEnvio ] # Sacamos el formato json a los envios for envio in enviosNuevos: envio['contenido'] = json.loads(envio['contenido']) if os.path.isfile(filename): with open(filename, 'rb') as f: enviosViejos = pickle.load(f) enviosExists = True display(tipoDeEnvio + ' tiene ' + str(len(enviosViejos)) + ' entradas.') else: display('Warning: no se encontro entradas previas para ' + tipoDeEnvio + ' se guardaran ' + str(len(enviosNuevos)) + ' entradas nuevas.') enviosExists = False if enviosExists: enviosUnificados = enviosViejos + [ envioNuevo for envioNuevo in enviosNuevos if not envioNuevo['instance'] in set([envioViejo['instance'] for envioViejo in enviosViejos]) ] else: enviosUnificados = enviosNuevos display(tipoDeEnvio + ' paso a tener ' + str(len(enviosUnificados)) + ' entradas.') with open(filename, 'wb+') as f: pickle.dump(enviosUnificados, f) joinUsers()
def plotConvergenciaAngulos(levels, completos=True): """ Esta función grafica el angulo en funcion del numero de trial para cada uno de los cuadrantes """ import matplotlib.pyplot as plt from IPython.display import display from scripts.general import fechaLocal import json from scripts.general import chkVersion chkVersion() mostrarReferencia = True mostrarNivel = False mostrarAngulo = False if completos: levels = levels[levels['levelCompleted']] for usuario in levels['Alias'].unique(): display('Se hara la estadistica del usuario: ' + usuario) levelsUsuario = levels[levels['Alias'] == usuario] display('El usuario ' + usuario + ' jugo ' + str(len(levelsUsuario['sessionInstance'].unique())) + ' veces') if mostrarReferencia: # Armamos el grafico de angulos refrenciados (esta aca porque queremos comparar entre todos los levels de todas las sesiones de un mismo usuario) # Armamos los colores # These are the "Tableau 20" colors as RGB. tableau20 = [(31, 119, 180), (174, 199, 232), (255, 187, 120), (44, 160, 44), (152, 223, 138), (214, 39, 40), (255, 152, 150), (148, 103, 189), (197, 176, 213), (140, 86, 75), (196, 156, 148), (227, 119, 194), (247, 182, 210), (127, 127, 127), (199, 199, 199), (188, 189, 34), (219, 219, 141), (23, 190, 207), (158, 218, 229), (255, 127, 14)] Color2 = [ '0F3FFF', '190EFE', '530DFD', '8D0CFD', 'C80BFC', 'FC0AF5', 'FB0AB9', 'FB097D', 'FA0841', 'FA0A07', 'F94506', 'F98006', 'F8BB05', 'F8F604', 'BCF703', '80F703', '43F602', '06F601', '00F537', '00F572' ] # Scale the RGB values to the [0, 1] range, which is the format matplotlib accepts. for i in range(len(tableau20)): r, g, b = tableau20[i] tableau20[i] = (r / 255., g / 255., b / 255.) figC, (axC1, axC2, axC3, axC4) = plt.subplots(nrows=4) figC.set_size_inches(10, 18) title = 'Comparacion de la evolucion del delta angulo en funcion del trial\n' + 'Usuario: ' + str( usuario) figC.suptitle(title, fontsize=10, fontweight='bold') figC.subplots_adjust(hspace=0.5) axC1.set_title("Cuadrante 1") axC1.set_xlabel('Numero de trial') axC1.set_ylabel('Delta angulo') axC1.set_color_cycle(tableau20) axC2.set_title("Cuadrante 2") axC2.set_xlabel('Numero de trial') axC2.set_ylabel('Delta angulo') axC2.set_color_cycle(tableau20) axC3.set_title("Cuadrante 3") axC3.set_xlabel('Numero de trial') axC3.set_ylabel('Delta angulo') axC3.set_color_cycle(tableau20) axC4.set_title("Cuadrante 4") axC4.set_xlabel('Numero de trial') axC4.set_ylabel('Delta angulo') axC4.set_color_cycle(tableau20) for session in levelsUsuario['sessionInstance'].unique(): levelSession = levelsUsuario[levelsUsuario['sessionInstance'] == session] display('En la session ' + str(fechaLocal(session)) + ' el usuario ' + str(usuario) + ' jugo ' + str(len(levelSession['levelInstance'].unique())) + ' niveles') for level in levelSession['levelInstance'].unique(): levelLevel = levelSession[levelSession['levelInstance'] == level] # display (levelLevel) levelInfo = levelLevel.iloc[0] convergencias = levelInfo['advance']['convergencias'] for convergencia in convergencias: if mostrarNivel: # Armamos el grafico de nivel fig1 = plt.figure(figsize=(10, 3)) ax1 = fig1.add_subplot(111) title = 'Evolucion de la dificultad en funcion del trial \n' + 'Usuario: ' + str( usuario) + ' en la referencia: ' + str( convergencia['anguloDeReferencia']) ax1.set_title(title, fontsize=10, fontweight='bold') ax1.set_xlabel('Numero de trial') ax1.set_ylabel('Nivel') if mostrarAngulo: # Armamos el grafico de angulo fig2 = plt.figure(figsize=(10, 3)) ax2 = fig2.add_subplot(111) title = 'Evolucion del angulo en funcion del trial \n' + 'Usuario: ' + str( usuario) + ' en la referencia: ' + str( convergencia['anguloDeReferencia']) ax2.set_title(title, fontsize=10, fontweight='bold') ax2.set_xlabel('Numero de trial') ax2.set_ylabel('Angulo') # Extraemos la info en forma de lista aciertos = [] angulosReferido = [] angulos = [] angulosNivel = [] for historial in convergencia['historial']: # Extraemos la lista de aciertos o errores de la info del historial if historial['acertado']: aciertos = aciertos + [True] else: aciertos = aciertos + [False] angulos = angulos + [historial['angulo']] # Corregimos el tema de cuadrante para que se vea mas lindo. if angulos[-1] < historial['anguloDeReferencia']: angulos[-1] = angulos[-1] + 360 angulosReferido = angulosReferido + [ historial['anguloReferido'] ] angulosNivel = angulosNivel + [historial['nivel']] if mostrarNivel: # Dibujamos los niveles x = range(len(angulosNivel)) y = angulosNivel ax1.plot(x, y, label=convergencia['nombreDelCuadrante']) # marcamos aciertos y errores x = [i for i in range(len(aciertos)) if aciertos[i]] y = [ angulosNivel[i] for i in range(len(aciertos)) if aciertos[i] ] ax1.plot(x, y, 'go') x = [ i for i in range(len(aciertos)) if not aciertos[i] ] y = [ angulosNivel[i] for i in range(len(aciertos)) if not aciertos[i] ] ax1.plot(x, y, 'ro') # Marcamos el final si es convergencia o no. if convergencia['convergenciaAlcanzada']: ax1.plot([len(angulosNivel) - 1], angulosNivel[-1], 'bs', markersize=10) else: if len( angulosNivel ) > 0: # Esto es porque hay datos malos, no deberia hacer falta en gral ax1.plot([len(angulosNivel) - 1], angulosNivel[-1], 'rs', markersize=10) ax1.legend(loc='center left', bbox_to_anchor=(1, 0.5)) if mostrarAngulo: # Dibujamos los angulos x = range(len(angulos)) y = angulos ax2.plot(x, y, label=convergencia['nombreDelCuadrante']) # marcamos aciertos y errores x = [i for i in range(len(aciertos)) if aciertos[i]] y = [ angulos[i] for i in range(len(aciertos)) if aciertos[i] ] ax2.plot(x, y, 'go') x = [ i for i in range(len(aciertos)) if not aciertos[i] ] y = [ angulos[i] for i in range(len(aciertos)) if not aciertos[i] ] ax2.plot(x, y, 'ro') # Marcamos el final si es convergencia o no. if convergencia['convergenciaAlcanzada']: ax2.plot([len(angulos) - 1], angulos[-1], 'bs', markersize=10) else: if len( angulos ) > 0: # Esto es porque hay datos malos, no deberia hacer falta en gral ax2.plot([len(angulos) - 1], angulos[-1], 'rs', markersize=10) ax2.legend(loc='center left', bbox_to_anchor=(1, 0.5)) if mostrarReferencia: # Dibujamos los angulos referenciados if convergencia['numeroCuadrante'] == 1: axC = axC1 if convergencia['numeroCuadrante'] == 2: axC = axC2 if convergencia['numeroCuadrante'] == 3: axC = axC3 if convergencia['numeroCuadrante'] == 4: axC = axC4 x = range(len(angulos)) y = angulosReferido if 'ultimoMEANAngulo' in convergencia: Label = "Referencia " + str( convergencia['anguloDeReferencia'] ) + " mean(Angulo): " + str( convergencia['ultimoMEANAngulo']) else: Label = "Referencia " + str( convergencia['anguloDeReferencia'] ) + " mean(Level): " + str( convergencia['ultimoMEAN']) axC.plot(x, y, label=Label, lw=(convergencia['anguloDeReferencia'] + 45) / 90 * 5) # marcamos aciertos y errores #x = [i for i in range(len(aciertos)) if aciertos[i]] #y = [angulosRef[i] for i in range(len(aciertos)) if aciertos[i]] #axC.plot(x,y,'go') #x = [i for i in range(len(aciertos)) if not aciertos[i]] #y = [angulosRef[i] for i in range(len(aciertos)) if not aciertos[i]] #axC.plot(x,y,'ro') # Marcamos el final si es convergencia o no. if convergencia['convergenciaAlcanzada']: axC.plot([len(angulosReferido) - 1], angulosReferido[-1], 'bs', markersize=10) else: if len( angulos ) > 0: # Esto es porque hay datos malos, no deberia hacer falta en gral axC.plot([len(angulos) - 1], angulosReferido[-1], 'rs', markersize=10) axC.legend(loc='center left', bbox_to_anchor=(1, 0.5), prop={'size': 10})
def plotConvergenciaXReferencia(dataframe): """ este script grafica como evoluciona la aproximacion a los angulos rectos en funcion de la referencia """ import matplotlib.pyplot as plt from scripts.general import fechaLocal from IPython.display import display from scripts.general import chkVersion chkVersion() # Cargamos una tabla de colores tableau20 = [(31, 119, 180), (255, 187, 120), (152, 223, 138), (255, 152, 150), (197, 176, 213), (196, 156, 148), (247, 182, 210), (199, 199, 199), (219, 219, 141), (158, 218, 229)] # Scale the RGB values to the [0, 1] range, which is the format matplotlib accepts. for i in range(len(tableau20)): r, g, b = tableau20[i] tableau20[i] = (r / 255., g / 255., b / 255.) colores = [] for color in tableau20: colores = colores + [color] + [color] + [color] + [color] # Se hace un grafico para cada referencia donde se juntan las cuadro convergencias de todos los usuarios listaReferencias = dataframe['anguloDeReferencia'].unique() listaReferencias.sort() for referencia in listaReferencias: # Filtramos los datos correspondientes a una referencia dfRef = dataframe[dataframe['anguloDeReferencia'] == referencia] # Creamos el grafico fig = plt.figure(figsize=(10, 3)) ax = fig.add_subplot(111) title = 'Evolucion del angulo en funcion del trial \n' + ' en la referencia: ' + str( referencia) ax.set_title(title, fontsize=10, fontweight='bold') ax.set_xlabel('Numero de trial') ax.set_ylabel('Angulo') ax.set_color_cycle(colores) # Buscamos el conjunto de las cuatro convergencias para cada levelInstance for i, instance in enumerate(dfRef['levelInstance'].unique()): # filtramos los datos x intancia dfRefInst = dfRef[dfRef['levelInstance'] == instance] # Buscamos la info de cada cuadrante for cuadrante in [1, 2, 3, 4]: dfRefInstCuad = dfRefInst[dfRefInst['cuadranteNumero'] == cuadrante] # nos asegurmos que esten ordenados los datos dfRefInstCuad.sort(['indiceEnHistorial']) # correjimos los numeros para que quede todo centrado alrededor del 90 if cuadrante == 1: #dfRefInstCuad['anguloReferidoPlot'] = dfRefInstCuad['anguloReferido'] dfRefInstCuad['ultimoMEANAnguloPlot'] = 90 - dfRefInstCuad[ 'ultimoMEANAngulo'] if cuadrante == 2: #dfRefInstCuad['anguloReferidoPlot'] = dfRefInstCuad['anguloReferido'] dfRefInstCuad['ultimoMEANAnguloPlot'] = dfRefInstCuad[ 'ultimoMEANAngulo'] - 90 if cuadrante == 3: #dfRefInstCuad['anguloReferidoPlot'] = dfRefInstCuad['anguloReferido'] - 180 dfRefInstCuad[ 'ultimoMEANAnguloPlot'] = 270 - dfRefInstCuad[ 'ultimoMEANAngulo'] if cuadrante == 4: #dfRefInstCuad['anguloReferidoPlot'] = dfRefInstCuad['anguloReferido'] - 180 dfRefInstCuad['ultimoMEANAnguloPlot'] = dfRefInstCuad[ 'ultimoMEANAngulo'] - 270 # Cargamos los datos a graficar x = dfRefInstCuad['indiceEnHistorial'] y = dfRefInstCuad['anguloReferido'] Label = "Cuadrante: " + str( cuadrante) + " User: " + dfRefInstCuad['Alias'].iloc[0] tamano = (dfRef['levelInstance'].unique().size - i) / (0.25 * dfRef['levelInstance'].unique().size) ax.plot(x, y, label=Label, lw=tamano) # Agregamos la marca de la convergencia x = dfRefInstCuad['indiceEnHistorial'].iloc[-1] y = dfRefInstCuad['anguloReferido'].iloc[-1] if dfRefInstCuad['convergenciaAlcanzada'].iloc[-1]: ax.plot(x, y, 'bs', markersize=10) else: ax.plot(x, y, 'rs', markersize=10) ax.legend(loc='center left', bbox_to_anchor=(1, 0.5)) # Graficamos una linea roja xmin, xmax = ax.get_xlim() ax.plot([0, xmax], [90, 90], 'r-') ax.plot([0, xmax], [270, 270], 'r-')
def plotConvergenciaXReferencia (dataframe) : """ este script grafica como evoluciona la aproximacion a los angulos rectos en funcion de la referencia """ import matplotlib.pyplot as plt from scripts.general import fechaLocal from IPython.display import display from scripts.general import chkVersion chkVersion() # Cargamos una tabla de colores tableau20 = [(31, 119, 180), (255, 187, 120), (152, 223, 138), (255, 152, 150), (197, 176, 213), (196, 156, 148), (247, 182, 210), (199, 199, 199), (219, 219, 141), (158, 218, 229)] # Scale the RGB values to the [0, 1] range, which is the format matplotlib accepts. for i in range(len(tableau20)): r, g, b = tableau20[i] tableau20[i] = (r / 255., g / 255., b / 255.) colores = [] for color in tableau20: colores = colores + [color] + [color] + [color] + [color] # Se hace un grafico para cada referencia donde se juntan las cuadro convergencias de todos los usuarios listaReferencias = dataframe['anguloDeReferencia'].unique() listaReferencias.sort() for referencia in listaReferencias: # Filtramos los datos correspondientes a una referencia dfRef = dataframe[dataframe['anguloDeReferencia']==referencia] # Creamos el grafico fig = plt.figure(figsize=(10,3)) ax = fig.add_subplot(111) title = 'Evolucion del angulo en funcion del trial \n' + ' en la referencia: ' + str(referencia) ax.set_title(title, fontsize=10, fontweight='bold') ax.set_xlabel('Numero de trial') ax.set_ylabel('Angulo') ax.set_color_cycle(colores) # Buscamos el conjunto de las cuatro convergencias para cada levelInstance for i,instance in enumerate(dfRef['levelInstance'].unique()) : # filtramos los datos x intancia dfRefInst = dfRef[dfRef['levelInstance'] == instance] # Buscamos la info de cada cuadrante for cuadrante in [1,2,3,4]: dfRefInstCuad = dfRefInst[dfRefInst['cuadranteNumero']==cuadrante] # nos asegurmos que esten ordenados los datos dfRefInstCuad.sort(['indiceEnHistorial']) # correjimos los numeros para que quede todo centrado alrededor del 90 if cuadrante == 1: #dfRefInstCuad['anguloReferidoPlot'] = dfRefInstCuad['anguloReferido'] dfRefInstCuad['ultimoMEANAnguloPlot'] = 90 - dfRefInstCuad['ultimoMEANAngulo'] if cuadrante == 2: #dfRefInstCuad['anguloReferidoPlot'] = dfRefInstCuad['anguloReferido'] dfRefInstCuad['ultimoMEANAnguloPlot'] = dfRefInstCuad['ultimoMEANAngulo'] - 90 if cuadrante == 3: #dfRefInstCuad['anguloReferidoPlot'] = dfRefInstCuad['anguloReferido'] - 180 dfRefInstCuad['ultimoMEANAnguloPlot'] = 270 - dfRefInstCuad['ultimoMEANAngulo'] if cuadrante == 4: #dfRefInstCuad['anguloReferidoPlot'] = dfRefInstCuad['anguloReferido'] - 180 dfRefInstCuad['ultimoMEANAnguloPlot'] = dfRefInstCuad['ultimoMEANAngulo'] - 270 # Cargamos los datos a graficar x = dfRefInstCuad['indiceEnHistorial'] y = dfRefInstCuad['anguloReferido'] Label = "Cuadrante: " + str(cuadrante) + " User: " + dfRefInstCuad['Alias'].iloc[0] tamano = (dfRef['levelInstance'].unique().size - i) / (0.25 * dfRef['levelInstance'].unique().size) ax.plot(x,y,label=Label, lw=tamano) # Agregamos la marca de la convergencia x = dfRefInstCuad['indiceEnHistorial'].iloc[-1] y = dfRefInstCuad['anguloReferido'].iloc[-1] if dfRefInstCuad['convergenciaAlcanzada'].iloc[-1]: ax.plot(x,y,'bs', markersize=10) else: ax.plot(x,y,'rs', markersize=10) ax.legend(loc='center left', bbox_to_anchor=(1, 0.5)) # Graficamos una linea roja xmin, xmax = ax.get_xlim() ax.plot ([0,xmax] , [90,90] , 'r-') ax.plot ([0,xmax] , [270,270] , 'r-')
def plotUmbralVsReferencia(dataframe): """ Muestra cuanto vale el umbral en funcion de la orientacion del angulo (toma como referencia el lado fijo) El cuadrante 1 se complementa con el 3 y el 2 con el 4. """ import matplotlib.pyplot as plt from scripts.general import fechaLocal from IPython.display import display import pandas as pd import numpy as np from scripts.general import chkVersion chkVersion() display(dataframe.keys()) # Iteramos sobre los usuarios for user in dataframe['Alias'].unique(): # Armamos los graficos fig, graficos = plt.subplots(2, 1, subplot_kw=dict(projection='polar')) fig.set_size_inches(10, 20) graficos[0].set_title('Aproximacion desde angulos agudos') graficos[1].set_title('Aproximacion desde angulos obtusos') fig.suptitle( 'Nivel de umbral (en grados) de deteccion de angulos rectos\n en funcion de la oriertacion del lado fijo \n usuario: ' + user) dataByUser = dataframe[dataframe['Alias'] == user] # Iteramos sobre las referencias referencias = dataByUser['anguloDeReferencia'].unique() referencias.sort() umbralC1 = [] umbralC2 = [] umbralC3 = [] umbralC4 = [] for referencia in referencias: dataByUserByRef = dataByUser[dataByUser['anguloDeReferencia'] == referencia] #display (dataByUserByRef[dataByUserByRef['cuadranteNumero']==3]) umbralC1 = umbralC1 + [ 90 - float(dataByUserByRef[dataByUserByRef['cuadranteNumero'] == 1]['anguloReferido'].tail(1)) ] umbralC2 = umbralC2 + [ float(dataByUserByRef[dataByUserByRef['cuadranteNumero'] == 2] ['anguloReferido'].tail(1)) - 90 ] umbralC3 = umbralC3 + [ 270 - float(dataByUserByRef[dataByUserByRef['cuadranteNumero'] == 3]['anguloReferido'].tail(1)) ] umbralC4 = umbralC4 + [ float(dataByUserByRef[dataByUserByRef['cuadranteNumero'] == 4] ['anguloReferido'].tail(1)) - 270 ] referenciasRadianes = [ value * np.pi / 180 + np.pi / 2 for value in referencias ] referenciasRadianes2 = [ value * np.pi / 180 + np.pi + np.pi / 2 for value in referencias ] graficos[0].plot(referenciasRadianes, umbralC1) graficos[0].plot(referenciasRadianes2, umbralC4) graficos[1].plot(referenciasRadianes, umbralC2) graficos[1].plot(referenciasRadianes2, umbralC3) fig.savefig('AngulosUmbral' + user + '.png') plt.show()
def plotConvergenciaXCuadrantes (dataframe) : """ Este script grafica cada convergencia uniendo todas las convergencias correspondientes a un mismo cuadrante """ import matplotlib.pyplot as plt from scripts.general import fechaLocal from IPython.display import display import numpy as np from scripts.general import chkVersion chkVersion() # Creamos una lista de colores linda # These are the "Tableau 20" colors as RGB. tableau20 = [(31, 119, 180), (174, 199, 232), (255, 187, 120), (44, 160, 44), (152, 223, 138), (214, 39, 40), (255, 152, 150), (148, 103, 189), (197, 176, 213), (140, 86, 75), (196, 156, 148), (227, 119, 194), (247, 182, 210), (127, 127, 127), (199, 199, 199), (188, 189, 34), (219, 219, 141), (23, 190, 207), (158, 218, 229), (255, 127, 14)] # Scale the RGB values to the [0, 1] range, which is the format matplotlib accepts. for i in range(len(tableau20)): r, g, b = tableau20[i] tableau20[i] = (r / 255., g / 255., b / 255.) for usuario in dataframe['Alias'].unique(): # Limitamos el dataframe al usuarios dataframeUsuario = dataframe[dataframe['Alias']==usuario] # Retocamos la info para que se adecue a los graficos que queremos dataframeUsuario[dataframeUsuario['angulo']<dataframeUsuario['anguloDeReferencia']]['angulo'] = dataframeUsuario['angulo'] + 360 # Creamos los graficos figC, (ax) = plt.subplots(nrows=1) figC.set_size_inches(10, 18) title = 'Comparacion de la evolucion del delta angulo en funcion del trial\n' + 'Usuario: '+str(usuario) figC.suptitle (title, fontsize=10, fontweight='bold') figC.subplots_adjust(hspace=0.5) # Reportamos un resumen display ('Se hara la estadistica del usuario: '+usuario) display ('El usuario '+usuario+' jugo '+str(len(dataframeUsuario['sessionInstance'].unique()))+' veces') # Repetimos la secuencia para cada cuadrante for i in [4,3,2,1]: # filtramos los datos correspondientes al cuadrante dfUserCuadrante = dataframeUsuario[dataframeUsuario['cuadranteNumero']==i] ax.set_xlabel('Numero de trial') ax.set_ylabel('Angulo') ax.set_color_cycle(tableau20) # Armamos una lista de todas las orientaciones ordenadas listaReferencias = dfUserCuadrante['anguloDeReferencia'].unique() listaReferencias.sort() listaReferencias[:] = listaReferencias[::-1] # Agregamos las lineas que corresponden a cada referencia for referencia in listaReferencias: # filtramos x referencia dfUserCuadranteReferencia = dfUserCuadrante[dfUserCuadrante['anguloDeReferencia']==referencia] # Revisamos si hay mas de una linea xq se jugo mas de una vez el nivel for levelintance in dfUserCuadranteReferencia['levelInstance'].unique(): # Filtramos por intancia de nivel dfUserCuadranteReferenciaInstance = dfUserCuadranteReferencia[dfUserCuadranteReferencia['levelInstance']==levelintance] # Nos aseguramos que esten bien ordenados los datos dfUserCuadranteReferenciaInstance.sort(['indiceEnHistorial']) # Cargamos las x y las y x = dfUserCuadranteReferenciaInstance['indiceEnHistorial'] y = dfUserCuadranteReferenciaInstance['anguloReferido'] # Agregamos la linea if i == 1: mean = 90 - dfUserCuadranteReferenciaInstance['ultimoMEANAngulo'].iloc[-1] if i == 2: mean = dfUserCuadranteReferenciaInstance['ultimoMEANAngulo'].iloc[-1] - 90 if i == 3: mean = 270 - dfUserCuadranteReferenciaInstance['ultimoMEANAngulo'].iloc[-1] if i == 4: mean = dfUserCuadranteReferenciaInstance['ultimoMEANAngulo'].iloc[-1] - 270 Label = "Referencia "+str(dfUserCuadranteReferenciaInstance['anguloDeReferencia'].iloc[0]) + " media al objetivo (grados): " + str(mean) ax.plot(x,y,label=Label, lw=(dfUserCuadranteReferenciaInstance['anguloDeReferencia'].iloc[0]+45)/90*5, alpha=0.2) ax.legend(loc='center left', bbox_to_anchor=(1, 0.5),prop={'size':8}) # Agregamos la marca de la convergencia x = dfUserCuadranteReferenciaInstance['indiceEnHistorial'].iloc[-1] y = dfUserCuadranteReferenciaInstance['anguloReferido'].iloc[-1] if dfUserCuadranteReferenciaInstance['convergenciaAlcanzada'].iloc[-1]: ax.plot(x,y,'bs', markersize=10, alpha=0.2) else: ax.plot(x,y,'rs', markersize=10, alpha=0.2) # Agregamos una linea que sea el valor medio de todos las referenciados x = [] y = [] colores = ['gray', 'blue', 'gray', 'blue'] #display (dfUserCuadrante['indiceEnHistorial'].unique()) #display (dfUserCuadrante[dfUserCuadrante['indiceEnHistorial']==0]['anguloReferido'].mean()) for indice in dfUserCuadrante['indiceEnHistorial'].unique(): if len (dfUserCuadrante[dfUserCuadrante['indiceEnHistorial']==indice].index) > 5: x = x + [indice] y = y + [dfUserCuadrante[dfUserCuadrante['indiceEnHistorial']==indice]['anguloReferido'].mean()] if len(y) > 10 : media = np.mean(y[10::]) if i == 1: media = 90 - media if i == 2: media = media - 90 if i == 3: media = 270 - media if i == 4: media = media - 270 Label = " Valor medio de todas las curvas (cuadrante: " + str(i) + ")" + "\n Distancia media (a partir del trial 10) al objetivo: " + str(media) ax.plot(x,y,label=Label, lw=3, color = colores[i-1]) lgd = ax.legend(loc='center left', bbox_to_anchor=(1, 0.5),prop={'size':8}) # Agregamos una linea de referencia xmin, xmax = ax.get_xlim() ax.plot ([0,xmax] , [90,90] , 'r-') ax.plot ([0,xmax] , [270,270] , 'r-') # Agregamos cartelitos que indiquen el cuadrante ax.annotate('Cuadrante 1', xy=(xmax/2, 45)) ax.annotate('Cuadrante 2', xy=(xmax/2, 135)) ax.annotate('Cuadrante 3', xy=(xmax/2, 225)) ax.annotate('Cuadrante 4', xy=(xmax/2, 315)) figC.savefig('XCuadrante'+usuario, bbox_extra_artists=(lgd,), bbox_inches='tight')
def plotConvergenciaXCuadrantes(dataframe): """ Este script grafica cada convergencia uniendo todas las convergencias correspondientes a un mismo cuadrante """ import matplotlib.pyplot as plt from scripts.general import fechaLocal from IPython.display import display import numpy as np from scripts.general import chkVersion chkVersion() # Creamos una lista de colores linda # These are the "Tableau 20" colors as RGB. tableau20 = [(31, 119, 180), (174, 199, 232), (255, 187, 120), (44, 160, 44), (152, 223, 138), (214, 39, 40), (255, 152, 150), (148, 103, 189), (197, 176, 213), (140, 86, 75), (196, 156, 148), (227, 119, 194), (247, 182, 210), (127, 127, 127), (199, 199, 199), (188, 189, 34), (219, 219, 141), (23, 190, 207), (158, 218, 229), (255, 127, 14)] # Scale the RGB values to the [0, 1] range, which is the format matplotlib accepts. for i in range(len(tableau20)): r, g, b = tableau20[i] tableau20[i] = (r / 255., g / 255., b / 255.) for usuario in dataframe['Alias'].unique(): # Limitamos el dataframe al usuarios dataframeUsuario = dataframe[dataframe['Alias'] == usuario] # Retocamos la info para que se adecue a los graficos que queremos dataframeUsuario[dataframeUsuario['angulo'] < dataframeUsuario[ 'anguloDeReferencia']]['angulo'] = dataframeUsuario['angulo'] + 360 # Creamos los graficos figC, (ax) = plt.subplots(nrows=1) figC.set_size_inches(10, 18) title = 'Comparacion de la evolucion del delta angulo en funcion del trial\n' + 'Usuario: ' + str( usuario) figC.suptitle(title, fontsize=10, fontweight='bold') figC.subplots_adjust(hspace=0.5) # Reportamos un resumen display('Se hara la estadistica del usuario: ' + usuario) display('El usuario ' + usuario + ' jugo ' + str(len(dataframeUsuario['sessionInstance'].unique())) + ' veces') # Repetimos la secuencia para cada cuadrante for i in [4, 3, 2, 1]: # filtramos los datos correspondientes al cuadrante dfUserCuadrante = dataframeUsuario[ dataframeUsuario['cuadranteNumero'] == i] ax.set_xlabel('Numero de trial') ax.set_ylabel('Angulo') ax.set_color_cycle(tableau20) # Armamos una lista de todas las orientaciones ordenadas listaReferencias = dfUserCuadrante['anguloDeReferencia'].unique() listaReferencias.sort() listaReferencias[:] = listaReferencias[::-1] # Agregamos las lineas que corresponden a cada referencia for referencia in listaReferencias: # filtramos x referencia dfUserCuadranteReferencia = dfUserCuadrante[ dfUserCuadrante['anguloDeReferencia'] == referencia] # Revisamos si hay mas de una linea xq se jugo mas de una vez el nivel for levelintance in dfUserCuadranteReferencia[ 'levelInstance'].unique(): # Filtramos por intancia de nivel dfUserCuadranteReferenciaInstance = dfUserCuadranteReferencia[ dfUserCuadranteReferencia['levelInstance'] == levelintance] # Nos aseguramos que esten bien ordenados los datos dfUserCuadranteReferenciaInstance.sort( ['indiceEnHistorial']) # Cargamos las x y las y x = dfUserCuadranteReferenciaInstance['indiceEnHistorial'] y = dfUserCuadranteReferenciaInstance['anguloReferido'] # Agregamos la linea if i == 1: mean = 90 - dfUserCuadranteReferenciaInstance[ 'ultimoMEANAngulo'].iloc[-1] if i == 2: mean = dfUserCuadranteReferenciaInstance[ 'ultimoMEANAngulo'].iloc[-1] - 90 if i == 3: mean = 270 - dfUserCuadranteReferenciaInstance[ 'ultimoMEANAngulo'].iloc[-1] if i == 4: mean = dfUserCuadranteReferenciaInstance[ 'ultimoMEANAngulo'].iloc[-1] - 270 Label = "Referencia " + str( dfUserCuadranteReferenciaInstance['anguloDeReferencia'] .iloc[0]) + " media al objetivo (grados): " + str(mean) ax.plot(x, y, label=Label, lw=(dfUserCuadranteReferenciaInstance[ 'anguloDeReferencia'].iloc[0] + 45) / 90 * 5, alpha=0.2) ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), prop={'size': 8}) # Agregamos la marca de la convergencia x = dfUserCuadranteReferenciaInstance[ 'indiceEnHistorial'].iloc[-1] y = dfUserCuadranteReferenciaInstance[ 'anguloReferido'].iloc[-1] if dfUserCuadranteReferenciaInstance[ 'convergenciaAlcanzada'].iloc[-1]: ax.plot(x, y, 'bs', markersize=10, alpha=0.2) else: ax.plot(x, y, 'rs', markersize=10, alpha=0.2) # Agregamos una linea que sea el valor medio de todos las referenciados x = [] y = [] colores = ['gray', 'blue', 'gray', 'blue'] #display (dfUserCuadrante['indiceEnHistorial'].unique()) #display (dfUserCuadrante[dfUserCuadrante['indiceEnHistorial']==0]['anguloReferido'].mean()) for indice in dfUserCuadrante['indiceEnHistorial'].unique(): if len(dfUserCuadrante[dfUserCuadrante['indiceEnHistorial'] == indice].index) > 5: x = x + [indice] y = y + [ dfUserCuadrante[dfUserCuadrante['indiceEnHistorial'] == indice]['anguloReferido'].mean() ] if len(y) > 10: media = np.mean(y[10::]) if i == 1: media = 90 - media if i == 2: media = media - 90 if i == 3: media = 270 - media if i == 4: media = media - 270 Label = " Valor medio de todas las curvas (cuadrante: " + str( i ) + ")" + "\n Distancia media (a partir del trial 10) al objetivo: " + str( media) ax.plot(x, y, label=Label, lw=3, color=colores[i - 1]) lgd = ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), prop={'size': 8}) # Agregamos una linea de referencia xmin, xmax = ax.get_xlim() ax.plot([0, xmax], [90, 90], 'r-') ax.plot([0, xmax], [270, 270], 'r-') # Agregamos cartelitos que indiquen el cuadrante ax.annotate('Cuadrante 1', xy=(xmax / 2, 45)) ax.annotate('Cuadrante 2', xy=(xmax / 2, 135)) ax.annotate('Cuadrante 3', xy=(xmax / 2, 225)) ax.annotate('Cuadrante 4', xy=(xmax / 2, 315)) figC.savefig('XCuadrante' + usuario, bbox_extra_artists=(lgd, ), bbox_inches='tight')
def crearTabla(touchs, experimentoUmbralCompleto=True): """ Esta funcion transforma la info que viene en los tochs en info util para hacer graficos de tipo de contiengencia donde es relevante la siguientes informacion: - La señal estimulo (converge/diverge +/-) - La señal reportada (converge/diverge +/-) - El delta tita - El angulo de referencia - La separacion entre las rectas - El usuario """ from scripts.general import chkVersion chkVersion() import pandas as pd import numpy as np from IPython.display import display display( "Creando tabla resumen de la informacion de los toques en funcion de los parametros para el experimento de umbral" ) resumen = touchs[["jsonMetaDataTouched", "jsonMetaDataEstimulo", "userID", "Alias"]] # Extraemos la info de los jsons columnName = "AnguloReferencia" display("Extrayendo informacion de: " + columnName) if not columnName in resumen.columns: temp = pd.DataFrame(columns=[columnName]) for (i, r) in touchs.iterrows(): temp.loc[i] = r["jsonMetaDataEstimulo"]["infoConceptual"]["direccionAnguloReferencia"] resumen = pd.concat([resumen, temp], axis=1) else: display("Warning: Se encontraron datos ya cargados para: " + columnName) columnName = "DeltaTita" display("Extrayendo informacion de: " + columnName) if not columnName in resumen.columns: temp = pd.DataFrame(columns=[columnName]) for (i, r) in touchs.iterrows(): temp.loc[i] = r["jsonMetaDataEstimulo"]["infoConceptual"]["deltaAngulo"] resumen = pd.concat([resumen, temp], axis=1) else: display("Warning: Se encontraron datos ya cargados para: " + columnName) columnName = "SeJuntanEstimulo" display("Extrayendo informacion de: " + columnName) if not columnName in resumen.columns: temp = pd.DataFrame(columns=[columnName]) for (i, r) in touchs.iterrows(): temp.loc[i] = r["jsonMetaDataEstimulo"]["infoConceptual"]["seJuntan"] resumen = pd.concat([resumen, temp], axis=1) else: display("Warning: Se encontraron datos ya cargados para: " + columnName) columnName = "Separacion" display("Extrayendo informacion de: " + columnName) if not columnName in resumen.columns: temp = pd.DataFrame(columns=[columnName]) for (i, r) in touchs.iterrows(): temp.loc[i] = r["jsonMetaDataEstimulo"]["infoConceptual"]["separacion"] resumen = pd.concat([resumen, temp], axis=1) else: display("Warning: Se encontraron datos ya cargados para: " + columnName) columnName = "SeJuntanSeleccion" display("Extrayendo informacion de: " + columnName) if not columnName in resumen.columns: temp = pd.DataFrame(columns=[columnName]) for (i, r) in touchs.iterrows(): temp.loc[i] = r["jsonMetaDataTouched"]["infoConceptual"]["seJuntan"] resumen = pd.concat([resumen, temp], axis=1) else: display("Warning: Se encontraron datos ya cargados para: " + columnName) resumen["Aciertos"] = np.where(resumen["SeJuntanEstimulo"] == resumen["SeJuntanSeleccion"], "Acierto", "Error") # Filtramos solo los datos de usuarios que hicieron los 26 niveles if experimentoUmbralCompleto: for user in touchs["userID"].unique(): resumenFiltrado = resumen[resumen["userID"] == user] if resumenFiltrado["AnguloReferencia"].unique().size != 26: resumen = resumen[resumen["userID"] != user] display(resumen["Alias"].unique()) display("Resumen completado") return resumen
def crearTabla(touchs, experimentoUmbralCompleto=True): """ Esta funcion transforma la info que viene en los tochs en info util para hacer graficos de tipo de contiengencia donde es relevante la siguientes informacion: - La señal estimulo (converge/diverge +/-) - La señal reportada (converge/diverge +/-) - El delta tita - El angulo de referencia - La separacion entre las rectas - El usuario """ from scripts.general import chkVersion chkVersion() import pandas as pd import numpy as np from IPython.display import display display( 'Creando tabla resumen de la informacion de los toques en funcion de los parametros para el experimento de umbral' ) resumen = touchs[[ 'jsonMetaDataTouched', 'jsonMetaDataEstimulo', 'userID', 'Alias' ]] # Extraemos la info de los jsons columnName = 'AnguloReferencia' display('Extrayendo informacion de: ' + columnName) if not columnName in resumen.columns: temp = pd.DataFrame(columns=[columnName]) for (i, r) in touchs.iterrows(): temp.loc[i] = r['jsonMetaDataEstimulo']['infoConceptual'][ 'direccionAnguloReferencia'] resumen = pd.concat([resumen, temp], axis=1) else: display('Warning: Se encontraron datos ya cargados para: ' + columnName) columnName = 'DeltaTita' display('Extrayendo informacion de: ' + columnName) if not columnName in resumen.columns: temp = pd.DataFrame(columns=[columnName]) for (i, r) in touchs.iterrows(): temp.loc[i] = r['jsonMetaDataEstimulo']['infoConceptual'][ 'deltaAngulo'] resumen = pd.concat([resumen, temp], axis=1) else: display('Warning: Se encontraron datos ya cargados para: ' + columnName) columnName = 'SeJuntanEstimulo' display('Extrayendo informacion de: ' + columnName) if not columnName in resumen.columns: temp = pd.DataFrame(columns=[columnName]) for (i, r) in touchs.iterrows(): temp.loc[i] = r['jsonMetaDataEstimulo']['infoConceptual'][ 'seJuntan'] resumen = pd.concat([resumen, temp], axis=1) else: display('Warning: Se encontraron datos ya cargados para: ' + columnName) columnName = 'Separacion' display('Extrayendo informacion de: ' + columnName) if not columnName in resumen.columns: temp = pd.DataFrame(columns=[columnName]) for (i, r) in touchs.iterrows(): temp.loc[i] = r['jsonMetaDataEstimulo']['infoConceptual'][ 'separacion'] resumen = pd.concat([resumen, temp], axis=1) else: display('Warning: Se encontraron datos ya cargados para: ' + columnName) columnName = 'SeJuntanSeleccion' display('Extrayendo informacion de: ' + columnName) if not columnName in resumen.columns: temp = pd.DataFrame(columns=[columnName]) for (i, r) in touchs.iterrows(): temp.loc[i] = r['jsonMetaDataTouched']['infoConceptual'][ 'seJuntan'] resumen = pd.concat([resumen, temp], axis=1) else: display('Warning: Se encontraron datos ya cargados para: ' + columnName) resumen['Aciertos'] = np.where( resumen['SeJuntanEstimulo'] == resumen['SeJuntanSeleccion'], 'Acierto', 'Error') # Filtramos solo los datos de usuarios que hicieron los 26 niveles if experimentoUmbralCompleto: for user in touchs['userID'].unique(): resumenFiltrado = resumen[resumen['userID'] == user] if resumenFiltrado['AnguloReferencia'].unique().size != 26: resumen = resumen[resumen['userID'] != user] display(resumen['Alias'].unique()) display('Resumen completado') return resumen