DISTRICT 37

なにか

matplotlibが描画されない

普段コードを書くときはjupyterを使っていて、matplotlibのプロットがブラウザ内に行われるの為この問題には気付かなかった。改めてpythonのコードを書いてみて描画関連でエラーが出ていることに気が付いた。

環境

  • Ubuntu16.02
  • python 3.5.1 (pyenv)
  • matplotlib 1.5.2

何が起こったか

最初はmatplotlibで描画するコードであるplt.show()としてもウンともスンとも言わなかった。で探しているうちにmatplotlibのbackendにTkを指定しないと描画が行われないとの情報があった。それを指定したのちにplt.show()を実行したら「ImportError: Nomodule named '_tkinter'」と出た。jupyter上では問題無く動くコードなのに、pythonのコードとして実行するとエラーを吐いて描画が行われなかった。

---> 35 import _tkinter # If this fails your Python may not be configured for Tk
     36 TclError = _tkinter.TclError
     37 from tkinter.constants import *

ImportError: No module named '_tkinter'

エラーメッセージには「キミの使っているpythonにTk関連のセットアップが済んでいないよ」と表示されている

解決方法

TK関連のライブラリを入れて、pythonの入れ直しをしたら直る。入れててよかったpyenv。

準備としてpip関連のパッケージ情報を吐きだしておく。何を入れていたかなんて当然覚えちゃいない。

pip freeze > pip.txt

まずはpythonのアンインストール。pyenvでどのバージョンのpythonを使っているか確認してからでもいいかも。

pyenv versions
pyenv uninstall 3.5.1

続いてTK関連のライブラリをインストール

sudo apt install python-tk tk-dev

そのあとでpythonを再インストール

pyenv install 3.5.1

終わったらpipのパッケージを一括インストール

pip install -r pip.txt

注意点としてscikit-learnが入っていた場合は先にScipyを入れないとエラーを起こして止まる。freezeで出力したファイルはアルファベット順にソートされていてscikit-learn、Scipyの順に記述されている。一括インストールではその順にインストールが行われるのでファイル自体の順番を編集するとか、指摘通りにScipyを先に入れちゃうとかやっておくといい。

作業としてはこれでおしまい。

確認

matplotlibrcというファイルにbackendの指定をする必要がある。場所はmatplotlib自身が教えてくれる

import matplotlib
print(matplotlib.matplotlib_fname())

# こんな感じで標準出力に出る
# '/home/yourname/.pyenv/versions/3.5.1/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc'

該当ファイルをエディタで開いて「backend」を「tkagg」に更新する

backend   :tkagg

このbackendが適切なものに指定されていないとmatplotlibはちゃんと描画されない。pythonのコード中に書いて指定することもできるが、そもそもライブラリが入っていなくて使えない場合は指定してもだめ。

以下のサンプルはjupyterだけど、pythonのコードを書いて無事にサインカーブが描画されたら確認完了。

原因

上記のエラーメッセージの通りpythonインストール時にTK関連のライブラリが無いとmatplotlibの描画時にTKが使われないとの事。後付けでできないかいろいろ探し回ったけど、再インストールが手っ取り早かった。

参考

qiita.com

Pandasの基本操作

Pandasの操作シリーズ 第二弾

前回 dragstar.hatenablog.com

データの基本操作

所謂基本統計量がとれる

www.mm-lab.jp

  • 最大値の取得
df.max()
  • 最小値の取得
df.min()
  • 平均値の取得
df.mean()
  • 中央値の取得
df.median()
  • 分散の取得
df.var()
df.std()
  • 合計値の取得
df.sum()
  • 尖度
df.kurt()
  • 歪度
df.skew()
  • 基本統計量
df.describe()

行の追加

行を追加する場合は列を合わせておくこと

df = df.append(new_df)

列の追加

列を追加する場合はデータ量を合わせておくこと

df['new_col'] = new_df

値の取得

  • 行単位で取得する。

戻り値はSeries

df.ix[0]

複数行を取得する。この場合はDataFrameが戻り値となる

df.ix[[0,2]]
  • 列単位で取得する。

戻り値はSeries

df['column_name']

複数列を取得。こちらもDataFrameとなる

df[['column_name','other_column']]

条件を満たすデータを選択

df[df['column_name'] > 30]

データの個数を数える

  • 列に出てきた値の個数を数える。

度数分布とかに便利

df['column'].value_counts()

単純に数を数える場合

df['column'].count()

df.count() #すべての列を対象にする
len(df) #単純にこれでもいい

欠損値の扱い

  • 欠損値を含むデータを削除
df.dropna()
  • NaNを埋める

指定した文字で埋める

df.fillna(0)

Pandasでcsvを操作

Pandasの操作シリーズ

CSVファイルからPandasを作る

こういうCSVデータがあったとする。

