PythonでPOSIX タイムスタンプを取得する

2018-09-02
このエントリーをはてなブックマークに追加

リファレンスには「POSIXタイムスタンプ」って書いてあるけど、
呼称としては「UNIXタイムスタンプ」のほうがよく使われてる気がする。

自分のまわりだけだろうか。

from datetime import datetime

_now = datetime.now()

print(_now.timestamp())
print(_now.strftime("%s"))

出力

1535881603.649396
1535881603

ミリ秒まで解釈するかしないかの違い。
datetime.timestamp()はPython3.3からだそうです。

Pythonでバイト配列を16進文字列に変換してまた元のバイト配列に戻す

2018-09-02
このエントリーをはてなブックマークに追加
_v = b'hello world.'
_v_hex = _v.hex()

print(_v_hex)

_v_bytes = bytes.fromhex(_v_hex)

print(_v_bytes)

出力

68656c6c6f20776f726c642e
b'hello world.'

fromhexはPython3.5から。

最初は超長いテキストを圧縮して、さらにstr型として保存しておきたくて調べてたんだけど、圧縮なんてbz2.compressすれば済んじゃうし、さらにテキストの内容によっては圧縮してもよけい長くなるだけだったりしたので要点を残すだけにしました。

Tags:

PythonでジョブをQueueにいれつつMulti Processでさばいていく方法

2017-12-20
このエントリーをはてなブックマークに追加

先日書いた「PythonでたまったQueueをMulti Threadでさばいていく方法」のMulti Process版

ProcessPoolExecutorではプロセス間で通信できないようだったのでmultiprocessingを使って書きました

import time
from datetime import datetime
from multiprocessing import Process, JoinableQueue


def worker(queue):
    while True:
        _job = queue.get()
        if _job is None:
            queue.task_done()
            break

        print(datetime.now())
        print(_job)
        queue.task_done()
        time.sleep(1)

def main():
    _process = []
    _queue = JoinableQueue()
    _docs = ["a", "b", "c", "d", "e", "f", "g"]
    for _i in range(2):
        _p = Process(target=worker, args=(_queue,))
        _p.start()
        _process.append(_p)

    for _d in _docs:
        _queue.put(_d)

    for _i in range(2):
        _queue.put(None)

    _queue.join()

if __name__ == "__main__":
    main()

思っていたよりマルチスレッド版とは違いが出ました

ジョブの投入が終わってからNoneを入れてるのは、「Noneっていうジョブが来たら終了してね」っていうサインを送ったっていう意図です、Queueが空になったくらいじゃ返ってきてくれません

2017-12-20 09:12:35.840879
a
2017-12-20 09:12:35.841184
b
2017-12-20 09:12:36.842196
c
2017-12-20 09:12:36.842427
d
2017-12-20 09:12:37.843443
e
2017-12-20 09:12:37.843636
f
2017-12-20 09:12:38.844696
g

PythonでたまったQueueをMulti Threadでさばいていく方法

2017-12-18
このエントリーをはてなブックマークに追加

Queueにはいったジョブを指定したThread数で順番にさばいていきたいよ、っていうときに使います
あんまり大量にQueueにいれるとメモリからあふれて落ちるんだろうな

import threading
import queue
import time
from datetime import datetime

QUEUE = queue.Queue()


def worker():
    while True:
        _docs = QUEUE.get()
        job_worker(_docs)
        QUEUE.task_done()

def job_worker(docs):
    print(datetime.now())
    print(docs)
    time.sleep(1)
    return None

def main():

    _threads = []
    for _i in range(2):
        _t = threading.Thread(target=worker)
        _t.daemon = True
        _t.start()
        _threads.append(_t)

    _docs = ["a", "b", "c", "d", "e", "f", "g"]
    for _doc in _docs:
        QUEUE.put(_doc)

    QUEUE.join()

if __name__ == "__main__":
    main()

実行するとこんな出力になります、threadがふたつなのでふたつずつ処理されてますね

2017-12-17 17:55:49.769058
a
2017-12-17 17:55:49.769201
b
2017-12-17 17:55:50.770286
c
2017-12-17 17:55:50.770461
d
2017-12-17 17:55:51.771527
e
2017-12-17 17:55:51.771687
f
2017-12-17 17:55:52.772768
g

Python3.6で書いたサンプルです

PythonのSciPyで値の標準化

2017-01-15
このエントリーをはてなブックマークに追加

「平均が0、分散が1」ってやつです。
平均引いて標準偏差で割ればいいので大した計算量ではないのですが、SciPyを使うと関数一発。便利すぎる。

