Pythonでの時刻データ変換 3種類

TwitterAPIからクローリングしたデータをDBで管理・検索しやすくするためにタイムスタンプをUNIXタイムで保存しておきたい。
以下、最近Pythonでよく使う時刻データの変換

datetimeオブジェクトからUNIXタイムへの変換

>>> from datetime import datetime
>>> import time
>>> now = datetime.now()
>>> stamp = time.mktime( now.timetuple() )
1328624789.0

UNIXタイムからtimeオブジェクトへの変換

>>> stamp=1328624789.0
>>> time.localtime(stamp)
time.struct_time(tm_year=2012, tm_mon=2, tm_mday=7, tm_hour=23, tm_min=26, tm_sec=29, tm_wday=1, tm_yday=38, tm_isdst=0)

>>> time.gmtime(stamp)
time.struct_time(tm_year=2012, tm_mon=2, tm_mday=7, tm_hour=14, tm_min=26, tm_sec=29, tm_wday=1, tm_yday=38, tm_isdst=0)

日付・時刻を表す文字列からUNIXタイムへの変換

>>> str="20120203"
>>> datetime.strptime(str, "%Y%m%d")
datetime.datetime(2012, 2, 3, 0, 0)

>>> str="2012-02-03 23:41:25"
>>> timeobj=datetime.strptime(str, "%Y-%m-%d %H:%M:%S")
datetime.datetime(2012, 2, 3, 23, 41, 25)

>>> stamp=time.mktime( timeobj.timetuple() )
1328280085.0

Python matplotlibの導入がアレだった件

状況:
ソースビルドしたPython2.7 (--prefix=$HOME/local)

複雑ネットワークの解析とかちょっとした可視化はnetworkxとmatplotlibを使うと楽チンで良い.
virtualenvで$HOME/python2.7に環境作ってpipでnetworkxとmatplotlibを入れようとしたときのハマりログ.
(OS: fedora13 x86_64)

networkxをpipでインストール

$ pip install networkx

これは問題なし、次にmatplotlibのインストール

$ pip install matplotlib

$HOME/python2.7/build/以下にあるmatplotlibのソース内, mpiutils.cppで"vsprintf が undeclaredだよ"というエラー.

いやいや, iostreamとcstdargがちゃんとincludeされてるじゃないすか…
しかたなくiostream → stdio.h, cstdarg → stdarg.h に書き換え.

もういっちょ, ttconv/truetype.h で "FILE なんて知りません" というエラー.
#include を追加

これで表向き, matplotlibのインストールは成功するが、

import matplotlib.pylab

で, "numpy.core.maが見つかりません"というエラー.

pipで入れたnumpyは 1.6.0 なので旧バージョンと今とでは, maモジュールの配置が変わってる.(numpy.core.ma → numpy.ma)

というわけでsite-packages/以下の
matplotlib/numerix/ma/__init__.py
matplotlib/numerix/npyma/__init__.py
のソース内で
"from numpy.core.ma import *" → "from numpy.ma import *"
と修正.

これでnetworkxとmatplotlibを使った簡単なサンプルはすべて動いた.

日本語データの抽出

Google Newsとかのデータを取って解析したいとき、多言語文書の中から日本語のデータだけが欲しいということがよくある。
そこで抽出を試みるワケだけれども、
日本語には漢字ひらがなカタカナが混じっているので、例えばひらがなを含むか否かで判別できる。これはよくやる。

ニュースデータには必ずURLが存在するので、URL → 文書のハッシュを考えると管理しやすい。日本語としてマッチングされなかった記事URLのドメインを保存しておけば次からは文書を見なくても除外できる。

これをTwitterデータでやるとするとどうなるかな。フォローフォロワー関係を見て識別するのが良さそう、文書データが主体のサービスなんだから上手く抽出できると思う。また試してみよう。

だらだら

はいどうも。

OpenMPIをソースからビルドしてサンプルコードをポチポチしてたり、NIPSの論文読んだり、Twitter Streaming APIと格闘した毎日でした。

