静かなる名辞

pythonとプログラミングのこと

2019/03/22:TechAcademyがteratailの質問・回答を盗用していた件
2019/03/26:TechAcademy盗用事件 公式発表と深まる疑念


Tips

pandasで年月日時刻の列を結合して一列にする(datetime64で)

概要 ローデータ(生データ)を取り込むと、年月日が独立して入っている感じの嫌なデータになっていることがあります。 年,月,日 1996,8,1 1998,12,2 2012,05,3 こういうのは嬉しくないので、できるだけ単一のdatetime風の型に変換しておきたいのですが、意…

【python】UnboundLocalErrorの原因と対処法

はじめに 関数の中で関数の外の変数を操作するようなコードを書いていると、たまに下記のようなエラーが出ます。UnboundLocalError: local variable '***' referenced before assignment 初歩的ですが、意外とまとまった良い解説がないので、記事にしておき…

scikit-learnで重み付きk近傍法(Weighted kNN)を試してみる

はじめに k近傍法には、近傍点の重み付けをどうするかで複数のやり方が考えられます。普通のk近傍点では予測対象の点のkつの近傍点を取ってきて、そのクラスを単純に多数決します。一方で、より近い点にはより大きい重みを持たせるという発想もまた自然です…

【python】キーワード引数と可変長キーワード引数(kwargs)の競合によるエラー

はじめに 既存の関数のwrapperを作るときなど、可変長キーワード引数を使いたいときがあります。 これは通常のキーワード引数と併用できますが、稀に問題になることがあります。 関数定義のとき 定義するときは割と単純で、問題も少ないです。 以下のような…

【python】seabornで棒グラフを信頼区間付きで描く

はじめに 信頼区間付きの棒グラフはよく見かけます。複数グループの差が優位かどうかという議論に向いているからです。 他のツールだと割と簡単に描けるグラフだったりするのですが、Pythonでやろうとするとmatplotlibは勝手に信頼区間を計算してくれません…

Python対話的インタプリタでアンダースコアが便利(誰も知らない機能)

概要 対話モードだとアンダースコアの変数が自動的にできています。最後に評価した結果が入るようです。 >>> 1 + 2 3 >>> _ 3 これはチュートリアルに書いてあったのですが、他の入門記事で触れられているのを見た記憶はまったくありません。私自身も、チュ…

【python】seabornで折れ線グラフを信頼区間付きで描く

はじめに 信頼区間というとなんとなく棒グラフにつけるものという印象がありますが、折れ線グラフでも計算すること自体はたやすくて、しかもけっこうかっこいいグラフになります。 大抵は別に無くても良いのですが、たまに信頼区間が出ていると便利なときが…

【python】sklearnのIterativeImputerで欠損値補完

注意:IterativeImputerは本記事の執筆時点(2019年11月)で実験的な実装とされており、最新の仕様等はこの記事の内容と異なる可能性があります。常にstable版の公式のドキュメントを確認してください。 公式のドキュメント sklearn.impute.IterativeImputer…

【python】sklearnのSimpleImputerで欠損値補完をしてみる

はじめに 欠損値補完(nanの処理)はだいたいpandasでやる人が多いですが、最近のscikit-learnはこの辺りの前処理に対するサポートも充実してきているので、平均値で補完する程度であればかえってscikit-learnでやった方が楽かもしれません。 ということで、…

【python】matplotlibのboxplotで外れ値を表示しないようにする

はじめに matplotlibのboxplotを使うと簡単に箱ひげ図が描けます。ただし、デフォルト設定では外れ値が黒い円で表示されます。 どんなデータでも、サンプル数が多いと一定数の外れ値は出てしまいます。ただ、図を見る人は気にするところですし、外れ値がたく…

matplotlibで図全体にタイトルを付けるにはsuptitleを使う

はじめに matplotlibではよく一つの図の中に複数のグラフを描きます。そうすると全体に共通してタイトルを付けたくなるのですが、普通にやろうとしても個別のAxesに対して呼んでしまいがちです。 図全体に対してタイトルを付けるには、suptitleを使います。m…

matplotlibでAxesを真っ白にする(x軸とかy軸なんかを消して非表示にする)

matplotlibでAxesを真っ白にする(x軸とかy軸とか目盛りなんかを消して非表示にする) matplotlibでsubplotsを使って適当にグラフを並べるのはよくある処理だと思います。しかし、きれいに長方形で配置できないときもあります。タイル状に作るので、場合によ…

【python】機械学習でpandas.get_dummiesを使ってはいけない

「pandasのget_dummiesでダミー変数が作れるぜ」という記事がとてもたくさんあって初心者を混乱させているのですが、これは「データ分析」には使えても「機械学習」には向きません。もう少し正確に言い換えると「訓練データからモデルを作り、未知のデータの…

【python】クラスを関数として使う

はじめに クラスはcallされたら自分のクラスのインスタンスを返さないといけないと思っていませんか? 一般論としてはその通りなのですが、Pythonではそうしないメカニズムも用意されています。 __new__を使えば割となんでもできます。もっとも、実用的な用…

【python】scikit-learnで大規模疎行列を扱うときのTips

