Home > Blockchain >  Weighting a Rolling Pandas Dataframe
Weighting a Rolling Pandas Dataframe

Time:11-18

So I have a dataframe:

import pandas as pd

values = [4,6,4,8,13,20,2,4,3,6,5,8,2,5,7, 20, 5, 6 , 7, 9, 20 , 5, 3, 5, 20, 4, 10, 2]

example = pd.DataFrame({'Values' : values})

example

And I want to do a rolling calculation on a moving window of these where the values are weighted. Specifically a window of 10 with a i/10 weighting. So the first 9 values would be blank then the 10th:

(1/10 x 4) (2/10 x 6) (3/10 x 4) (4/10 x 8) (5/10 x 13) (6/10 x 20) (7/10 x 2) (8/10 x 4) (9/10 x 3) (10/10 x 6)

then the 11th value would be

(1/10 x 6) (2/10 x 4) (3/10 x 8) (4/10 x 13) (5/10 x 20) (6/10 x 2) (7/10 x 4) (8/10 x 3) (9/10 x 6) (10/10 x 5)

etc.

I can do the rolling bit using the the .rolling() function but I can't find out how to weight these individually. Sorry this is probably quite a basic question.

CodePudding user response:

IIUC, create a weighted array:

WINDOWSIZE = 10
w = np.arange(1, WINDOWSIZE 1)
out = df.rolling(WINDOWSIZE).apply(lambda x: sum(w/WINDOWSIZE * x))
print(out)

# Output:
    Values
0      NaN
1      NaN
2      NaN
3      NaN
4      NaN
5      NaN
6      NaN
7      NaN
8      NaN
9     37.8  # (1/10 x 4)   (2/10 x 6)   (3/10 x 4)   (4/10 x 8)   (5/10 x 13)   (6/10 x 20)   (7/10 x 2)   (8/10 x 4)   (9/10 x 3)   (10/10 x 6)
10    35.8  # (1/10 x 6)   (2/10 x 4)   (3/10 x 8)   (4/10 x 13)   (5/10 x 20)   (6/10 x 2)   (7/10 x 4)   (8/10 x 3)   (9/10 x 6)   (10/10 x 5)
11    36.7
12    31.4
13    29.3
14    29.5
15    43.3
16    42.1
17    41.6
18    41.9
19    43.8
20    56.4
21    52.5
22    46.9
23    43.2
24    54.5
25    48.5
26    50.1
27    43.2
  • Related