CSVをPythonでリアルタイム表示したい!
背景
開発をしているときのデバッグやデータ解析などでリアルタイムで更新されるCSVファイルをグラフにしたいときがあります。そのようなときにいつもどう実装すればいいか悩んでしまうためにここに備忘録を記します。
アプローチ
様々なやり方があると思いますが、ここではmatplotlib.pyplotのplt.pause()を使います。 こちらを使うとmatplotlibのグラフを表示後引数の時間分sleepするということをやってくれます。 matplotlib.org
実装例
今回はsample.csvという名前1列目にx軸の値、2列目にy軸の値が更新されていくとします。
今回は下記の実装で100ループで1列目にx,2列目にx2の値が入っていくとします。
import pandas as pd import time import os index = [] data = [] for i in range(0, 100): data.append(i ** 2) datas = {"data": data} df = pd.DataFrame(data=datas) df.to_csv("sample.csv", header=False) # 1ループに付き1秒sleep time.sleep(1)
CSVをリアルで描画するのは以下のコードです。
while Trueで無限繰り返しをしてその中でcsvを読み込み、1行目をx,2行目をyとして描画しています。
plt.pasue(1)なのでおよそ1秒に1回更新されます。
import pandas as pd from matplotlib import pyplot as plt fig, ax = plt.subplots() while True: df = pd.read_csv("sample.csv", names=["index", "data"]) line = ax.plot(df["index"], df["data"], color="b") plt.pause(1)
以上の結果をgifにしたものがこちらです。 今回こちらをgifにするためにimageMagickを使用しました。 www.imagemagick.org
Math.absで最小値を扱うと負の値を返す
概要
Javaの実装でMath.abs()を使う際にその型の最小値を渡すと絶対値の戻り値なのに負の値を返すことがあります。 具体例を見ていきます。
具体例
- Integerの最小値
Math.abs(Integer.MIN_VALUE)
//-2147483648
- Shortの最小値
(short) Math.abs(Short.MIN_VALUE) //-32768
理由
Integerの範囲:-2147483648から2147483647
→2147483648が表せない
Shortの範囲:-32768から32767
→32768が表せない
このように最小値のほうが最大値より絶対値が1小さいため、最小値の絶対値は同じ型では表すことができないということがわかると思います。
感想
当たり前な気がしますが、意外と今まで気付かなかったです。。
絶対値がマイナスを返すわけないという前提を破るので頭に入れておきます。