R筋

プログラミング、金融、育児

google Homeを子育てに活用するぞ

 
おひさ!

気がつくと、このブログも放置して半年が経ってしまいました。

そして年末の暇に任せて復活し、半年間放置の言い訳とかを書くことにしました。

そもそもRの小技集をメモするブログだったんで、言い訳とか書く必要もないっちゃあないんですが、この半年間で仕事でRを使う頻度がだいぶ減り、プログラミング意外の設計の仕事が増えたことで、今後もRの記事しばりが厳しそうという状況になりました。そしてこの半年での大きな出来事は第一子が生まれました!現在4ヶ月半まで成長しましたが、妻と2交代制で24時間監視体制を敷く必要が生じ、これも週末は1日中パソコンをいじっていた僕の活動パターンを大きく変えることとなり、「R筋」の放置が加速したのでした。まぁ可愛いからいいや。

google homeを買った

流行りに乗っかって買いました。買う前に想定していた使い方は、子供に色々な音を聞かせてあげようというものでした。

我が子お気に入りの「じゃあじゃあびりびり」という本がありまして、犬の声や水の音など様々な効果音が書かれているんですが、都度、google homeにその効果音を聞き、ただの読み聞かせではない、圧倒的リアル読み聞かせが可能になったと自負しておりますの!

じゃあじゃあびりびり (まついのりこのあかちゃんのほん)

じゃあじゃあびりびり (まついのりこのあかちゃんのほん)

 

 とはいえ、google homeは16000円程度ですが、効果音マシンだけだとこの値段はあまりおすすめできず、他にも子育てに活用できる方法はないかと色々と試しています。とりあえず定番は、LINEやTwitterと連携するというもので、それぞれ実用性を試してみました。

LINEの連携

google homeに話した内容をLINE Notifyというアカウントの発言として、通知させることが可能です。以下の記事を参考にしました。

yuki-no-yabo.com

つまづきやすいポイントとしては、google homeとLINEとを連携するIFTTTを設定した際、LINEに追加される「Line Notify」というアカウントを含めたグループをLINEで作成するということです。Line Notifyを招待するではなく、「招待」→グループ作成→メンバーを選ぶでやるんですよ皆さん!普段からグループLINE来ない人には分かりませんよお!

f:id:anpontan382:20171231163327p:plain

わっちゃんというのは僕の子供の名前

日付と内容から活用具合を察して頂きたいが、指を切り落とされた時でもなければ、実用性はあまりない。まず、「LINEで○○と送って」という予め決めた命令文を必ず使う必要があり、接続詞が違っていても正しく認識出来ない。また、文面を送る前に確認することが出来ず、変な日本語のLINEが送られることも多い。妻が何度か試し、ある程度要領を得た結果、上記のLINEが外出中の僕に届いたが、それ以降使われることはなかった。

Twitterの連携

これも上記の記事を参考にIFTTTですぐに実現できた。僕はtwitterのアカウントがなかったので、新規に作成した。twitter自体を今日から始めたので実用性は未知数だが、例えば子供を抱きながら、ふと感じた子供の成長を口に出す時、文章の前後に「twitterで○○と投稿して」という独り言にすれば、それがこうなる。 

習慣になれば、気楽に何気ないことを記録していくことができるんじゃないでしょうか。それで、あとから子供の成長と併せて振り返ると楽しいんじゃないかなと思う。

 
 

 

 

【R】quantmodでファイナンスデータを取得

ファイナンスデータの取得・分析に強いquantmodのget系関数でできることをを挙げます。

toyota <- getSymbols("7203",src="yahooj",auto.assign=FALSE)

参考:
www.dmjtmj-stock.com

getSymbols.yahooj()を使って
getSymbols('7203.T',src='yahooj')でも可能ですね。

トヨタの10年間の4本値

