Группировка значений с конца датафрейма pandas

Всем привет) Ниже описываю группировку данных которой пользуюсь :

funcs = {
                "qvant": (3, 'quantile'),
                "skew": (3, 'skew'),
                ">0": (3, lambda x: x.lt(0).sum()),
                "=0": (3, lambda x: x.eq(0).sum()),
                "<0": (3, lambda x: x.gt(0).sum()),
        }
        res1 = df.groupby(pd.Grouper(key=0, freq="3T")).agg(**funcs)#.reset_index()
        res1 = res1.reset_index()

Данный метод очень хорош для вывода предварительных результатов. Однако при построении графика столкнулся с одним изъяном. При формировании последней строки и последующим выводом в график все значения нулевые и лишь под конец группировки выводятся статистика.

Возник вопрос : есть ли метод в pandas для группировки с конца датафрейма?

Пример начального датафрейма :

                            0        1        2  3
0     2021-11-25 16:28:48.075  1.12164  1.12170  6
1     2021-11-25 16:28:50.866  1.12167  1.12169 -6
2     2021-11-25 16:28:51.094  1.12164  1.12170 -6
3     2021-11-25 16:28:51.223  1.12167  1.12169 -6
4     2021-11-25 16:28:54.080  1.12169  1.12171  6
...                       ...      ...      ... ..
89160 2021-11-26 13:13:44.285  1.12868  1.12870 -6
89161 2021-11-26 13:13:44.587  1.12867  1.12869 -6
89162 2021-11-26 13:13:46.364  1.12867  1.12868 -4
89163 2021-11-26 13:13:46.537  1.12866  1.12868 -2
89164 2021-11-26 13:13:46.618  1.12867  1.12869  6

Пояснения : при обычной группировки все подсчитывается с нуля. Пример на картинке ::

начало формирования новой строки

Это не есть удобно, т.к. я пользуюсь входящими данными.
Нужно чтобы последняя строка в начале формирования не была нулевой, т.е. подхватывались и учитывались данные с предпоследней строки. И как итог получался последовательный график

то что нужно

https://cloud.mail.ru/public/7Lpy/cRBX6Qvr4 база с данными(уже не актуальная). Сами данные записаны в живую! Ныне известные в простонародье как "Live data".

Пример для чтения данных ::

import sqlite3
import pytz
import pandas as pd
import numpy as np
from datetime import datetime
import time


#Повтор кода для исполнения
tempo = time.time() + 1000000000
while time.time() < tempo:
        timezone = pytz.timezone("Etc/UTC")
        utc_from = datetime(2021, 9, 13, tzinfo=timezone)
        base = sqlite3.connect('1234_base.db')
        cur = base.cursor()

        read_db = cur.execute('SELECT * FROM data_eurusd').fetchall()
        df = pd.DataFrame(read_db)
# d = pd.read_sql("select * from data", db_conn)

        df[0] = pd.to_datetime(df[0], unit='ms')
        df[3] = np.where(df[1].diff().lt(0) | df[2].diff().lt(0), df[3] * -1, df[3])
        #res1 = df.sort_index(ascending=False)
        funcs = {
                "bid_open": (1, 'first'),
                "bid_close": (1, 'last'),
                "tiks": (0, 'size'),
                "ask_open": (2, 'first'),
                "ask_close": (2, 'last'),
                "bid_min": (1, 'min'),
                "bid_max": (1, 'max'),
                "ask_min": (2, 'min'),
                "ask_max": (2, 'max'),
                "qvant": (3, 'quantile'),
                "sred": (3, 'mean'),
                "skew": (3, 'skew'),
                ">0": (3, lambda x: x.lt(0).sum()),
                "=0": (3, lambda x: x.eq(0).sum()),
                "<0": (3, lambda x: x.gt(0).sum()),
                "mad": (3, 'mad'),
                "median": (3, 'median'),
                "prod": (3, 'prod'),
                "std": (3,'std'),
                "var": (3, 'var'),
                "sem": (3, 'sem')

        }

        res = df.groupby(pd.Grouper(key=0, freq="3T")).agg(**funcs)#.reset_index()
        res1 = res.reset_index()

        #res1[0] = pd.to_datetime(res1[0]).astype('int64') / 10 ** 9
        #res2 = res1[['ask_open','skew','qvant']] # выбыраем столбцы
        #print(res2.iloc[-1])
        print(df)
        time.sleep(1)

Ответы (1 шт):

Автор решения: CrazyElf

Если я правильно понял проблему, то можно предложить такое решение. Во-первых чтобы где нет значений были во всех колонках NA нужно слегка модифицировать аггрегирующие функции. Кстати, у вас перепутаны больше нуля и меньше нуля:

        "<0": (3, lambda x: x.lt(0).sum() if x.any() else np.NaN),
        "=0": (3, lambda x: x.eq(0).sum() if x.any() else np.NaN),
        ">0": (3, lambda x: x.gt(0).sum() if x.any() else np.NaN),

А затем нужно заполнить NA предыдущими значениями:

res1 = res1.ffill()
→ Ссылка