Скользящий рейтинг по группам

Я пытаюсь получить скользящий рейтинг на основе группы. Это мои демо-данные, ожидаемый столбец «Постоянный двухлетний рейтинг».

Это работает так: я собираюсь сгруппировать по каждому «ID» и вычислить ранг на основе его собственного исторического «значения».

df = pd.DataFrame({
    'Year': [2000,2000,2000,2001,2001,2001,2002,2002,2002,2003,2003,2003],
    'ID': ['A','B','C','A','B','C','A','B','C','A','B','C'],
    'Value': [5,1,2,3,4,3,2,7,1,1,13,23],
    'Rolling 2Y Rank': [np.nan,np.nan,np.nan, 2,1,1,2,1,2,2,1,1]})
Год ИДЕНТИФИКАТОР Ценить Переходящий 2-й ранг 2000 г. А 5 Нэн 2000 г. Б 1 Нэн 2000 г. С 2 Нэн 2001 г. А 3 2 2001 г. Б 4 1 2001 г. С 3 1 2002 г. А 2 2 2002 г. Б 7 1 2002 г. С 1 2 2003 г. А 1 2 2003 г. Б 13 1 2003 г. С 23 1

Например, для «ID»="A":

  1. В первом случае ("Год"=="2020") нет только одних данных, поэтому их не с чем сравнивать, поэтому это NA.
  2. Во втором случае мы сравниваем 3 с 5 (скользящее двухлетнее окно), поэтому получаем ранг 2 (потому что 5 больше, чем 3).
  3. В третьем случае мы сравниваем 2 с 3, чтобы получить ранг 2 и так далее и тому подобное.
df[df['ID']=='A']

Я пробовал и не получилось:

df.groupby('ID')['Value'].rolling(2).rank()

Вставьте введенные данные и ожидаемый результат в формате таблицы.

Prathik Kini 22.08.2024 18:52

@PrathikKini Желаемый результат: Rolling 2Y Rank. Я добавил таблицу.

wjandrea 22.08.2024 20:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужен обратный (нисходящий) ранг, поэтому передайте его функции ранга . Затем вы можете сделать merge, чтобы вернуть исходный фрейм данных:

df = df.merge(
    df.groupby('ID').rolling(2, on='Year')['Value'].rank(ascending=False),
    on=['ID','Year'],
)

Выход:

    Year ID  Value_x  Value_y
0   2000  A        5      NaN
1   2000  B        1      NaN
2   2000  C        2      NaN
3   2001  A        3      2.0
4   2001  B        4      1.0
5   2001  C        3      1.0
6   2002  A        2      2.0
7   2002  B        7      1.0
8   2002  C        1      2.0
9   2003  A        1      2.0
10  2003  B       13      1.0
11  2003  C       23      1.0

Вот способ использования .rolling().agg()

df.groupby('ID')['Value'].rolling(2).agg(lambda x: x.rank(method = 'dense',ascending=False).iloc[-1]).droplevel(0).sort_index()

Выход:

0     NaN
1     NaN
2     NaN
3     2.0
4     1.0
5     1.0
6     2.0
7     1.0
8     2.0
9     2.0
10    1.0
11    1.0

Другие вопросы по теме