Вы были почти там, просто пропустили .groupby
:
df['PrevValue'] = df.sort_values(['UUID', 'RANK']).groupby('UUID').Value.shift(1)
print(df)
Date UUID Value RANK PrevValue
0 01/03/2019 A 0 2 1.0
1 28/02/2019 A 1 1 NaN
2 28/02/2019 B 2 2 3.0
3 26/02/2019 B 3 1 NaN
4 24/02/2019 C 4 2 1.0
5 21/02/2019 C 1 1 NaN
Если вы вызовете форму bang! метода события перехода, состояние сохранится. Например, предположим, что у вас есть объект со следующим событием:
class Book < ActiveRecord::Base
# ...
aasm_event :close do
transitions :to => :closed, :from => [:opened]
end
# ...
end
Вызов book.close
установит состояние закрыто
, но не сохранит автоматически. Вызов book.close!
устанавливает состояние * и * автоматически сохраняет объект AR.
Как предполагает Колин, AASM сохранит ваши изменения за вас. То, что сказал Маркус, совершенно неверно, за исключением того, что в последней версии гема есть ошибка.
В строке 180 lib / persistence / active_record_persistence.rb (вы можете получить это, запустив gem: unpack), Вы должны увидеть комментарий, в котором говорится:
Записывает состояние в столбец состояния и сохраняет его в базе данных. используя update_attribute (который обходит валидацию)
Однако в коде он фактически вызывает save!
unless self.save
Ошибка возникает, когда базовая модель не проходит валидацию, поскольку метод save по умолчанию не обходит валидацию. Быстрое решение было бы сделать вместо этого:
unless self.save(false)
Теперь переходы действительно сохраняют новое состояние в базе данных.
Я полагаю, что AASM сохранит состояние объекта после перехода. Посмотрите строки 180-189 в aasm/lib/persistence/active_record_persistence.rb
Я думаю, что необходимо сохранить в переходе, если это - эффект, Вы хотите. ActiveRecord (сверху которого находится aasm) не сохраняет записи автоматически дизайном.
Можно сделать сохранение в обратном вызове, если Вы хотите (и оно кажется, что Вы делаете).