はやし雑記

はやしです

データ処理でよく使うPython Snippets

データ処理にPythonをよく使ってるくんさんです。

  • numpy
  • scipy
  • pandas
  • matplotlib
  • Pillow

あたりを使ったデータ処理でよく使うSnippetを書いていきます。 それぞれexampleでjupyter notebookのリンクを付けています。

日々思い付き次第追記していきます。

移動平均

data = np.convolve(np.ones(N) / N, data, mode="same")

これで前後のN/2点を平均化した値が得られます。 ただし、存在しないデータは0で埋められるので、最初と最後は値がおかしくなります。 mode=validにすればデータの数は減りますが、最初と最後がおかしくなる問題は解決できます。

ipynbs/sma.ipynb at master · hayashikun/ipynbs · GitHub

matplotlibでplotする線の色を自由に変える

matplotlibでplotする線の色はcolorの引数に色を渡すことで変えられます。 文字列 or RGBAのtupleを渡せば良いです。

plt.plot(x, y, color="red")

とすれば、線の色は赤になります

グラデーションにするときは、matplotlib.cmを使うと便利です

Colormaps in Matplotlib — Matplotlib 2.2.2 documentation

import matplotlib.cm as cm

for i, y in enumerate(y_list):
    plt.plot(x, y, color=cm.hsv(i / N))

のような感じです。

ipynbs/cm.ipynb at master · hayashikun/ipynbs · GitHub

関数のFitting

関数のフィッティングにはscipy.optimize.curve_fitが便利です。

scipy.optimize.curve_fit — SciPy v1.1.0 Reference Guide

Initial guessのp0はデフォルトでは1なので、係数が1から大きく外れる場合はあまり収束しません。なので、なるべくp0は与えたほうがいいでしょう。

ipynbs/fitting.ipynb at master · hayashikun/ipynbs · GitHub

正規分布(ヒストグラム・フィッティング)

測定誤差とかって正規分布なことが多いですよね。

matplotlibでヒストグラムを表示させるときは、plt.histを使います。

plt.hist(data, bins=20, range=(0, 1), density=True)

binsでビンの個数を指定します。指定しないと10になります。 rangeは何も指定しないと(min(data), max(data))になります。 density=Trueにすると、ヒストグラム積分した面積が1になります。normed=Trueは非推奨になりました。

重要なパラメーターはこれくらいでしょうか。 詳しくは

matplotlib.pyplot.hist — Matplotlib 2.2.2 documentation

正規分布のフィッティングはscipy.stats.normを使います。 使い方は簡単で、norm.fit(data)で平均と標準偏差が得られます。

ipynbs/normal_distribution.ipynb at master · hayashikun/ipynbs · GitHub

display

Module: display — IPython 3.2.1 documentation

いろいろいい感じに表示できます。 多分1番良く使うのはpandas.DataFrameの表示でしょう。

ipynbs/display.ipynb at master · hayashikun/ipynbs · GitHub

バイナリを扱う

測定ソフトウエアが吐くデータってCSVとかだと思うのですが、たまにバイナリを吐いてくるやつがいるんですよね。 それでそのデータの変換はクソ使いにくいソフト限定のときとかあって、マジf**kなんですが、でも大丈夫、Pythonならね。

データの解析はバイナリを読んで頑張るとして、それをPythonで読んだりする方法です。

7.1. struct — バイト列をパックされたバイナリデータとして解釈する — Python 3.6.5 ドキュメント

大抵のことはstructを使えばサクッといけます。

読むときにはstruct.unpack_fromstruct.iter_unpackを使うことが多いかと思います。 書き込むときはstruct.pack_intoでしょう。

ipynbs/binary.ipynb at master · hayashikun/ipynbs · GitHub