当我在带有日期索引的 df 列上使用 pandas 的 .shift() 时,我可以将它与 .corr() 一起使用,但我无法使用此函数更新我的旧 df 或创建新的 df
第一次尝试
我的 df 看起来像这样:
Date X Y
2000-01-01 x1 y1
2000-02-01 x2 y2
2000-03-01 x3 y3
2000-04-01 x4 y4
2000-05-01 x5 y5
2000-06-01 x6 y6
我想像这样改变它:
Date X Y
2000-01-01 NaN NaN
2000-02-01 NaN y1
2000-03-01 x1 y2
2000-04-01 x2 y3
2000-05-01 x3 y4
2000-06-01 x4 y5
我首先尝试更新我的旧 df:
# max_lag is a dictionary with lags for each feature / column in my df
for key in max_lag.keys():
df[key].shift(periods=max_lag[key], freq='ME')
此代码不会导致任何错误,但在未使用移位值更新后会导致 df 错误。
第二次尝试
然后我尝试分配 df:
for key in max_lag.keys():
df[key] = df[key].shift(periods=max_lag[key], freq='ME')
我收到此错误:
ValueError: cannot reindex on an axis with duplicate labels
第三次尝试
这次我创建了一个新的 df 来存储筛选后的值:
for key in max_lag.keys():
df_shift[key] = df[key].shift(periods=max_lag[key], freq='ME')
错误:
TypeError: 'type' object does not support item assignment
我尝试过许多其他的小改变,但没有任何效果。我真的很感激任何帮助和解释我做错了什么。
您需要定义换档滞后:
import pandas as pd
data = {
"Date": ["2000-01-01", "2000-02-01", "2000-03-01", "2000-04-01", "2000-05-01", "2000-06-01"],
"X": ["x1", "x2", "x3", "x4", "x5", "x6"],
"Y": ["y1", "y2", "y3", "y4", "y5", "y6"]
}
df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
max_lag = {'X': 2, 'Y': 1}
df_shifted = pd.DataFrame(index=df.index)
for key, lag in max_lag.items():
df_shifted[key] = df[key].shift(periods=lag)
print(df_shifted)
这将为您带来预期的结果。
X Y
Date
2000-01-01 None None
2000-02-01 None y1
2000-03-01 x1 y2
2000-04-01 x2 y3
2000-05-01 x3 y4
2000-06-01 x4 y5
第一次尝试失败,因为
shift()
没有就地修改df,而是返回一个新的系列。因此,您需要显式地将结果重新分配回 df。您的第二次尝试使用 freq
是错误的,因为 freq
用于基于时间的轮班并引入重新索引问题,导致由于重复或冲突的索引而导致 ValueError
。第三次尝试失败,因为 df_shift
未正确初始化,导致当您尝试为其赋值时出现 TypeError
。