python interpolate_Python pandas.DataFrame.interpolate函数方法的使用

DataFrame.interpolate(self, method='linear', axis=0, limit=None, inplace=False, limit_direction='forward', limit_area=None, downcast=None, **kwargs)[source]

根据不同的方法插值。

请注意,只有method='linear'具有MultiIndex的DataFrame/Series支持。

参数:method : str,默认为‘linear’

使用插值技术。之一:

‘linear’:忽略索引,并将值等距地对待。

这是MultiIndexes支持的唯一方法。

‘time’: 处理每日和更高分辨率的数据,

以内插给定的时间间隔长度。

‘index’, ‘values’:使用索引的实际数值。

'pad':使用现有值填写NaN。

‘nearest’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’,

‘spline’, ‘barycentric’, ‘polynomial’:

传递给 scipy.interpolate.interp1d。

这些方法使用索引的数值。‘polynomial’

和 ‘spline’ 都要求您还指定一个顺序(int),

例如 ,

df.interpolate(method='polynomial', order=5)

'krogh','piecewise_polynomial','spline','pchip','akima':

环绕类似名称的SciPy插值方法。请参阅注释。

'from_derivatives':

指 scipy.interpolate.BPoly.from_derivatives,

它替换了scipy 0.18中的'piecewise_polynomial'插值方法。

0.18.1版中的新功能:添加了对 ‘akima’方法的支持。

添加了插值方法‘from_derivatives’ ,

该方法替换了SciPy 0.18中的 ‘piecewise_polynomial’;

向后兼容,SciPy <0.18

axis : {0或'index',1或'columns',None},默认为None

沿轴进行interpolate。

limit : 整数,可选

要填充的连续NaN的最大数量。必须大于0。

inplace : bool,默认为False

尽可能更新数据。

limit_direction :{'forward','backward','both'},

默认为'forward'

如果指定了限制,则将沿该方向填充连续的NaN。

limit_area : {None, ‘inside’, ‘outside’}, 默认为None

如果指定了限制,则连续的NaN将填充此限制。

None:无填充限制。

‘inside’:仅填充有效值(interpolate)包围的NaN。

‘outside’: 仅在有效值之外(extrapolate)填充NaN。

0.23.0版中的新功能。

downcast : 可选, ‘infer’ 或None,默认为None

如果可能,请向下转换dtype。

**kwargs

关键字参数传递给插值函数。

返回值:Series 或 DataFrame

返回与调用方相同的对象类型,

并以部分或全部NaN值进行插值。

Notes

‘krogh’, ‘piecewise_polynomial’, ‘spline’, ‘pchip’ 和‘akima’方法是类似名称的相应SciPy实现的包装。这些使用索引的实际数值。有关其行为的更多信息,请参见 SciPy文档 和SciPy教程。

例子

填充NaN在Series通过线性内插>>> s = pd.Series([0, 1, np.nan, 3])

>>> s

0 0.0

1 1.0

2 NaN

3 3.0

dtype: float64

>>> s.interpolate()

0 0.0

1 1.0

2 2.0

3 3.0

dtype: float64

在填补NaN了一系列的填充,却尽显最多两个连续NaN在同一时间>>> s = pd.Series([np.nan, "single_one", np.nan,

... "fill_two_more", np.nan, np.nan, np.nan,

... 4.71, np.nan])

>>> s

0 NaN

1 single_one

2 NaN

3 fill_two_more

4 NaN

5 NaN

6 NaN

7 4.71

8 NaN

dtype: object

>>> s.interpolate(method='pad', limit=2)

0 NaN

1 single_one

2 single_one

3 fill_two_more

4 fill_two_more

5 fill_two_more

6 NaN

7 4.71

8 4.71

dtype: object

NaN通过多项式插值或样条曲线填充系列:'多项式'和'样条曲线'方法都要求您还指定order(int)>>> s = pd.Series([0, 2, np.nan, 8])

>>> s.interpolate(method='polynomial', order=2)

