生活を良くします - 怠惰なプログラミング

読者です 読者をやめる 読者になる 読者になる

生活を良くします-怠惰なプログラミング

外資系でエンジニアをやっています。便利なサービスや商品、プログラミングで作ったものなどを紹介していきます

Python Jupyter notebookでpandasを使いCSVを読み込みグラフを描画してpdfなどで保存する方法

python プログラミング

Pythonでグラフを描画する方法について

Pythonを知らない人やプログラミング初心者の人はこちらの記事をどうぞ

www.what-a-day.net

python用の講座についても無料で勉強できます。

jupyter notebook

昔はIPython Notebookと呼ばれていたが、現在はjupyter notebook(ジュパイターノートブック)となっている便利なものがあります。これでグラフを作る方法についてメモ書きしておきます。

エクセルでグラフを作ってもいいのですが、処理がやや面倒かつMacだとエクセルの動作に不安を覚えます。勝手に落ちたり、立ち上がらなかったりと。

jupyter notebookだと割と簡単で綺麗なグラフがかけます。pythonで動くのでpythonがわかる人ならコードを書くだけで加工ができます。

毎回ググっては忘れるを繰り返しているのでそろそろ覚えたい。

jupyter notebookについてはこちらで書きました。

www.what-a-day.net

今回やりたかったこと

IMFが公開している各種経済関連のデータを使って色々と調べたいことがあったのでいい機会なので逐一行動をメモることにしました。

Select Country or Country Groups

簡単に言うとcsv形式のファイルから特定の情報だけをとってきてそれをいい感じにグラフに描画し、pdf・jpg・png形式で保存したい、というだけです。

それ別にエクセルでやれば良くない?となりますが、jupyter notebook上でやればとても早いですし何よりフリーズしません。また結構キレイなグラフになりますし、グラフのデザインとかもそれなりに拘れます。

ちなみにエクセルのファイルがどのようになっているのかも書いておきます。

year GDP_rate (%)
1980 10
1981  12
1982 8
1983 2
1984 1
〜〜〜 〜〜〜


ここから特定の行(列)だけを抜き出してグラフにします。それで簡単な説明はあとでするとして、忘れないようにコードを書いておくことにします。

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import os

df = pd.read_csv("/Users/yourname/Desktop/book.csv", encoding="UTF-8")
plt.figure(figsize=(8, 6.5))
plt.rcParams["font.size"] = 22
plt.rcParams["xtick.labelsize"] = 12
plt.rcParams["ytick.labelsize"] = 15
plt.rcParams["legend.fontsize"] = 12
plt.grid()

year = df["year"]
gdp = df["GDP_rate(%)"]

plt.axhline(y=0)
plt.ylim(ymax=8)
plt.ylim(ymin=-8)

plt.xlabel("年")
plt.ylabel("GDP成長率(%)")



plt.plot(year,gdp,"r",marker="o",markersize=2)

plt.savefig("/Users/yourname/Desktop/gdp.svg", bbox_inches="tight")
plt.savefig("/Users/yourname/Desktop/gdp.pdf", bbox_inches="tight")
plt.savefig("/Users/yourname/Desktop/gdp.png", bbox_inches="tight")
plt.savefig("/Users/yourname/Desktop/gdp.jpg", bbox_inches="tight")


f:id:what_a_day:20170210224939j:plain

これは.jpg形式で保存した画像をはてなブログにアップロードしたものになります。

なんか全体的に暗くてダメそうな感じになってしまいました。


f:id:what_a_day:20170210225021p:plain

こちらはpng形式で保存したものです。なかなか悪くない感じになりました。レポートに貼り付ける画像もエクセルだとメンドくさくてスクリーンショットで済ませてしまうことが多かったのですが、最近はちゃんとpythonで書いてます。

データ数が少ないと恩恵が少なく感じますが、数万点のデータを何度も扱う場合は非常に楽になります。

どういう風に楽になるかというと一度グラフを指定して処理の仕方を記述しておけば勝手に計算してくれるからです。たいていちょっと改変するだけで使いまわせます。

エクセルだとちょっと嫌になる処理でもpythonで書いているとなんだか気が楽になる、そういう感じのものです。

具体的な説明について

%matplotlib inlineでは実行したものの結果がすぐにわかるという機能です。

大学とかだとこれでメモとったりしてたら強そう。簡単に情報共有できるし。

f:id:what_a_day:20170210234648g:plain


これらはグラフのフォントや文字サイズをいい感じに調整するための部分です。ちょっと文字が多すぎたので普段よりも小さめにしています。

plt.figure(figsize=(8, 6.5))
plt.rcParams["font.size"] = 22
plt.rcParams["xtick.labelsize"] = 12
plt.rcParams["ytick.labelsize"] = 15
plt.rcParams["legend.fontsize"] = 12
plt.grid()


これでcsv形式のファイルを読み込みdf(データフレーム)として使用します。

そしてyearにはcsvのyear列を取得したものを、gdpにはGDP_rate(%)列を取得したものを入れておきます。

df = pd.read_csv("/Users/yourname/Desktop/book.csv", encoding="UTF-8")


year = df["year"]
gdp = df["GDP_rate(%)"]


データフレームはこんな感じになっています。だいたいエクセルっぽいやつという認識です。

f:id:what_a_day:20170210235228p:plain:w450


これでpythonの描画を実行します。普通の折れ線グラフに実際の点の部分にマーカーをサイズ"2"で埋め込んでいます。色々調べるともっとキレイにできそうですが、これで十分な気がします。

plt.plot(year,gdp,"r",marker="o",markersize=2)

考えられるエラーとその対策

AttributeError: ‘Series’ object has no attribute ‘find’

これはpandasを使っているとよく出るエラーです。

メインの説明はstackoverflowに任せますが、自分が詰まった時のエラーを紹介します。

csvの数値表示はたまに親切で桁表示をしてくれているのですが、それが原因でした。

例:5000と5,000

まさかこれが原因とは知らなかったので時間を無駄にしました。治し方とかは簡単でエクセルでその列または行を指定し、数値表示にさせます。その時に桁表示のオプションをつけなければ治ります。

KeyError: “[‘ ’] not in index”

指定された行または列などが存在していないという意味です。基本的にタイプミスで出てきます。

上の例でいうと、yearがyaerとかになっているとKeyError: “[‘yaer’] not in index"とか表示されます。

TypeError: Can’t convert ‘int’ object to str implicitly

intと文字列で間違って操作をしているというメッセージです。

この場合だとエラーが発生します。

i = 5
print("this is five" + i)


治した場合が下のものです。簡単そうに見えますが、疲れている時にはよく出てくるエラーです。

i = 5
print("this is five" + str(i))

UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0x8c in position 0: invalid start byte

読み込んでいるcsvがUTF-8形式ではなく、SHIFT-JIS形式だった時に発生します。

その逆のSHIFT-JISをUTF-8形式で読み込もうとしていた場合でも同様にエラーが発生します。

まとめ

  • pythonでキレイなグラフの書き方を探した
  • jupyter notebookはやっぱり便利


f:id:what_a_day:20170211001406p:plain

ちなみにこんな感じのpythonでもっとキレイなグラフや独特なグラフを使いたい場合はこちらの記事を参考にしていただければと思います。

www.what-a-day.net