import numpy as np
from scipy.stats import zscore


def main():
    _array = np.array([1, 2, 3, 4, 5])
    _n = zscore(_array)

    print(_n)
    print(np.mean(_n))
    print(np.var(_n))


if __name__ == "__main__":
    main()
$ python standardization.py
[-1.41421356 -0.70710678  0.          0.70710678  1.41421356]
0.0
1.0

PythonでTwitterのStreaming APIを受信する

2017-01-05
このエントリーをはてなブックマークに追加

全Tweetの1%と言われるPublic streamsのsampleを受信してみます。

OAuthやらStreamやら、どう実装するかなーと調べてみるとRequests: 人間のためのHTTP があれば十分なことがわかったし、親切なサンプルコードも書かれてたのであっさり実装できてしまった。

OAuth 1 Authentication

Streaming Requests

import json

import requests
from requests_oauthlib import OAuth1


def main():
    _auth = OAuth1(
        API_KEY,
        API_SECRET,
        ACCESS_TOKEN,
        ACCESS_SECRET
    )

    _stream = requests.get(
        "https://stream.twitter.com/1.1/statuses/sample.json?language=ja",
        auth=_auth,
        stream=True,
    )

    for _line in _stream.iter_lines():

        _doc = json.loads(_line.decode("utf-8"))
        print(json.dumps(_doc, ensure_ascii=False, indent=2))


if __name__ == '__main__':
    main()

日本語のツイートだけ取得したかったのでlanguage=jaを追加しています。Requests便利すぎ。

CentOS7にPython3.6.0をソースからインストールした

2016-12-31
このエントリーをはてなブックマークに追加

久々に新しくec2に私用でインスタンスたてたのでこれまでずっとAmazon Linux使ってたけどCentOS7にしてみた。ついでに先日リリースされたPython3.6.0をインストールしてみました。

cd /usr/local/src/
sudo wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz
sudo tar zxfv Python-3.6.0.tgz
sudo chown -R centos. Python-3.6.0
cd Python-3.6.0
./configure --enable-shared --enable-optimizations
sudo make
sudo make install

「chownはなんのため?」と思われるでしょうが、tarボールを解凍したらパーミッションが501.gamesになっていて触れなかったのでcentosユーザーに変えました。なんでこうなったのかは知らんのですが、同じホストでPython3.5.2のソースコードをDLして試したらパーミッションはcentos.centosだったので、tarした環境の問題なんじゃないかと。

makeとmake installで30分以上待ちました。テストですごい時間かかってた。t2.microだったからなんだろうけど、3.5のころはここまで時間かかんなかった気がするんだよなぁ。

で、このまま起動しようとするとライブラリがみえないっていって怒られるので

sudo vi /etc/ld.so.conf

「/usr/local/lib」を追記

sudo /sbin/ldconfig
$ /usr/local/bin/python3
Python 3.6.0 (default, Dec 31 2016, 00:18:38)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.

無事起動しました。

デフォルトのpythonを置き換えることはしなくて、併存です。どうせvenv使うんだし、それで十分です。最近はpyenv使う人が多いのかもしれないけど、標準でインストールされるvenvで十分なのであれこれインストールしたりはしません。

最近GCPが話題になっていて、AWSよりずっと安いっていう話も聞くんですけど、別にAWSにそんなに不満もないのでまだしばらくはAWS使おうかなと。

scikit-learnのTfidfVectorizerで単語ごとのスコアを取得する

2016-06-17
このエントリーをはてなブックマークに追加
from sklearn.feature_extraction.text import TfidfVectorizer


def main():
    _docs = [
        'A friend to all is a friend to none.',
        'One good turn deserves another.',
        'He who runs after two hares will catch neither.',
        'It’s no use crying over spilt milk.',
        'Time and tide wait for no man.',
    ]

    _v = TfidfVectorizer(analyzer=text_split)
    _score =_v.fit_transform(_docs)

    print(_score.toarray())
    print(_v.get_feature_names())

def text_split(val):
    return val.split(' ')

if __name__ == '__main__':
    main()

