Пример #1
0
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
Пример #2
0
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
Пример #3
0
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')
Пример #4
0
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')
Пример #5
0
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()
Пример #6
0
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()
Пример #7
0
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
Пример #8
0
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!')
Пример #9
0
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'])
Пример #10
0
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"
Пример #11
0
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
        """
Пример #12
0
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})
Пример #13
0
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'])
Пример #14
0
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')
Пример #15
0
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
Пример #16
0
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()
Пример #17
0
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})
Пример #18
0
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-')
Пример #19
0
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-')
Пример #20
0
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()
Пример #21
0
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')
Пример #22
0
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')
Пример #23
0
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
Пример #24
0
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