Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 外推数据帧行_Pandas_Dataframe_Scipy_Interpolation_Extrapolation - Fatal编程技术网

Pandas 外推数据帧行

Pandas 外推数据帧行,pandas,dataframe,scipy,interpolation,extrapolation,Pandas,Dataframe,Scipy,Interpolation,Extrapolation,我有一个类似df的 并希望对行进行推断,以填充任何后续的NAN 预期产出: d2 = {'col1': [np.nan, np.nan, 1], 'col2': [1, 1, 2], 'col3': [2, 2, 3], 'col4': [3, 3, 4]} df2 = pd.DataFrame(data=d2) 编辑:每行的坡度不同。我尝试过df.interpolatemethod='linear',但这给了我一个跟踪NaN的平缓趋势,它主要是scipy插

我有一个类似df的

并希望对行进行推断,以填充任何后续的NAN

预期产出:

d2 = {'col1': [np.nan, np.nan, 1],
      'col2': [1, 1, 2],
      'col3': [2, 2, 3],
      'col4': [3, 3, 4]}
df2 = pd.DataFrame(data=d2)
编辑:每行的坡度不同。我尝试过df.interpolatemethod='linear',但这给了我一个跟踪NaN的平缓趋势,它主要是scipy插值函数的包装,有许多关键字允许您调整插值。可以使用样条曲线:

输出:

   col1  col2  col3  col4
0  -7.0   1.0   2.0   2.0
1  -3.0   1.0   2.0   3.0
2   1.0   2.0   3.0   4.0
3   5.0   5.0   4.0   5.0
4   9.0   8.0   5.0   6.0
5  13.0   8.8   5.6   7.0
   col1 Mar   col2 Jun  col3 Sep  col4 Dec
0       NaN          1         2       NaN
1       NaN          1         2       3.0
2       1.0          2         3       NaN
   col1 Mar   col2 Jun  col3 Sep  col4 Dec
0         0          1         2         3
1         0          1         2         3
2         1          2         3         4
   2014-03-01  2014-06-01  2014-09-01  2015-03-01
0    0.000000         1.0         2.0    3.967391
1   -0.016457         1.0         2.0    4.000000
2    1.000000         2.0         3.0    4.967391
编辑: 熊猫可能有更优雅的解决方案,但这里有一种解决问题的方法:

d = {'col1 Mar': [np.nan, np.nan, 1],
     'col2 Jun': [1, 1, 2],
     'col3 Sep': [2, 2, 3],
     'col4 Dec': [np.nan, 3, np.nan]}
df = pd.DataFrame(data=d)
print(df)
#store temporarily the column index
col_index = df.columns
#transcribe month into a number that reflects the time distance
df.columns = [3, 6, 9, 12]

#interpolate over rows
df = df.interpolate(method = "spline", order = 1,  limit_direction = "both", axis = 1, downcast = "infer")
#assign back the original index
df.columns = col_index
print(df)
输出:

   col1  col2  col3  col4
0  -7.0   1.0   2.0   2.0
1  -3.0   1.0   2.0   3.0
2   1.0   2.0   3.0   4.0
3   5.0   5.0   4.0   5.0
4   9.0   8.0   5.0   6.0
5  13.0   8.8   5.6   7.0
   col1 Mar   col2 Jun  col3 Sep  col4 Dec
0       NaN          1         2       NaN
1       NaN          1         2       3.0
2       1.0          2         3       NaN
   col1 Mar   col2 Jun  col3 Sep  col4 Dec
0         0          1         2         3
1         0          1         2         3
2         1          2         3         4
   2014-03-01  2014-06-01  2014-09-01  2015-03-01
0    0.000000         1.0         2.0    3.967391
1   -0.016457         1.0         2.0    4.000000
2    1.000000         2.0         3.0    4.967391
如果将列索引作为datetime对象提供,则可能可以直接使用列索引,但我对此不确定

编辑2: 正如预期的那样,您还可以使用datetime对象作为列名来插值:

CSV文件

