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
我的初始数据集只有 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 |