Рассчитайте соотношение (то есть сумма (числитель) / (Знаменатель)) за последние 3 недели, должны использовать Groupby Id, год, неделю и сортировать по году и неделе - PullRequest
0 голосов
/ 27 января 2020
    Id  Year  Week  numerator  Denominator
0    1  2018    21       1        1
1    1  2018    22       1        0
2    1  2018    34       1        1
3    1  2018    35       1        1
4    1  2018    36       1        0
5    1  2018    42       1        0
6    1  2019     2       1        0
7    1  2019     3       1        1
8    1  2019     5       1        1
9    2  2018    40       1        0
10   2  2018    43       1        1
11   2  2018    44       1        1
12   2  2019     2       1        0
13   2  2019     3       1        1
14   3  2018    50       1        1
15   3  2018    52       1        0
16   3  2019     1       1        1

вывод

6    1  2019     2       1        0   (3/2)
7    1  2019     3       1        1   (3/2) 
8    1  2019     5       1        1    (3/2)
13   2  2019     3       1        1    (2/1)
12   2  2019     2       1        0    (2/1)
11   2  2018    44       1        1      1

после добавления числителя и знаменателя отношение будет добавлено к отношению

1 Ответ

2 голосов
/ 27 января 2020

Используйте DataFrame.sort_values с 3 столбцами и GroupBy.head, для ratio используйте группирование по 2 столбцам с GroupBy.transform:

df1 = df.sort_values(['Id','Year','Week'],ascending=[True,False, False]).groupby('Id').head(3)
df1['ratio'] = df1.groupby(['Id','Year']).transform('sum').eval('numerator/Denominator')
print (df1)
    Id  Year  Week  numerator  Denominator  ratio
8    1  2019     5          1            1    1.5
7    1  2019     3          1            1    1.5
6    1  2019     2          1            0    1.5
13   2  2019     3          1            1    2.0
12   2  2019     2          1            0    2.0
11   2  2018    44          1            1    1.0
16   3  2019     1          1            1    1.0
15   3  2018    52          1            0    2.0
14   3  2018    50          1            1    2.0
...