はじめに 自然言語処理などで大規模疎行列を扱うことがあります。一昔前はNLPといえばこれでした(最近は低次元密行列で表現することのほうが多いですが)。 疎行列はその特性をうまく生かして扱うとパフォーマンス上のメリットが得られる反面、うかつにdens…

【python】itertools.chainを使って複数のiterableを一つにまとめる

概要 複数のiterable(リストとか)を結合させてループさせたいときがあります。 >>> lst1 = [1, 2, 3] >>> lst2 = [4, 5, 6] >>> # 1, 2, 3, 4, 5, 6というループをやりたい 連結すればできたりしますが、余計なメモリを確保するのでスマートではないし、パ…

【python】namedtupleはすごい(きもちわるい)

namedtupleは存在は知ってたけど、使い方を知ったら「すげえ(きめえ)」という感想にしかならなかったので、記事に書きました。

list, tuple, dict, setの基本的な使い方、相違点、使い分け、応用など

pythonでよく使う組み込みのコレクション型には、list, tuple, dict, setなどがあります。ただ、なんとなく使っている、いつもlist、それぞれ微妙に使い勝手が違って困る、という人も多いと思います。そこで、これらについて解説します。

【python】code.pyも作っちゃだめだよという話

概要 実行時カレントディレクトリにcode.pyを置いておいたら訳のわからない落ち方をした。 現象 なんかimportしたらまともに動かなかった。調べると、pytest→pdb→codeという流れでimportして、自作のcode.pyはエラーが出るコードだったのでそこで止まってた…

【python】標準データ型での二次元配列の表現あれこれのアクセス速度

はじめに 俗に言う「二次元配列」をpythonで表現しようとすると、listのlistで書くというのが一番最初に思いつくやり方だと思います。 速度のこととか考えるとどうやるのがいいのか? ということは実はあまり知らなかったので、この際いろいろ試してみます。…

【python】numpyが入ってない標準Pythonでnanをゲットする方法

はじめに nanの値を取得したいときは、普通はnumpyを使うと思います。 >>> import numpy as np >>> np.nan nan まあ、そんなシチュエーションそもそもあまりないという話ですが。じゃあ、numpyがないときは? 即答できる人はあまりいないと思います。 リテラ…

【python】bool(nan)とかnanをastype(bool)するとTrueになるので気をつけよう

なんのことなのか タイトルの通りです。 >>> import numpy as np >>> bool(np.nan) True >>> np.array([np.nan]).astype(bool) array([ True]) いやまあ、確かにPythonの言語仕様上そうなんですが、釈然としない気も・・・ なんで困るのか 0かそれ以外かをそ…

TypeError: list indices must be integers or slices, not ***等の原因と対処法

はじめに pythonを触り始めたばかりの人は、よくこんなエラーに遭遇すると思います。 TypeError: list indices must be integers or slices, not *** ***の部分はfloatだったりlistだったりstrだったりといろいろありますが、とにかくこんなエラーです。 ま…

sklearnで正則化回帰(Ridge, Lasso, ElasticNet)するときはCV付きのモデルがいいよ

はじめに 正則化回帰は割と定番のモデルなのですが、sklearnのAPIリファレンスをよく見ると、CVが末尾についたモデルがあることがわかります。 Lasso→LassoCV Ridge→RidgeCV ElasticNet→ElasticNetCV API Reference — scikit-learn 0.21.2 documentation な…

【python】相関係数行列をstatsmodelsを使って描く

はじめに 相関係数行列を描く方法としては、pandasとseabornを使う方法などが一般的です。しかし、statsmodelsで行う方法も実は存在します。pandas+seabornでやる場合 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seabo…

pythonで相関係数を計算する方法いろいろ3種類

はじめに pythonで相関係数を計算する方法はいろいろあります。確認したら、主要ライブラリだけで3つありました。 いろいろあるということは用途によって使い分けられるということなので、淡々と書いていきます。 なお、念のために断っておくと、ここで書い…

Pythonプロセスの自分自身のメモリ使用量を調べる

簡単なテストや処理をしているとき、Pythonプロセス自身のメモリ消費量を計算したくなるときがある。やり方を知らなかったけど、頑張って検索したら出てきたのでメモ。 import os import psutil process = psutil.Process(os.getpid()) print(process.memory…

nltkでテキストを文・センテンス単位で分割する

概要 自然言語処理やテキストマイニングをしていると文単位で処理・分析したいということはたまにあるので、テキスト(複数文)→センテンス(単一の文)という変換をしたくなることがあります。 英語の場合は、nltkを使うと簡単です。 nltk.sent_tokenizeで…

numpyでnanを含む配列の同値性をちゃんと計算する

はじめに 2つのnumpy配列が同一であるかどうか調べたいシチュエーションは、ままあるでしょう。 で、こうする訳です。 >>> import numpy as np >>> a = np.array([1,2,3]) >>> b = np.array([1,2,3]) >>> (a == b).all() True すべての要素同士を比較して、…

sklearnの変数選択は疎行列型(csr_matrix)でやると速いっぽいよ

はじめに 疎行列はメモリ消費こそ少ないものの、scikit-learnで使うと内部でnumpy配列に変換されたりしてあまり恩恵を受けられないことが多いです。 でも、変数選択に使うときはどうやら効くっぽいです。 関連記事 scikit learnのモデルに疎行列(csr_matrix…