12/12 「電話をかけたほうがいいのかもよ」

PyCharmのアイコンがとってもかわいくてすきだな.

ということで久々にPython.Dial配分のコードを書いていて,たぶん完成したかな.うれしい.

rankdataが整数にならないということ
prpr.hatenablog.jp
ここに書いてある通り,関数rankdataはたしかに便利なのです.しかしいかんせん,同率〇位という順位が生じたとき,そこは小数表示になる.これをfor文の繰り返し指定で使おうとかするとちょっと不便だったりする※.
これを解決するために四捨五入をかけることにした(というか今回は0.5単位の端数しかでてないし,切り上げか切り捨てのどちらかで統一すればいいだけ).

uniqueとかつかってその範囲で繰り返しかけるとかすればそれはそれでいいかも.
spitta8823.hatenablog.com
 
四捨五入
今回は上記のとおりあんまり関係なかったのですがこんな事象が発生するらしいのでメモ.いやそれ四捨五入じゃなくて切り上げになってるやん!みたいなやつ.
qiita.com
 
リストの操作

www.yoheim.net
まとめてくれているのを見つけた.すぐわかんなくなっちゃうからうれしい…
 
データをマージする
Rでいうcbind, rbindみたいなやつを探していたんだけど,

Pandas でデータフレームの結合 (マージ, JOIN) – Python でデータサイエンス


データフレームの結合しかでなかった(ほかのクラスには使えないということ).ひとつならappendとかでくっつけられるんだけどな.


 
csvを読み込む

csv/tsvファイルの読み書き - numpyメモ | mwSoft


間違いなく重要なやつ.numpyに入ってるgenfromtxtかloadtxtを使う.どっちもcsv限定の読み込み関数じゃなくて,区切り文字を指定して読みこむもの.

 

穴あきならgenfromtxtを使う.

np.genfromtxt( "__.csv", delimiter=",", filling_values=0 )

delimiterは区切り文字のこと(csvならカンマ).filling_valuesは,なんにもはいってないセルがあったときに詰めといてくれる文字の指定(ここでは0を入れてくれるように指示している).

 

ヘッダを飛ばしたりしたいならskiprows引数に飛ばしたい行数を入れる.使えるのはloadtxtだけなので注意.

np.loadtxt("foo.csv",delimiter=",", skiprows=1)

 

今回はヘッダをうまく読みだせなくて,どうしたらいいかよくわからなくなってきたので笑,loadtxtでskiplow=1にしといて,

note.nkmk.me

データ名.columns =["  ", "  "]であとからつけちゃった.

 

csvに書き出す

csv/tsvファイルの読み書き - numpyメモ | mwSoft

np.savetxt("___.csv", data名, delimiter=",")

これだけ.

すでに存在しているのと同じファイル名を指定して,そのファイルを開いた状態で実行すると,

fh = open(fname, 'wb')
PermissionError: [Errno 13] Permission denied: '___.csv'

となるらしい.要するにこのままだと上書きはできないから,ファイルを閉じて違う名前にするかどっちか(ほんとはpermissionを与える処理をするのもできるのかもしれないけどまあいいでしょう).

 

結局numpyってなんなのか

import numpy as npでおなじみ.

nonbiri-tereka.hatenablog.com

科学計算の為の基本的なパッケージだそうです
特徴として

①array objectが提供されている(np.array)
②洗練された関数
C++Fortranのコードが利用されている
④よく使う線形代数フーリエ変換、乱数のアルゴリズムがあります。

と記載されています。

因みに計算をさせるとむちゃくちゃ早いです。

 自分でつかってるのはzeros(ちなみに要素値不定でいいならnp.emptyのほうがデータ量が少なくて済むのでよさそう)とか上のcsv読んだり書いたりのやつとか.あとarrayは結構重要なのでは?と思っている.

 

numpy.array

NumPy 配列の基礎 — 機械学習の Python との出会い

np.ndarray は, N-d Array すなわち,N次元配列を扱うためのクラスです. NumPy を使わない場合, Python ではこうしたN次元配列を表現するには,多重のリストが利用されます. np.ndarray と多重リストには以下のような違いがあります.

  • 多重リストはリンクでセルを結合した形式でメモリ上に保持されますが, np.ndarray は C や Fortran の配列と同様にメモリの連続領域上に保持されます. そのため,多重リストは動的に変更可能ですが, np.ndarray の形状変更には全体の削除・再生成が必要になります.
  • 多重リストはリスト内でその要素の型が異なることが許されますが, np.ndarray は,基本的に全て同じ型の要素で構成されていなければなりません.
  • 多重リストとは異なり, np.ndarray は各次元ごとの要素数が等しくなければなりません. すなわち,行ごとに列数が異なるような2次元配列などは扱えません.
  • np.ndarray は,行や列を対象とした多くの高度な数学的操作を,多重リストより容易かつ高速に適用できます. また,配列中の全要素,もしくは一部の要素に対してまとめて演算や関数を適用することで,高速な処理が可能です.

 今回なんでこれが重要だったかというと,多重リストだとセルを結合したままになっちゃうから,一つ一つのセルの中身を取り出すのがよくわかんなくなったから.

 

pandasのデータフレームは便利の巻

Pandas でデータフレームから特定の行・列を取得する – Python でデータサイエンス

行とか列とかで簡単に取り出せる.