PyCon 2016 参加ノート (カンファレンス2日目)

先日に引き続き、2日目の聴講ノートです。

f2pyとmatplotlibを用いたブラウン粒子動力学のリアルタイム可視化

  - 話者について
    - 理論物理で博士をとった
    - ベンゼンの分子の構造計算など
  
  - Pythonとの出会い
    - Software Designで1997年に出会う
  
  - An examples of embedding python
    - OCTA: an integrated sim system for soft materials
      - COGNAC, PASTA, SUSHIm MUFFIN, GOURMET
      - 物理仮想実験室
    - 土井正男先生による
  
  - ToC
    - ブラウン運動
    - f2py
    - matplotlib
      - 同じことをするのに行くと幾通りのやり方がありいまいち。
      - tutorealsはあるが、basic notationsが限定的!!
    - Qt Designer + PyQt + matplotlib
  
  - ブラウン運動の前に…
    - PM2.5とは?
      - 10^-6〜10^-5cmの
      - def. ug/m^2
    - PM2.5は気体分子間にすっぽり収まらない(小さい)ため、ブラウン運動をする
    - 微分できない動きをする… 粒子が小さいことがessential
    - Diffusion of small particles
  
  - Dislin?
    - Max Planck研究所の開発したライブラリ
    - Fortranとリンクできる希少な描画ライブラリ
    - マルチプロットでのいい感じなレイアウトや、インタラクティブプロットは厳しい
  
  - Fortranの現状
    - 動的メモリアロケーションが可能に
    - モジュール
    - 数値計算のrecommendationができた
  
    - G95はメンテされてないんでgfortranをつかおう(or Intel, CUDA, ...)
  
  - f2pyとは
    - Numpyの一部
      - 今もメンテされている
    - Fortranのブリッジ
    
  
  - matplotlibのアーキテクチャ
    - Scripting layer
    - Artistic layer
    - Backend layer
    
  - リアルタイム描写テクニック
    - ion, ioff (OSX)
    - pause method (将来的にAPI変更されるかもよ)
    - event method
    - timer method
    - animation method
  
  - MatplotlibにはGUIのwidgetがあるけどFAQに書いてない!!!
  
  - PyQtについて
    - 多くのGUIツールがPythonをサポートしている
    - なかでも、QtはDesignerがある

Pythonで実現する4コマ漫画の分析・評論

  - 「情熱駆動開発」
  
  - Pythonと評論と4コマ漫画
    - データを集める
    - 機械学習でさらにデータを集める(検討中)
    - 分析をする
  
  - 評論とは:「作品への新しい読み方を提示して、作品と作家と読者に新しい道を拓く」
  
  - コマの切り出し・コマにいる人物のラベリング・その後の分析 → Pythonが良いのでは?
  
  - 4コマにおけるデータ
    - 各コマ
      - 人物
      - 吹き出し 
      - セリフ
      - 背景
      - コマ感のつながり
    - 扉絵
    - 柱ネタ
    - その他、表紙、カラーページ等
  
  - データ処理フロー
    - PDF化→PNG化→コマ単位PNG化
  
  - コマ化
    - 直線検出だとあまりうまくいかない
    - @non_117による平均画素置誤差法の発明
    - 縦横それぞれの方向に画素値の平均を取る
    - 平均画素値が低い(黒い部分が多い)ところに枠線がある
    - 枠を超える表現などのため、paddingを大きめに付けて切り出す
    - 柱ネタが枠にかぶるなどのケースの防止のため、上記処理を再度行う。
  
  - 処理高速化
    - np.averageをつかうとforつかうよりずっと速い
  
  - セリフ抜き出し
    - 縦書きの日本語を抜き出すため、Google Cloud Vision APIを利用
    - とぎれとぎれに帰ってくるのは、形態素解析をした結果で帰ってくる
  
  - 今後の展望
    - 人物認識
    - アニメ顔検出器である程度行けそう
    - 吹き出し検出
    - 背景判断
      - 教室?部屋?
      - スクリーントーンパターン
      - 無背景
    - 人物配置・カメラワークの分析

  - まとめ
    - 評論は人のためならず
    - 情熱駆動開発は泥臭い
  
Q&A

  - データ自体の活用の今後の展望は?
    - ゆゆしきらしさ、みたいな概念を抽出し、ゆゆ式らしきマンガの生成などを行いたい。