no,Sepal.Length,Sepal.Width,Petal.Length,Petal.Width,Species
1,5.1 ,3.5 ,1.4 ,0.2 ,setosa
2,4.9 ,3.0 ,1.4 ,0.2 ,setosa
3,4.7 ,3.2 ,1.3 ,0.2 ,setosa

まずは基本系

import pandas as pd #以下省略
df = pd.read_csv("hoge.csv")
print(df)

結果としてこうなる。デフォルトで一行目がタイトルとなり、0から始まるインデックス列が自動的に付与される。

no Sepal.Length Sepal.Width Petal.Length Petal.Width Species
0 1 5.1 3.5 1.4 0.2 setosa
1 2 4.9 3.0 1.4 0.2 setosa
2 3 4.7 3.2 1.3 0.2 setosa

インデックスを指定したい場合はindex_colを指定

import pandas as pd #以下省略
df = pd.read_csv("hoge.csv", index_col="no")
print(df)

指定した列がインデックス列となる

no Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa

タイトルがなく、一行目からデータがある場合はheaderパラメータを指定する。

df = pd.read_csv("hoge.csv", header=None)
print(df)

タイトルが自動的にふられて読み込まれる。

no 1 2 3 4 5
0 1 5.1 3.5 1.4 0.2 setosa
1 2 4.9 3.0 1.4 0.2 setosa
2 3 4.7 3.2 1.3 0.2 setosa

そういったデータにヘッダーを付けて読み込みたい場合はnamesパラメータを指定する。

df = pd.read_csv("hoge.csv", names=('a','b','c','d','e'))
print(df)

指定したヘッダーで読み込まれる

no a b c d e
0 1 5.1 3.5 1.4 0.2 setosa
1 2 4.9 3.0 1.4 0.2 setosa
2 3 4.7 3.2 1.3 0.2 setosa

カンマ区切りではなく、タブ区切りの場合にはdelimiterを指定する

df = pd.read_csv("hoge.csv", delimiter='\t')

delimiterを指定することで、タブだけでなく他の区切り形式でも読み込むことができる。

PandasからCSVを作る

まずは基本系

import pandas as pd #以下省略
df.to_csv("hoge/hoge/iris.csv")

デフォルトではインデックスがつく

,no,Sepal.Length,Sepal.Width,Petal.Length,Petal.Width,Species
0,1,5.1 ,3.5 ,1.4 ,0.2 ,setosa
1,2,4.9 ,3.0 ,1.4 ,0.2 ,setosa
2,3,4.7 ,3.2 ,1.3 ,0.2 ,setosa

インデックスを外したい場合はindexをFalseに指定する

df.to_csv("hoge/hoge/iris.csv", index=False)

デリミタをタブにしたい場合はsepを指定する

df.to_csv("hoge/hoge/iris.csv", sep="\t")

他の区切り文字でもいける。

また、データをquoteで囲む場合はquotingを指定する

import csv
df.to_csv("hoge/hoge/iris.csv", quoting=csv.QUOTE_ALL)

Rのパッケージを一括アップデート

pythonに続きRでもそれをやる

dragstar.hatenablog.com

パッケージを一括アップデート

update.packages()

このコマンドを打ったのちにCRANと既存パッケージのバージョン比較が自動的に行なわれる。だが、パッケージごとに更新してもいいか「Update (y/N/c)?」と確認してくるので、インストールしているパッケージが多ければ多いほど、しかもそれがアップデート対象だと少々厄介。いうまでもないが「y」がyes、「N」がNo、「c」がcancelだ。

Rsutdioだと簡単

Rstudioだとこれが格段に簡単になってくる。左下(デフォルトだと)のPackegesタブを選択して「Update」ボタンを押すと同様にCRANとの比較をして更新状況を確認する。この中から更新対象を選択して「Install Updates」を押したら完了。「Select All」を押したらすべて選択状態になるという地味に便利な補助機能付き。

f:id:dragstarclassic:20160909112313j:plain

パッケージってそれほど劇的に内容が変わるわけでもないので、バグでも見つけない限りインストール済みのパッケージは結構放っておきがち。新しいものにしておくに越したことはないが、引数が強制的に増減したり、さらには関数自体無くなったりとやっかいな変更もあったりするので、パッケージ管理は一概に最新にしておくのがいいってわけではないのかと。ReleaseNoteとか見て判断するのもいいかもしれない。

MySQLの基本的なコマンド

普段は別のRDBMSを使っているので、MySQLのコマンドがいつも覚えられない。接続コマンドすら打てないという体たらくなので、忘れてもいいようにメモしておく。

データベース関連

  • 接続
mysql -h host -u user -p
  • DB表示
show databases;
  • DBの切り替え
use yourdb;
exit;

テーブル関連

  • テーブルの確認
show tables;
  • テーブル構造の確認
