pyplot 時系列のデータをCSVから読み込んで表示するサンプルコード

ちょっとマニアックかもしれませんが、時系列のデータをcsvから読み込んでグラフにします。
pyplotはmatplotlibというライブラリの中にある、Pythonのグラフを書く機能です。

グラフ大好き。pyplot好き。₍ᐢ⑅•ᴗ•⑅ᐢ₎♡

グラフにするcsvは、例えば次のようなデータのcsvです。x軸もy軸も時間なので、ちょっと変わってるかもしれませんね!

10:10:52  4:21:05
10:10:52 4:08:56
10:10:52 4:08:56
10:10:54 4:52:52
10:10:54 5:19:17
10:10:54 5:19:17
10:10:55 3:58:04
10:10:55 4:09:11
10:10:55 3:58:04
10:10:56 4:12:34
10:10:57 3:58:51
10:10:57 4:12:34
10:10:57 3:16:06
10:10:58 3:41:25
10:10:58 3:16:06
10:10:59 4:34:48
10:10:59 4:58:54
10:10:59 4:34:48
10:11:00 5:08:33

上記をtest_csv.csvという名前で保存したとして、次のようにコードを書きます。

 

import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime as dt

df = pd.read_csv('G:/test/test_csv.csv', names=['num1', 'num2'])

xlist = [dt.strptime(d, '%H:%M:%S') for d in df['num1']]
ylist = [dt.strptime(d, '%H:%M:%S') for d in df['num2']]


plt.plot(xlist, ylist, marker="o")
plt.show()

次のような図が表示されます。

ヒャッハー 楽しい~⊂(^-^)⊃

さてさて、時系列データの悩みと言えば、数が多いことですよね。(ですよね?!)

Pythonでは、間引き処理も簡単にできます。

リストのスライスを使えばいいんですね~。先程のcsvではない、多めのデータを処理するとして、次のように書きます。

import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime as dt

df = pd.read_csv('G:/test/many_datas.csv', names=['num1', 'num2'])

xlist = df['num1'][::100] #間引き処理
ylist = df['num2'][::100] #間引き処理

xlist = [dt.strptime(d, '%H:%M:%S') for d in xlist]
ylist = [dt.strptime(d, '%H:%M:%S') for d in ylist]


plt.plot(xlist, ylist, marker="o")
plt.show()

 

若干余談ですが、データを時分秒形式に直す際に

time data ' 4:21:05' does not match format '%H:%M:%S'

というエラーに悩まされました。(>_<)
下記とか見てみてもわからず…。

https://stackoverflow.com/questions/51029343/time-data-2018-06-19-112113-311-does-not-match-format

で、よく見ると’ 4:21:05’の4の前に半角スペース入ってるじゃんwwww

下記のようにすれば解決しました(^_^)

ylist = [dt.strptime(d, ' %H:%M:%S') for d in ylist]    #%Hの前に半角スペースを入れた

結構あるあるだと思いますので!お気をつけあれ~。

Keras Functional API とSequentialモデルの違い

私はディープラーニングのコードを書くのにKerasを使って書いてます。

ですが、Kerasのドキュメントがわかりにくいんだよなぁぁ。なので、メモ的に書いておきます。

最初の方に出てくる話なのですが、Kerasではモデルというものを使って、ディープラーニングを作ります。(めちゃざっくりしてますが)

モデルの作り方に、

  1. Sequentialモデル
  2. Functional API

というのでつくるやり方の2通りが紹介されています。

一体何が違うの~?!( ゚Д゚) となっちゃいますよね。なんか、ネーミングも、Functional APIって、何かのAPI? Sequentialモデルとは全く似ても似つかないものなのでは???と思っちゃいますよね。

しかし、二つはモデルの作り方が違うだけです。

Sequentialモデルは、Sequentialは「順序通り」という意味でして、その名の通り、モデルを下記のようや

model = Sequential([
    Dense(32, input_shape=(784,)),
    Activation('relu'),
    Dense(10),
    Activation('softmax'),
])

下記のように

model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))

した場合、この順番通りにレイヤーが追加されて、処理がされるということです。

Functional APIは、複数の入出力を持ったモデルなど、Sequentialではできないような、ちょっと複雑なモデルが作れます。

アレの出力をコレの入力にも、アッチの入力にも使える、みたいなイメージです。

 

 

Python __repr__ と __str__の違い

Pythonの関数で、アンダースコア2つ __ (←これ) で囲まれている関数を、特殊関数と言います。特別な役割があります。

__repr__ と __str__ってどう違うの??といつもわからなくなってしまうので、メモしておきます。

 

下記のPython3の公式ドキュメントによると

https://docs.python.jp/3.3/reference/datamodel.html

object.__repr__(self)

repr() 組み込み関数によって呼び出され、オブジェクトを表す「公式の (official)」文字列を計算します。

object.__str__(self)

オブジェクトの「非公式の (informal)」あるいは表示に適した文字列表現を計算するために、 str(object) と組み込み関数 format(), print() によって呼ばれます。

だ、そうですが。

なんやねん。公式とか非公式とか!!って思いますよね。

とりあえず、動作を見てみます。

class MC():
  def __repr__(self):
    return 'Wahaha!'

  def __str__(self):
    return 'Uki'


mc = MC()
print(mc)

上記の出力結果は

Uki

となります。

class MC():
  def __repr__(self):
    return 'Wahaha!'

  def __str__(self):
    return 'Uki'