YJ7203.Open YJ7203.High YJ7203.Low YJ7203.Close YJ7203.Volume YJ7203.Adjusted
2007-01-04 8110 8140 8060 8090 6986200 8090
2007-01-05 8100 8100 7860 7900 10876000 7900
2007-01-09 7900 7930 7810 7870 9750900 7870
2007-01-10 7890 7890 7660 7690 11632000 7690
2007-01-11 7750 7790 7630 7660 10417100 7660
2007-01-12 7740 7840 7720 7820 11302500 7820


getFX("USD/JPY")

過去半年間の為替レートが取得できます。

USD.JPY
2017-03-01 113.4712
2017-03-02 114.1899
2017-03-03 114.3148
2017-03-04 114.0033
2017-03-05 114.0050
2017-03-06 113.8457

getDividends("IBM", from = "1970-01-01", to = Sys.Date())

1970-01-01からのIBMの配当データが取得できます。
東証の株価データの取得については分かりませんでした。。

getFin('NASDAQ:AAPL')
viewFin(NASDAQ.AAPL.f, "CF", "A")

4半期分のファイナンスデータが取得できます。
Google Financeから取得しているとのことですが、
こちらも東証については取得方法がわからず…

2016-09-24
Net Income/Starting Line 45687
Depreciation/Depletion 10505
Amortization NA
Deferred Taxes 4938
Non-Cash Items 4210
Changes in Working Capital 484
Cash from Operating Activities 65824
Capital Expenditures -13548
Other Investing Cash Flow Items, Total -32429
Cash from Investing Activities -45977
Financing Cash Flow Items -1163
Total Cash Dividends Paid -12150
Issuance (Retirement) of Stock, Net -29227
Issuance (Retirement) of Debt, Net 22057
Cash from Financing Activities -20483
Foreign Exchange Effects NA
Net Change in Cash -636
Cash Interest Paid, Supplemental 1316
Cash Taxes Paid, Supplemental 10444
2015-09-26
Net Income/Starting Line 53394
Depreciation/Depletion 11257
Amortization NA
Deferred Taxes 1382
Non-Cash Items 3586
Changes in Working Capital 11647
Cash from Operating Activities 81266
Capital Expenditures -11488
Other Investing Cash Flow Items, Total -44786
Cash from Investing Activities -56274
Financing Cash Flow Items -750
Total Cash Dividends Paid -11561
Issuance (Retirement) of Stock, Net -34710
Issuance (Retirement) of Debt, Net 29305
Cash from Financing Activities -17716
Foreign Exchange Effects NA
Net Change in Cash 7276
Cash Interest Paid, Supplemental 514
Cash Taxes Paid, Supplemental 13252

getMetals("gold")

金/ドル相場
https://www.oanda.com/lang/ja/
から取得します。

getOptionChain()

http://secwords.com/%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%BB%E3%83%81%E3%82%A7%E3%82%A4%E3%83%B3.htmlsecwords.com
だそうです。

getQuate()

現在の株価を取得できます。
今日は日曜日なので試してないです。

getSymbols.csv
getSymbols.FRED
getSymbols.google
getSymbols.MySQL
getSymbols.oanda
getSymbols.rda
getSymbols.SQLite
getSymbols.yahoo

その他ソースを指定して取得する関数たち

【R】SQLiteと連携

sqliteのDBへのデータ入出力についてです。

まず、sqlite本体からデータベースを作成して見ます。

https://sqlite.org/index.html
download→Precompiled Binaries for Windowssqlite-tools-win32-x86-3190300.zi
作業フォルダに解答。
コマンドプロンプトを起動→作業フォルダに移動

database1をデータベースとして作成し、
日次でドル円レートを入れるFXテーブルを作成
カラムは日付、始値、高値、安値、終値とする。

sqlite database1
CREATE TABLE FX(date,open,high,low,close);
.exit

rから接続してみます。

install.packages("RSQLite")
library("RSQLite")
con = dbConnect(SQLite(), "database1", synchronous="off")
dbListTables(con)#テーブル"FX"が取得できる