0 0.000000

1 2.000000

2 4.666667

3 8.000000

dtype: float64

使用线性插值沿每列向前(即向下)填充DataFrame

请注意,如何对列“ a”中的最后一个条目进行不同的插值,因为在其后没有任何条目可用于插值。请注意,如何保留列'b'中的第一个条目NaN,因为在它之前没有条目可用于插值。>>> df = pd.DataFrame([(0.0, np.nan, -1.0, 1.0),

... (np.nan, 2.0, np.nan, np.nan),

... (2.0, 3.0, np.nan, 9.0),

... (np.nan, 4.0, -4.0, 16.0)],

... columns=list('abcd'))

>>> df

a b c d

0 0.0 NaN -1.0 1.0

1 NaN 2.0 NaN NaN

2 2.0 3.0 NaN 9.0

3 NaN 4.0 -4.0 16.0

>>> df.interpolate(method='linear', limit_direction='forward', axis=0)

a b c d

0 0.0 NaN -1.0 1.0

1 1.0 2.0 -2.0 5.0

2 2.0 3.0 -3.0 9.0

3 2.0 4.0 -4.0 16.0

使用多项式插值>>> df['d'].interpolate(method='polynomial', order=2)

0 1.0

1 4.0

2 9.0

3 16.0

Name: d, dtype: float64

import pandas as pd import numpy as np import os from pprint import pprint from pandas import DataFrame from scipy import interpolate data_1_hour_predict_raw = pd.read_excel('./data/附件1 监测点A空气质量预报基础数据.xlsx' ) data_1_hour_actual_raw = pd.read_excel('./data/附件1 监测点A空气质量预报基础数据.xlsx' ) data_1_day_actual_raw = pd.rea df_1_predict = data_1_hour_actual_raw df_1_actual = data_1_day_actual_raw df_1_predict.set_axis( ['time', 'place', 'so2', 'no2', 'pm10', 'pm2.5', 'o3', 'co', 'temperature', 'humidity', 'pressure', 'wind', 'direction'], axis='columns', inplace=True) df_1_actual.set_axis(['time', 'place', 'so2', 'no2', 'pm10', 'pm2.5', 'o3', 'co'], axis='columns', inplace=True) modeltime_df_actual = df_1_actual['time'] modeltime_df_pre = df_1_predict['time'] df_1_actual = df_1_actual.drop(columns=['place', 'time']) df_1_predict = df_1_predict.drop(columns=['place', 'time']) df_1_predict = df_1_predict.replace('—', np.nan) df_1_predict = df_1_predict.astype('float') df_1_predict[df_1_predict < 0] = np.nan # 重新插入time列 df_1_actual.insert(0, 'time', modeltime_df_actual) df_1_predict.insert(0, 'time', modeltime_df_pre) # 线性插值的方法需要单独处理最后一行的数据 data_1_actual = df_1_actual[0:-3] data_1_predict = df_1_predict data_1_predict.iloc[-1:]['pm10'] = 22.0 data_1_actual_knn = df_1_actual[0:-3] data_1_predict_knn: DataFrame = df_1_predict for indexs in data_1_actual.columns: if indexs == 'time': continue data_1_actual['rownum'] = np.arange(data_1_actual.shape[0]) df_nona = data_1_actual.dropna(subset=[indexs]) f = interpolate.interp1d(df_nona['rownum'], df_nona[indexs]) data_1_actual[indexs] = f(data_1_actual['rownum']) data_1_actual = data_1_actual.drop(columns=['rownum']) for indexs in data_1_predict.columns: if indexs == 'time': continue data_1_predict['rownum'] = np.arange(data_1_predict.shape[0]) df_nona = data_1_predict.dropna(subset=[indexs]) f = interpolate.interp1d(df_nona['rownum'], df_nona[indexs]) data_1_predict[indexs] = f(data_1_predict['rownum']) data_1_predict = data_1_predict.drop(columns=['rownum']) writer = pd.E
06-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值