2
votes

pandas dataframe / numpy array - rouler sans fonction d'agrégation

Rolling in python agrège les données:

[
  [[1,'a'],[2,'b'],[3,'c']],
  [[2,'b'],[3,'c'],[4,'d']]
]

donne:

     a  b
0  NaN  a
1  1.5  b
2  2.5  c
3  3.5  d

ce dont j'ai besoin est un décalage de dataframes en 3 dimensions (ou tableaux numpy) 3 échantillons par 1 étape (dans cet exemple):

x = pd.DataFrame([[1,'a'],[2,'b'],[3,'c'],[4,'d']], columns=['a','b'])
y = x.rolling(2).mean()
print(y)

Quelle est la bonne façon de le faire pour 900 échantillons décalés de 1 à chaque étape?


0 commentaires

4 Réponses :


1
votes

Vous pouvez essayer de concaténer les cadres de données associés à la longueur de la fenêtre en fonction de la longueur de la fenêtre choisie (comme sélectionné 2)

array([[[1, 'a'],
        [2, 'b']],

       [[2, 'b'],
        [3, 'c']],

       [[3, 'c'],
        [4, 'd']]], dtype=object)

Sortie:

length = df.dropna().shape[0]-1
cols = len(df.columns)
pd.concat([df.shift(1),df],axis=1).dropna().astype(int,errors='ignore').values.reshape((length,cols,2))

p>


0 commentaires

2
votes

Utilisation de np.concatenate

np.concatenate([x.values[:-1], 
                x.values[1:]], axis=1)\
  .reshape([x.shape[0] - 1, x.shape[1], -1])


1 commentaires

à quoi cela ressemblerait-il si le nombre d'échantillons est de 900 au lieu de 2, le décalage est de 1 comme dans la question d'origine?



1
votes

Faites-moi savoir si cette solution convient à votre question.

p = x[['a','b']].values.tolist()  # create a list of list ,as [i.a,i.b] for every i row in x
#### Output  ####
[[1, 'a'], [2, 'b'], [3, 'c'], [4, 'd']]


#iterate through list except last two and for every i, fetch p[i],p[i+1],p[i+2] into a list
list_of_3 = [[p[i],p[i+1],p[i+2]] for i in range(len(p)-2)]

#### Output  ####
[
    [[1, 'a'], [2, 'b'], [3, 'c']],
    [[2, 'b'], [3, 'c'], [4, 'd']]
]



# This is used if in case the list you require is numpy ndarray
from numpy import array
a = array(list_of_3)

#### Output  ####
[[['1' 'a']
  ['2' 'b']
  ['3' 'c']]

 [['2' 'b']
  ['3' 'c']
  ['4' 'd']]
]


1 commentaires

J'ai vraiment besoin du nombre d'échantillons pour être une variable. Il est 900 aujourd'hui. Je ne savais pas que les développeurs de python étaient tellement intéressés par le codage en dur. ce n'est pas comme si je cherchais à écrire [p [i], p [i + 1], p [i + 2] 300 fois. mais merci pour l'effort



1
votes

Depuis pandas 1.1 , vous pouvez parcourir des objets roulants:

[window.values.tolist() for window in x.rolling(3) if window.shape[0] == 3]

Le if s'assure que nous n'obtenons que plein windows. Cette solution a l’avantage de pouvoir utiliser n’importe quel paramètre de la fonction pratique rolling des pandas.


0 commentaires