es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Un algoritmo para manipular listas para un gráfico de barras apiladas de Bokeh

Estoy recibiendo datos de una API que estoy tratando de incorporar en un gráfico de barras apiladas de Bokeh. La documentación de Bokeh muestra que necesito este formato:

data = {
    x: [1, 2, 3, 4, 5],
    y1: [1, 2, 4, 3, 4],
    y2: [1, 4, 2, 2, 3],
}

Mis datos salen de mi bucle for de esta manera:

ts = [0, 1,   1,   1,  1, 2,  2,   4,  4,   4]
tx = [0, 233, 121, 34, 4, 22, 522, 11, 245, 3]

y, por lo tanto, deben quedar de esta manera:

# el xlist = los valores únicos de ts
# el número de capas debajo = el recuento (4) del elemento más común de ts (1)
# la longitud de cada lista de capas = el número de elementos únicos (4) de ts (0,1,2,4)

data = {
    xlist  : [0, 1,   2,   4]
    layer0 : [0, 233, 22, 11]
    layer1 : [0, 121, 522, 245]
    layer2 : [0, 34,  0,  3]
    layer3 : [0, 4,   0,  0]
}

Aclaraciones:
1. Los valores de ts siempre serán >= al valor anterior, serán marcas de tiempo de época.
2. Siempre habrá 2 listas de igual longitud.

Esto me brinda la estructura básica del diccionario y siento que estoy cerca, pero la lógica en los bucles está fuera de mi alcance. Si alguien puede ayudarme con un enfoque de mejores prácticas para esto, lo agradecería.

from statistics import mode

def stacker(list1, list2):
   data = {}
   xlist = list(set(list1))
   if len(list1) != len(list2):
      layer0 = [0]*len(list1)
      data = dict(xlist, layer0)
      print("las listas no tenían la misma longitud")
      return data
   data['xlist'] = xlist
   modeVal = mode(list1)
   layercount = list1.count(modeVal)
   for i in range(layercount):
      data['layer' + str(i)] = []
      # bucles
   return data
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para crear el formato de datos de la gráfica de barras apiladas a partir de las listas proporcionadas, puedes seguir estos pasos:

    1. Determina el número de capas requeridas para la gráfica de barras apiladas. Esto será la cantidad del elemento más común en la lista ts. Puedes usar la función mode del módulo statistics para obtener esta cantidad.
    2. Crea un diccionario vacío llamado data para almacenar los datos finales en el formato requerido.

    3. Obtén los valores únicos de la lista ts para usarlos como valores del eje x en los datos finales. Puedes usar la función set para obtener los valores únicos y luego convertir el conjunto nuevamente a una lista.

    4. Para cada capa en la gráfica de barras apiladas (es decir, desde 0 hasta el valor de layercount), crea una lista vacía en el diccionario data con una clave de layer0, layer1, etc.

    5. Recorre cada valor en la lista ts y agrega el valor correspondiente de la lista tx a la lista de capas adecuada en el diccionario data.

    6. Para las capas que no tienen un valor para un valor particular del eje x, rellena con 0.

    Aquí tienes un código de ejemplo para lograr esto:

    from statistics import mode
    
    def stacker(ts, tx):
        layercount = ts.count(mode(ts))
        xlist = sorted(set(ts))
        data = {'xlist': xlist}
        for i in range(layercount):
            data['layer' + str(i)] = []
        for xval in xlist:
            for i, val in enumerate(ts):
                if val == xval:
                    data['layer' + str(i % layercount)].append(tx[i])
            for i in range(layercount):
                if len(data['layer' + str(i)]) < len(xlist):
                    data['layer' + str(i)].append(0)
        return data
    

    Puedes llamar a esta función con tus listas ts y tx para obtener el formato de datos requerido para la gráfica de barras apiladas de Bokeh. Por ejemplo:

    ts = [0, 1, 1, 1, 1, 2, 2, 4, 4, 4]
    tx = [0, 233, 121, 34, 4, 22, 522, 11, 245, 3]
    data = stacker(ts, tx)
    

    Esto resultará en el diccionario data que contiene los valores del eje x y los valores de las capas en el formato requerido para la gráfica de barras apiladas de Bokeh.

Comments are closed.