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.

Anotar mapa de calor con varias columnas de fecha y condiciones en otras columnas de un dataframe.

Tengo un dataframe de ejemplo como se muestra a continuación.

import pandas as pd

data = {'ID':['001', '002', '003', '004', '005'],
    'Aim2 Date':['9/3/19', '9/3/19', '9/13/19', '9/20/19', '9/23/19'],
    'Aim2 C/I' :['Intervention', 'Intervention', 'Intervention', 'Control', 'Intervention'],
    'Aim3 Date':['9/17/19','9/19/19','9/27/19','9/30/19','10/8/19'],
    'Aim3 C/I' :['Control', 'Intervention', 'Control', 'Withdraw', 'Withdraw']}

df = pd.DataFrame(data)

El objetivo es crear un mapa de calor donde las 2 columnas de fecha se combinan para formar un solo eje x del mapa de calor en orden. El eje y del mapa de calor tiene el número de ID. El mapa de calor debe tener 3 categorías como se muestra a continuación:

  • 0: si no hay intervenciones en ambas columnas C/I para ese día.
  • 1: si hay ‘Intervention’ en la columna Aim2 C/I para ese día.
  • 2: si hay ‘Intervention’ en la columna Aim3 C/I para ese día.

La imagen de la salida tal como debería verse se muestra a continuación:

Imagen

Realmente estoy luchando para verificar las condiciones, crear las categorías y anotarlas dentro del mapa de calor.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para crear el mapa de calor deseado, podemos usar las bibliotecas pandas y seaborn. Primero, necesitamos combinar las columnas Aim2 Date y Aim3 Date en una sola columna y convertirla al formato de fecha y hora. También configuraremos la columna ID como el índice del dataframe para facilitar la creación del mapa de calor.

    A continuación, crearemos una nueva columna llamada Category, que tendrá tres valores: 0, 1 y 2, según las condiciones dadas en la pregunta. Podemos usar el método apply() para aplicar una función a cada fila del dataframe y configurar el valor de la columna Category en consecuencia.

    Finalmente, podemos usar la función heatmap() de seaborn para trazar el mapa de calor, especificando el eje x como la columna de fecha combinada, el eje y como la columna ID y la columna Category como los valores a trazar. También podemos usar la función annotate() de seaborn para agregar anotaciones al mapa de calor.

    El código para crear el mapa de calor deseado se muestra a continuación:

    import pandas as pd
    import seaborn as sns
    
    # crear el dataframe
    data = {'ID':['001', '002', '003', '004', '005'],
            'Aim2 Date':['9/3/19', '9/3/19', '9/13/19', '9/20/19', '9/23/19'],
            'Aim2 C/I' :['Intervention', 'Intervention', 'Intervention', 'Control', 'Intervention'],
            'Aim3 Date':['9/17/19','9/19/19','9/27/19','9/30/19','10/8/19'],
            'Aim3 C/I' :['Control', 'Intervention', 'Control', 'Withdraw', 'Withdraw']}
    
    df = pd.DataFrame(data)
    
    # combinar las columnas de fecha y configurar ID como índice
    df['Date'] = pd.to_datetime(df['Aim2 Date']).combine_first(pd.to_datetime(df['Aim3 Date']))
    df.set_index('ID', inplace=True)
    
    # crear columna de categoría
    def get_category(row):
        if row['Aim2 C/I'] == 'Intervention':
            return 1
        elif row['Aim3 C/I'] == 'Intervention':
            return 2
        else:
            return 0
    
    df['Category'] = df.apply(get_category, axis=1)
    
    # trazar el mapa de calor
    sns.set()
    sns.heatmap(df.pivot_table(index='ID', columns='Date', values='Category'),
                annot=True, fmt='d', cmap='coolwarm', cbar=False)
    

    El mapa de calor resultante debería lucir como la imagen mostrada en la pregunta.

Comments are closed.