為替データの収集をデーモンで自動化

# はじめに
単なるプログラムのデーモン化は面白みがないので、**為替データを収集するプログラムのデーモン化**（**自動化**）を紹介します。システムの監視だけでなく、為替変動のようにリアルタイムな監視をしたい場合に、プログラムのデーモン化は役立つと思っています。

# 目次

1. 為替データを収集するプログラムの作成
2. 為替データを収集するプログラムのデーモン化


# 1. 為替データを収集するプログラムの作成
Python3でプログラムを作成していきます。

## 1.1 公開されている為替データの確認
先ずはデータの確認です。
" http://www.gaitameonline.com/rateaj/getrate "にアクセスすると、下記のように為替レートに関するデータがjson形式で表示されます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756450/7ca03c74-0458-d94f-534b-c79696459bdf.png)


## 1.2 プログラムの作成
作成したプログラムを以下に示します。
今回は、**60秒毎にUSDJPYのデータ**を収集しcsvで保存します。尚、PC再起動後に収集したデータが消去されるように、データの保存先は**tmpフォルダ**を指定しています。パラメータの調整によって、データ収集の周期や保存先などは変更できます。


``` collect_currency_rate.py
#!/usr/bin/env python3
import requests
import json
import time
import datetime
import pandas as pd

# parameters
URL    = "http://www.gaitameonline.com/rateaj/getrate"
TARGET = "USDJPY"
FILEPATH = "/tmp/currency_"+TARGET+".csv"
TIMESPAN =  60 # [sec]

def main(INIT):
	# get data
	res = requests.get(URL)
	current_time = [datetime.datetime.now()]
	
	# data transform json to pandas
	jData = res.json()
	tmpData = jData["quotes"]
	
	col = 0
	for k in tmpData:
		if k["currencyPairCode"] == TARGET:
			break
		col += 1
	
	targetData = tmpData[col]

	add_data = pd.DataFrame.from_dict(targetData,orient='index',columns=current_time)
	add_data = add_data.T
	
	# save data 
	if INIT == 1:
		add_data.to_csv(FILEPATH)
	else:
		add_data.to_csv(FILEPATH,mode='a', header=False)


if __name__ == '__main__':
	f = open(str(FILEPATH),'w')
	f.close()
	INIT_FLAG = 1
	while True:
		main(INIT_FLAG)
		time.sleep(TIMESPAN)
		INIT_FLAG = 0
```
上記のプログラムを実行すると、指定したパスにデータが保存されていることが確認できます。
```
# cat /tmp/currency_USDJPY.csv 
,high,open,bid,currencyPairCode,ask,low
2022-11-13 13:43:16.838764,138.76,138.76,138.76,USDJPY,138.81,138.76
2022-11-13 13:44:17.044830,138.76,138.76,138.76,USDJPY,138.81,138.76
```
# 2. 為替データを収集するプログラムのデーモン化
## 2.1 プログラムへの実行権限付与とデーモンの定義
作成したpythonプログラムに実行権限を付与しておきます。
```
# sudo chmod a+x /opt/MyDaemon/collect_currency_rate.py
```
次に、以下のようにデーモンを定義します。
ExecStartには、作成したpythonプログラムのパスを指定します。
```:/etc/systemd/system/my-collect-currency-rate.service
[Unit]
Description=Collect Currency Rate Data

[Service]
Type=simple
Restart=always
ExecStart=/opt/MyDaemon/collect_currency_rate.py

[Install]
WantedBy=multi-user.target
```
## 2.2 デーモンの起動と動作確認
デーモンを起動します。
```
# sudo systemctl daemon-reload
# sudo systemctl start my-collect-currency-rate.service 
# sudo systemctl enable my-collect-currency-rate.service 
```
無事に起動していることが確認できます。
```
# sudo systemctl status my-collect-currency-rate.service 
● my-collect-currency-rate.service - Collect Currency Rate Data
   Loaded: loaded (/etc/systemd/system/my-collect-currency-rate.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2022-11-14 09:02:25 JST; 1s ago
 Main PID: 10962 (python3)
    Tasks: 8 (limit: 4915)
   CGroup: /system.slice/my-collect-currency-rate.service
           └─10962 python3 /opt/MyDaemon/collect_currency_rate.py

11月 14 08:48:14 ub-host systemd[1]: Started Collect Currency Rate Data.
```
数分後に/tmp/currency_USDJPY.csv を確認すると、無事にデータが約60秒毎に収集されていることが確認できました。
```
# cat /tmp/currency_USDJPY.csv 
,high,open,bid,currencyPairCode,ask,low
2022-11-14 08:48:14.725133,139.90,138.95,139.44,USDJPY,139.45,138.95
2022-11-14 08:49:14.939894,139.90,138.95,139.41,USDJPY,139.42,138.95
2022-11-14 08:50:15.135750,139.90,138.95,139.45,USDJPY,139.47,138.95
2022-11-14 08:51:15.336668,139.90,138.95,139.46,USDJPY,139.47,138.95
2022-11-14 08:52:15.503485,139.90,138.95,139.50,USDJPY,139.51,138.95
```
# 3. まとめ
為替データを収集するプログラムのデーモン化（自動化）について紹介しました。
今後は、収集した為替データの表示や利用に関して紹介するかもしれません。

# 参考文献

https://qiita.com/chromabox/items/a1323225bae146c80bec

https://qiita.com/katsuNakajima/items/7ece6c74f992f652d732

https://qiita.com/bow_arrow/items/4dcab3389c892baba1a5