Pandas DataFrame: cómo hacer Establecer la agregación de unión en una ventana móvil

Tengo un Dataframe que contiene conjuntos de ID en una columna y fechas en otra:

import pandas as pd df = pd.DataFrame([['2018-01-01', {1, 2, 3}], ['2018-01-02', {3}], ['2018-01-03', {3, 4, 5}], ['2018-01-04', {5, 6}]], columns=['timestamp', 'ids']) df['timestamp'] = pd.to_datetime(df['timestamp']) df.set_index('timestamp', inplace=True) ids timestamp 2018-01-01 {1, 2, 3} 2018-01-02 {3} 2018-01-03 {3, 4, 5} 2018-01-04 {5, 6} 

Lo que estoy buscando es una función que me pueda dar los ID de los últimos x días del día. Entonces, asumiendo que x = 3, me gustaría que el resultado fuera:

  ids timestamp 2018-01-01 {1, 2, 3} 2018-01-02 {1, 2, 3} 2018-01-03 {1, 2, 3, 4, 5} 2018-01-04 {3, 4, 5, 6} 

Yo he tratado

 df.rolling(3).agg(set.union) 

pero eso lleva al siguiente error:

 Traceback (most recent call last): File "C:\Users\m.manhertz\Envs\demo-8EG6nosu\lib\site-packages\pandas\core\window.py", line 222, in _prep_values values = _ensure_float64(values) File "pandas\_libs\algos_common_helper.pxi", line 3182, in pandas._libs.algos.ensure_float64 File "pandas\_libs\algos_common_helper.pxi", line 3187, in pandas._libs.algos.ensure_float64 TypeError: float() argument must be a string or a number, not 'set' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "", line 1, in  File "C:\Users\m.manhertz\Envs\demo-8EG6nosu\lib\site-packages\pandas\core\window.py", line 1561, in aggregate return super(Rolling, self).aggregate(arg, *args, **kwargs) File "C:\Users\m.manhertz\Envs\demo-8EG6nosu\lib\site-packages\pandas\core\window.py", line 321, in aggregate return self.apply(arg, raw=False, args=args, kwargs=kwargs) File "C:\Users\m.manhertz\Envs\demo-8EG6nosu\lib\site-packages\pandas\core\window.py", line 1580, in apply func, raw=raw, args=args, kwargs=kwargs) File "C:\Users\m.manhertz\Envs\demo-8EG6nosu\lib\site-packages\pandas\core\window.py", line 1003, in apply center=False, raw=raw) File "C:\Users\m.manhertz\Envs\demo-8EG6nosu\lib\site-packages\pandas\core\window.py", line 844, in _apply values = self._prep_values(b.values) File "C:\Users\m.manhertz\Envs\demo-8EG6nosu\lib\site-packages\pandas\core\window.py", line 225, in _prep_values "".format(values.dtype)) TypeError: cannot handle this type -> object 

Pandas no está diseñado para contener iterables como list , set , pd.Series dentro de los objetos de pd.Series . Como tal, su lógica no es vectorizable. Su mejor opción puede ser una lista de comprensión:

 import pandas as pd df = pd.DataFrame([['2018-01-01', {1, 2, 3}], ['2018-01-02', {3}], ['2018-01-03', {3, 4, 5}], ['2018-01-04', {3, 6}]], columns=['timestamp', 'ids']) df['timestamp'] = pd.to_datetime(df['timestamp']) df.set_index('timestamp', inplace=True) df['ids'] = [set.union(*df.iloc[max(0, i-2): i+1, 0]) for i in range(len(df.index))] print(df) ids timestamp 2018-01-01 {1, 2, 3} 2018-01-02 {1, 2, 3} 2018-01-03 {1, 2, 3, 4, 5} 2018-01-04 {3, 4, 5, 6}