Pythonで入門するApache Spark

  - 狙い
    - Sparkの基礎的な特徴を理解
    - Pythonからの利用方法
    - SparkSQLとMLinを理解
  
  - Spark概要
    - 高速・多目的
    - タスクスケジューリングや障害復旧などの一般的な問題をカヴァー
    - インメモリ処理で速い
      - c.f. MapReduceはMapごとび中間データを吐く
      - もちろん reduceなどでは必要だが
  
  - 多様なAPI
    - Python, Scala, Java, R
    - 2.6+, 3.4+, PyPy2.3+
  
  - Spark is, is not
    - is: 大規模データの分散処理フレームワーク
    - is not: 分散ファイルシステム (HDFS)
    - is not: リソーススケジューラ (YARN, Mesos)
    - is not: 小規模なデータ処理ツール
  
  - なぜSparkか
    - わかりやすいインタフェース
    - 高速
    - 多様なライブラリ
    - 従来のHadoopスタックが利用可能
    - 情報の多いコミュニティ
  
  - Spark使用事例について
    - サイトの行動ログからユーザをセグメントに分ける
      - 人手を介さず、自動でいい感じにやりたい。
    - ユーザの行動ログからK-meansでクラスタリングをし、セグメント判定する
      - ユーザの閲覧ページカテゴリ傾向などを特徴量に
  
  - Spark Core API
    - Jupyterから使ってみよう
  
    - sc = SparkContext
    - scつくってメソッドチェーンしていく (pymongoとかに似てる?)
    
    - RDDにノードとデータが入っている。
    - ユーザはRDDのみ意識すれば良い
    
    - map, filterが呼ばれても、新たなRDDオブジェクトが作られる
      - 実際の処理は遅延する
  
  - SparkSQL
    - JSON, CSV, RDBなどにSQLでクエリできる
    - DataFrame...pandasの同名クラスと似てる。
  
  - DataFrameのメソッド
  - データリソース
    - JSON, CSV, HiveTableなどなど
  - SparkSQLのメリット
    - SQLで書く場合、Spark固有APIを触れなくて済む
    - RDDよりDataFrameを使って可読性があげられる
    - オプティマイザが入り処理が最適化される
      - DataFrameが論理プラン・実行プラン・JVMのバイトコードを吐き、その間に最適化してくれるので
  
  - MLib
    - Sparkで機械学習を行うためのライブラリ
      - spark.ml, spark.mlinという2つのAPIがあるので注意。公式は今後、前者を推す。
    - パイプラインAPI
      - よくある処理フローを表現するためのAPI
      - API構成要素
        - Transformer
        - Estimator
        - Pipeline (=Transformer, Estimatorを組み合わせてつくる)
  
  - MLibサンプル
    - UCIのスパムメースデータから
    - Transformer, Estimatorはデフォルトでかなりいろいろはいってる (ロジスティック回帰など)
  
  - ほか
    - GraphXやSpark Streamingなど調べると良いよ
    - Driver, Executorなどについて調べるとよいよ

pandasによる時系列データ処理

  - 目的
    - 時系列データ分析のための効率的データ処理を知る
  
  - pandasとは
    - データ構造/前処理/集計を持つライブラリ
    - PANel Data System
  
  - pandaをつかうメリット
    - 現実の汚いデータに対応
    - 直感的な操作
    - 高速
      - pandas internals @ PyConJP 2015
  
  - データ構造
    - 1次元 Sriel
    - 2次元: DataFrame
    - 2次元: Panel
  
  - DataFrame
    - 行列にラベルを持つ
    - 列ごとに型をもつ
  
  - Pandasの希望
    - グループ化、変形、入出力、柔軟な時系列データ処理、可視化
  
  - 環境
    - Python 3.5.2, pandas 0.19.0, statsmodels 0.8.0
  
  - 時系列データの処理
    - 時系列データ: 一定周期or連続のデータ
    - しかし現実では...
      - 必要な周期が異なる
      - 周期的でない
      - 時間ラベルがない
    - 生データ → 時系列データにする
  
  - 時系列データの準備
    - ラベルSeriesとDataFrameを自分で組む例...
  
    - データに日時のラベルを与えたい
      - pd.date_range
      - frequency stringで周期を柔軟に指定できる
      - 週(X曜日開始)がつくれたり、強力
    - 任意の日時フォーマットをパースしたい

  - データ選択
    - スライスを使える
    - 日付文字列はdatetimeオブジェクトと同等
    - 月までしか渡さないと、その月をすべて選択
    ― df.index.monthなどといった選択ができる
  
  - 日時データの前処理
    - 日時の周期を変えたい
      - リサンプリング
      - 正規乱数の累積和(ランダムウォーク)
      - ダウンサンプリングだけでなく、アップサンプリングもできる
    - 欠損値を保管したい
      - データにNaN(np.nan)を含む場合
      - interpolate (バックエンドはscipyのinterpolateを利用)
      - ウインドウ関数(rolling)...resampleと同じく集約メソッドをチェインできる
      - シフト(.shift)値を指定したperiodsだけずらす (前後の値との比較計算などに有効)
      - diff = df - df.shift()と同じ
      - シフトの使いみち: 

  - 集計
    - 日時を含む生データを集計したい
    - pd.Grouper
      - df.groupbyでキー+freqなど複雑なクエリでグループ化し、sumをとる、など
  
    - pivot_tableでクロス集計ができる
  
  - カレンダー
    - pd.tseries.offsets.CustomBusinessDay
      - 祝日を考慮した処理
    - japandas ... JapaneseHolidayCalendarなどがある
    
  - 時系列データの統計モデル
    - 時系列の関係を調べる
      - 
    - 将来の予測をしたい
    - 変化点/異常値を検知したい
    
    - 時系列データの留意点
      - ある時点以前のデータからの影響がある?(例: 株価)
      - 季節性・トレンドがある?
  
  - パッケージ
    - StatsModels v. PyFlux
  
  - サンプルデータ
    - AirPassengers
    - 月次の国際線搭乗人数
    - 単位量、トレンドと季節性を持つ
    
  - 時系列を、トレンド、季節性、残差に分解
    - sm.tsa.seasonal_decompose(df)
    
  - 相関
      - 標本自己相関 (ACF)
        - 1, 2, ...前からどれだけ影響受けてる???
        - sm.tsa.graphics.plot_acf
      - 標本偏自己相関 (PACF)
        ―sm.tsa.graphics.plot_pacf
      
      - 例えばホワイトノイズなら相関なし
  
  - SARIMAモデル
    - 自己回帰和分移動平均モデル (ARIMA)
  
  - res_seasonal.forecastで将来予測
  
  - 開発ロードマップ
    - pandas 1.0
      - APIを凍結予定
      - LTS
    - pandas 2.0
      - Python 3.0
      - 2次元以下に特化
      - 内部をC++に移行

