La duplicación de n filas de una trama de datos utilizando el índice de nivel de segundo?

pierre_j:

Tengo una trama de datos pandas que, por ejemplo, está buscando de esta manera.

df
            Values
Timestamp
2020-02-01       A
2020-02-02       B
2020-02-03       C

Me gustaría (a la facilidad de tratamiento hay que hacer después) para mantener una ventana de n filas y duplicarlo para cada marca de tiempo, y la creación de un índice de nivel de segundo con int index local.

Con n = 2, esto daría:

df_new
                                Values
Timestamp   2nd_level_index
2020-02-01                0        NaN
                          1          A
2020-02-02                0          A
                          1          B
2020-03-03                0          B
                          1          C

¿Hay algún tipo de pandas de las funciones integradas que ayuden a hacer eso? Una ventana rodando con tamaño fijo (n) parece ser el principio, pero luego ¿Cómo puedo duplicar la ventana y la almacena para cada fila utilizando un índice del nivel de segundo?

¡Gracias de antemano por cualquier ayuda! mejores,

Jezreel:

Creo que no está incorporado en el método de pandas.

Posible solución con pasos para generar rodando matriz 2D:

n = 2
#added Nones for first values of 2d array
x = np.concatenate([[None] * (n-1), df['Values']])

def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
a = rolling_window(x, n)
print (a)
[[None 'A']
 ['A' 'B']
 ['B' 'C']]

Y luego crear MultiIndexpor MultiIndex.from_producty aplanar valores de la matriz por numpy.ravel:

mux = pd.MultiIndex.from_product([df.index, range(n)], names=('times','level1'))
df = pd.DataFrame({'Values': np.ravel(a)}, index=mux)
print (df)
                  Values
times      level1       
2020-02-01 0        None
           1           A
2020-02-02 0           A
           1           B
2020-02-03 0           B
           1           C

Si los valores son números agregar valores que faltan:

print (df)
            Values
Timestamp         
2020-02-01       1
2020-02-02       2
2020-02-03       3

n = 2
x = np.concatenate([[np.nan] * (n-1), df['Values']])

def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
a = rolling_window(x, n)
print (a)
[[nan  1.]
 [ 1.  2.]
 [ 2.  3.]]

mux = pd.MultiIndex.from_product([df.index, range(n)], names=('times','level1'))
df = pd.DataFrame({'Values': np.ravel(a)}, index=mux)
print (df)

                   Values
times      level1        
2020-02-01 0          NaN
           1          1.0
2020-02-02 0          1.0
           1          2.0
2020-02-03 0          2.0
           1          3.0

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=387501&siteId=1
Recomendado
Clasificación