VS CodeのTips

プログラマーのためのVisual Studio Codeの教科書』を読んで、これから使おうと思ったTipsのメモ。

www.amazon.co.jp

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章

  • 拡張機能でGitのPRの管理までVSCode上で完結できる。
  • Remote Development機能は以下の三種類。
    • Remote-SSH
    • Remote-Container
    • Remote-WSL

おすすめ拡張機能

  • 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をつけておくと、{}内の変数を展開して出力。フォーマット指定も可
  • os.subprocessで外部プロセス実行

  • concurrent.futuresで複数タスクを並列実行

10連休に自作PCデビューしてみた記録

はじめに

平成から令和へと変わる10連休、何か新しいことをしようと思い立ち、前々からやりたいと思っていた自作PCデビューをキメました。 組みたいPCの要件としては、

  • webブラウジングしたり動画見たり音楽聞いたり趣味のコーディングしたりするのにストレスない程度の性能
  • 特にゲームしたりするわけではないけどせっかくなのでGPUも組んでみたい
  • 初めてだし、拡張性や組みやすさを考えてATXがいい
  • 光らせてかっこよくしたい(重要)

くらい。
自分がやったことの記録として、とりとめもなく書いていきます。
※あくまで、初心者の自分が調べながらやったことをなんとなく書いているゆるふわ記事です。

参考文献

初の自作でよくわからないので、まとまった情報源として主に以下を参考にしました。
あとはYouTube自作PC動画漁ったりとか。
ドスブイパワーレポートはKindle Unlimited対象なので、加入すればバックナンバー含めて毎月読めます。これだけで元取れますね。

パーツ選定

最終的に選んだものは以下の通り。

  • 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 CPU Ryzen 5 2600 with Wraith Stealth cooler YD2600BBAFBOX

マザーボード

Ryzen第2世代に最適化されているチップセットはAMD400シリーズ(X470、B450)で、その中でもスタンダードモデルにあたるB450がよさそう。
細かいところは正直よくわからんので、そこそこ定番っぽい、比較的安い、というところでMSI B450 GAMING PLUSにする。
YouTubeでもいろんな人が紹介してた気がします。
赤と黒でかっこいい。

メモリ

16GB(8GB × 2)ほしい。
逆にこの条件さえ満たしていればいいかな。
モリークロックが違っても、体感できない程度の違いらしいのでそこまで気にしなくていいかも。
Ryzen5 2600と合わせてる人が何人かいたのでCorsairのCMK16GX4M2A2666C16で。

グラフィックボード

自作PCについて調べてると、つよい人は重いゲームをがっつり楽しむのを目的にクソ高いGPU積んで仕上げてる印象だけど、自分は別にゲームはしないのでそこまで強いのはいらない。
でもせっかくなのでいちおうグラボも用意して組みたい、とかそれくらいのモチベなので、人権が得られる最低限の性能で安いグラボがあればそれでいいかな。
CPUをAMDにするんだからグラボも合わせてRadeonがいい(気がする)。
RX560なら1万くらいで手軽に手が出せそうだしいいかな。
この価格帯でちゃんとしてそうなのが手に入るのはASRockのこれしか見当たらなかったです。

SSD

システムドライブをSSD、データ保存用ドライブをHDDにするつもりなので、SSDの容量は250GBあれば十分。
一番鉄板っぽいCrucialのMX500シリーズでよさそう。

Crucial SSD 250GB 7mm / 2.5インチ MX500シリーズ SATA3.0 9.5mmアダプター付 CT250MX500SSD1/JP

Crucial SSD 250GB 7mm / 2.5インチ MX500シリーズ SATA3.0 9.5mmアダプター付 CT250MX500SSD1/JP

HDD

データ保存用、1TBほしい。
デスクトップ向けとNAS向けに分類されるみたいだけど、自分は基本的に24時間電源入れっぱなしにするので、より信頼性の高いNAS向けがほしい。
SeagateのIronWolfにする。
何より、名前とロゴがクソかっこいい(重要)。

電源ユニット