マネースクエアジャパンが同じ形式のデータを公開していますので、
こちらの、csvファイルをダウンロードして入れてみます。
[ヒストリカルデータ | マーケット情報(FX) | FX - マネースクウェア・ジャパン(M2J)]
http://www.m2j.co.jp/market/historical.php
ドル円日足ファイルcsvをダウンロード

usdjpy <- read.csv("USDJPY.csv",header=T)
sql <- paste("insert into FX values('",usdjpy[1,1],"',",usdjpy[1,2],",",usdjpy[1,3],",",usdjpy[1,4],",",usdjpy[1,5],");",sep="")
#"insert into FX values('2007/04/02',117.84,118.08,117.46,117.84);"
dbSendQuery(con,sql)

これで一行目を入力できました。

dbGetQuery(con,"select * from FX")
dbReadTable(con,"FX")

で、今insertしたデータを確認できます。
dbReadTableは、テーブル名でアクセスができるのでSQLを発行する必要がありません。
この作業をループで全行に行えば全てのデータがinsertできますが、
データフレーム全てを入力できる便利な関数があります。

dbWriteTable(con, "USDJPY", usdjpy)
#新たに"USDJPY"テーブルを作成して、データフレームusdjpyを一括挿入できる

最後は、切断します。

dbDisconnect(con)#切断

【R】optionsでの設定一覧

options関数で様々なオプションを設定・確認できます
確認する場合は以下のコマンドを使用します。

options()
getOptions("option名")

設定する場合は、options(オプション名=設定値)で行います。
設定できるオプションについて以下にまとめました。

$add.smooth
[1] FALSE
→単回帰分析のグラフを滑らかにするオプション

$askpass
→options()askpass("enter your password!")を実行すると
ポップアップでパスワードの入力画面を作成できる

$browserNLdisabled
[1] FALSE
→ブラウザの改行を"n"として扱うか

$check.bounds
[1] FALSE

x <- 1:3
x[5] <- 6
TRUEにすると、上のような実行をした時に、warningが出る。代入自体はできる。

