сложная условная математика python pandas с большим количеством отсутствующих строк в разных столбцах и возможным переиндексированием

Изображение есть кадр данных с большим количеством отсутствующих transaction_total и balance_total и дата

id,date,transaction_total,balance_total
1,01/01/2019,-1,102
1,01/02/2019,-2,100
1,01/03/2019,-3,
1,01/04/2019,,
1,01/05/2019,-4,
2,01/01/2019,-2,200
2,01/02/2019,-2,100
2,01/04/2019,,
2,01/05/2019,-4,

Вот сценарий создания-ввода:

import pandas as pd
import numpy as np

users=pd.DataFrame(
                [
                {'id':1,'date':'01/01/2019', 'transaction_total':-1, 'balance_total':102},
                {'id':1,'date':'01/02/2019', 'transaction_total':-2, 'balance_total':100},
                {'id':1,'date':'01/03/2019', 'transaction_total':-3, 'balance_total':''},
                {'id':1,'date':'01/04/2019', 'transaction_total':'', 'balance_total':''},
                {'id':1,'date':'01/05/2019', 'transaction_total':-4, 'balance_total':''},
                {'id':2,'date':'01/01/2019', 'transaction_total':-2, 'balance_total':200},
                {'id':2,'date':'01/02/2019', 'transaction_total':-2, 'balance_total':100},
                {'id':2,'date':'01/04/2019', 'transaction_total':'', 'balance_total':''},
                {'id':2,'date':'01/05/2019', 'transaction_total':-4, 'balance_total':''}  
                ]
                )

цель состоит в том, чтобы достичь следующего:

желаемый КОНЕЧНЫЙ результат:

id,date,balance_total
1,01/01/2019,102
1,01/02/2019,100
1,01/03/2019,97
1,01/04/2019,97
1,01/05/2019,93
2,01/01/2019,200
2,01/02/2019,100
2,01/03/2019,97
2,01/04/2019,97
2,01/05/2019,93

(1) если дата отсутствует, заполните дату балансом с предыдущей даты (я думаю, что решение для переиндексации в этой ссылке может работать Pandas заполняет отсутствующие даты и значения в группе )

(2) если balance_total отсутствует, в то время как существуют действительные «дата» и «transaction_total», заполните «общий баланс» с помощью «предыдущей даты balance_total-transaction_total на дату, когда balance_total отсутствует» (случай в строке 3 : 100+ (-3)=97)

(3) если есть действительная дата, но как transaction_total, так и balance_total являются NaN, просто заполните balance_total последней даты (например, строка 4: поскольку total_balance на 03.01.2019 будет 97 на основе предыдущего расчета, баланс на 04.01.2019 будет 97, так как отсутствует transaction_total.)

желаемый вывод метаданных:

id,date,transaction_total,balance_total
1,01/01/2019,-1,102
1,01/02/2019,-2,100
1,01/03/2019,-3,97
1,01/04/2019,0,97
1,01/05/2019,-4,93
2,01/01/2019,-2,200
2,01/02/2019,-2,100
2,01/03/2019,-3,97
2,01/04/2019,,97
2,01/05/2019,-4,93

person Chubaka    schedule 24.02.2020    source источник
comment
Каков общий баланс в первой строке 98?   -  person Vishnudev    schedule 24.02.2020
comment
опечатка. позвольте мне исправить это. должно быть 102   -  person Chubaka    schedule 24.02.2020
comment
только что исправил @Vishnudev. Я также предоставил пример сценария создания данных!   -  person Chubaka    schedule 24.02.2020