こだわりなし。
玄人志向、安くていいんじゃないでしょうか? 知らんけど。

ケース

今回、自作PCなんとなくかっこいいからやってみたいみたいなところから始まっているのでガワはある程度こだわりたい。
サイドが強化ガラスで中身が見えるやつがいい。
店頭で実際にいろいろ見てみた結果Sharkoonに行き着く。
TG4 RGBは、サイドだけでなく前も強化ガラスでかっこよく、無駄のないスタイリッシュなデザインで、ちょうどいいコンパクトさで、RGBに光るLEDファンが4つ搭載。
Sharkoonがどれくらいメジャーなのかわからないけど、コレしかないという感じ。

CPUクーラー

Ryzen付属の純正品で十分らしいので特に買いません。

組み立て

届いた! f:id:poco_tkm:20190501223201j:plain

ということで、写真とともに組み立ての流れを書きます。

第一部

パーツ並べるとこんな感じ。 f:id:poco_tkm:20190501225230j:plain

CPU開封f:id:poco_tkm:20190501232003j:plain f:id:poco_tkm:20190501225550j:plain f:id:poco_tkm:20190501231617j:plain

マザボ開封赤と黒のデザインがかっこいい。 f:id:poco_tkm:20190501225621j:plain

CPU取り付け。
今回のCPUクーラーの場合は、まずマザボについてるスペーサー的なやつを外します(もう使わない)。 f:id:poco_tkm:20190501225713j:plain

バーを開けて向きに気をつけてCPU取り付け。 f:id:poco_tkm:20190501225727j:plainf:id:poco_tkm:20190501225739j:plain

CPUクーラーを上に乗せてネジで取り付け。
AMDのロゴが飛び出てる部分がメモリの反対側にくるこの向きが正解っぽい。
けっこう力を入れてぐぐっとやらないとネジがはまらない&ドライバーがファンの縁に当たって非常にネジが締めにくい、で、結構苦労した。
対角線の順序でやるのがいいって誰かが言ってました。 f:id:poco_tkm:20190501232700j:plain

次はメモリ。 f:id:poco_tkm:20190501232729j:plain f:id:poco_tkm:20190501232943j:plain

メモリスロットは4箇所ありますが、2枚の場合は1箇所おきの赤い部分に挿します。 f:id:poco_tkm:20190501233027j:plain

いったんできました。 f:id:poco_tkm:20190501233248j:plain

ここからはケースへの取り付けをやっていきます。
ケース開封。高級感のある強化ガラスがよい感じです。 f:id:poco_tkm:20190501234249j:plainf:id:poco_tkm:20190501234305j:plain

まずは電源ユニット。
これはケーブルが全部ついてて外せないタイプ。安いのはだいたいこうらしい。 f:id:poco_tkm:20190501234419j:plainf:id:poco_tkm:20190501234439j:plain

ケースの下の方にドライバーで固定。
f:id:poco_tkm:20190501234445j:plainf:id:poco_tkm:20190501234456j:plain

次にHDDも下の方につけます。
IronWolf、ロゴがかっこよくて選んだみたいなところあるのにかっこいいパッケージじゃなくてただのダンボールに入った状態で届いてかなしい。
Amazonで買うとこうなの? f:id:poco_tkm:20190501234758j:plain

本体にはかっこいいロゴがついてるのでよしとします。 f:id:poco_tkm:20190501234810j:plain

取り付け方は何通りかあるんですが、ケースの下についてる台の上につけようとするとドライバーの取っ手が引っかかってネジまで届かず断念。もっと長いドライバーが必要だった。
f:id:poco_tkm:20190501235054j:plain

いったん、台の中に収める感じにします(結局これはこれで問題があってあとからつけ直すことになるんですが……)。 f:id:poco_tkm:20190501235109j:plain f:id:poco_tkm:20190501235555j:plain

次、SSDf:id:poco_tkm:20190501235442j:plainf:id:poco_tkm:20190501235454j:plain

側面に直接取り付ける感じ。 f:id:poco_tkm:20190501235708j:plain

