[pandas] 16. 中央値のインデックスを求める

matplotlib

はじめに

最大値、最小値のインデックスを求めるには、pandasの場合、idxmax(), idxmin()がある。しかしながら中央値のインデックスを求めるidxmedian()はない。

ここでは、中央値のインデックスの求め方について説明する。

コード

要素数が偶数個の場合

要素数が奇数個の場合

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

解説

要素数が偶数個の場合

モジュールのインポート

notebook上で表示する行数の最大値を、pd.set_option(‘display.max_rows’, 20)で20行としている。

データの生成

numpy.random.rand(n) で 0 から1 の乱数をn個生成する。ここでは、n=100なので100個の乱数が生成する。
生成したdataをDataFrame化した。

中央値のインデックスをもとめる

最初に、dataからdataの中央値の値を引いた数の絶対値をとって、中央値が最小となる配列を作成して、それを.valuesにより、np.arrayに変換する。

要素数が偶数の場合、中央値は2つの中央値の平均となる。2つの中央値のインデクスをもとめるには、np.argpartitionを使う。使用例は↓を参照。

404 NOT FOUND – サボテンパイソン
サボテンの栽培とpythonに関する技術ブログ

np.argpartition(d_m, 2, axis=0)により、最も小さい要素の配列のインデクスを2個、配列の左側においた配列を生成するので、[0]と[1]にある要素が中央値のインデクスとなる。

最大値、最小値のインデックス

最大値、最小値のインデクスはそれぞれ、idxmax(), idxmin()で求まる。

図示

ax.plot(data.index[m1_ind],data.loc[m1_ind],’yo’,markersize=14,alpha=0.5, label=’median1′)のように、マーカーサイズを大きくして、透明度を0.5にすることで、図中のどの点が中央値であるかをわかりやすく表示している。

凡例については、plt.legend(bbox_to_anchor=(1.05, 1), loc=’upper left’, borderaxespad=0)とすることで、枠外に凡例を設置している。

bbox_to_anchorは凡例の相対的な位置の設定であり、図の枠の左下を(0,0)、右上を(1,1)としたときの相対的な位置を指定する。locはその位置を凡例の枠のどの部分で合わせるかの設定で、ここでは、左上の位置が(1.05,1)に来るように凡例を設定した。
borderaxespadは余白の設定。

要素数が奇数個の場合

要素数が奇数個の場合、中央値はひとつとなる。

その他にnp.where()などによる求め方がある。
中央値が複数ある場合は、np.whereを使ったほうが良い。

参考

matplotlib の legend(凡例) の 位置を調整する - Qiita
凡例を表示するplt.legendには3つのパラメータがあります.bbox_to_anchorlocborderaxespadbbox_to_anchorでは, 凡例の枠の, 図全体に対する…
https://machine-earning.net/article/numpy-where/

コメント