VS CodeのTips
『プログラマーのためのVisual Studio Codeの教科書』を読んで、これから使おうと思ったTipsのメモ。
1章
- ZENモード(ctrl+K→Z)でエディタ部分のみ表示して集中。
- ワークスペースごとにカラーテーマを変えると、複数プロジェクトを並行したりする際に区別しやすくて便利。
- ctrl+shift+Lで同じ単語を全選択、ctrl+Dで同じ単語を一つずつ選択(追加)。
- 軽く置換とかするときはctrl+Hよりも早いかも。
- ctrl+K→ctrl+0でソースのたためる部分をすべてたたむ。ctrl+K→ctrl+Jですべて展開。
- ctrl+shift+\で対応する括弧にカーソル移動。
4章
- エディタで選択した部分をコマンドパレットから「run selected text」でターミナルで実行できて便利。
- F12で定義へ移動(ctrl+クリックとほぼ同じ)。
- shift、altと組み合わせるピーク(チラ見)機能も便利。
- ctrl+shift+Oで特定のシンボルに移動。
- F2でシンボル名の変更。
- デバッグ時、ログポイントを作成すると実行を止めずにログを出せる。
5章
おすすめ拡張機能
- indent-rainbow
- Excel Viewer
- 業務でどうしてもエクセルを開かないといけない時便利かも
Pythonでちゃんと実装するメモ
はじめに
Python適当に書いたことしかない人生だったので、ちゃんとした実装を眺めてみて、知らなかった機能とか作法とかに関する気づきを自分用にメモする。
以下、箇条書き
- ログ出力
- loggingで、出力するログレベル(DEBUG 〜 CRITICAL)や出力ファイルパス等を制御する
import logging if __name__ == '__main__': logging.basicConfig(level=logging.INFO)
os.name
で、実行しているOSの種類を判別文字列系
- raw文字列
- 文字列の前に
r
をつけておくと、エスケープシーケンスを無視させられる
- 文字列の前に
- f文字列(3.6以降)
- format()みたいなことが簡単にできる
- 文字列の前に
f
をつけておくと、{}
内の変数を展開して出力。フォーマット指定も可
- raw文字列
os.subprocess
で外部プロセス実行- 情報: subprocess.runの引数について - †MASAYOSHI†のオンラインメモ帳
capture_output
は3.7以降でのみ対応しているので注意
concurrent.futures
で複数タスクを並列実行
10連休に自作PCデビューしてみた記録
はじめに
平成から令和へと変わる10連休、何か新しいことをしようと思い立ち、前々からやりたいと思っていた自作PCデビューをキメました。 組みたいPCの要件としては、
- webブラウジングしたり動画見たり音楽聞いたり趣味のコーディングしたりするのにストレスない程度の性能
- 特にゲームしたりするわけではないけどせっかくなのでGPUも組んでみたい
- 初めてだし、拡張性や組みやすさを考えてATXがいい
- 光らせてかっこよくしたい(重要)
くらい。
自分がやったことの記録として、とりとめもなく書いていきます。
※あくまで、初心者の自分が調べながらやったことをなんとなく書いているゆるふわ記事です。
参考文献
初の自作でよくわからないので、まとまった情報源として主に以下を参考にしました。
あとはYouTubeで自作PC動画漁ったりとか。
ドスブイパワーレポートはKindle Unlimited対象なので、加入すればバックナンバー含めて毎月読めます。これだけで元取れますね。
DOS/V POWER REPORT (ドスブイパワーレポート) 2019年5月号[雑誌]
- 出版社/メーカー: インプレス
- 発売日: 2019/03/29
- メディア: Kindle版
- この商品を含むブログを見る
パーツ選定
最終的に選んだものは以下の通り。
- CPU:AMD Ryzen5 2600
- マザーボード:MSI B450 GAMING PLUS
- メモリ:Corsair CMK16GX4M2A2666C16
- グラフィックボード:ASRock PG Radeon RX560 2G
- SSD:Crucial MX500 SSD(250GB)
- HDD:Seagate IronWolf(1TB)
- 電源ユニット:玄人志向 KRPW-N600W/85+
- PCケース:Sharkoon TG4 RGB
- CPUクーラー:CPU付属のやつ
全部、Amazonで新品で買って8万円弱でした。
中古とか探してもそんなにいいの見つからなかった。
以下、選んだときの気持ちを順番に。
CPU
intelにするかAMDにするか?
ゲームならintelが強いけどそれ以外に関してはAMDの方がコスパ高いらしい。
AMDのほうが対応マザーボードが安いらしい。
AMDの方が通っぽくてかっこいいしAMDにしよう。
せっかくだしGPUは別で組みたいと思ってるので内蔵GPUはいらない。
ある程度の必要十分な性能とコスパを兼ね備えたRyzen5 2600あたりがいいかな?
2600Xにすると消費電力が結構上がってしまうらしい。
OCとかはよくわからん。
AMD CPU Ryzen 5 2600 with Wraith Stealth cooler YD2600BBAFBOX
- 出版社/メーカー: AMD
- 発売日: 2018/04/19
- メディア: Personal Computers
- この商品を含むブログを見る
マザーボード
Ryzen第2世代に最適化されているチップセットはAMD400シリーズ(X470、B450)で、その中でもスタンダードモデルにあたるB450がよさそう。
細かいところは正直よくわからんので、そこそこ定番っぽい、比較的安い、というところでMSI B450 GAMING PLUSにする。
YouTubeでもいろんな人が紹介してた気がします。
赤と黒でかっこいい。
MSI B450 GAMING PLUS ATX ゲーミングマザーボード [AMD B450チップセット搭載] MB4527
- 出版社/メーカー: MSI COMPUTER
- 発売日: 2018/07/31
- メディア: Personal Computers
- この商品を含むブログを見る
メモリ
16GB(8GB × 2)ほしい。
逆にこの条件さえ満たしていればいいかな。
メモリークロックが違っても、体感できない程度の違いらしいのでそこまで気にしなくていいかも。
Ryzen5 2600と合わせてる人が何人かいたのでCorsairのCMK16GX4M2A2666C16で。
CORSAIR DDR4-2666MHz デスクトップPC用 メモリモジュール VENGEANCE LPX Series 8GB×2枚キット CMK16GX4M2A2666C16
- 出版社/メーカー: Corsair
- 発売日: 2015/08/01
- メディア: Personal Computers
- この商品を含むブログ (2件) を見る
グラフィックボード
自作PCについて調べてると、つよい人は重いゲームをがっつり楽しむのを目的にクソ高いGPU積んで仕上げてる印象だけど、自分は別にゲームはしないのでそこまで強いのはいらない。
でもせっかくなのでいちおうグラボも用意して組みたい、とかそれくらいのモチベなので、人権が得られる最低限の性能で安いグラボがあればそれでいいかな。
CPUをAMDにするんだからグラボも合わせてRadeonがいい(気がする)。
RX560なら1万くらいで手軽に手が出せそうだしいいかな。
この価格帯でちゃんとしてそうなのが手に入るのはASRockのこれしか見当たらなかったです。
ASRock ビデオカード Radeon RX560搭載 3モード切替モデル PG Radeon RX560 2G
- 出版社/メーカー: ASROCK
- 発売日: 2018/07/05
- メディア: Personal Computers
- この商品を含むブログを見る
SSD
システムドライブをSSD、データ保存用ドライブをHDDにするつもりなので、SSDの容量は250GBあれば十分。
一番鉄板っぽいCrucialのMX500シリーズでよさそう。
Crucial SSD 250GB 7mm / 2.5インチ MX500シリーズ SATA3.0 9.5mmアダプター付 CT250MX500SSD1/JP
- 出版社/メーカー: Crucial(クルーシャル)
- 発売日: 2018/01/09
- メディア: Personal Computers
- この商品を含むブログを見る
HDD
データ保存用、1TBほしい。
デスクトップ向けとNAS向けに分類されるみたいだけど、自分は基本的に24時間電源入れっぱなしにするので、より信頼性の高いNAS向けがほしい。
SeagateのIronWolfにする。
何より、名前とロゴがクソかっこいい(重要)。
Seagate IronWolf 3.5" 1TB 内蔵ハードディスク HDD 3年保証 6Gb/s 64MB 5900rpm 24時間稼動 PC NAS向け ST1000VN002
- 出版社/メーカー: SEAGATE
- 発売日: 2016/09/16
- メディア: Personal Computers
- この商品を含むブログを見る
電源ユニット
こだわりなし。
玄人志向、安くていいんじゃないでしょうか? 知らんけど。
玄人志向 NEXTシリーズ 80 PLUS Bronze 600W ATX電源 KRPW-N600W/85+
- 出版社/メーカー: 玄人志向
- 発売日: 2015/05/29
- メディア: Personal Computers
- この商品を含むブログを見る
ケース
今回、自作PCなんとなくかっこいいからやってみたいみたいなところから始まっているのでガワはある程度こだわりたい。
サイドが強化ガラスで中身が見えるやつがいい。
店頭で実際にいろいろ見てみた結果Sharkoonに行き着く。
TG4 RGBは、サイドだけでなく前も強化ガラスでかっこよく、無駄のないスタイリッシュなデザインで、ちょうどいいコンパクトさで、RGBに光るLEDファンが4つ搭載。
Sharkoonがどれくらいメジャーなのかわからないけど、コレしかないという感じ。
Sharkoon製 RGBLEDファン4基搭載の高コストパフォーマンスミドルタワーケース TG4 RGB 日本正規代理店品
- 出版社/メーカー: Sharkoon
- 発売日: 2019/02/07
- メディア: 付属品
- この商品を含むブログを見る
CPUクーラー
Ryzen付属の純正品で十分らしいので特に買いません。
組み立て
届いた!
ということで、写真とともに組み立ての流れを書きます。
第一部
パーツ並べるとこんな感じ。
CPU開封。
CPU取り付け。
今回のCPUクーラーの場合は、まずマザボについてるスペーサー的なやつを外します(もう使わない)。
バーを開けて向きに気をつけてCPU取り付け。
CPUクーラーを上に乗せてネジで取り付け。
AMDのロゴが飛び出てる部分がメモリの反対側にくるこの向きが正解っぽい。
けっこう力を入れてぐぐっとやらないとネジがはまらない&ドライバーがファンの縁に当たって非常にネジが締めにくい、で、結構苦労した。
対角線の順序でやるのがいいって誰かが言ってました。
次はメモリ。
メモリスロットは4箇所ありますが、2枚の場合は1箇所おきの赤い部分に挿します。
いったんできました。
ここからはケースへの取り付けをやっていきます。
ケース開封。高級感のある強化ガラスがよい感じです。
まずは電源ユニット。
これはケーブルが全部ついてて外せないタイプ。安いのはだいたいこうらしい。
ケースの下の方にドライバーで固定。
次にHDDも下の方につけます。
IronWolf、ロゴがかっこよくて選んだみたいなところあるのにかっこいいパッケージじゃなくてただのダンボールに入った状態で届いてかなしい。
Amazonで買うとこうなの?
本体にはかっこいいロゴがついてるのでよしとします。
取り付け方は何通りかあるんですが、ケースの下についてる台の上につけようとするとドライバーの取っ手が引っかかってネジまで届かず断念。もっと長いドライバーが必要だった。
いったん、台の中に収める感じにします(結局これはこれで問題があってあとからつけ直すことになるんですが……)。
次、SSD。
側面に直接取り付ける感じ。
パッケージに入ってたこのフレームみたいなのはなんだろうって思ったけど、スペーサーなんですね。
今回は不要。
ここまで取り付けてこんな感じ。
SSDのロゴが上下逆さにならざるを得ないのがちょっと気になる……。
次にいよいよマザボの取り付け。
マザボについてくる端子の出入り口(?)をパチッとはめる。
ネジ9箇所で固定。
だいぶそれらしくなってきたのでは?
あとはグラボ。
取り付けるためには、まずここの金具を一部取り外す。
コレ大丈夫なのかって不安になったけど、普通にバキッと取っちゃうものなんですね。
根本を差し込み、カバーを戻してネジ止めする。
ここまでで主なパーツ取り付けは完了し、あとは配線。
計画的にやらないとカオスになりがちとは聞いてたけど実際だいぶ大変だった。
電源ユニットから一番太い線をマザボに引っ張り、
CPU用に電源ユニットから線を引っ張り、
SSDには電力供給用とデータ転送用の線をそれぞれ電源ユニットとマザボから引っ張り、
と、ここで……
HDDのケーブル挿すとこ、ケースの端に当たってめっちゃキツい。
これがあとでプチ問題を引き起こすことに。
ほか、ケースについてる4つのLEDファンにも、電源用とLED制御用の線を引っ張る必要があります。
ファンの電源用には4ピンペリフェラルコネクタが必要ですが、この電源ユニットからは3本しか出てないので足りないです。あとで変換名人でも買いましょう。
LEDは、ケースについてるこんな基盤で制御されてるっぽい。
ケース正面のスイッチ・端子からのケーブルも適宜繋いで、ようやく一通り完成(のつもり)。
配線のカオスっぷりよ……。
電源繋いで、初のスイッチON。緊張の瞬間。
つきました!
LEDが超きれいなピンクで光って感動。
やっぱり光り物は最高だぜ。
ちなみにマザボのロゴも光ります。
第一部完。
第二部
さっきちょっと書きましたが、何が問題だったかというと、
HDDの配置的にケースの端にぶつかってケーブルがまともに挿さらないのです。
無理やり挿してなんとかなった気になってましたが、すぐに抜けてしまう……。
電源入れてもHDDが認識されてなくて気づいた。
仕方ないので、結局HDDの位置を台の下から上に変更。
こんな感じで。
百均で長いドライバー買ってきたら余裕でつけられた。
というわけでこんな風に収まり、ケーブルも無理なく取り付けられるようになりました。
結果的に、クソかっこいいIronWolfのロゴがちゃんと見えるようになったのでよかったのでは?
最後に、LEDファンの制御方法について……
LEDの光り方を制御するには、マザボにそれ用の端子がついてる場合は、ケースのLED制御基板から線を引っ張って繋げばよいみたいです。
ただ今回購入したGAMING PLUSには対応する端子はなさそう。残念。そこまで調べてなかった。
その場合はどうするかというと、ケースのリセットボタンから伸びてる線をマザボではなくLED制御基板に繋ぐことで、リセット機能を犠牲にして光り方制御機能に置き換えることができます。
こんな感じに、複数の色や光り方パターンを順に切り替えられるようになると。
もっと柔軟に制御したり他のパーツと連動させたりするには、追加でコントローラを買うしかないのかな。
終わりに
満足。
読んだメモ:「Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理 第2版」
はじめに
NumpyとかPandasのまだ知らない機能ってたくさんあるんだろうなと思い立ったので、ざっと眺めて知らなかった便利機能をメモ。
# 最近Pythonあんまり触ってないけど、こういう作業って特にPythonでやることがないこういうときにしかできないよなぁと
1章 はじめに
- statsmodels
- 古典的な統計アルゴリズムをサポートする
- ARIMAとか
2章 Pythonの基礎、IPythonとJupyter Notebook
- IPythonのイントロスペクション
- 変数の前後に「?」で情報が見れる
- IPythonで
%run
、%load
- 知ってるけど
%debug
とか%timeit
とかも非常に便利
- 知ってるけど
- 文字列はimmutable
3章 Python組み込みのデータ構造と関数、ファイルの扱い
a,b=b,a
で簡単にswap- タプルの一部を取り出す
*rest
collections.defaultdict
- セット内包表記、ディクショナリ内包表記
- ジェネレータ
itertools
にもgroupby
がある
4章 NumPyの基礎:配列とベクトル演算
- arrayとndarrayって何が違うのって思ってたけど……
- array関数がndarray型を返すということ
- numpyで扱うのは基本ndarrayで、arrayとかarangeとかみんなndarrayを返す
np.where
x if condition else y
のベクトル演算版
cumsum
、cumprod
any
、all
- ほか、便利な集合関数がいろいろ
unique
など
- 行列積は
dot
だけでなく@
でも書ける(3.5以降)
5章 pandas入門
- Seriesとは:「インデックスとデータ値がマッピングされた固定長の順序付きディクショナリ」と捉えられる
- ディクショナリからの変換も可能
- インデックスが異なるSeires同士の算術演算も可能
- Seriesはname属性を持つ
- DataFrameとは:「シリーズをバリューとして持つディクショナリ」と捉えられる
- 各列が一つのシリーズで、インデックスを全体で共有しているイメージ
- 1段階ネストしたディクショナリをもとにDataFrameを作ることも可能
- DataFrameの行・列のインデックスにname属性を与えるとそれぞれ表示される
df.values
で、中身だけ取り出したndarrayができる- インデックスオブジェクトについて
- immutable
- 配列に似ているが集合としての機能も持ち、様々なメソッドが使えるので便利
- 重複値も許す
reindex
- 与えたインデックスに既存の値がない場合はデフォルトでNA
method='ffill
で前方に穴埋めbfill
なら後方fill_value
でnan以外の値も指定可limit
、tolerance
で穴埋めの度合いも指定可
- 与えたインデックスに既存の値がない場合はデフォルトでNA
- 要素指定の際、スライシングでラベルを使うと終点も含む
- locとilocの挙動も違うことになるので注意
- 算術メソッド
- Series、DataFrame同士の算術演算
- インデックスについては外部結合するイメージ
df.add
等のメソッドを使えばfill_value
の指定が可能- SeriesとDataFrame間の演算も可
apply
、applymap
は便利- ソート
sort_index
かsort_values
rank
で順位を返すこともできる
- 集計
mean
とかsum
skipna
で、NAを無視するか指定idxmax
で最大値を持つインデックスを返すargmax
で最大値を持つインデックス位置を返すpct_change
でパーセント変化
isin
なんかも便利pandas_datareader
を利用してデータを取得できる
6章 データの読み込み、書き出しとファイル形式
- 「複雑になりすぎた」
- 区切り文字の指定(正規表現も可)
- NAとみなす文字の指定(列ごとに別でも可)
- スキップする行の指定
TextFileReader
を使う(chunksize
を指定)と少しずつ読み込める- 一度だけなら
nrows
でも指定可
- 一度だけなら
- Python組み込みのcsvモジュールがある
- json、html、xmlの扱い、バイナリデータ、エクセル、webAPI、DBについて
- 必要になったら読む
7章 データのクリーニングと前処理
- 欠損値
dropna
で削除- howとかaxisとか指定
- threshも指定可(その行に何個以上NAがあったら削除するか、など)
fillna
で穴埋め- 列ごとに別の値も可
- methodの指定で
ffill
とかもできる
- 重複
duprecated
、drop_duprecates
で判定、削除- 一度目の登場以外を重複と判断
- 最後だけ残すとかも可
- 置き換え
map
の引数には関数だけでなくディクショナリを与えるのも可replace
も使える
- 軸名の変更
- インデックスにもmapが使える
- renameでもいい
- ビニング
cut
でbinに分けられる- 境界を明示的に指定するのも、等間隔で自動的に分けるのも可
qcut
で分位点ベースにできるのも便利
- 外れ値検出・除去は配列操作で普通にやろう
df.sample
で行の復元・非復元抽出df.take
はilocと同等get_dummies
は便利- 文字列操作
8章 データラングリング:連結、結合、変形
- リストのリストの形で階層型インデックスを指定できる(名前も別々に指定可)
- set_indexとreset_indexで列をインデックスにしたり戻したり
- 複数指定して階層型インデックスも可 − dropパラメータでもとのインデックスを残すかどうか指定
- mergeでSQLライクに結合
- keyの両方に重複値がある場合は直積
- インデックスをkeyとしたいときはleft_indexまたはright_indexをTrueにする
- concatでも連結
df1.combine_first(df2)
- df1の中のNAを対応するdf2の要素で補う
- stack、unstackでピボット
- 階層型インデックスのSeriesとDataFrameを行き来
- DataFrame同士も
- ピボットする階層を指定できる
- stackの際にdropnaを指定できる
- pivot、meltでもデータの縦持ち・横持ちを行き来
9章 プロットと可視化
- # 必要に応じて調べよう
- # 以下は特に有益
10章 データの集約とグループ演算
- groupbyには属性名だけでなく同じ長さの配列も指定可
- for文でgroupbyの結果を回せる
- axis=1も指定可
- ディクショナリを与えて複数属性をグループ化することもできる
- 関数を与えるのも可(その関数をインデックスに与えた結果でグループ化される?)
- 集約関数として、自分で定義したものも与えられる(aggで指定)
- 複数列に複数の関数を適用したい場合も柔軟にできる
- as_index=Falseを指定可
- groupby().apply()を使うのが一番柔軟
- 様々な例を紹介(略)
- pivot_table、crosstabなんかもある
11章 時系列データ
- インデックスがdatetimeの場合、インデックスの型はDatetimeIndexクラスになる
- 年を指定するだけで範囲指定できたりとかいろいろといい感じに解釈
- pd.date_rangeで一定頻度のDatetimeIndexを生成
- 頻度はデフォルトで日ごとだが、いろいろ指定可能(営業日、とかも)
- shift
- デフォルトでは、インデックスはそのままで値をずらす
- 与えた幅だけ、DatetimeIndexごと動かすこともできる
- タイムゾーン関係のテクニックもいろいろある(めんどくさい)
- 「期間」を表すことのできるPeriodクラスがある
- resampleが便利
- ダウンサンプリングは、resampleをgroupbyのように使うイメージ
- ohlc:open、high、low、closeを計算(金融)
- ダウンサンプリングは、resampleをgroupbyのように使うイメージ
- rollingで窓関数を用いた集約ができる
- 移動平均を求めるのに便利
- データ数または期間を指定できたりする
- expandingというのもある(拡大する窓関数)
- 重みをつけたりもできる?
12章 pandas:応用編
- Categorical型
- 基本的に操作は同じだが、パフォーマンスの改善が見込める
- cutで返される区間はカテゴリ型だったりする
- groupby().transform()
- applyと比べて多少制約がかかるが、高速になる場合がある(組み込み関数を用いる場合)
- TimeGrouperによって、特定のkey(インデックスである必要がある)と時系列によるresampleを同時に行える
- assignで列を増やす
- pipeでメソッドチェーンを書く
f(df)
はdf.pipe(f)
と同じ
# いったんここまで
読んだメモ:「Effective Python」
Effective Python(第1版)
特に学びがあった事項だけ雑多にメモ。
1. Python流思考(Pythonic Thinking)
#4
map.get(...)
:- マップから第一引数のキーに対応する値を、キーが存在しない場合は第二引数の値を返す
#5
assert 条件式
で、条件が満たされないときにAssertionErrorを投げる
#7
- 辞書や集合も、リスト内包表記のような書き方で定義できる
#9
- 大きいリストやストリームに対してリスト内包表記のような処理をしたいときはジェネレータ式を使う
- 書き方はほぼ同じ([] -> ())だが、リストではなくイテレータを返す。
- そもそもイテレータ、ジェネレータについての解説
#10
- enumerateは第二引数でカウンタのデフォルト値を指定できる
#12
- for、whileループのあとのelseブロックは使うべきではない
- 便利なのに……
#13
- tryのあとはcatch、finallyだけでなくelseも使える
- catchされる例外が怒らなかったときのみ実行
2. 関数
#14
- 使わない変数を
_
と書く記法がある(慣習?)
#15
#16
- ジェネレータを使おう
- イテレータは
list(itr)
で簡単にリストに変換もできる
#17
#18
*args
で可変個数の位置引数を受け取れる- 「位置引数」:与えるときの位置で区別する引数。<->「キーワード引数」
#20
- キーワード引数に動的な値(現在時刻とか)をデフォルト値として入れたいときは、とりあえずNoneにしておくのがよい
- コード内で
is None
で判定して明示的に入れる(ちゃんとコメントに示す)
- コード内で
#21
- 「キーワード専用引数」を使うことができる
- 関数呼び出し時、キーワード引数は位置引数としても(キーワードを指定しなくても)与えることができるが、バグの原因になりうる
- キーワード専用引数として定義すれば、キーワードを明示的に書くことを強制できる
3. クラスと継承
#22
- collections.namedtupleで、名前付きのタプル(値の変更不可)を作れる
- うまく使うと便利だが、自分でクラス定義したほうがいい場合も
#23
- 関数を引数に与えて振る舞いを制御する仕組みを「hook」という
- sortにキーを制御する関数を渡すとか
- クラスにも
__call__()
を定義するとcallableになってhookとして使えるようになる
#24
- 理解できず
#25
- 親クラスを初期化するには常に
super
を使うべき - ダイヤモンド継承してるときには実行順序に注意(MROで定義される)
#26
- 多重継承はなるべく使わず、mix-inを使うべき
- mix-inについては理解できず
#27
- プライベート属性(
__value
)は基本的に好ましくない- 内部的な変数名を変えて(クラス名を頭につけて)クラス外から同じ名前で呼び出せないようにしているだけ(!)なので、この仕組を理解していれば容易にアクセスできてしまう
- 注意をうながすためにプロテクテッド属性(
_value
)を使う - プライベート属性が役立つのは子クラスで同じ名前の変数が定義されないか警戒するときのみ
#28
- コンテナ型を自分でカスタムして新しいクラスを作りたいときはcollections.abcを継承する
- 定義が必要な特殊メソッドを教えてくれる
- 例えば、シーケンスに添え字でアクセスしたときは内部的には
__getitem__()
メソッドが呼び出されていたりするため
- 自分で一から実装しなくても大丈夫なら、既存のコンテナ型(listやdictなど)を継承すれば十分
4. メタクラスと属性
#29
- 基本的に、メンバーのsetter、getterは実装せず、パブリックにアクセスできるようにするのがpythonic
- 必要な場合は、
@property
デコレータとそれに対応するsetter属性をマイグレートする
#_
5. 並行性と並列性
#_
6. 組み込みモジュール
#42
- デコレータで、ある関数を別の関数で修正する
- 引数、返り値を実行ごとにprintする機能を付け加えるとか
- 関数をwrapする関数を作るためのデコレータとして
@wrap
がある- (内部的に認識される)関数名を変更しないので嬉しい
#46
- 便利な組み込みデータ構造がいろいろあるので活用する
- 両端キュー、順序つき辞書、デフォルト値を指定できる辞書、二分探索など
#47
- 数値の精度を求めるときはDecimalを使う
7. 協働作業(コラボレーション)
#49
- 関数、クラス、モジュールには
"""
で囲ったドキュメントをちゃんと書こう- このドキュメントは
__doc__
メソッドを呼び出すことでプログラム内からも参照できる
- このドキュメントは
#_
#53
- 仮想環境を構成するにはpyvenvを使うのがよい
- python3.4以降なら標準で使える
- 結局ベストなのはどれ?
pip freeze
でrequirements.txtを自動的に作れる
8. 本番運用準備
#55
- デバッグの際には
print(obj)
よりもprint(repr(obj))
の方が、型の違いがはっきりするので適している
#56
- unittestモジュールを使うなどしてちゃんとテストをするべき
- モックを使う場合はunittest.mockモジュールもある
#57
- プログラム中に1行、
import pdb; pdb.set_trase()
を入れると、その部分から直接対話型デバッガを起動できる
#58
- 速度低下の原因を、組み込みのプロファイラを使って調べる
- profileモジュールよりもcProfileモジュールのほうがよい
#59
- tracemallocモジュールを使って、メモリリークの原因を調べる
Effective Python 第2版
第2版を読んだので改めて雑多にメモ。 重複もあるが気にしない。
#10
- 代入式
a:=b
:- 条件式内で代入を行えるので、値のチェックと変数としての利用で処理が重複するのを防げて便利
#26
- 関数のデコレータを書く際は、functools.wraps ヘルパー関数を使う
- こうしないと、docstring などのメタデータが引き継がれないという不具合が生じる
#36
- 組み込みモジュールの itertools にはイテレータ、ジェネレータ関連の便利な関数がたくさんある
- 異なる長さに対応する zip_longest など
#39
- クラスメソッドを使うことで、クラスレベルのポリモーフィズムを実現
#44
- setter や getter を不必要に用意せず、クラス属性に直接アクセスするのが pythonic
- 必要な場合は、@property デコレータと組み合わせて型検査付き setter みたいな機能を作れる
#46
- クラス属性にsetter・getterとしての処理を追加したいときは、基本的には@propertyを使えばよい
- クラス内の複数の属性に対して、setter・getterとして同じ処理を使いまわしたいときは、「ディスクリプタ」となるクラスを定義して使うのがよい
- 実装には結構注意点がある
#47
- オブジェクトの属性へのアクセスや設定を遅延的に(オブジェクト自体を定義した後から?)行いたい場合、以下の仕組みを活用する
- クラスに
__getattr__
が定義されている場合、存在しない属性アクセスが発生した際にこれが呼び出される - クラスに
__getattribute__
が定義されている場合、属性アクセスの際に常にこれが呼び出される - クラスに
__setattr__
が定義されている場合、属性への値の設定時に常にこれが呼び出される
- クラスに
#48
type
を継承した「メタクラス」を定義することで、例えばサブクラスの定義に問題がないかのチェックといったメタな視点での動作をサブクラス定義と同時にさせられる- しかしメタクラスを実際に使った実装は大変なので、同等なチェックを親クラスに
__init_subclass__
を定義することで実現できる
#66
- contextlibの@contextmanagerデコレータを使って、with文を独自に作ることができる
- 一時的にログレベルの閾値を変えるなど
#68
- かっちりしたプログラムでpickleを使うときは、copyregの利用を検討する
- オブジェクトの後方互換性を考慮するなど
#69
- 丸め誤差等も考慮して精度の良い正確な値を扱いたいときはDecimalを使う
- 正確な値が欲しいときは、Decimalをstrで初期化する
#70
- 高速化したいときは、cProfileを使ってプロファイル情報を調べる
- profileモジュールよりもcProfileモジュールのほうがよい
#75
- repr でオブジェクトの型情報等もわかりやすくして print デバッグする
- ちなみに、
f'{var!r}'
はf'{repr(var)}'
と等価
#76
- unittest の TestCase の基本的な使い方について
- subTest を用いて、1 つのテストメソッドの中で複数のケースをまとめてチェックできる
#77
- テストの、モジュールレベルの前後処理を setUpModule, tearDownModule で、メソッドレベルの前後処理を setUp, tearDown で行う
- たとえば TemporaryDirectory モジュールは仮のディレクトリ、ファイルを入出力テストに使う際に便利そう
#80
- プログラム中で pdb モジュールの
breakpoint()
を呼ぶだけで、デバッガを開始できる
#85
__init__.py
と__all__
によってパッケージ定義
#87
- ライブラリ作成時には、そのライブラリ内で共通の例外を表すルート例外クラスを作成し、ライブラリ内で発生させる例外はすべてルート例外を継承するようにするとよい
- これにより、ライブラリ利用者はルート例外を catch すればよくなる
読んだメモ:「データ前処理の極意」
データ前処理の極意
1. AI、IoTが日本で進まない本当の理由
2. なぜデータの前処理が必要なのか?
- IoT時代に用いるフィールドデータに対しては、従来の"前処理"以上に高度な処理が必要
- ”データクレンジング"はいわゆる従来の前処理を指す
- 名寄せ、形式合わせ、欠損値処理など
- IoT時代はさらに、
- 特徴量生成なども
- ”データクレンジング"はいわゆる従来の前処理を指す
- データの"バリューアップ"
- データ把握(異常値の把握、可視化)
- データ加工(状態分離、移動平均など)
3. AI、IoTにおけるデータ活用プロセス
- CRISP-DM(CRoss Inductry Standart Process for Data Mining):データ活用の標準プロセス
- 「経験から得た現場ノウハウ」コラムがリアルで面白い
- エクエルデータが全部図
- 夜間自動実行でサーバリソース食いつぶす
4. 実践ステップ1「ビジネスの理解」、2「データの理解」
- 基本的な統計用語、可視化手法の説明
- 意味もなく分析しまくってもダメ
- 高度な機械学習とかしなくても、可視化だけで十分わかることはある
5. 実践ステップ3「データの準備」
- データの取捨選択
- 欠損値処理
- 欠損値の意味を考えて
- その他、よくある前処理について
- データがエクセルで投げられたりしてしんどかった
6. 実践ステップ4「モデリング」
- 「ディープラーニングは4層以上のニューラルネットワークのこと」
- そうなんだ……
- プロファイリング:クラスタリングの結果を見て、意味を分析する
- 「ジニ係数」は場面によって定義が変わるので注意
7. 実践ステップ5「評価」、実践ステップ6「展開」
- 評価・改善を繰り返す
8. 実践ステップ7「データのバリューアップ」
- 業務知識・関連する知識をフルに活用し、形式的な前処理にとどまらないバリューアップを行う