$continue
[1] "+ "
> cat("コンソールで

  1. 途中改行した場合表示される文字")

$defaultPackages
[1] "datasets" "utils" "grDevices" "graphics" "stats" "methods"
→デフォルトのパッケージ一覧

$digits
[1] 7
→数値の表示を7桁

$download.file.method
[1] "wininet"
→ファイルをダウンロードする方法
"internal", "wininet","libcurl", "wget" and "curl", が選べる

$editor
→options()$editor("vi")などの指定で、edit()で起動する
editorを指定できる

$encoding
→options()$encoding("encode")で、インプットアウトプットの
エンコードを指定する。デフォルトは、native.encであり、変換を行わない

$help.try.all.packages
[1] FALSE
→help("packages")で検索する際に、全てのパッケージから検索できる
help("packages", try.all.packages=TRUE) によっても可能

$max.print
[1] 1000
→最大の表示件数

$nwarnings
[1] 50
→warn=0のとき、保存しておくエラーの件数

$OutDec
[1] "."
→小数点の表記

$papersize
[1] "a4"
→PostScriptで使用する用紙デフォルトサイズ

$PCRE_limit_recursion
$PCRE_study
$PCRE_use_JIT
→PCRE - Perl Compatible Regular Expressions関連

$profvis.keep_output
$profvis.print
$profvis.prof_extension
$profvis.prof_output
→コード可視化パッケージprofivis関連

$prompt
[1] "> "
→console上でプロンプトを促す文字

$scipen
[1] 0
→指数表記(1e+05)を変更

$show.error.messages
[1] TRUE
→エラーメッセージ表示

$str
$str$strict.width
[1] "no"
→ページ幅へ従う度合い"no","cut","wrap"

$str$digits.d
[1] 3
str関数で表示させる桁数

$str$vec.len
[1] 4
→表示させるベクトル数

$timeout
[1] 60
→インターネット関連の処理でのタイムアウト秒数

$ts.eps
[1] 1e-05
→時系列tsの範囲

$warn
[1] 0
→-1の時全てのエラーを無視、0のときは関数の終了まで保存、+1のときはすぐに表示

$warning.length
[1] 1000
→切り捨てるエラーや警告の件数

$width
[1] 122
→表示文字数

【R】Excelファイルの読み込み

Excelファイルを読み込む場合はreadxlパッケージを使用します。
試しに政府統計の日本の人口データを読み込んでみます。

人口推計 各月1日現在人口 月次 2017年6月 | ファイルから探す | 統計データを探す | 政府統計の総合窓口

install.packages("readxl")
library(readxl)
xls <- read_excel("05k2-1.xls",sheet=1,range="D12:M32",col_names = FALSE,col_types = "text",)

range=で読み込み範囲を指定できます。
当該データのように、タイトル列は複数のデータ列にまたがるようなレイアウトだったり、セルの結合が行われているような場合は、列名とデータが合致しないため、
範囲指定でデータ部分だけ読み込んだあと、列部分を入力して作成するか別途読み込む必要があります。
読み込む場合は、skipとn_maxを組み合わせて1行だけ読み込んだら、列名にできますよ。

【R】RcppBDTパッケージ

前回に引き続き、日付を操作するパッケージRcppBDTをご紹介します。
私がよく使うのはgetNthDayOfWeekで、「今月の第3水曜日は何日」といったことを取得できます。

以下に例を挙げます。

install.packages("RcppBDT")
library(RcppBDT)
date <- today()
getEndOfBizWeek(date)#"2017-06-23"
getEndOfMonth(date)#"2017-06-30"
getYear(date)#2017
getMonth(date)#6
getDay(date)#19
getDayOfWeek(date)#1
getDayOfYear(date)#170
#先物・オプション取引の契約終了日=第3水曜日
getIMMDate(6,2017)#"2017-06-21"
#2017年6月の第3水曜
getNthDayOfWeek(3, Wed, 6, 2017)#"2017-06-21"
#2017年6月の最後の月曜日
getLastDayOfWeekInMonth(Mon, 6, 2017) #"2017-06-26"
#今日の次に来る水曜日は
getFirstDayOfWeekAfter(Wed, date)#"2017-06-21"


参考:Package ‘RcppBDT’
https://cran.rstudio.com/web/packages/RcppBDT/RcppBDT.pdf

【R】lubridateパッケージ

lubridateパッケージは日付の操作に役立つ様々な関数があります。
日付型からyear(),month(),day(),hour()などで
それぞれの部分を取り出せる関数がとても便利です。
他にも使用頻度が高いと思われるもののサンプルを紹介します。

#パッケージインストール
install.packages("lubridate")
#パッケージ読み込み
library(lubridate)
#システム時刻を取得
now <- Sys.time()#"2017-06-18 09:19:51 JST"
#午前か午後かを判定
am(now)#TRUE
pm(now)#FALSE
#うるう年判定
leap_year(now)#FALSE
#クオーター取得
quarter(now)#2
#先月末を取得
rollback(today())#"2017-05-31"

#day()
day(now) #18
wday(now,label=T)#sun
yday(now)#169 年初から
qday(nwo)#79 四半期から
#年初から何週目か
week(now)#25

#インターバル型を作る interval(x,start)
span <-interval(ymd("2017-01-01"),today())#
#インターバルの期間(秒)を計算
seconds <- as.duration(span)#"14515200s (~24 weeks)"
#インターバルの期間(日数)を計算
as.numeric(seconds,"days")#168
#期間(日数)をperiod型で計算
s.period(span,"days")#"168d 0H 0M 0S"
#秒表記をseconds_to_periodにより変換も可能
seconds_to_period(seconds)#"168d 0H 0M 0S"

参考
https://cran.r-project.org/web/packages/lubridate/lubridate.pdf