mc = MC()
print(str(mc))

上記の出力結果も

Uki

となります。

__str__関数がない場合は

class MC():
  def __repr__(self):
    return 'Wahaha!'

mc = MC()
print(str(mc))

__repr__が使われて、

Wahaha!

が出力されます。

 

下記のサイトさんによると、次のような動作です。

http://taustation.com/python3-str-repr/

print文やformat文での__str____repr__の使われ方は次の通り。

  • __str__のみが定義されていれば__str__が使われる
  • __repr__のみが定義されていれば__repr__が使われる
  • __str____repr__の両方が定義されていれば__str__が使われる

PHPUnitテストを初めてやってみる

開発におけるテストの自動化ツールとしてPHPUnitを使ってみます。
PHPUnitのインストールや環境などは既に揃っているものだとします。

テストの目的
・想定通りの操作をするか
・デグレしないか

まあいろいろあると思いますがテストなんてしないよりした方がいいですよね。
作るのは面倒かもしれませんが自動化できるところは自動化しておけば人がテストするよりも楽で結果的に速くなるという考え方もうなずけます。

注意点としては初めは難しいと思うのでちょっとずつ書くこと。
完璧を意識しすぎないこと(挫折する可能性大)

早速簡単なテストコードを書いてみたいと思います。
今回は半角英数のバリデーションが意図通りの操作をしてくれるかテストをしたいと思います

テストする関数

function isAlphanumeric($string){
    return preg_match("/^[a-zA-Z0-9]+$/", $string);
}

PHPUnit_Framework_TestCaseを継承したクラスがテストクラスになります。
テストするメソッドは「test」から始めるようにします。

OKなケースとNGなケースを書きます。

class hogeTest extends PHPUnit_Framework_TestCase {

    public function testIsAlphanumeric() {
    // OK
    $strings = array("aaa", "aB12", "fd9fasyf7","fawiefawb23r9y");
    foreach ($strings as $string) {
        $this->assertEquals(1, isAlphanumeric($string));
    }

    // NG
    $strings = array(null, "", "あああ", "カキク", "…", "@", "s", ":@[]\/.", "金", "AAあ");
    foreach($strings as $string) {
        $this->assertEquals(0, isAlphanumeric($string));
    }
}

assertEquals(x, y)
→第一引数(x)と第二引数(y)が等しいかどうかを調べてくれるメソッドです。

さてテストが書けたので実行します。

phpunit hogeTest.php

結果は以下の通り。

1つのテストを実行し計14個の検証が行われOKとでました。めでたしです。

Python 再帰関数 初めの一歩

再帰関数 超むずい。

ファミマの焼き鳥 超うまい。(食べたことないけど)

というわけで、再帰関数について勉強中であります。

 

今まで、縁がなかったんですよ。作る必要なかったっていうか。

しかし、ディープラーニング系だと結構出てきますよね!

こちらのサイト拝見して勉強させて頂きました。m(_ _)m

http://www.geocities.jp/m_hiroi/light/pyalgo01.html

とりあえず、ここに載っているフィボナッチ関数の簡単なバージョンを作ってみます。

def fibo(n):

    print('nだよ %s' %n)
    if n == 0 or n == 1: return 1

    return fibo(n - 1) + n

v=fibo(5)
print('vだよ %s' %v)

結果は次の通り。

nだよ 5
nだよ 4
nだよ 3
nだよ 2
nだよ 1
vだよ 15

再帰関数初心者としては、return が最後しか返ってこないのが不思議。

弊社の俊英 Nくんが教えてくれたのですが、
「まずは再帰の中をぐるぐるやって、終わった時にreturnします。」
だそうです。

もうちょっと飛躍させて、次のようなのを作ります。

print('はじまり')
array = [1,2,3]

def search(s):

    print("sだよ %s" %s)

    if s not in array:

        v = s + 10
        print("途中で帰るv %s" % v)
        return -v

    next_s = s + 1

    v = search(next_s)

    print('最後まで行ったv:%s s:%s' %(v,s))

    return -v

for x in range(5):
    value = search(x)
    print("vだよ %s" %value)

print('おわり')

出力は次の通り。

はじまり

sだよ 0
途中で帰るv 10
vだよ -10
sだよ 1
sだよ 2
sだよ 3
sだよ 4
途中で帰るv 14
最後まで行ったv:-14 s:3
最後まで行ったv:14 s:2
最後まで行ったv:-14 s:1
vだよ 14
sだよ 2
sだよ 3
sだよ 4
途中で帰るv 14
最後まで行ったv:-14 s:3
最後まで行ったv:14 s:2
vだよ -14
sだよ 3
sだよ 4
途中で帰るv 14
最後まで行ったv:-14 s:3
vだよ 14
sだよ 4
途中で帰るv 14
vだよ -14

おわり

最後まで行ったv というのが結局returnされないのは、さっきのくだりで学習したのですが、初心者にとって解せぬポイントは

最後まで行ったv:-14 s:3
最後まで行ったv:14 s:2
最後まで行ったv:-14 s:1

なんですよ。

なんで、これ、sの順番が逆なの??
sは 1,2,3 の順じゃないの??

これも、弊社の俊英かつサイキッカーのN君が教えてくれました。

「再帰関数は、枝分かれしていって評価するんですが、最後の枝までいったら逆順に評価していくんです。」

エッッ そうなんだ。( ゚Д゚) むずかしー!!

サイキッカーへの道は遠いようです。