こけこっこー

がんばる

urllibでurlから画像ダウンロードするときにタイムアウトを設定する

pythonで画像ダウンロードする方法を調べたら出てきたのが urllib.request.urlretrieve を使う方法だったので、これを使っていました。

課題

しかしながら、たくさんの画像を一度にダウンロードしようとしたときにurllib.request.urlretrieve を使う方法だとタイムアウトをセットできず、 無駄に時間がかかってしまう問題がありました。

解決方法

urllib.request.urlopenタイムアウトをセットできます。 これを使えば問題を解決できそうです。

21.6. urllib.request — URL を開くための拡張可能なライブラリ — Python 3.6.5 ドキュメント

実装

実装は以下のように一度 read() でメモリ上に読み込んでからファイルに 書き込む必要があるみたいです。 timeoutは秒単位で設定できるということなので、10秒でセットしてみました。

try:
    data = urllib.request.urlopen(url, timeout=10).read()
    with open(file_name, mode="wb") as f:
        f.write(data)
except:
    print("failed to download")

うまく動いてそうです。

ReactNativeにFlowを導入しようとして詰まった

静的方解析ツールFlowをReactNativeのプロジェクトに導入しようと思ったらいろいろ詰まったんですが、 解決は驚くほどあっけなかったです。

解決策

ReactNativeは標準でFlowに対応しているので、プロジェクト立ち上げ時に作成される .flowconfig の中に書いてあるバージョンに従って flow-bin をインストールすれば完了です。

.flowconfig の一番下にこんなのが書いてあるはず。

[version]
^0.65.0

なので

npm i flow-bin@0.65.0 --save-dev 

これで良いのです。

この記事を参考にしました。

tomoima525.hatenablog.com

何で詰まったか

Flowの公式インストール方法を参考にしたのが間違いでした。。。 flow.org

これでセットアップして npm run flow すると node_modules/react-native/Libraries の中でたくさんエラーが出ます。

それでおかしいなと思ってここを参考にして.flowconfigいじったり、

stackoverflow.com

その後 npm run flow して出てきた

Cannot resolve module react-native.

みたいなエラーに戸惑ったり。。。

完全に泥沼にハマりました。

matplotlibについて学ぶ

seabornがいいらしいとか書いておきながらですが、kaggleのkernelや世の中の機械学習の記事を 読んでいるとmatplotlibの使い方も知っておかないとなーと思いました。

以下がmatplotlibの公式サイトで、親切にチュートリアルや詳細なドキュメントが用意されています。

Matplotlib: Python plotting — Matplotlib 2.1.0.post440+gc280700 documentation

もちろん詳細な使い方が知りたくなった場合には公式サイトを見るべきですが、お手軽にはじめるには 以下の記事が入門として非常にまとまっていて参考になりました。

bicycle1885.hatenablog.com

seabornでヒートマップを表示してみる

ぱっと見ただけではよくわからないデータの表も、ヒートマップを使えば意味のあるものに見えてくるということもあるでしょう。 seabornにはヒートマップを描くための関数が用意されているので、それを使ってみたいと思います。

seabornには機械学習チュートリアルで良く用いられるデータセットが最初から含まれています。 今回はtitanicのデータセットを使います。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

titanic = sns.load_dataset("titanic") # titanicのデータセット読み込み

sns.heatmap(titanic.corr(),annot=True) # 相関係数のヒートマップを作成
plt.show() # 描画

sns.heatmap()annot=True でセルの中に値を表示することができます。

f:id:monisoi:20171023232201p:plain

とても簡単にヒートマップを表示することができました。

matplotlibのラッパー、seabornで美しくデータ可視化ができるっぽい

seabornというmatplotlibのラッパーライブラリを使用すると、matplotlibよりも簡単に美しいグラフ描画ができるみたいです。

seaborn: statistical data visualization — seaborn 0.8.1 documentation

import seaborn as sns

matplotlibと一緒にimportしてやると、matplotlibで描画したグラフもスタイルがきれいになります。

公式サイトにTutorialとGalleryがあり、順を追って使い方を学ぶことも、使いたいグラフスタイルを逆引きすることもできます。

pandasでグルーピングとカウント

グルーピングはデータの集計に使えます。 例えばtitanicのtraining dataのDataFrameをtrain_dfとして以下のように書くと

train_df.groupby('Sex').max()

こんな結果が得られます。

f:id:monisoi:20171019071859p:plain

train_dfに対してSexでグルーピングしてそれぞれの特徴量の最大値を取得したということです。 最大値が取得できないような特徴量は表示されません。

ただ、全ての特徴量の最大値を取得しても特に意味はないので、 実際に使うときは、どの特徴量を見るのかも指定することでしょう。

train_df.groupby('Sex').max().Age

これで男女それぞれの年齢の最大値だけ取り出せます。

Sex
female    63.0
male      80.0
Name: Age, dtype: float64

また、複数の項目でグルーピングして、かつ、グルーピングに使った項目でカウントしたりもできます。

train_df.groupby(['Sex','Survived'])['Survived'].count()

出力

Sex     Survived
female  0            81
        1           233
male    0           468
        1           109
Name: Survived, dtype: int64

これで男女の生存数の内訳がわかりますね。

titanic生存予測のkernelがすごい

kaggleのtitanic生存予測のkernelのトップにあった。 まとめ方が見やすく、とにかく執念を感じる!

EDA To Prediction(DieTanic) | Kaggle

それぞれの特徴量のタイプ分けから、どうやって解析すべきか、から どのアルゴリズムを使って予測するのが良さそうかまで丁寧に取り扱ってます。