In [1]:
import pandas as pd
import matplotlib.pyplot as plt
from pandas.io import wb
import xlsxwriter
pandas の to_excel
を使ってデータフレームをエクセルに書き出します。
世界銀行の API を使って、アメリカと日本の人口とGDPを取得します。indicator 文字列は世界銀行の API から取得します。
In [2]:
df_gdp = wb.download(indicator='NY.GDP.PCAP.KD', country=['US', 'JP'], start=1960, end=2013)
In [3]:
df_population = wb.download(indicator='SP.POP.TOTL', country=['US', 'JP'], start=1960, end=2013)
In [4]:
df_gdp.head(3)
Out[4]:
In [5]:
df_gdp.dtypes
Out[5]:
In [6]:
df_gdp.index
Out[6]:
In [7]:
df_gdp.describe()
Out[7]:
GDP のデータフレームは:
人口のデータフレームも同じような構成になっています。
このままでは使いにくいのでデータを整形します。
In [8]:
df_gdp.unstack(level=0).head(3)
Out[8]:
In [9]:
df_gdp.unstack(level=0).describe()
Out[9]:
In [10]:
df_gdp.unstack(level=0).plot(figsize=(16, 4), colormap='seismic')
Out[10]:
人口のデータも同様に変換します。
In [11]:
df_population.unstack(level=0).head(3)
Out[11]:
In [12]:
ax = df_population.unstack(level=0).plot(figsize=(16, 4), colormap='seismic')
5年の移動平均を計算してみると、アメリカは人口増加、日本は人口横ばいである傾向が少しハッキリします。
In [13]:
ax = pd.stats.moments.rolling_mean(df_population.unstack(level=0), 5).plot(figsize=(16, 4), colormap='seismic')
In [14]:
ax = pd.stats.moments.rolling_std(df_population.unstack(level=0)['SP.POP.TOTL'], 5).plot(figsize=(16, 4), colormap='seismic')
2つのデータフレームを結合します。
In [15]:
pd.concat([df_gdp, df_population], axis=1).unstack(level=0).head(3)
Out[15]:
In [16]:
df = pd.concat([df_gdp, df_population], axis=1).unstack(level=0)
df.describe()
Out[16]:
GDPを左軸、人口を右軸にしてグラフを描画してみます。
In [17]:
ax = df.plot(figsize=(16, 6), colormap='seismic',
secondary_y=[('SP.POP.TOTL', 'Japan'), ('SP.POP.TOTL', 'United States')])
ax.set_ylabel('GDP')
_ = ax.right_ax.set_ylabel('Population')
単一のデータフレームで扱えるようになりました。
5年単位での分散を計算すると、日本の人口は1980年ごろから伸び悩み、GDPは1995年ごろから横ばいと言えます。 アメリカの場合は、1990年ごろに人口増加の波があり、2000年ごろにGDPの増加がピークを迎え、定期的に波があると言えます。
In [18]:
ax = pd.stats.moments.rolling_var(df, 5).plot(subplots=True, layout=(2, 2), figsize=(16, 6))
エクセルに出力します。データフレームのメソッドを呼び出しますが、xlsxwriter
などのエクセル書き出しモジュールがインストールされている必要があります。
In [19]:
df.to_excel('/data/sample.xlsx', sheet_name='Japan_US')
In [20]:
%ls /data
出来上がったデータをエクセルで開いてみてください。LibreOffice などでも構いません。
複数のデータフレームを個別のシートに書き出す場合は、引数にファイル名ではなくライターオブジェクト (ExcelWriter
) を指定します。公式ドキュメントに例がありますが、詳しくは Stack Overflow などで探しましょう。
version_information 拡張を有効にしてあります。このノートブックの動作環境は以下のものです。
In [21]:
%version_information numpy, pandas, matplotlib, xlsxwriter
Out[21]: