Я думаю, что добавление «столбца номера транзакции» для каждой политики облегчит это. Затем вы можете просто снять транзакции, чтобы увидеть, есть ли «измененные» строки.
Посмотрите на следующее, например:
import pandas as pd
dat = [['b123', 234, 522], ['b123', 234, 522], ['c123', 34, 23],
['c123', 38, 23], ['c123', 34, 23]]
cols = ['Policy_id', 'Fee1', 'Fee2']
df = pd.DataFrame(dat, columns=cols)
df['transaction_id'] = 1
df['transaction_id'] = df.groupby('Policy_id').cumsum()['transaction_id']
df2 = df[cols].drop_duplicates()
final_df = df2.join(df[['transaction_id']])
Вывод:
Policy_id Fee1 Fee2 transaction_id
0 b123 234 522 1
2 c123 34 23 1
3 c123 38 23 2
И так как b123
имеет только одну транзакцию после дедупликации, вы знаете, что ничего изменилось. Что-то должно было измениться с c123
.
Вы можете получить все измененные транзакции с помощью final_df[final_df.transaction_id > 1]
.
Как уже упоминалось, вам, возможно, придется сделать какую-то другую математику с датами, но это должно помочь вам в этом.
Редактировать: Если вы хотите просмотреть только последние два месяца, вы можете отфильтровать DataFrame перед запуском вышеуказанного.
Как это сделать:
Создайте переменную для отфильтрованной даты, например:
from datetime import date, timedelta
filtered_date = date.today() - timedelta(days=60)
Затем я бы использовал пакет pyjanitor
, чтобы использовать его метод filter_date. Просто выберите любой столбец, который вам нужен; Я думал, что Start_date
кажется наиболее разумным.
import janitor
final_df.filter_date("Start_date", start=filtered_date)
Как только вы запустите import janitor
, final_df
волшебным образом получит доступ к методу filter_date
.
Вы можете увидеть больше filter_date
примеров здесь .
От https://developer.mozilla.org/En/Code_snippets:Toolbar#Adding_button_by_default-
Когда Вы создаете и развертываете свое расширение и включаете кнопку на панели инструментов для него путем накладывания Настраивания toolbarpalette, это не доступно по умолчанию. Пользователь должен перетащить его на панель инструментов. Следующий код поместит Вашу кнопку в панель инструментов по умолчанию. Это должно только быть сделано на первом показе Вашего дополнения после установки так, чтобы, если пользователь решает удалить Вашу кнопку, она не обнаруживалась снова каждый раз, когда они запускают приложение.
Примечания
Вставьте свою кнопку по умолчанию только однажды на первом показе, или когда дополнительное обновление добавит новую кнопку.
Только добавьте свою кнопку по умолчанию, если она добавляет действительное значение к пользователю и будет частой точкой входа к Вашему расширению.
Вы не должны вставлять свою кнопку на панели инструментов ни между одним из следующих элементов: объединенное назад/вперед кнопка, адресная панель, остановка botton или кнопка перезагрузки. Эти элементы имеют специальные поведения при размещении друг рядом с другом и повреждении, если разделено другим элементом.
/**
* Installs the toolbar button with the given ID into the given
* toolbar, if it is not already present in the document.
*
* @param {string} toolbarId The ID of the toolbar to install to.
* @param {string} id The ID of the button to install.
* @param {string} afterId The ID of the element to insert after. @optional
*/
function installButton(toolbarId, id, afterId) {
if (!document.getElementById(id)) {
var toolbar = document.getElementById(toolbarId);
// If no afterId is given, then append the item to the toolbar
var before = null;
if (afterId) {
let elem = document.getElementById(afterId);
if (elem && elem.parentNode == toolbar)
before = elem.nextElementSibling;
}
toolbar.insertItem(id, before);
toolbar.setAttribute("currentset", toolbar.currentSet);
document.persist(toolbar.id, "currentset");
if (toolbarId == "addon-bar")
toolbar.collapsed = false;
}
}
if (firstRun) {
installButton("nav-bar", "my-extension-navbar-button");
// The "addon-bar" is available since Firefox 4
installButton("addon-bar", "my-extension-addon-bar-button");
}
Мы используем следующий код....
function init() {
// ....
var navbar = document.getElementById("nav-bar");
if ((myExtensionShared.checkMyBtnInstalled() == false) &&
(navbar != null && document.getElementById("myExtension-button") == null)) {
var newset;
if (navbar.getAttribute('currentset') &&
navbar.getAttribute('currentset').indexOf('myExtension-button') == -1) {
navbar.insertItem ('myExtension-button', null, null, false);
newset = navbar.getAttribute('currentset') + ',myExtension-button';
navbar.setAttribute('currentset', newset);
document.persist('nav-bar', 'currentset');
}
else if (!navbar.getAttribute('currentset')) {
navbar.insertItem ('myExtension-button', null, null, false);
newset=navbar.getAttribute('defaultset') + ',myExtension-button';
navbar.setAttribute('currentset', newset);
document.persist('nav-bar', 'currentset');
}
}
// ....
}
myExtensionShared.prototype.checkMyBtnInstalled = function() {
var prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
var btnInstalled = false;
if (prefs.prefHasUserValue("extensions.myExtension.myBtnInstalled")) {
btnInstalled = prefs.getBoolPref("extensions.myExtension.myBtnInstalled");
}
if (!btnInstalled) {
prefs.setBoolPref("extensions.myExtension.myBtnInstalled", true);
}
return btnInstalled;
}
Мы используем следующий код, который будет добавьте кнопку (если она уже существует где-то еще на панели).
//...
appendButtonInToolbar:function(buttonId, toolbarId) {
var toolbar = document.getElementById(toolbarId);
var button = document.getElementById(buttonId);
if(button) {
var parentBar = button.parentNode;
if(parentBar && parentBar != toolbar) {
var newset = this.removeButtonFromToolbarCurrentSet(parentBar,buttonId);
}
toolbar.appendChild(button);
}else{
toolbar.insertItem(buttonId);
}
this.appendButtonInToolbarCurrentSet(toolbar,buttonId);
},
appendButtonInToolbarCurrentSet:function(toolbar, buttonId) {
var oldset = toolbar.getAttribute("currentset");
var newset = "";
if(oldset && oldset!="") {
newset = oldset + ",";
}
newset += buttonId;
toolbar.setAttribute("currentset", newset);
document.persist(toolbar.id,"currentset");
return newset;
},
removeButtonFromToolbarCurrentSet:function(toolbar, buttonId) {
var oldset = toolbar.getAttribute("currentset");
if(!oldset || oldset=="" || oldset.indexOf(buttonId) == -1) return oldset;
var reg = new RegExp(buttonId+",?", "gi");
var newset = oldset.replace(reg,"");
if (newset.charAt(newset.length-1) == ",") {
newset = newset.substring(0, newset.length - 1);
}
toolbar.setAttribute("currentset", newset);
document.persist(toolbar.id,"currentset");
return newset;
},
//...