使用三次样条插值在Pandas中对时间序列进行插值

6
我想使用三次样条函数填充DataFrame中的列中的空白项。如果我导出到列表,那么我可以使用numpy的interp1d函数并将其应用于缺失值。
是否有一种方法在pandas中使用这个函数?

我很惊讶你这么快就接受了答案(不是针对你,Hayden ;) 因为我认为你特别想要插值时间序列,但我猜你并不是指pandas.TimeSeries。我目前也对这些话题非常感兴趣。请参见https://dev59.com/zGzXa4cB1Zd3GeqPRTzH#yXoGoYgBc1ULPQZFipzv - K.-Michael Aye
1个回答

8

大多数numpy/scipy函数只需要参数是“array_like”,iterp1d也不例外。幸运的是,Series和DataFrame都是“array_like”,因此我们无需离开pandas:

import pandas as pd
import numpy as np
from scipy.interpolate import interp1d

df = pd.DataFrame([np.arange(1, 6), [1, 8, 27, np.nan, 125]]).T

In [5]: df
Out[5]: 
   0    1
0  1    1
1  2    8
2  3   27
3  4  NaN
4  5  125

df2 = df.dropna() # interpolate on the non nan
f = interp1d(df2[0], df2[1], kind='cubic')
#f(4) == array(63.9999999999992)

df[1] = df[0].apply(f)

In [10]: df
Out[10]: 
   0    1
0  1    1
1  2    8
2  3   27
3  4   64
4  5  125

注意:我无法立即想出一个示例将DataFrame传递到第二个参数(y)中...但这也应该可以工作。


啊哈。我明白了。如果你在interp1d函数中的X值是数据框索引值,你会怎么做? - user1911866
你可以设置 x = df.index,然后 pd.Series(f(x), index=x)。 :) - Andy Hayden
好的,谢谢你的帮助!还有一件事我希望能得到帮助。我有多列数据都包含NaN数据。所以df.dropna()会删除太多行。你如何只对一个列(即“data1”)应用它? - user1911866
@user1911866 .dropna(subset=list_of_cols_to_drop)(请参见此处 - Andy Hayden
我很高兴自己想出了与Hayden建议完全相同的方法:1.删除缺失值,2.使用x = df.index,3.创建一个pd.Series(f(x), index=x)。我想我终于看到我的pandas技能在增长了.. ;) - K.-Michael Aye
再次感谢大家。我尝试了这个方法,但是使用interp1d时出现了错误“TypeError: array cannot be safely cast to required type”,我认为这是因为interp1d被传递了日期时间的x值和浮点数的y值。有没有关于如何在Interp1d函数中使用日期时间的想法? - user1911866

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接