銘柄同士の相関を取ってみるテスト

なんぞこれ?

↓ ここの株価データを使って、銘柄総当たりの相関を調べてみました http://softreed.la.coocan.jp/data.htm

なんか面白い発見ないかな。って期待しながら 出てきたデータを眺めて楽しむことができます。

はい。それだけです。

前準備

  1. gaushe をインストールしておいてください
  2. 上記サイトからデータを取ってきて 解凍。csvを適当な場所へ。
  3. csvから銘柄リストを作っておきます  - cat 201804.csv | cut -d ',' -f 2 | sort | uniq > code.lst

実行

以下ファイルを適当な名前で保存。実行すると標準出力に 以下フォーマットでデータがひねり出されていきます 「銘柄1」「銘柄2」「相関係数

calc.data とでも名前を付けたファイルにリダイレクトして保管しておきましょう。 ※めちゃくちゃ時間がかかります。2日くらいw

#!/usr/bin/env gosh

(use file.util)
(use text.tr)

;; 合計
(define sum (lambda (x) (apply + x)))

;; 平均
(define (ave lst)
  (/ (sum lst) (length lst)))

;; 共分散
(define (covariance lst)
  (-
    (ave
      (map (lambda (item) (* (car item) (cdr item))) lst))
    (* (ave (map car lst))
       (ave (map cdr lst)))))

;; 標準偏差
(define (standard-dev lst)
  (define ave-lst (ave lst))
  (ave
    (map
      (lambda (x)
        (expt (- x ave-lst) 2)) lst)))

;; 相関関数
(define (correctionFn lst)
  (define std
    (* (standard-dev (map car lst))
    (standard-dev (map cdr lst))))
  (cond
    ((zero? std) 9999)
    (else
      (inexact
        (/ (covariance lst) std)))))

