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,
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 MultiIndex
por MultiIndex.from_product
y 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