3 votes

Cadre de données Pandas, effectuez des calculs sur n'importe quelle colonne de la fenêtre mobile.

Peut-être des pandas.

Ce que je veux, c'est avoir une fenêtre déroulante sur df et avoir toutes les colonnes de df disponibles dans la fenêtre pour faire divers calculs.

Je pense que le code ci-dessous est très proche de mes objectifs, mais j'ai du mal à comprendre le problème de l'index tel qu'il est énoncé dans le code.

Au début x.index = RangeIndex(start=0, stop=2, step=1), et tmp_df sélectionne correctement la première et la deuxième ligne dans df (index 0 et 1). Pour le dernier x.index = RangeIndex(start=4, stop=6, step=1), il semble qu'iloc essaie de sélectionner l'index 6 dans df qui est hors de portée (df a les index 0 à 5).

Qu'est-ce que je rate ?

Merci d'avance pour tout conseil.

import numpy as np
import pandas as pd

df = pd.DataFrame({'open': [7, 5, 10, 11,6,12],
                   'close': [6, 6, 11, 10,7,10],
                   'positive': [0, 1, 1, 0,1,0]},
                 )

def do_calculations_on_any_df_column_in_window(x,df):
    print("index:",x.index)
    tmp_df = df.iloc[x.index] # raises "ValueError: cannot set using a slice indexer with a different length than the value" when x.index = RangeIndex(start=4, stop=6, step=1) as df index goes from 0 to 5 only

    # do calulations on any column in tmp_df, get result
    result = 1 #dummyresult

    return result

intervals = range(2, 10)
for i in intervals:
    df['result_' + str(i)] = np.nan
    res = df.rolling(i).apply(do_calculations_on_any_df_column_in_window, args=(df,), raw=False)
    df['result_' + str(i)][1:] = res

print(df)

2voto

BICube Points 2157

Essayez cette fonction :

def calculate_on_rolling_window(df, win, col_names):
    #final_df = pd.DataFrame() # stores the complete results
    # calculate sd and mean for each tag
    for i in range(len(col_names)):
      current_column = col_names[i]
      df[current_column + '_mean_' +str(win)] = (df[current_column].rolling(window=win).mean())
      df[current_column + '_min_' +str(win)] = (df[current_column].rolling(window=win).min())
      df[current_column + '_max_' +str(win)] = (df[current_column].rolling(window=win).max())
    df = df.fillna(0)
    return(df)

Vous obtenez les résultats suivants

col_names = df.columns
df_extended = calculate_on_rolling_window(df,2,col_names)
df_extended.head()

open    close   positive    open_mean_2     open_min_2  open_max_2  close_mean_2    close_min_2     close_max_2     positive_mean_2     positive_min_2  positive_max_2
0     7       6       0           0.0              0.0          0.0        0.0             0.0            0.0             0.0                   0.0           0.0
1     5       6       1           6.0              5.0          7.0        6.0             6.0            6.0             0.5                   0.0           1.0
2     10      11      1           7.5              5.0          10.0       8.5             6.0            11.0            1.0                   1.0           1.0
3     11      10      0           10.5             10.0         11.0       10.5            10.0           11.0            0.5                   0.0           1.0
4     6       7       1           8.5              6.0          11.0       8.5             7.0            10.0            0.5                   0.0           1.0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X