;; 銘柄組み合わせ作成
(define (combination-pattern l)
 (define (pair-create top lst)
   (cond 
     ((null? lst) '())
     (else
       (cons
         (cons top (car lst))
         (pair-create top (cdr lst))))))
 (cond
  ((null? l) '())
  (else
    (append
      (pair-create (car l) (cdr l))
      (combination-pattern (cdr l))))))

;; 銘柄コードフィルタ
(define (create-filter no)
  (lambda (lst)
    (cond
      ((null? lst) '#f)
      (else (equal? (cadr lst) no)))))

;; 株価データ(一ヶ月分全銘柄)
(define kabu-lst
  (map
    (lambda (str) (string-split str ","))
    (file->string-list "./data/201804.csv")))

;; 銘柄コードリスト
(define code-lst
    (file->string-list "./data/code.lst"))

;; データ生成
(define (marge-data lst1 lst2)
  (cond
    ((null? lst1) '())
    ((null? lst2) '())
    (else
      (cons
        (cons (string->number (car lst1)) (string->number (car lst2)))
        (marge-data (cdr lst1) (cdr lst2))))))

;; 相関関数計算
(define (calcCorrectionFn no1 no2)
  (print
    (format "~A ~A ~A"
      no1
      no2
      (correctionFn
        (marge-data
          (map caddr (filter (create-filter no1) kabu-lst))
          (map caddr (filter (create-filter no2) kabu-lst)))))))

(define (all-calc lst)
  (cond
    ((null? lst) '())
    (else
      (calcCorrectionFn (caar lst) (cdar lst))
      (all-calc (cdr lst)))))

;; 組み合わせリスト
(define cmb-lst (combination-pattern code-lst))
(all-calc cmb-lst)

楽しみ方

出てきたデータはこんな感じで楽しみます。

head -n 1000 calc.data | awk '{printf"%.10f %d %d \n", $3,$1,$2}' | sort -r

gaushe で共分散を計算してみる

数学苦手なワシ。以下のページを参考に共分散を学ぶ https://mathtrain.jp/covariance

;; 国語・数学 の点数セット
(define lst '((50 50) (50 70) (80 60) (70 90) (90 100)))

(define (sum lst)
  (cond
   ((null? lst) 0)
   (#t
     (+ (car lst) (sum (cdr lst)))))

(define (ave lst)
  (/ (sum lst) (length lst)))

(define (first-list lst) (map car lst)) ;; 国語
(define (second-list lst) (map cadr lst)) ;; 数学

(ave (first-list lst)) ;; 国語 ave
(ave (second-list lst)) ;; 数学 ave


;;共分散 計算方法 1
(ave
  (map
    (lambda (item)
      (*
        (- (car item) (ave (first-list lst)))
        (- (cadr item) (ave (second-list lst)))))
    lst))

;;共分散 計算方法2
(-
  (ave
    (map
      (lambda (item)
        (* (car item) (cadr item)))
      lst))
    (* (ave (first-list lst))
      (ave (second-list lst))))

ついでに標準偏差、相関関数も。

;; 共分散
(define (covariance lst)
  (-
    (ave
      (map (lambda (item) (* (car item) (cadr item))) lst))
    (* (ave (map car lst))
       (ave (map cadr lst)))))

;; 標準偏差
(define (standard-dev lst)
  (define ave-lst (ave lst))
  (ave
    (map
      (lambda (x)
        (expt (- x ave-lst) 2)) lst)))


;; 相関関数
(define (correctionFn lst)
  (inexact
    (/
      (covariance lst)
      (* (standard-dev (map car lst))
         (standard-dev (map cadr lst))))))

Ubuntu18.04 ネットワーク設定

VirtualBox の Ubuntu18.04 にネットワーク設定をしたときのメモ。 ブリッジアダプタを追加した後に起動。以下の設定をし再起動する

/etc/netplan/50-cloud-init.yaml

# This file is generated from information provided by
# the datasource.  Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        enp0s3:
            addresses: []
            dhcp4: true
            optional: true
+        enp0s8:
+            addresses: []
+            dhcp4: true
+            optional: true
    version: 2

言語処理100本ノックを Gauche でやってみる(1)

こんなの見つけましたのでGaucheでやってみようかと思いました www.cl.ecei.tohoku.ac.jp

第一章 4番までなんとかやってみました。 超時間かかっちゃった・・・

コード

以下コード。 汚いなぁ orz

#!/usr/bin/env gosh
(use srfi-1)
(use srfi-13)
(use gauche.sequence)
(use gauche.collection)
(use text.tree)



(define (nlp100-sample)
  "hello")

(define (nlp100-00)
  (list->string (reverse (string->list "stressed"))))

(define (nlp100-01)
  (define (getchar s i)
    (subseq s (- i 1) i))
  (define (getstr str lst)
    (map (lambda (n) (getchar str n)) lst))
  (tree->string (getstr "パタトクカシーー" '#(1 3 5 7))))

(define (nlp100-02)
  (define (getchar s i)
    (subseq s (- i 1) i))
  (define (getstr str1 str2)
    (cond
      ((null? str1) '())
      (else
        (cons (cons (car str1) (car str2)) (getstr (cdr str1) (cdr str2))))))
  (tree->string (getstr (string->list "パトカー") (string->list "タクシー"))))


(define (nlp100-03)
  (define (getchar lst)
    (cond
      ((null? lst) '())
      (else
        (cons (string-length (string-filter char-alphabetic? (car lst))) (getchar (cdr lst))))))
  (tree->string
    (getchar
      (string-split 
        "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics." " "))))

(define (nlp100-04)
  (define (mkalist lst)
    (cond
      ((null? lst) '())
      ((assoc (subseq (car lst) 0 1) (mkalist (cdr lst)))
        (acons (subseq (car lst) 0 2) (car lst) (mkalist (cdr lst))))
      (else
        (acons (subseq (car lst) 0 1) (car lst) (mkalist (cdr lst))))))
  (mkalist (string-split "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can." " ") ))

テストも書いたお

#!/usr/bin/env gosh
(use gauche.test)

(test-start "ch01-01")
(load "./main.gosh")

(test-section "01")
(test "nlp100-sample" "hello" nlp100-sample)
(test "nlp100-00" "desserts" nlp100-00)
(test "nlp100-01" "パトカー" nlp100-01)
(test "nlp100-02" "パタトクカシーー" nlp100-02)
(test "nlp100-03" "314159265358979" nlp100-03)
(test "nlp100-04" '(("Hi" . "Hi") ("H" . "He") ("L" . "Lied") ("Be" . "Because") ("B" . "Boron") ("Co" . "Could") ("No" . "Not") ("O" . "Oxidize") ("F" . "Fluorine.") ("Ne" . "New") ("N" . "Nations") ("M" . "Might") ("Al" . "Also") ("Si" . "Sign") ("P" . "Peace") ("S" . "Security") ("Cl" . "Clause.") ("A" . "Arthur") ("K" . "King") ("C" . "Can.")) nlp100-04)

結果

~/work/repos/nlp100-gosh/ch01$ ./test.gosh 
Testing ch01-01 ...                                              
<01>---------------------------------------------------------------------------
test nlp100-sample, expects "hello" ==> ok
test nlp100-00, expects "desserts" ==> ok
test nlp100-01, expects "パトカー" ==> ok
test nlp100-02, expects "パタトクカシーー" ==> ok
test nlp100-03, expects "314159265358979" ==> ok
test nlp100-04, expects (("Hi" . "Hi") ("H" . "He") ("L" . "Lied") ("Be" . "Because") ("B" . "Boron") ("Co" . "Could") ("No" . "Not") ("O" . "Oxidize") ("F" . "Fluorine.") ("Ne" . "New") ("N" . "Nations") ("M" . "Might") ("Al" . "Also") ("Si" . "Sign") ("P" . "Peace") ("S" . "Security") ("Cl" . "Clause.") ("A" . "Arthur") ("K" . "King") ("C" . "Can.")) ==> ok

つづく。(かも

keycloak のビルドとテストをしてみた(うまくいかなかった)

keycloak の ビルド、テスト方法について調べたのでメモ。

現状ではテストが上手く動かすことができてないのですが
とりあえず今までのところまでを記録しておきます

コンパイルまで

keycloak/README.md at master · keycloak/keycloak · GitHub

  • git clone
$ git clone https://github.com/keycloak/keycloak.git

$ cd keycloak
  • compile
mvn install -Pdistribution -DskipTests=true
  • run
$ mvn -f testsuite/utils/pom.xml exec:java -Pkeycloak-server 

テスト実行

keycloak/HOW-TO-RUN.md at master · keycloak/keycloak · GitHub

# Prepare servers
mvn -f testsuite/integration-arquillian/servers/pom.xml clean install \
   -Pauth-server-wildfly \
   -Papp-server-wildfly
$ curl -O 
http://origin-repository.jboss.org/nexus/content/groups/m2-proxy/org/jboss/fuse/jboss-fuse-karaf/6.3.0.redhat-328/jboss-fuse-karaf-6.3.0.redhat-328.zip
$ mv boss-fuse-karaf-6.3.0.redhat-328.zip $DOWNLOAD_DIR

$ mvn install:install-file \
 -DgroupId=org.jboss.fuse \
 -DartifactId=jboss-fuse-karaf \
 -Dversion=6.3.0.redhat-328 \
 -Dpackaging=zip \
 -Dfile=$DOWNLOAD_DIR/jboss-fuse-karaf-6.3.0.redhat-328.zip 
$ mvn -f testsuite/integration-arquillian/servers \
 clean install \
 -Pauth-server-wildfly \
 -Papp-server-fuse63 \
 -Dfuse63.version=6.3.0.redhat-328 \
 -Dapp.server.karaf.update.config=true \
 -Dmaven.local.settings=$HOME/.m2/settings.xml \
 -Drepositories=,http://download.eng.bos.redhat.com/brewroot/repos/sso-7.1-build/latest/maven/ \
 -Dmaven.repo.local=$HOME/.m2/repository

失敗

ここまでやったら 以下のエラー。

Updating Config - Keycloak authentication
ps: illegal argument: o
usage: ps [-AaCcEefhjlMmrSTvwXx] [-O fmt | -o fmt] [-G gid[,gid...]]
          [-u]
          [-p pid[,pid...]] [-t tty[,tty...]] [-U user[,user...]]
       ps [-L]

こんなのみつけた
https://issues.apache.org/jira/browse/KARAF-5312

Macのせいなのかな?
環境をCentOS に変えて後で試してみよう

コンテナログの削除

ずーっと動かしているとコンテナのログがたまり過ぎちゃうこと、ありますよね?
全部削除する方法です。

rm `docker ps -a -q | xargs -IXXX docker inspect XXX | jq -r .[0].LogPath`

参考

qiita.com

qiita.com

付箋画像の抽出を試してみた(まだうまくいってない)

ホワイトボードの写真から付箋画像を抽出したいって話を聞いて
それOpenCVでできるんじゃないかと一生懸命ググってみました。

以下記事を参考に 試しにやってみた記録です。 qiita.com www.blog.umentu.work

環境

%matplotlib inline
import cv2 # opencv
import matplotlib.pyplot as plt # matplotlibの描画系

fn_img = "test.jpeg" # 画像ファイル名
img = cv2.imread(fn_img) # 画像を読み込む

# opencvの処理系では (B,G,R) で管理されているが、
# matplotlib では (R,G,B) で画像を認識するので、
# 表示用に一旦変換する
show_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 

plt.imshow(show_img) #表示

f:id:moremagic:20180225214418p:plain

  • 付箋を抽出してみる
# 画像差分を算出
def createDiffImg(img, base_img):
    img_diff = cv2.absdiff(base_img, img)
    return cv2.threshold(img_diff, 20, 255, cv2.THRESH_BINARY)[1]

# 差分を二値化
def show_hoge(img_diff):
    return cv2.threshold(img_diff, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)[1]

im_gray = cv2.cvtColor(show_img, cv2.COLOR_BGR2GRAY) 

# 元画像を RGBに分割
RGB =cv2.split(show_img)
Blue   = show_hoge(createDiffImg(RGB[0], im_gray))
Green = show_hoge(createDiffImg(RGB[1], im_gray))
Red    = show_hoge(createDiffImg(RGB[2], im_gray))
#plt.imshow( Green )

aaa = cv2.addWeighted(Blue,0.5,Green,0.5,0)
aaa = cv2.addWeighted(aaa,0.5,Red,0.5,0)
plt.imshow( aaa )

f:id:moremagic:20180225215639p:plain

  • 画像を切り出してみる
def getRectByPoints(points):
    # prepare simple array 
    points = list(map(lambda x: x[0], points))

    points = sorted(points, key=lambda x:x[1])
    top_points = sorted(points[:2], key=lambda x:x[0])
    bottom_points = sorted(points[2:4], key=lambda x:x[0])
    points = top_points + bottom_points

    left = min(points[0][0], points[2][0])
    right = max(points[1][0], points[3][0])
    top = min(points[0][1], points[1][1])
    bottom = max(points[2][1], points[3][1])
    return (top, bottom, left, right)

def getPartImageByRect(rect, img):
    return img[rect[0]:rect[1], rect[2]:rect[3]]

contours = cv2.findContours(aaa, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[1]
# filtered with area over (all area / 100 )
th_area = aaa.shape[0] * aaa.shape[1] / 100
contours_large = list(filter(lambda c:cv2.contourArea(c) > th_area, contours))

outputs = []
rects = []
approxes = []

for (i,cnt) in enumerate(contours_large):
    arclen = cv2.arcLength(cnt, True)
    approx = cv2.approxPolyDP(cnt, 0.02*arclen, True)
    if len(approx) < 4:
        continue
    approxes.append(approx)
    rect = getRectByPoints(approx)
    rects.append(rect)
    outputs.append(getPartImageByRect(rect, show_img))
    cv2.imwrite(str(i)+'.jpg', getPartImageByRect(rect, show_img))

f:id:moremagic:20180225215728p:plain

結果

付箋を四角く フィルタをかけることはできたっぽいですが
二値画像にした(つもり)なのに なんか超黄色くなってるし
一部しか抽出できませんでした・・・orz

もうちょっとちゃんと勉強してみないとだめっぽいです。

※ 続くかも