TPTブログ

テックポート株式会社のブログです。 技術情報や製品・サービス情報、 また未経験社員がデータサイエンティストを 目指す奮闘記など、更新していきます。

▲本日の関数==interpolate()==

f:id:TBT_matsu:20200402152259p:plain

本日の関数:interpolate()

こんにちは。
テービーテックの村松です。

本日ご紹介する関数は「interpolate()」。
※※これまでご紹介した関数はこちら※※

どんな関数?

データフレーム等の欠損値の補間方法の一つ。
前後の値を考慮して補間します。
沢山の補間方法が用意されています。

引数は?
DataFrame.interpolate(self, method='linear', axis=0, limit=None, inplace=False, limit_direction='forward', limit_area=None, downcast=None)

よく指定する引数は、

  • method:linear(線形補間、デフォルト), time(インデックス列の日時に合わせて線形補間), index(線形補間、インデックス列(数値の場合)を考慮する), values(線形補間、インデックス列(数値の場合)を考慮する), pad(既存の数値で補間), nearest, zero, slinear, quadratic, cubic, barycentric, krogh, polynomial, spline, piecewise_polynomial, pchip。各詳細はドキュメント参照。
  • axis:変換する方向の指定をします。行(1)か列(0)。
  • limit:連続している欠損値を最大いくつ補間するか指定します。デフォルトはNone(全て補間)。
  • limit:inplace:元のオブジェクトを補間した内容で更新するか指定します。デフォルトはFalse。

使ってみよう

input
import pandas as pd
# 欠損値入りのデータフレームを用意
df = pd.DataFrame({'a': [1, pd.np.nan, pd.np.nan, 5, 6],
                   'b': [0, 1, 2, pd.np.nan, pd.np.nan],
                   'c': [pd.np.nan, 1, 3, pd.np.nan, 7],
                   'd': [4, 6, pd.np.nan, 10, 12]})
df

f:id:TBT_matsu:20200514111319p:plain

コード
#デフォルトで補間
df.interpolate()

f:id:TBT_matsu:20200514111429p:plain

各列に対して線形補間を行いました。
0行目は前の値がないのでNaNのままです。
また、b列のように後ろの値がない場合は同じ値が繰り返し入ります。

なお、引数limit_direction='both'とすると前の値がない個所も補間されます。

#引数limit_direction='both'で補間
df.interpolate(limit_direction='both')

f:id:TBT_matsu:20200514111606p:plain

デフォルトだとインデックス列を考慮せず、等間隔扱いで補完していますが、
インデックスを考慮した補間も可能です。
どのように補間の数値が変わるか不連続なインデックス列のデータフレームで試してみましょう。

# 不連続なインデックスのデータフレームを用意
df2 = pd.DataFrame({'a': [1, pd.np.nan, pd.np.nan, 5, 6],
                   'b': [0, 1, 2, pd.np.nan, pd.np.nan],
                   'c': [pd.np.nan, 1, 3, pd.np.nan, 7],
                   'd': [4, 6, pd.np.nan, 10, 12]},
                   index=[0, 2, 6, 7, 10])
df2

f:id:TBT_matsu:20200514111857p:plain

methodにはindexかvaluesを指定します。

# インデックス列の数値を配慮した補間。
df2.interpolate('index')

f:id:TBT_matsu:20200514112534p:plain
インデックス列を考慮したmethodを使用する場合はインデックスが数値型以外だとエラーになるので注意です。

methodをtimeにすれば日時を考慮した線形補間も可能です。

# インデックスが日時の場合のデータフレームを用意
df3 = pd.DataFrame({'a': [1, pd.np.nan, pd.np.nan, 5, 6],
                   'b': [0, 1, 2, pd.np.nan, pd.np.nan],
                   'c': [pd.np.nan, 1, 3, pd.np.nan, 7],
                   'd': [4, 6, pd.np.nan, 10, 12]},
                   index=pd.to_datetime(['2020-05-01', '2020-05-11', '2020-05-12', '2020-05-15', '2020-05-30']))
df3

f:id:TBT_matsu:20200514112702p:plain

#日時を考慮した補間
df3.interpolate('time')

f:id:TBT_matsu:20200514112837p:plain

もっと詳しく!

ドキュメントへ!!