パッケージに入ってたこのフレームみたいなのはなんだろうって思ったけど、スペーサーなんですね。
今回は不要。 f:id:poco_tkm:20190501235721j:plain

ここまで取り付けてこんな感じ。
SSDのロゴが上下逆さにならざるを得ないのがちょっと気になる……。 f:id:poco_tkm:20190501235833j:plain

次にいよいよマザボの取り付け。
マザボについてくる端子の出入り口(?)をパチッとはめる。 f:id:poco_tkm:20190502000251j:plain

ネジ9箇所で固定。 f:id:poco_tkm:20190502000148j:plain

だいぶそれらしくなってきたのでは? f:id:poco_tkm:20190502000502j:plain

あとはグラボ。 f:id:poco_tkm:20190502000625j:plainf:id:poco_tkm:20190502000640j:plain

取り付けるためには、まずここの金具を一部取り外す。
コレ大丈夫なのかって不安になったけど、普通にバキッと取っちゃうものなんですね。 f:id:poco_tkm:20190502000850j:plainf:id:poco_tkm:20190502000904j:plain

根本を差し込み、カバーを戻してネジ止めする。 f:id:poco_tkm:20190502001050j:plainf:id:poco_tkm:20190502001102j:plainf:id:poco_tkm:20190502001113j:plain

ここまでで主なパーツ取り付けは完了し、あとは配線。
計画的にやらないとカオスになりがちとは聞いてたけど実際だいぶ大変だった。

電源ユニットから一番太い線をマザボに引っ張り、 f:id:poco_tkm:20190502001551j:plain

CPU用に電源ユニットから線を引っ張り、 f:id:poco_tkm:20190502001405j:plain

SSDには電力供給用とデータ転送用の線をそれぞれ電源ユニットとマザボから引っ張り、 f:id:poco_tkm:20190502001507j:plain

と、ここで……
HDDのケーブル挿すとこ、ケースの端に当たってめっちゃキツい。
これがあとでプチ問題を引き起こすことに。 f:id:poco_tkm:20190502002104j:plain

ほか、ケースについてる4つのLEDファンにも、電源用とLED制御用の線を引っ張る必要があります。
ファンの電源用には4ピンペリフェラルコネクタが必要ですが、この電源ユニットからは3本しか出てないので足りないです。あとで変換名人でも買いましょう。
LEDは、ケースについてるこんな基盤で制御されてるっぽい。 f:id:poco_tkm:20190502002439j:plain

ケース正面のスイッチ・端子からのケーブルも適宜繋いで、ようやく一通り完成(のつもり)。
配線のカオスっぷりよ……。 f:id:poco_tkm:20190502002428j:plainf:id:poco_tkm:20190502002451j:plain

電源繋いで、初のスイッチON。緊張の瞬間。

f:id:poco_tkm:20190502002704j:plain つきました!
LEDが超きれいなピンクで光って感動。
やっぱり光り物は最高だぜ。

ちなみにマザボのロゴも光ります。 f:id:poco_tkm:20190502002829j:plain

第一部完。

第二部

さっきちょっと書きましたが、何が問題だったかというと、
HDDの配置的にケースの端にぶつかってケーブルがまともに挿さらないのです。
無理やり挿してなんとかなった気になってましたが、すぐに抜けてしまう……。 電源入れてもHDDが認識されてなくて気づいた。

仕方ないので、結局HDDの位置を台の下から上に変更。
こんな感じで。 f:id:poco_tkm:20190502003826j:plain

百均で長いドライバー買ってきたら余裕でつけられた。 f:id:poco_tkm:20190502003804j:plain

というわけでこんな風に収まり、ケーブルも無理なく取り付けられるようになりました。
結果的に、クソかっこいいIronWolfのロゴがちゃんと見えるようになったのでよかったのでは? f:id:poco_tkm:20190502003837j:plain f:id:poco_tkm:20190502004137j:plain

