0
votes

Façon efficace de créer une colonne référençant sa propre valeur précédente

J'essaie de générer quelques colonnes dans un Dataframe avec l'index DateTime basé sur une règle qui fait référence à ses propres valeurs précédentes. J'ai essayé une boucle sur la longueur de DF selon ci-dessous, mais à la recherche d'une solution plus propre si possible?

Parce que ce que je veux faire à la fin, vous obtenez les statistiques des colonnes générées (C, D, E ci-dessous Exemple) sur un grand nombre de personnes, B .... p> xxx pré>

EDIT: Ajout de la sortie attendue ci-dessous p>

         A        B         diff        C             D                 E
0   -0.352725   1.429037    NaN         0.000000    0.000000    0.000000
1   -1.024418   -0.644302   -0.671693   0.000000    -0.671693   0.225585
2   0.401065    0.419555    1.425483    0.000000    1.425483    1.016001
3   -1.302484   0.724320    -1.703549   0.000000    -1.703549   1.451039
4   0.427035    0.835221    1.729518    0.000000    1.729518    1.495617
5   0.158694    -0.416741   -0.268340   -0.268340   0.000000    0.000000
6   0.921985    -0.490635   0.763291    0.494951    0.000000    0.000000
7   -0.835297   -1.036580   -1.757282   0.000000    -1.262331   0.796740
8   0.752060    -0.279206   1.587356    0.000000    1.587356    1.259850
9   1.795306    -1.554886   1.043246    0.000000    1.043246    0.544181
10  -0.405100   -0.361454   -2.200406   0.000000    -2.200406   2.420893
11  -0.253629   -0.627245   0.151471    0.151471    0.000000    0.000000
12  -0.820573   -0.212886   -0.566944   -0.415473   0.000000    0.000000
13  0.473439    2.532487    1.294012    0.000000    0.878539    0.385916
14  -1.395435   1.016338    -1.868875   0.000000    -1.868875   1.746346
15  -0.244269   -0.337820   1.151166    0.000000    1.151166    0.662592
16  -2.084977   -1.262249   -1.840708   0.000000    -1.840708   1.694103
17  0.666323    -1.696245   2.751300    0.000000    2.751300    3.784825
18  0.235207    -0.513903   -0.431115   -0.431115   0.000000    0.000000
19  1.386456    -0.149153   1.151249    0.000000    0.720134    0.259296
20  0.093456    -0.298154   -1.293000   0.000000    -1.293000   0.835925
21  0.690499    -1.687416   0.597043    0.000000    0.597043    0.178230
22  1.287530    -1.390260   0.597031    0.000000    0.597031    0.178223
23  1.828138    -0.288829   0.540608    0.000000    0.540608    0.146128
24  0.209666    -0.903385   -1.618472   0.000000    -1.618472   1.309727
25  -1.010678   0.615569    -1.220344   0.000000    -1.220344   0.744619
26  -1.799800   1.536332    -0.789122   0.000000    -0.789122   0.311357
27  0.611096    -1.033066   2.410896    0.000000    2.410896    2.906209
28  -0.532675   -0.091541   -1.143770   0.000000    -1.143770   0.654105
29  2.468137    -1.046117   3.000811    0.000000    3.000811    4.502435


2 commentaires

fournir la sortie attendue


Pouvez-vous mettre un graine pour NUMPY, sinon il est impossible de fournir la même sortie et de voir ce qui ne va pas en raison du hasard de vos données.


3 Réponses :


0
votes

Essayez celui-ci (mais ne pas itérer sur toutes les lignes - il fera toute la colonne à la fois pour vous):

df["C_prev"] = df["C"].shift(1)


0 commentaires

2
votes

J'ai converti votre pour en boucle à l'aide d'une matrice numpie pour contenir les conditions, puis np.where pour remplacer les valeurs en fonction de votre condition:

  1. Définir la matrice de condition xxx
    1. Remplacez les valeurs en fonction de la condition xxx

      sortie: xxx

      est-ce que vous cherchiez, vous n'avez pas fourni de sortie attendue.

      Documentation:


0 commentaires

0
votes
def f(row):
    if abs(df.loc[row.name - 1, 'C'] + row['diff']) > reset_level:
        C = 0.0
        D = df.loc[row.name - 1, 'C'] + row['diff']
    else:
        C = df.loc[row.name - 1, 'C'] + row['diff']
        D = 0.0
    E = 0.5 * row['D'] * row['D'] 
    return(pd.Series([C, D, E]))

df.loc[1:, ['C', 'D', 'E']] = df[1:].apply(f, axis=1)

2 commentaires

Merci mais problème est que les valeurs de 'c' sont toutes initialisées à 0 lorsque vous créez une histoire


@Volguy Bonne Catch, j'avais oublié ça. Voir ma réponse mise à jour (@ SmileyProd's est très élégante aussi).