J'ai un dataframe de pandas géants que, par exemple, est à la recherche comme celui-ci.
df
Values
Timestamp
2020-02-01 A
2020-02-02 B
2020-02-03 C
Je voudrais (pour faciliter le traitement à faire par la suite) pour garder une fenêtre de la ligne n et le dupliquer pour chaque horodatage, et la création d'un index de niveau 2 avec int index local.
Avec n = 2, cela donnerait:
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
Y at-il sorte de pandas géants intégrés dans la fonction qui me aider à le faire? Une fenêtre de roulement avec une taille fixe (n) semble être le début, mais comment puis-je dupliquer la fenêtre et le stocker pour chaque ligne en utilisant un indice de niveau 2?
Merci d'avance pour votre aide! bests,
Je pense qu'il n'y a pas intégré dans la méthode de pandas géants.
Solution possible avec des progrès pour générer de roulement tableau 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']]
Et puis créer MultiIndex
par MultiIndex.from_product
et aplatir les valeurs de tableau par 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 les valeurs sont des nombres ajouter des valeurs manquantes:
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