Mar 2014, Jun 2014, Sep 2014, Mar 2015
nan,        1,        2,      nan
nan,        1,        2,      4
1,          2,        3,      nan
代码:

#read CSV file
df = pd.read_csv("test.txt", sep = r',\s*')
#convert column names to datetime objects
df.columns = pd.to_datetime(df.columns)
#interpolate over rows
df = df.interpolate(method = "spline", order = 1,  limit_direction = "both", axis = 1, downcast = "infer")
print(df)
输出:

   col1  col2  col3  col4
0  -7.0   1.0   2.0   2.0
1  -3.0   1.0   2.0   3.0
2   1.0   2.0   3.0   4.0
3   5.0   5.0   4.0   5.0
4   9.0   8.0   5.0   6.0
5  13.0   8.8   5.6   7.0
   col1 Mar   col2 Jun  col3 Sep  col4 Dec
0       NaN          1         2       NaN
1       NaN          1         2       3.0
2       1.0          2         3       NaN
   col1 Mar   col2 Jun  col3 Sep  col4 Dec
0         0          1         2         3
1         0          1         2         3
2         1          2         3         4
   2014-03-01  2014-06-01  2014-09-01  2015-03-01
0    0.000000         1.0         2.0    3.967391
1   -0.016457         1.0         2.0    4.000000
2    1.000000         2.0         3.0    4.967391
由于三个月的天数不同,现在的结果不再是好的整数

,它主要是scipy插值函数的包装,有许多关键字可以让您调整插值。可以使用样条曲线:

输出:

   col1  col2  col3  col4
0  -7.0   1.0   2.0   2.0
1  -3.0   1.0   2.0   3.0
2   1.0   2.0   3.0   4.0
3   5.0   5.0   4.0   5.0
4   9.0   8.0   5.0   6.0
5  13.0   8.8   5.6   7.0
   col1 Mar   col2 Jun  col3 Sep  col4 Dec
0       NaN          1         2       NaN
1       NaN          1         2       3.0
2       1.0          2         3       NaN
   col1 Mar   col2 Jun  col3 Sep  col4 Dec
0         0          1         2         3
1         0          1         2         3
2         1          2         3         4
   2014-03-01  2014-06-01  2014-09-01  2015-03-01
0    0.000000         1.0         2.0    3.967391
1   -0.016457         1.0         2.0    4.000000
2    1.000000         2.0         3.0    4.967391
编辑: 熊猫可能有更优雅的解决方案,但这里有一种解决问题的方法:

d = {'col1 Mar': [np.nan, np.nan, 1],
     'col2 Jun': [1, 1, 2],
     'col3 Sep': [2, 2, 3],
     'col4 Dec': [np.nan, 3, np.nan]}
df = pd.DataFrame(data=d)
print(df)
#store temporarily the column index
col_index = df.columns
#transcribe month into a number that reflects the time distance
df.columns = [3, 6, 9, 12]

#interpolate over rows
df = df.interpolate(method = "spline", order = 1,  limit_direction = "both", axis = 1, downcast = "infer")
#assign back the original index
df.columns = col_index
print(df)
输出:

   col1  col2  col3  col4
0  -7.0   1.0   2.0   2.0
1  -3.0   1.0   2.0   3.0
2   1.0   2.0   3.0   4.0
3   5.0   5.0   4.0   5.0
4   9.0   8.0   5.0   6.0
5  13.0   8.8   5.6   7.0
   col1 Mar   col2 Jun  col3 Sep  col4 Dec
0       NaN          1         2       NaN
1       NaN          1         2       3.0
2       1.0          2         3       NaN
   col1 Mar   col2 Jun  col3 Sep  col4 Dec
0         0          1         2         3
1         0          1         2         3
2         1          2         3         4
   2014-03-01  2014-06-01  2014-09-01  2015-03-01
0    0.000000         1.0         2.0    3.967391
1   -0.016457         1.0         2.0    4.000000
2    1.000000         2.0         3.0    4.967391
如果将列索引作为datetime对象提供,则可能可以直接使用列索引,但我对此不确定

编辑2: 正如预期的那样,您还可以使用datetime对象作为列名来插值:

