Проблемы с pd.rolling(), возвращающим несколько выходных данных

#python #pandas

#python #панды

Вопрос:

У меня возникли проблемы с методом pd.rolling(), который возвращает несколько выходных данных, даже если функция возвращает одно значение.

Моя цель состоит в том, чтобы:

  1. Вычислите абсолютную процентную разницу между двумя фреймами данных с 3 столбцами в каждом df.
  2. Вычислите среднее значение каждой строки с шага 1.
  3. Суммирует средние значения с шага 2.

Я могу сделать это с помощью pd.iterrows(). Но работа с большими наборами данных делает этот метод неэффективным.

Это тестовые данные, с которыми я работаю:

 #import libraries
import pandas as pd
import numpy as np 

#create two dataframes
values = {'column1': [7,2,3,1,3,2,5,3,2,4,6,8,1,3,7,3,7,2,6,3,8],
        'column2': [1,5,2,4,1,5,5,3,1,5,3,5,8,1,6,4,2,3,9,1,4],
        "column3" : [3,6,3,9,7,1,2,3,7,5,4,1,4,2,9,6,5,1,4,1,3]
        }

df1 = pd.DataFrame(values)
df2 = pd.DataFrame([[2,3,4],[3,4,1],[3,6,1]])
print(df1)
print(df2)

    column1  column2  column3
0         7        1        3
1         2        5        6
2         3        2        3
3         1        4        9
4         3        1        7
5         2        5        1
6         5        5        2
7         3        3        3
8         2        1        7
9         4        5        5
10        6        3        4
11        8        5        1
12        1        8        4
13        3        1        2
14        7        6        9
15        3        4        6
16        7        2        5
17        2        3        1
18        6        9        4
19        3        1        1
20        8        4        3
   0  1  2
0  2  3  4
1  3  4  1
2  3  6  1
  

Этот метод выдает желаемый результат с помощью pd.iterrows()

 RunningSum = []
for index, rows in df1.iterrows():
    if index > 3:
        Div = abs((((df2 / df1.iloc[index-3 1:index 1].reset_index(drop="True").values)-1)*100))
        Average = Div.mean(axis=0)
        SumOfAverages = np.sum(Average)
        RunningSum.append(SumOfAverages)
        
        
            
        #printing my desired output values
        print(RunningSum)
[330.42328042328046,
 212.0899470899471,
 152.06349206349208,
 205.55555555555554,
 311.9047619047619,
 209.1269841269841,
 197.61904761904765,
 116.94444444444444,
 149.72222222222223,
 430.0,
 219.51058201058203,
 215.34391534391537,
 199.15343915343914,
 159.6031746031746,
 127.6984126984127,
 326.85185185185185,
 204.16666666666669]
  

Наконец, ниже приведена моя попытка использовать pd.rolling(), чтобы мне не нужно было перебирать каждую строку.

 def SumOfAverageFunction(vals):
    Div = abs((((df2.values / vals.reset_index(drop="True").values)-1)*100))
    Average = Div.sum()
    SumOfAverages = Average.sum()
    return Average

RunningSums = df1.rolling(window=3,axis=0).apply(SumOfAverageFunction)
  

Вот моя проблема, потому что печать RunningSums сверху выводит несколько значений и не близка к результатам, которые я получаю, используя метод iterrows. Как мне это решить?

 print(RunningSums)

        column1      column2      column3
0           NaN          NaN          NaN
1           NaN          NaN          NaN
2    702.380952   780.000000   283.333333
3    533.333333   640.000000   533.333333
4   1200.000000   475.000000   403.174603
5    833.333333  1280.000000   625.396825
6    563.333333   760.000000  1385.714286
7    346.666667   386.666667  1016.666667
8    473.333333   573.333333   447.619048
9    533.333333  1213.333333   327.619048
10   375.000000   746.666667   415.714286
11   408.333333   453.333333   515.000000
12   604.166667   338.333333  1250.000000
13  1366.666667   577.500000   775.000000
14   847.619048  1400.000000   683.333333
15   314.285714   733.333333   455.555556
16   533.333333   441.666667   474.444444
17   347.619048   616.666667   546.666667
18   735.714286   466.666667  1290.000000
19   350.000000   488.888889   875.000000
20   525.000000  1361.111111  1266.666667