$ python tf.py
[[ 0.2773501   0.          0.          0.          0.          0.2773501
   0.          0.2773501   0.          0.          0.          0.          0.
   0.          0.5547002   0.          0.          0.2773501   0.          0.
   0.          0.          0.2773501   0.          0.          0.          0.
   0.5547002   0.          0.          0.          0.          0.          0.        ]
 [ 0.          0.          0.          0.4472136   0.          0.          0.
   0.          0.          0.4472136   0.          0.          0.4472136
   0.          0.          0.4472136   0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.          0.
   0.          0.4472136   0.          0.          0.          0.          0.        ]
 [ 0.          0.33333333  0.          0.          0.          0.
   0.33333333  0.          0.          0.          0.33333333  0.          0.
   0.          0.          0.          0.33333333  0.          0.          0.
   0.33333333  0.          0.          0.          0.33333333  0.          0.
   0.          0.          0.33333333  0.          0.          0.33333333
   0.33333333]
 [ 0.          0.          0.38775666  0.          0.          0.          0.
   0.          0.          0.          0.          0.38775666  0.          0.
   0.          0.          0.          0.          0.          0.38775666
   0.          0.31283963  0.          0.38775666  0.          0.38775666
   0.          0.          0.          0.          0.38775666  0.          0.
   0.        ]
 [ 0.          0.          0.          0.          0.38775666  0.          0.
   0.          0.38775666  0.          0.          0.          0.
   0.38775666  0.          0.          0.          0.          0.38775666
   0.          0.          0.31283963  0.          0.          0.          0.
   0.38775666  0.          0.          0.          0.          0.38775666
   0.          0.        ]]

[‘A’, ‘He’, ‘It’s’, ‘One’, ‘Time’, ‘a’, ‘after’, ‘all’, ‘and’, ‘another.’, ‘catch’, ‘crying’, ‘deserves’, ‘for’, ‘friend’, ‘good’, ‘hares’, ‘is’, ‘man.’, ‘milk.’, ‘neither.’, ‘no’, ‘none.’, ‘over’, ‘runs’, ‘spilt’, ‘tide’, ‘to’, ‘turn’, ‘two’, ‘use’, ‘wait’, ‘who’, ‘will’]

Pythonで標準偏差と偏差値を求めてみる

2016-04-04
このエントリーをはてなブックマークに追加
import numpy as np


def main():

    _v = np.array([35, 40, 45, 50, 100])

    _avg = np.average(_v)
    _std = np.std(_v)
    print(_avg, _std)

    _std_score = (((_v - _avg) * 10) / _std) + 50
    print(_std_score)

if __name__ == "__main__":

    # 偏差値@Wikipedia
    main()
54.0 23.5372045919
[ 41.92767352  44.05196996  46.1762664   48.30056285  69.54352728]

なんで標準偏差は関数があるのに偏差値はないんだろう。
あと、なんで偏差値は50を足すんだろう。0を中央にしてもいいと思うんだ。
学生向けに使うことが多い値だからマイナスというネガティブな値にマッピングされるされるのを避けたのかな。

scikit-learnでトレーニングデータとテストデータを分割する

2016-02-19
このエントリーをはてなブックマークに追加

機械学習させるときに用意したデータの9割を学習用データに、1割をテストデータに使ったりします。その分割を手軽にしてくれます。scikit-learnを使いたくてPython書いてるようなもんです。

from sklearn.cross_validation import train_test_split
import numpy as np

def main():

    _train_x, _train_y, _test_x, _test_y = train_test_split(
        np.array([
            [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
            [1, 1, 0, 1, 0, 1, 0, 1, 0, 1],
            [2, 1, 0, 1, 0, 1, 0, 1, 0, 1],
            [3, 1, 0, 1, 0, 1, 0, 1, 0, 1],
            [4, 1, 0, 1, 0, 1, 0, 1, 0, 1],
            [5, 1, 0, 1, 0, 1, 0, 1, 0, 1],
            [6, 1, 0, 1, 0, 1, 0, 1, 0, 1],
            [7, 1, 0, 1, 0, 1, 0, 1, 0, 1],
            [8, 1, 0, 1, 0, 1, 0, 1, 0, 1],
            [9, 1, 0, 1, 0, 1, 0, 1, 0, 1]
        ]),
        np.array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1]),
        test_size=0.1
    )
    print(_train_x)

if __name__ == "__main__":
    main()

test_size=0.1、で10%をテスト用データとして分割してくれます。

[[0 1 0 1 0 1 0 1 0 1]
 [8 1 0 1 0 1 0 1 0 1]
 [7 1 0 1 0 1 0 1 0 1]
 [4 1 0 1 0 1 0 1 0 1]
 [2 1 0 1 0 1 0 1 0 1]
 [5 1 0 1 0 1 0 1 0 1]
 [6 1 0 1 0 1 0 1 0 1]
 [1 1 0 1 0 1 0 1 0 1]
 [3 1 0 1 0 1 0 1 0 1]]

これだけでシャッフルして指定した割合で分割してくれるからありがたい。