CSV文件

Mar 2014, Jun 2014, Sep 2014, Mar 2015
nan,        1,        2,      nan
nan,        1,        2,      4
1,          2,        3,      nan
代码:

#read CSV file
df = pd.read_csv("test.txt", sep = r',\s*')
#convert column names to datetime objects
df.columns = pd.to_datetime(df.columns)
#interpolate over rows
df = df.interpolate(method = "spline", order = 1,  limit_direction = "both", axis = 1, downcast = "infer")
print(df)
输出:

   col1  col2  col3  col4
0  -7.0   1.0   2.0   2.0
1  -3.0   1.0   2.0   3.0
2   1.0   2.0   3.0   4.0
3   5.0   5.0   4.0   5.0
4   9.0   8.0   5.0   6.0
5  13.0   8.8   5.6   7.0
   col1 Mar   col2 Jun  col3 Sep  col4 Dec
0       NaN          1         2       NaN
1       NaN          1         2       3.0
2       1.0          2         3       NaN
   col1 Mar   col2 Jun  col3 Sep  col4 Dec
0         0          1         2         3
1         0          1         2         3
2         1          2         3         4
   2014-03-01  2014-06-01  2014-09-01  2015-03-01
0    0.000000         1.0         2.0    3.967391
1   -0.016457         1.0         2.0    4.000000
2    1.000000         2.0         3.0    4.967391

由于三个月的天数不同,现在的结果不再是好的整数

您是假设所有列都具有相同的外推基础函数,还是单独处理每个列?还不清楚col1为什么不插值。你试过什么?例如,每行的坡度可能不同。有关已尝试的内容,请参见相关编辑。您提供的链接引发了一个异常错误:对于隐藏的m:fpcurf0:m=1,m>k失败。您对插值有什么期望?你提供一个数据点,它神奇地猜出你心目中的线性关系是什么?y=1也是一个线性关系。温总理向文件中提供的链接如何?插值是灵活的,它提供诸如method和limit_direction之类的关键字来适应您的需要。df.interpolationmethod='linear',direction='forward',direction_limits='both'的线性插值在外推时给出0的斜率。似乎是已知的bug:[link]您是假设所有列都具有相同的外推基础函数,还是独立处理每一列?还不清楚col1为什么不插值。你试过什么?例如,每行的坡度可能不同。有关已尝试的内容,请参见相关编辑。您提供的链接引发了一个异常错误:对于隐藏的m:fpcurf0:m=1,m>k失败。您对插值有什么期望?你提供一个数据点,它神奇地猜出你心目中的线性关系是什么?y=1也是一个线性关系。温总理向文件中提供的链接如何?插值是灵活的,它提供诸如method和limit_direction之类的关键字来适应您的需要。df.interpolationmethod='linear',direction='forward',direction_limits='both'的线性插值在外推时给出0的斜率。似乎是已知的bug:[link]这正是我想要的,但是在行而不是列上。我尝试在axis=1的原始DFM上运行它,但收到错误消息TypeError:不支持的操作数类型-:'str'和'str'。你能在我的初始df的行中包括你将如何做吗?你的问题不清楚。对字符串col1、col2、col3、col4进行插值意味着什么?列是月,索引是车辆,值是行驶公里。我正在尝试插值缺失的值,并预测未来的公里数,您应该始终提供一个。如果月份是等间隔的或日期时间对象,则方法可能更简单。请查看更新。我添加了一个datetime对象的示例。这正是我想要的,但是是行而不是列。我尝试在axis=1的原始DFM上运行它,但收到错误消息TypeError:不支持的操作数类型-:'str'和'str'。你能在我的初始df的行中包括你将如何做吗?你的问题不清楚。对字符串col1、col2、col3、col4进行插值意味着什么?列是月,索引是车辆,值是行驶公里。我试图插值缺失的值,并预测未来的公里数,你应该
总是提供一个良好的环境。如果月份是等间隔的或日期时间对象,则方法可能更简单。请查看更新。我添加了一个datetime对象的示例。