id_time_grid

 id_time_grid (df:~DFType, freq:Union[str,int],
               start:Union[str,int,datetime.date,datetime.datetime]='per_s
               erie', end:Union[str,int,datetime.date,datetime.datetime]='
               global', id_col:str='unique_id', time_col:str='ds')

生成所有预期的 id 和时间组合。

类型默认值详情
dfDFType输入数据
freqUnion序列频率
startUnionper_serie序列的初始时间戳。
* ‘per_serie’ 使用每个序列的第一个时间戳
* ‘global’ 使用数据中遇到的第一个时间戳
* 也可以是特定的时间戳或整数,例如 ‘2000-01-01’、2000 或 datetime(2000, 1, 1)
endUnionglobal序列的初始时间戳。
* ‘per_serie’ 使用每个序列的最后一个时间戳
* ‘global’ 使用数据中遇到的最后一个时间戳
* 也可以是特定的时间戳或整数,例如 ‘2000-01-01’、2000 或 datetime(2000, 1, 1)
id_colstrunique_id标识每个序列的列。
time_colstrds标识每个时间戳的列。
返回值DFType包含预期 id 和时间的 Dataframe。

fill_gaps

 fill_gaps (df:~DFType, freq:Union[str,int],
            start:Union[str,int,datetime.date,datetime.datetime]='per_seri
            e',
            end:Union[str,int,datetime.date,datetime.datetime]='global',
            id_col:str='unique_id', time_col:str='ds')

强制 Dataframe 的开始和结束日期时间。

类型默认值详情
dfDFType输入数据
freqUnion序列频率
startUnionper_serie序列的初始时间戳。
* ‘per_serie’ 使用每个序列的第一个时间戳
* ‘global’ 使用数据中遇到的第一个时间戳
* 也可以是特定的时间戳或整数,例如 ‘2000-01-01’、2000 或 datetime(2000, 1, 1)
endUnionglobal序列的初始时间戳。
* ‘per_serie’ 使用每个序列的最后一个时间戳
* ‘global’ 使用数据中遇到的最后一个时间戳
* 也可以是特定的时间戳或整数,例如 ‘2000-01-01’、2000 或 datetime(2000, 1, 1)
id_colstrunique_id标识每个序列的列。
time_colstrds标识每个时间戳的列。
返回值DFType已填充间隙的 Dataframe。
df = pd.DataFrame(
    {
        'unique_id': [0, 0, 0, 1, 1],
        'ds': pd.to_datetime(['2020', '2021', '2023', '2021', '2022']),
        'y': np.arange(5),
    }
)
df
unique_iddsy
002020-01-010
102021-01-011
202023-01-012
312021-01-013
412022-01-014

默认功能是采用当前的起始时间,并仅将结束日期扩展为所有序列的相同时间。

fill_gaps(
    df,
    freq='YS',
)
unique_iddsy
002020-01-010.0
102021-01-011.0
202022-01-01NaN
302023-01-012.0
412021-01-013.0
512022-01-014.0
612023-01-01NaN

我们还可以指定 end='per_serie' 以仅填充每个序列内可能的间隙。

fill_gaps(
    df,
    freq='YS',
    end='per_serie',
)
unique_iddsy
002020-01-010.0
102021-01-011.0
202022-01-01NaN
302023-01-012.0
412021-01-013.0
512022-01-014.0

我们还可以指定未来的结束日期。

fill_gaps(
    df,
    freq='YS',
    end='2024',
)
unique_iddsy
002020-01-010.0
102021-01-011.0
202022-01-01NaN
302023-01-012.0
402024-01-01NaN
512021-01-013.0
612022-01-014.0
712023-01-01NaN
812024-01-01NaN

我们可以将所有序列设置为在同一时间开始。

fill_gaps(
    df,
    freq='YS',
    start='global'
)
unique_iddsy
002020-01-010.0
102021-01-011.0
202022-01-01NaN
302023-01-012.0
412020-01-01NaN
512021-01-013.0
612022-01-014.0
712023-01-01NaN

我们还可以为所有序列设置一个共同的开始日期(可以早于它们当前的开始时间)。

fill_gaps(
    df,
    freq='YS',
    start='2019',
)
unique_iddsy
002019-01-01NaN
102020-01-010.0
202021-01-011.0
302022-01-01NaN
402023-01-012.0
512019-01-01NaN
612020-01-01NaN
712021-01-013.0
812022-01-014.0
912023-01-01NaN

如果时间是整数,则频率、开始和结束也必须是整数。

df = pd.DataFrame(
    {
        'unique_id': [0, 0, 0, 1, 1],
        'ds': [2020, 2021, 2023, 2021, 2022],
        'y': np.arange(5),
    }
)
df
unique_iddsy
0020200
1020211
2020232
3120213
4120224
fill_gaps(
    df,
    freq=1,
    start=2019,
    end=2024,
)
unique_iddsy
002019NaN
1020200.0
2020211.0
302022NaN
4020232.0
502024NaN
612019NaN
712020NaN
8120213.0
9120224.0
1012023NaN
1112024NaN

该函数也接受 polars dataframes

df = pl.DataFrame(
    {
        'unique_id': [0, 0, 0, 1, 1],
        'ds': [
            datetime(2020, 1, 1), datetime(2022, 1, 1), datetime(2023, 1, 1),
            datetime(2021, 1, 1), datetime(2022, 1, 1)],
        'y': np.arange(5),
    }
)
df
unique_iddsy
i64datetime[μs]i64
02020-01-01 00:00:000
02022-01-01 00:00:001
02023-01-01 00:00:002
12021-01-01 00:00:003
12022-01-01 00:00:004
polars_ms = fill_gaps(
    df.with_columns(pl.col('ds').cast(pl.Datetime(time_unit='ms'))),
    freq='1y',
    start=datetime(2019, 1, 1),
    end=datetime(2024, 1, 1),
)
assert polars_ms.schema['ds'].time_unit == 'ms'
polars_ms
unique_iddsy
i64datetime[ms]i64
02019-01-01 00:00:00null
02020-01-01 00:00:000
02021-01-01 00:00:00null
02022-01-01 00:00:001
02023-01-01 00:00:002
12020-01-01 00:00:00null
12021-01-01 00:00:003
12022-01-01 00:00:004
12023-01-01 00:00:00null
12024-01-01 00:00:00null
df = pl.DataFrame(
    {
        'unique_id': [0, 0, 0, 1, 1],
        'ds': [
            date(2020, 1, 1), date(2022, 1, 1), date(2023, 1, 1),
            date(2021, 1, 1), date(2022, 1, 1)],
        'y': np.arange(5),
    }
)
df
unique_iddsy
i64datei64
02020-01-010
02022-01-011
02023-01-012
12021-01-013
12022-01-014
fill_gaps(
    df,
    freq='1y',
    start=date(2020, 1, 1),
    end=date(2024, 1, 1),
)
unique_iddsy
i64datei64
02020-01-010
02021-01-01null
02022-01-011
02023-01-012
02024-01-01null
12020-01-01null
12021-01-013
12022-01-014
12023-01-01null
12024-01-01null
df = pl.DataFrame(
    {
        'unique_id': [0, 0, 0, 1, 1],
        'ds': [2020, 2021, 2023, 2021, 2022],
        'y': np.arange(5),
    }
)
df
unique_iddsy
i64i64i64
020200
020211
020232
120213
120224
fill_gaps(
    df,
    freq=1,
    start=2019,
    end=2024,
)
unique_iddsy
i64i64i64
02019null
020200
020211
02022null
020232
12020null
120213
120224
12023null
12024null