altairのブログ

若手エンジニアの備忘録

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小さいため、最小値の絶対値は同じ型では表すことができないということがわかると思います。

感想

当たり前な気がしますが、意外と今まで気付かなかったです。。
絶対値がマイナスを返すわけないという前提を破るので頭に入れておきます。