1 个月前的滞后值

Lag of values from 1 month ago

我的初始数据集只有 2 列,日期和值。

我想要做的是,对于每个日期,获取上个月的值(m-1 和 m-12 列)。我遇到的问题是当前一个月不存在这一天时,比如 2 月 29 日,我想将其留空,而大多数方法往往会获取附近的日期。

所以,最后的 table 会是这样的:

date value m-1 m-12
2021-01-05 400 NaN NaN
2022-01-05 100 NaN 400
2022-01-28 300 NaN NaN
2022-02-05 300 100 NaN
2022-02-28 500 300 NaN
2022-03-29 300 NaN NaN

我想我可以使用 d.apply(lambda x: x['date'] - relativedelta(months = 1), axis=1) 之类的东西,但有了这个,我只能得到日期,而不是价值。并且它四舍五入日期,例如对于 2022-03-29 它 returns 2022-02-28 这是不正确的,它应该是 02-29,并且由于它不存在它应该是 NaN。

这是一种可能性:

# 1. necessary imports
import pandas as pd
from dateutil.relativedelta import relativedelta
import numpy as np

# 2. build example
df_example = pd.DataFrame(columns=["date", "value"])
df_example.date = ["2021-01-05", "2022-01-05", "2022-01-28", "2022-02-05", "2022-02-28", "2022-03-29"]
df_example.date = pd.to_datetime(df_example.date)
df_example.value = [400, 100, 300, 300, 500, 300]

# 3. look for the value corresponding to a given date
def build_column(row, month_shift, year_shift):
    previous_month_date = f"{row.date.year-year_shift}-{row.date.month-month_shift}-{row.date.day}"
    previous_value_row = df_example[df_example.date == previous_month_date]
    if len(previous_value_row) == 0:
        return np.nan

    return previous_value_row.value.iloc[0]

# 4. add column m1 corresponding to the 1-month shift
df_example["m1"] = df_example.apply(lambda x: build_column(x, 1, 0), axis=1)
df_example["m12"] = df_example.apply(lambda x: build_column(x, 0, 1), axis=1)

输出

date value m1 m12
0 2021-01-05 00:00:00 400 nan nan
1 2022-01-05 00:00:00 100 nan 400
2 2022-01-28 00:00:00 300 nan nan
3 2022-02-05 00:00:00 300 100 nan
4 2022-02-28 00:00:00 500 300 nan
5 2022-03-29 00:00:00 300 nan nan