OpenMPIのソースからのビルド、パスの設定関連は詳しい資料が公開されているのでとてもうれしいんだけどね、
自分の環境ではビルドしたパッケージは全部、$HOME/local 以下に入れてるんだけど共有オブジェクトをldconfigに反映させても -lmpi では見つけてくれないんだよ、なんなのこれ。
結局、-L オプションでパス指定とか残念な応急処置になっちゃったし、解決策はまた探す。

論文は階層ベータ過程のくだりがワケわかんないので土日は関連資料も読んで復習するしかないわな。

Streaming API使ったクローラはちょっと並列化したい。
フラットなものじゃなくて優先度に応じたパラメータの割り振りぐらいまではやりたいな。

Project EulerでPythonを覚える 1

Project Eulerの序盤は正しい解答を出すことが簡単なので, Pythonの文法を覚える.

1. リストの要素すべての合計, reduce と lambda を使う.

seq = [1, 2, 3, 4, 5]

# リスト seq すべての要素の合計.
reduce(lambda x, y: x + y, seq) #= 15

2. リスト内包表記で, if文を併用する.

seq = [1, 2, 3, 4, 5]

# リスト seq の要素から偶数を抽出.
[i for i in seq if (i % 2) is 0] #= [2, 4]

HDD増設

1TBのHDDがもったいなかったので増設、ext4でフォーマット。

# fdisk /dev/sdb
コマンド(mでヘルプ):
n

------------------------------
e 拡張区画
p 基本区画(1-4)
------------------------------
p

------------------------------
区画番号 (1-4):
------------------------------
1

------------------------------
最初のシリンダ (1-xxx, default 1):
------------------------------
1

------------------------------
最後のシリンダ, または +size, +sizeM, +sizeK (1-xxx, default xxx):
------------------------------
+800G

コマンド(mでヘルプ):
w
# mkfs.ext4 /dev/sdb
# mount /dev/sdb ~/storage
# chown -R takayuk ~/storage

RSRubyの導入

Linux & RubyからRSRubyを使ってRのモジュールを使用、例としてFisher検定を行いたい。
RSRubyの導入方法。

RubyとRはソースコンパイルで$HOME/local以下にインストール

Ubuntuデスクトップ(32bit)の場合。

$ wget http://cran.r-project.org/src/base/R-2/R-2.8.1.tar.gz
$ tar xvf R-2.8.1.tar.gz
$ cd R-2.8.1.tar.gz
$ ./configure --prefix=$HOME/local --enable-R-shlib
$ make
$ make install


よくある問題。
F44(fortranコンパイラ)がない。

$ sudo apt-get install gcc42-fortran
$ sudo apt-get install libncl-dev???

Rのコンパイルとインストールが終われば

$ gem install rsruby -- --with-R-dir=$HOME/local/lib/R


これで導入終わり。(2011/1/16 現在)

CentOSサーバ(64bit)の場合。若干、設定を変える。
Xサーバが走っていないサーバマシンに導入するときはグラフ描画関連を省いたので
"--with-x=no" と "--readline=no" を指定した。

$ ./configure --prefix=$HOME/local --enable-R-shlib --with-x=no --readline=no

CentOS 64bitの場合は、$HOME/local/lib64以下にRのライブラリが配置されるみたい。

$ gem install rsruby -- --with-R-dir=$HOME/local/lib64/R

次にFisher検定を手早く試したい。以下のコードはRubyForgeのフォーラムで見つけたもの。

しかしトピック内で言われているようなSIGSEGVは発生せず正常に動作した、修正されたか?

require 'rsruby'

r = RSRuby.instance
r.matrix.autoconvert(RSRuby::NO_CONVERSION)
m = r.matrix([1,2,3,4],:nrow=>2,:ncol=>2)
puts r.is_matrix(m)
r.fisher_test(m)

Rではfisher.testだがRSRubyではfisher_testになるらしい。

なぜか導入方法以外で豊富な日本語tipsが見つからない。

Rなら比較実験のベースラインなんかでよく使われるランダムグラフやコンフィグモデルなども簡単に書ける。