necochan

Python For Economist [第7回]: Pandasデータハンドリング・便利機能まとめ20選

ダウンロード

マクロ経済データを使って統計解析をするには、前処理や後処理が欠かせません。今回は、そんな補助的なデータ処理(データハンドリング)に役立つPandasの機能を20個ピックアップして紹介します。なお、ここではエコノミストが頻繁に扱うマクロ経済の時系列データを念頭に選びました。Full Codeはこちら

まず、以下のスクリプト全体を通して使うpandasをpdとしてimportしておきます。
Scipyもよく使うので丸ごとimportします。

 


import pandas as pd
from scipy import *

 

データ入力

1) Excelからデータをimport

  • 単純にData.xlsxのsheet1を読み込む。

URL=r"Data.xlsx" # Set a path
EXL=pd.ExcelFile(URL) # Open
Data=EXL.parse("sheet1") # Parse

  • シートの1行目を除いて読み込み、年月日の入ったTIMEという列をIndexとして使う。

Data=EXL.parse("sheet1",skiprows=1,index_col="TIME") # Parse

  • B列~F列だけを切抜いて読み込む。

Data=EXL.parse("sheet1",parse_cols="B:F") # Parse

 

2) Yahoo!Financeからデータをimport

  • 日経平均株価(コード:^N225)の日次時系列を1984年から取得。

import pandas.io.data as web # import I/O tool of pandas
Data=web.get_data_yahoo('^N225','1984') # Yahoo!Finance parser of pandas

 

3) GithubのGistからデータをimport

  • GistにData.csvがアップロードされているとして読み込み。単にGistのページ左下の”Link to this gist”に表示されたURLを現在位置としてData.csvを読み込めばOK。

URL=r"<gist-URL>/Data.csv"
Data=pd.DataFrame.from_csv(URL)

 

時間処理

4) Period-Indexを利用

  • TimestampデータをPeriodデータに変換する。年月日データの列”TIME”をindex_colとして読み込むと、Timestampインデックスが生成される。これはデータの観察周期が一様でない時にも使える汎用的なラベリングで、若干使い勝手が悪い。年次、四半期、月次、など観察周期が決まっている時はPeriodインデックスの方が便利。

URL=r"Data.xlsx" # Set a path
EXL=pd.ExcelFile(URL) # Open
Data=EXL.parse("sheet1",index_col="TIME") # Parse
Data=Data.to_period(freq="M") # change timestamp to period; e.g. "M": Montly, "Q": quarterly, "A": annual

 

5) サンプル期間の分割(スライス)

  • 2000年を境にデータを前半と後半に分割する。

Data_1H = Data[:"2000"]
Data_2H = Data["2001":] 

 

6) データ頻度の低解像化(集計)

  • 月次データを四半期データに変換。変換方法は「期間平均」。

Data=Data.resample('Q',how="mean") # how="sum","mean", "median", "max", "min", "last", "first"

 

7) データ頻度の高解像化(補完)

  • 四半期データを月次データに変換。補完方法は直後値の繰り返し(fill-forward: ‘ffill’)。

Data=Data.resample('M',fill_method='ffill') # fill_method= 'ffill', 'bfill'

 

データの選択・書き換え

8) 欠損値処理

  • 欠損値を一括して指定の値(例えば0)に置き換え。

Data = Data.fillna(0)

  • 欠損値を所属列の時間平均で置き換え。

Data = Data.fillna(Data.mean())

  • 欠損値の直後値で埋め合わせ。

Data = Data.fillna(method='ffill')

  • 欠損値の前後で線形補完。

Data = Data.interpolate()

  • 欠損値のを含む行(axis=0)か列(axis=1)を削除。

Data = Data.dropna(axis=0)

 

9) 条件選択でサブデータ作成

  • ある列の値がプラスの時点だけを集めたデータセット(例ではインフレ率: ‘Pi’)。

Data = Data[Data['Pi']>0]

 

10) 列の追加

  • DataFrameに一様乱数列を’Random’という変数名で追加

Data['Random']=rand(Data.shape[0])

 

11) 行の追加

  • 直近時点と同じデータを1時点先の行として追加

Data=Data.append(pd.DataFrame(Data[-1:].values,columns=Data[-1:].columns,index=Data[-1:].index+1))

 

12) データ値の置き換え(上書き)

  • 1行目を乱数列に置き換え。

Data.iloc[0]=rand(Data.shape[1])

  • 1列目を乱数列に置き換え。

Data.iloc[:,0]=rand(Data.shape[0])

  • 1行1列~5行5列までを乱数に置き換え。

Data.iloc[0:5,0:5]=rand(5*5).reshape((5,5))

 

13) ソート

  • 1列目のデータ値に基づき昇順でソート

Data.sort(columns=Data.columns[0],ascending=True)

  • 1列目のデータ値が同じ行については、2列目に基づきソート(昇順)

Data.sort(columns=list(Data.columns[0:2]),ascending=True)

 

時系列の変換

14) 記述統計の表示


Data.describe()

 

15) 変化率の計算

  • 前期比

Data.pct_change()

  • 前年比(月次)

Data.pct_change(periods=12)

 

16) 指数化

  • 2010年=100の指数を作成。

Data/Data['2010'].mean()*100

 

17) 対数変換


Data.apply(log)

 

18) 四分位範囲で正規化


(Data - Data.quantile(0.5).values) / (Data.quantile(0.75)-Data.quantile(0.25)).values

 

19) ラグ変数の追加

  • Dataの全ての変数(列)について、ラグ変数を3期分追加したDataFrameを作成。

nlag=3
for i in range(1,nlag+1):
    LD=Data.join(Data.shift(i),rsuffix="_"+str(i))

 

20) 移動平均の計算

  • 後方3期移動平均を計算(均等ウェイト)。

pd.rolling_mean(Data,3)

  • 後方3期移動平均を計算(指数関数ウェイト)。

pd.ewma(Data,span=3)

 Python for Economist バックナンバー

[第6回]: Statsmodelsでかんたん回帰分析
[第5回]: 最先端の時系列分析もPythonで!~粒子フィルターによるTVP-SVARの推定~
[第4回]: チャート画像からデータを取得
[第3回]: Codeするための便利な道具
[第2回]: PandasでExcelの読み書き
[第1回]: Anacondaのインストール

Email this to someoneShare on Google+Share on LinkedInShare on FacebookTweet about this on Twitter

2 thoughts on “Python For Economist [第7回]: Pandasデータハンドリング・便利機能まとめ20選

コメントを残す

Facebook Auto Publish Powered By : XYZScripts.com