ひよこ、通勤中。

通勤中の電車の中でひよこは何を思うのか。

関数の引数を固定した関数を作る

functools.partialを使うと引数を固定した関数を作ることができる。

例えば以下のような引数を2つ受け取る関数args2を、functools.partialを使って1つ目の引数aを固定したargs1を作ると以下のような感じに使える。

import functools

def args2(a, b):
    print(f"a:{a} b:{b}")

args1 = functools.partial(args2, 'a')
args1('b')
# a:a b:b

しゃべる英語めも

日常会話

  • 平凡な mediocrity
  • がんばる
    • 努力する strive
    • もがき苦しみながらがんばる struggle
  • しようとしている I'd try to ~
  • XX時ならいいよ Any time after/before XX is fine.

自己紹介

  • はじめまして(ビジネス) Pleased to meet you
  • {NAME}って呼んでね you can call me {NAME}

食べ物

  • もやし bean sprout
  • なす egg plant

モデルを学習させるときのスクリプトテンプレート in Python

  • 標準出力とファイルのログを書き出す
  • 好きなコア数で並列処理する
  • デバッグ中はデータ数少なくしたい

みたいなときこんな感じでかいたの使ってる

import time
import argparse
import logging
import multiprocessing
from pathlib import Path

logger = logging.getLogger(__name__)
fmt = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s')
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.DEBUG)
stream_handler.setFormatter(fmt)
logger.setLevel(logging.DEBUG)
logger.addHandler(stream_handler)
logger.propagate = False


def main(args):
    logger.debug('log test')
    pass


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--limit', default=None, type=int, help='Max data size')
    parser.add_argument('--log', default=None, type=str,
                        help='Path to log file.')
    parser.add_argument('--cpu', default=multiprocessing.cpu_count(), type=int)
    args = parser.parse_args()
    if args.log is not None:
        path = Path(args.log)
        path.parent.mkdir(parents=True, exist_ok=True)
        handler = logging.FileHandler(path, 'w')
        handler.setLevel(logging.DEBUG)
        logger.addHandler(handler)

    start = time.time()
    main(args)
    t = time.time() - start
    logger.info(f'Time: {t / 60:,.0f} min {t % 60:,.0f} sec')

ひらがな <-> カタカナ in pandas

import pandas as pd


def katakana_to_hiragana(text):
    d = {i: i - 0x60 for i in range(ord('ァ'), ord('ァ') + 86)}
    return text.str.translate(d)


def hiragana_to_katakana(text):
    d = {i - 0x60: i for i in range(ord('ァ'), ord('ァ') + 86)}
    return text.str.translate(d)


s = pd.Series(['あいう', 'アイウ', 'あqwせdrftgyふじこlp;'])
katakana_to_hiragana(s)
# 0                 あいう
# 1                 あいう
# 2    あqwせdrftgyふじこlp;
hiragana_to_katakana(s)
# 0                 アイウ
# 1                 アイウ
# 2    アqwセdrftgyフジコlp;

DaskでDataFrameをpartitionに分けて並列処理

Install

$ pip install "dask[complete]"

各partitionごとに何かを計算してmergeするイメージ

import pandas as pd
import pandas as pd
from dask import dataframe as dd


def func(series):
    return pd.DataFrame({
        'min': [series.min()],
        'median': [series.median()],
        'sum': [series.sum()]})


# 分割処理したいオブジェクト
s = pd.Series(list(range(100)))

# Daskに変換(npartitions:分割数)
ds = dd.from_pandas(s, npartitions=4)

# 帰ってくるデータの型を定義して
meta = pd.DataFrame({
    'min': [0],
    'sum': [0],
    'median': [0]})

# 計算の設定
res = ds.map_partitions(func, meta=meta)

# 計算の実行
d = res.compute(scheduler='processes')

print(d)
#    median  min   sum
# 0    12.0    0   300
# 0    37.0   25   925
# 0    62.0   50  1550
# 0    87.0   75  2175

dockerメモ

コンテナ起動

$ docker run -d -it ubuntu:16.04 bash

※ ubuntu:16.04はdockerイメージ名

コンテナのターミナルに接続

$ docker exec -it ${CONTAINER_ID} bash

コンテナの状態をコミット

$ docker commit ${CONTAINER_ID}

タグ付け

$ docker tag ${commit番号} ${REPOSITORY}:${TAG} #例 test:latest

イメージの削除

$ docker rmi ${REPOSITORY}:${TAG} 

docker imagesで確認できる

Docker Imageを保存/読み込み

保存

$ docker save -o ファイル名  ${REPOSITORY}:${TAG}

読み込み

 $ docker load < ファイル名