desc yourtable;

データ関連

  • 縦にデータを出力
select * from yourtable where column = 'hoge' \G;
  • CSVでデータを出力
select * from yourtable where column = 'hoge'
INTO OUTFILE '/foo/bar.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"';

ただし、リモートDBの場合はデータをローカルに出力できない。その時は可能ならMySQL Workbench使うヨロシ。

f:id:dragstarclassic:20160908100554j:plain

SQLで検索結果を出したのち、この「Export/Import」を押すとファイル選択画面になってリモートDBでもデータを出力できる。SSH中とかでGUIを使えない場面では、何やらスクリプトを組めばどうにかなるそうなのだが、GUIでできてコマンドでできないなんて間違ってると思う。

pipでいれたパッケージを一括アップデート

pipでなんやかやパッケージを入れているのだが、これまで何をいれたのか忘れる。アップデートがあるとかそういったものは当然のように忘れる。ということで管理方法などを調べた。

パッケージの管理

まずはpipでできるコマンドから。

パッケージリストの表示

pip list

結果

click (6.6)
cycler (0.10.0)
decorator (4.0.10)
entrypoints (0.2.2)
first (2.0.1)
ipykernel (4.3.1)
略

更新状況を知りたかったらオプションを追加する

pip list --o

更新あるよというパッケージだけが出力される

ipykernel (4.3.1) - Latest: 4.4.1 [wheel]
ipython (5.0.0) - Latest: 5.1.0 [wheel]
jupyter-client (4.3.0) - Latest: 4.4.0 [wheel]
jupyter-core (4.1.0) - Latest: 4.1.1 [wheel]
略

パッケージのインストール

pip install hogehoge

アップグレードは-Uオプションを付ける

pip install hogehoge -U

アンインストール

pip uninstall hogehoge

pip-reviewで一括アップデート

いよいよ一括アップデートの仕方を。pip-reviewを使うと一括でやってくれる。

github.com

pip install pip-review

pipでpip-reviewを入れてから、pip-reviewを実行。

更新があるパッケージを表示

pip-review

微妙に文言は変わるがpip list -oと同じ結果が得られる。

ipykernel==4.4.1 is available (you have 4.3.1)
ipython==5.1.0 is available (you have 5.0.0)
jupyter-client==4.4.0 is available (you have 4.3.0)
jupyter-core==4.1.1 is available (you have 4.1.0)
略

--autoオプションを付けると更新があるパッケージを自動的に更新してくれる。

pip-review --auto

インタラクティブに更新を行う場合は--intaractiveオプションを付けて実行。これは更新する?しない?と聞いてくるので、お好みで更新ができる。

pip-review --interactive

あとはpip-review自体を忘れないようにしないと、、、、

イヤホンを買った

もう何個目かわからないくらいイヤホンは買ってる。といってもオーディオマニアとかそういうのではなく、単純になくすからだ。高いやつでそれをやっちゃうと後悔が大きいので、いつも安めのやつを買うようにしている。Beatsとか買っちゃってなくしたらきっと立ち上がれなくなる。イヤホンは消耗品として割り切るようにしている。

イヤホンに求める条件

オーディオマニアではないといってもささやかながらこだわりがある

  • L型プラグ
  • 赤い
  • 安い

L型プラグは外せない。イヤホンを買い替える理由は無くすというのが不動の一位だが、断線というのもそれに追随している。断線個所する場所はプラグ付近とイヤーピース付近だと思うのだが、そのプラグ付近への断線リスクをL型プラグは低減してくれる。なので、買ったイヤホンをL型じゃないという理由で返品をしたこともある。

その他の理由は個人的な趣味とか懐具合ですね。なぜだかイヤホンは赤という固定概念が昔からありまして買ってきたイヤホンは全部赤いですね。ほかのイヤホンでいいなと思っても赤がカラバリにないというだけであきらめたりもします。安いというのもよくなくすからからという理由で高いのは買いません。予算としては1500~2000円くらいでいつも考えてます。

よっぽどの低品質でなければ音はまったく気にしません。いい音で聴きたい場合はポタアンつけたり、ヘッドホンします。でも家を出る場合は荷物になるのでもっていきません。予算にあげたこのあたりの価格帯ならば聞くに堪えないクソ音を出すイヤホンは無いんで。

オーディオテクニカ CK330M

ということで、今回買ったのはこれ。オーディオテクニカ「CK330M」。価格としては税込で1800円くらいだったと思う。

L型だし、赤いし、安いし最高じゃないですか。さすがオーディオテクニカ。音も問題ない。ただ、コードが固いかな。固いからしまう時に少しコードが暴れてポケットとか、ケースとかに収まってくれない時がある。でもそれは裏を返すと断線に強いという長所なのかも。

ということで、しばらくはこれと付き合っていきます。