高木のブログ

IOSTを毎日積み立てをする場合、何時に買えばいいのか検証

2021/06/04

IOSTを毎日積み立てをする場合、何時に買えばいいのか

前に用意したワンライナーである程度データが溜まったので集計してみた
IOSTの価格を取得するワンライナーバッチ

特に知識ないので、単純に時間ごとの平均価格を出すだけ

$ head results.csv
202104200000,7.74429699
202104200100,7.57416832
202104200200,7.71993105
202104200300,7.87145464
202104200400,7.83520595
202104200500,7.88429135
202104200600,7.98213785
202104200700,7.98698289
202104200800,7.81248123
202104200900,7.64619947

$ cat results.csv | grep 0000 | wc -l
      46

https://github.com/ytkg/iost_hourly_average/blob/main/results.csv

データとしては46日分用意した

結論

さっそく結論を言うと、何時に買っても大して変わらない

$ cat results.csv | ./hourly_average.awk | sort
00 5.43181
01 5.42103
02 5.41575
03 5.40975
04 5.40204
05 5.39636
06 5.37479
07 5.39608
08 5.39295
09 5.40997
10 5.39481
11 5.42372
12 5.41233
13 5.3864
14 5.37735
15 5.41897
16 5.39677
17 5.39798
18 5.39341
19 5.38188
20 5.38604
21 5.38065
22 5.35603
23 5.36825

手順

時間ごとの平均をawkで出してみた
その試行錯誤ログ

そのまま出力

実質cat

$ awk '{print $0}' results.csv
202104200000,7.74429699
202104200100,7.57416832
202104200200,7.71993105
...
202106032100,3.87210096
202106032200,3.95014972
202106032300,3.8537631

タイムスタンプのみ出力

区切り文字を指定してタイムスタンプ部分だけ出力

$ awk -F, '{print $1}' results.csv
202104200000
202104200100
202104200200
...
202106032100
202106032200
202106032300

時間部分のみ出力

substr関数で文字列を切り出す
substr(文字列, 切り出し開始位置, 切り出す文字列の長さ)

$ awk -F, '{print substr($1, 9, 2)}' results.csv
00
01
02
...
21
22
23

時間ごとの合計を出力

END {}で最後に行いたい処理が書ける
変数は勝手に初期化してくれる
なぜか順番が変わるのでsort

$ awk -F, '{sum[substr($1, 9, 2)] += $2}; END { for (hour in sum) { print hour, sum[hour] } }' results.csv | sort
00 244.431
01 243.946
02 243.709
...
21 242.129
22 241.021
23 241.571

時間ごとの平均を出力

$ awk -F, '{sum[substr($1, 9, 2)] += $2; count[substr($1, 9, 2)]++}; END { for (hour in sum) { print hour, sum[hour] / count[hour] } }' results.csv | sort
00 5.43181
01 5.42103
02 5.41575
...
21 5.38065
22 5.35603
23 5.36825

スクリプトファイルにして実行

処理を引数ではなくファイルに保存してから呼び出す方法でもいける

{
  hour = substr($1, 9, 2)
  sum[hour] += $2
  count[hour]++
}
END {
  for (hour in sum) {
    average = sum[hour] / count[hour]
    print hour, average
  }
}
$ awk -F, -f sample.awk results.csv | sort
00 5.43181
01 5.42103
02 5.41575
...
21 5.38065
22 5.35603
23 5.36825

コマンドとして実行

先頭に#!/usr/bin/awk -fを加えて、実行権限を与えてあげればコマンドとして実行できる
一緒に区切り文字-F,を指定した

hourly_average.awk
#!/usr/bin/awk -F, -f

{
  hour = substr($1, 9, 2)
  sum[hour] += $2
  count[hour]++
}
END {
  for (hour in sum) {
    average = sum[hour] / count[hour]
    print hour, average
  }
}
$ chmod +x hourly_average.awk
$ cat results.csv | ./hourly_average.awk | sort
00 5.43181
01 5.42103
02 5.41575
...
21 5.38065
22 5.35603
23 5.36825

リポジトリ

今回のデータとスクリプトをGitHubにあげた

ytkg/iost_hourly_average - GitHub

参考


Written by ytkg, Twitter, GitHub

Pixela