最後に、LEDファンの制御方法について……
LEDの光り方を制御するには、マザボにそれ用の端子がついてる場合は、ケースのLED制御基板から線を引っ張って繋げばよいみたいです。
ただ今回購入したGAMING PLUSには対応する端子はなさそう。残念。そこまで調べてなかった。
その場合はどうするかというと、ケースのリセットボタンから伸びてる線をマザボではなくLED制御基板に繋ぐことで、リセット機能を犠牲にして光り方制御機能に置き換えることができます。
こんな感じに、複数の色や光り方パターンを順に切り替えられるようになると。 f:id:poco_tkm:20190505211426j:plain

もっと柔軟に制御したり他のパーツと連動させたりするには、追加でコントローラを買うしかないのかな。

終わりに

満足。 f:id:poco_tkm:20190502005342j:plain

読んだメモ:「Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理 第2版」

はじめに

NumpyとかPandasのまだ知らない機能ってたくさんあるんだろうなと思い立ったので、ざっと眺めて知らなかった便利機能をメモ。
# 最近Pythonあんまり触ってないけど、こういう作業って特にPythonでやることがないこういうときにしかできないよなぁと

1章 はじめに

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のベクトル演算版
  • cumsumcumprod
  • anyall
  • ほか、便利な集合関数がいろいろ
    • 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以外の値も指定可
      • limittoleranceで穴埋めの度合いも指定可
  • 要素指定の際、スライシングでラベルを使うと終点も含む
    • locとilocの挙動も違うことになるので注意
  • 算術メソッド
    • Series、DataFrame同士の算術演算
    • インデックスについては外部結合するイメージ
    • df.add等のメソッドを使えばfill_valueの指定が可能
    • SeriesとDataFrame間の演算も可
  • applyapplymapは便利
  • ソート
    • sort_indexsort_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とかもできる
  • 重複
    • duprecateddrop_duprecatesで判定、削除
    • 一度目の登場以外を重複と判断
      • 最後だけ残すとかも可
  • 置き換え
    • mapの引数には関数だけでなくディクショナリを与えるのも可
    • replaceも使える
  • 軸名の変更
    • インデックスにもmapが使える
    • renameでもいい
  • ビニング
    • cutでbinに分けられる
      • 境界を明示的に指定するのも、等間隔で自動的に分けるのも可
    • qcutで分位点ベースにできるのも便利
  • 外れ値検出・除去は配列操作で普通にやろう
  • df.sampleで行の復元・非復元抽出
  • df.takeはilocと同等
  • get_dummiesは便利
  • 文字列操作
    • 基本的にPython標準の機能で十分
    • reモジュールで正規表現
    • シリーズの文字列属性(str)を使うと、NAを無視してくれたりと便利だったりする

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を計算(金融)
  • 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

  • データをクロージャの外に出す(クロージャ内での変更が外で反映されるようにする)nonlocal
    • global文と補完関係にある
    • 複雑になるとデバッグが難しいので使わないほうがよいかも

#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

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を使ってプロファイル情報を調べる

#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「モデリング

7. 実践ステップ5「評価」、実践ステップ6「展開」

  • 評価・改善を繰り返す

8. 実践ステップ7「データのバリューアップ」

  • 業務知識・関連する知識をフルに活用し、形式的な前処理にとどまらないバリューアップを行う

RStudioインストール(Windows10)

はじめに

Windows 10にRStudioをインストールしたメモです。
環境:Windows10 64bit、R 3.3.3をインストール済み

ダウンロード

公式サイトからRStudio Desktop Open Source LicenseのInstallers for Supported Platformsをダウンロードします。
f:id:poco_tkm:20181013164538p:plain

インストール

インストーラを実行

f:id:poco_tkm:20181013165228p:plain

インストール先フォルダを選択

f:id:poco_tkm:20181013165251p:plain
デフォルトで「次へ」をクリック。

ショートカットを作成するスタートメニューフォルダを選択

f:id:poco_tkm:20181013165839p:plain
デフォルトで「次へ」をクリック。

インストール

f:id:poco_tkm:20181013165614p:plain
f:id:poco_tkm:20181013165642p:plain
完了。