我在DataFrame中有一个时间序列的数据,在样本的开始和结尾都缺少值。
我正在尝试通过使用简单的AR(1)程序将其向前扩展来填充末端的缺失值。
例如
X(t + 1)-X(t)= 0.5 * [X(t)-X(t-1)]
A = [np.nan, np.nan, 5.5, 5.7, 5.9, 6.1, 6.0, 5.9, np.nan, np.nan, np.nan]
df = pd.DataFrame({'A':A}, index = pd.date_range(start = '2010',
periods = len(A),
freq = "QS"))
A
2010-01-01 5.5
2010-04-01 5.7
2010-07-01 5.9
2010-10-01 6.1
2011-01-01 6.0
2011-04-01 5.9
2011-07-01 NaN
2011-10-01 NaN
2012-01-01 NaN
我想要什么:
A
2010-01-01 NaN
2010-04-01 NaN
2010-07-01 5.5000
2010-10-01 5.7000
2011-01-01 5.9000
2011-04-01 6.1000
2011-07-01 6.0000
2011-10-01 5.9000
2012-01-01 5.8500
2012-04-01 5.8250
2012-07-01 5.8125
获取该系列的下一个条目相对容易:
NEXT = 0.5*df.dropna().diff().iloc[-1] + df.dropna().iloc[-1]
但是以一种很好的方式将其附加到DataFrame上给我带来了麻烦。
答案 0 :(得分:2)
您可以使用以下代码进行操作:
A = [np.nan, np.nan, 5.5, 5.7, 5.9, 6.1, 6.0, 5.9, np.nan, np.nan, np.nan]
df = pd.DataFrame({'A': A}, index=pd.date_range(start='2010', periods=len(A), freq="QS"))
for id in df[df.A.isnull() == True].index:
df.loc[id, 'A'] = 1.5 * df.A.shift().loc[id] - 0.5 * df.A.shift(2).loc[id]
#Output dataframe
A
2010-01-01 NaN
2010-04-01 NaN
2010-07-01 5.5000
2010-10-01 5.7000
2011-01-01 5.9000
2011-04-01 6.1000
2011-07-01 6.0000
2011-10-01 5.9000
2012-01-01 5.8500
2012-04-01 5.8250
2012-07-01 5.8125