matplotlibの超基本的な使い方:Python 3.X
matplotlibをしばらく使わないとかなり忘れてしまいます.なので使い方についてメモしておきます.
【もくじ】
まずは基本的な使い方
まずは最小構成でプロットしてみます.
最初にx軸用のデータとして,Numpyのarangeを使って-5から5まで0.2刻みの数字の列を作ります.ちなみにarangeの使い方はこちら
つぎにy軸用のデータとして,x軸用のデータを平方します.
こいつらをスクリプトで描くとこんな感じです.
import numpy as np import matplotlib.pyplot as plt # x:-5から5まで0.2刻みのデータを作る x = np.arange(-5, 5, 0.2) # y:xの値を二乗する y = x**2 # 描画 plt.plot(x, y)
このスクリプトを処理すると,,,
と見慣れた二次関数のグラフになります.
散布図を描く
つぎに散布図です.先程のスクリプトの,
# 描画
plt.plot(x, y)
のところを
# 描画 plt.plot(x, y,".")
としてあげると
みたいな点線になります
「+」の形にプロット
# 描画 plt.plot(x, y,"+")
としてあげると,+の形に点が打たれた散布図がかけます.
破線でプロット
# 描画 plt.plot(x, y,"--")
としてあげると
のような破線になります.まぁ,これは"散布図"とは呼ばないかもしれませんが・・・
画像ファイルに出力する
plt.savefig(ファイル名と形式)で画像ファイルとして出力されます.
また,pylabをインポートしてpylab.figureを呼び出せばサイズも変えられます.
一番最初のスクリプトに追記するとこんな感じです.
import numpy as np import matplotlib.pyplot as plt import pylab # ←加えた!!!サイズを変えるのに使う # x:-5から5まで0.2刻みのデータを作る x = np.arange(-5, 5, 0.2) # y:xの値を二乗する y = x**2 # サイズを変える pylab.figure(figsize=(9, 6)) #←加えた!!!!900×600のサイズになる # 描画 plt.plot(x, y) # グラフを保存 plt.savefig("image.png") #←加えた!!!!画像ファイルとして保存する
Python3,Pandas:データフレームを用いて複数のCSVファイルを連続で読み込む
1.簡単な例
最も単純な例.CSVファイルが2つを読み込んで結合する
import pandas as pd # データの読み込み f1 = pd.read_csv('CSVfile1.csv', header=None) f2 = pd.read_csv('CSVfile2.csv', header=None) # 結合 data = pd.concat([f1, f2]) # 書き出し data.to_csv('newData.csv', index=False)
2.ちょっと複雑な例
「data」というフォルダに複数のCSVファイルが格納されているとする.
これらを「glob」を使ってフォルダ全体を読み込み,データフレームに格納して結合する.
import glob import pandas as pd # ファイル読み込み files = glob.glob('data/*.csv') # ファイルを読み込んでデータフレーム作成 df = pd.concat( (pd.read_csv(f, header=None, # ファイルを読み込む.読み込む際にHeader名は無視する names=('id','val'), # Headerの名前を決める dtype={'id':'str', 'val':'str'}) # データの型を定義 for f in files)) # ファイルを連続で読み込む # 表示 print(df)
ix,loc,ilocによるデータフレームのアクセス:Pandas
ix,loc,ilocは何が違うのか?こいつらを使ってスクリプトを書いたのですが,やや気づきにくい不具合があり,苦戦しました.そんなときに下記のブログに参考にして直しましたが,自分でも試行錯誤したので,その一部を記録しておきます.
リンク先にも書いてありますが,「ちょこっと試すなら.ixを使って,長く使うなら iloc, loc が安全」かと.
列に名前がついて無い場合
ixもilocもloc同じ挙動
In [2]: import pandas as pd In [20]: df = pd.DataFrame( ...: [(10, 11, 12, 13), ...: (20, 21, 22, 23), ...: (30, 31, 32, 33)]) In [21]: df Out[21]: 0 1 2 3 0 10 11 12 13 1 20 21 22 23 2 30 31 32 33 In [22]: df.ix[1,1] Out[22]: 21 In [23]: df.loc[1,1] Out[23]: 21 In [24]: df.iloc[1,1] Out[24]: 21
列に名前(str)がついている場合
ixとilocは番号指定出来る.locは番号指定出来ない
In [7]: df = pd.DataFrame( ...: {'C1': [10, 11, 12, 13], ...: 'C2': [20, 21, 22, 23], ...: 'C3': [30, 31, 32, 33]}) In [8]: df Out[8]: C1 C2 C3 0 10 20 30 1 11 21 31 2 12 22 32 3 13 23 33 In [9]: df.ix[1,1] Out[9]: 21 In [10]: df.loc[1,1] # これはエラー In [11]: df.loc[1,'C2'] Out[11]: 21 # 列名を指定すればOK In [12]: df.iloc[1,1] Out[12]: 21
列に名前(int)がついている場合
ixだと列名の方を優先するみたいです.
In [37]: df = pd.DataFrame( ...: {5: [10, 11, 12, 13], ...: 3: [20, 21, 22, 23], ...: 1: [30, 31, 32, 33]}) In [38]: df Out[38]: 1 3 5 0 30 20 10 1 31 21 11 2 32 22 12 3 33 23 13 In [39]: df.ix[1,1] Out[39]: 31 In [40]: df.iloc[1,1] Out[40]: 21 In [41]: df.columns Out[41]: Int64Index([1, 3, 5], dtype='int64')
Python3.X:データフレームの生成方法色々
その1 数字だけ入れると勝手にHeaderとIndexが追加される
In [17]: import pandas as pd In [18]: df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) In [19]: df Out[19]: 0 1 2 0 1 2 3 1 4 5 6 2 7 8 9
その2 HeaderとIndexを自分で指定する
In [20]: df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], index=['I1','I2','I3'], columns=['C1', 'C2', 'C3']) In [21]: df Out[21]: C1 C2 C3 I1 1 2 3 I2 4 5 6 I3 7 8 9
その3 こんな方法もある
In [27]: df = pd.DataFrame({'C1':[1, 2, 3], 'C2':[4, 5, 6], 'C3':[7, 8, 9]},index=['I1','I2','I3']) In [28]: df Out[28]: C1 C2 C3 I1 1 4 7 I2 2 5 8 I3 3 6 9
Python 3.x:配列やデータフレームのコピー
たとえば,こんな
実行結果がこれです
list [[[0, 12], [21, 22]]]
list [[[1, 12], [21, 22]], [[1, 12], [21, 22]]]
list [[[2, 12], [21, 22]], [[2, 12], [21, 22]], [[2, 12], [21, 22]]]
線形計画法のソルバの使い方:Python
最近,線形計画法のソルバを使ってあれこれしました.使うために色々調べたわけですが,時間が立つと調べた内容を忘れそうなので記録しておきます.
線形計画法のソルバはPuLPというライブラリから呼び出して使います.
例題を解いてみる
こういう最適化問題があるとします.
これは が答えなのですが,本当にそうなるかを試します.
バッチ処理版
細かいところを説明する前に,まずは全体像をお見せします.バッチ処理で書くとこんな感じです.
# (1)ライブラリ呼び出し import pulp # (2)問題の定義 lp = pulp.LpProblem('lp', pulp.LpMaximize) # (3)変数の設定 x1 = pulp.LpVariable('x1', 0) x2 = pulp.LpVariable('x2', 0) # (4)評価関数の生成 lp += 4*x1 + 3*x2 # (5)制約条件の生成 lp += 2*x1 + 3*x2 <= 15 lp += 2*x1 + x2 <= 9 # (6)最適化問題の確認 print(lp) # (7)求解 lp.solve() # (8)結果の確認 print('x1=',x1.value()) print('x2=',x2.value())
これを読み込むと,
lp: MAXIMIZE 4*x1 + 3*x2 + 0 SUBJECT TO _C1: 2 x1 + 3 x2 <= 15 _C2: 2 x1 + x2 <= 9 VARIABLES x1 Continuous x2 Continuous x1= 3.0 x2= 3.0
おぉ.ちゃんと が出力されました.
解説
(1)ライブラリの呼び出し
これは何も説明する必要はないと思います.
import pulp
(2)問題の定義
pulp.LpProblemで最大化問題か最小化問題かを設定するそうです.引数はそれぞれ下記のようになります.
pulp.LpProblem(『1.問題の名前』, 『2.最大化or最小化』)
- 『1.問題の名前』で問題の名前を決めるらしいです.
- 『2.最大化or最小化』では最小化問題ならLpMinimize ,最大化問題なら LpMaximizeと入力します.デフォルトではLpMinimizeです.
これに関しても,下記のリンク先に英語で載っていますので,ご参考にしていただければと思います.
今回は最大化問題なので次のように書きました.
lp = pulp.LpProblem('lp', pulp.LpMaximize)
(3)変数の生成
pulp.LpVariableで変数を作ります.引数はそれぞれ
pulp.LpVariable(『1.名前』, 『2.変数の最小値』,『3.変数の最大値』, 『4.連続値or離散値or01』, 『5.e』)
を意味するらしいです.要するに
- 『1.名前』では変数の名前を入力する
- 『2.変数の最小値』では,文字通り変数の最小値を入力します.何も入れないと設定されないようです.
- 『3.変数の最大値』では,同じく最大値を入力します.何も入れないと設定されないようです.
- 『4.連続値or離散値or01』では Integer(整数計画問題), Binary(0,1) or Continuous(連続値)を入力するそうです.デフォルトではContinuous(連続値)だそうです
- 『5.e』は列ベースのモデリングに使用されるそうですが,正直良くわかりません.
ということみたいです.下記のリンク先に英語で書いてあるので,こちらも御覧ください.
今回は制約条件より なので,下記のように入力しました.
x1 = pulp.LpVariable('x1', 0) x2 = pulp.LpVariable('x2', 0)
(4)評価関数の生成
評価関数はさっき作ったオブジェクトに足していくみたいです.
lp += 4*x1 + 3*x2
(5)制約条件の生成
制約条件もさっき作ったオブジェクトに足していくみたいです.
lp += 2*x1 + 3*x2 <= 15 lp += 2*x1 + x2 <= 9
(6)最適化問題の確認
さっき作ったオブジェクトlpを出力すれば問題が表示されます.どういう問題を解くか?というのが見れます.
print(lp)
と書くと
lp: MAXIMIZE 4*x1 + 3*x2 + 0 SUBJECT TO _C1: 2 x1 + 3 x2 <= 15 _C2: 2 x1 + x2 <= 9
と出力されます.
(7)求解
さっきのオブジェクトに,.solve()モジュールをくっつけます.
lp.solve()
(8)計算結果の確認
変数に.value()モジュールをくっつければ,結果が見れます.
print(x1.value()) print(x2.value())