Q&A

  - numpyとpandasの使い分け
    - ファイルから読み、ひととおりの前処理が終わった段階でvaluesでnumpy形式にすると良い
  - PythonとRのメリットデメリット
    - 一貫して書きたいならPython、高度なモデルを利用する場合はR

型ヒントについて考えよう!

  - 型ヒントとは
    - Pythonにおける標準化された型アノテーション
    - (ジェネリクスも使えるがちょっとゴツい?)
  
  - 背景
    - Pythonは動的型付けで高速開発/プロトタイピングが楽
    - しかしランタイムエラーは避けたい
      - 大規模プロジェクト
      - 科学計算・機械学習 (型検査)
    
    - 型検査につかえるツール
      - mypy
      - PyCharm
      - Reticulated Python
        - 静的だけでなく、ランタイム型検査もできる
  
    - c.f. 関数アノテーション
      - 関数のパラメータ・戻り値のアノテーション (PEP3107) (Python 3系のみ)

    - ドキュメンテーション
      - 型情報がドキュメンテーションに必要(特に大規模では)
      - c.f. Sphnx
    
    - Gradual Typing
      - Siek and Tahaにより 2006に提案
      - 静的/動的型付けを混在
      - PEP483, What is Gradual Typing
      
  - 型ヒントの基礎
    - Python 3.5で導入
    - 関数アノテーションを利用して記述
    - 関数アノテーションは何書いても良い
      - PEP484は強制ではない
    
    - 変数に形を書きたい場合、Type Comments (# type: xxx)と書いていた
      - Python 3.6より v: xxx = ...と書ける
    
    - .pyiファイル
      - 関数のシグネチャのみ別ファイルに切り出して記述できる (stub file)
    
    - 使える型
      - Callable, TypeVar, Generics, Any, Optional, Union, Iterable, ....
      
    - 型ヒントのよいところ
      - 同一の型ヒントを使いまわせる
      - 必須でない
      - CPythonは無視する
      - パフォーマンスを上げない
      - 後方互換あり
    
    - 後方互換…
      - 単なるファイルひとつ
      - Python 3.x, Python 2.7で使える
      - 2.7では、Type Commentsで書く
  
  - 型ヒントに利用できるツール
    - mypy
      - PEP484に影響を与えた
      - 開発中
      - pylint, flake8とともに使える
    - typeshed
      - stub fileのリポジトリ
      - 標準ライブラリやサードパーティライブラリをホストする
    - PyCharm
      - 型チェックやコード補完など
      - インラインでチェック、イケてる!
    - Sphinx
      - docstringの既存のアノテーションをサポート
      - こいつもtype hintsをサポートしてる
      
  - 他言語との比較
    - JS: TypeScript
      - JavaScriptのsuperset
      - 静的型チェッカ+コンパイラ
      - Definitely Typed
        - 1000以上ものライブラリへの型情報がある
    - JS: Flow
      - 型注釈なしでも利用できることをうりにしている(型推論を利用)
      - //@flowが付与されたメソッドのみ型チェックする
    - PHP: Hack
      - PHPに型の情報やラムダなどを付加した言語
      - HHVMで動く (PHP, Hackを動かせる)
        - 型情報を使って実行高速化する

  - まとめ
    - TypeScriptは良さそう
    - しかし標準化されていないのでリスクがある
    - 後方互換性ない (Hackなど)

Q&A

  - PreConditionとPostConditionで型チェックできるかも?