閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

血液検査の結果を眺めてみる

血液検査の結果も2015年から記録を続け、そこそこ貯まってきたので年毎にプロットしたら何か見えるかな?と思って描いてみた。今回はPythonを使いました。

色々計っているけど関心があるのは血中リン濃度くらいなので、横軸は月、縦軸はリンの値のプロットを描いています。他にカリウムなんかも大事なんだけど、これは上がりすぎると死ぬってだけでたまに外れ値があってもまぁ生きていればいいやという感じなのでスルーです。リンは高い状態が長く続くとじわじわ体に悪影響が出てくるタイプのものなので、よく見ています。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime

# プロットの設定
plt.figure(figsize=(20,5))

def create_plot(dd, pp, label, color):
    norm_dates = [datetime.datetime(2020, d.month, d.day) for d in dd]
    plt.plot(norm_dates, pp, label=label, color=color)

df = pd.read_csv('./summary.csv', sep=',',
    index_col='日付',
    date_parser=lambda dates: pd.datetime.strptime(dates, '%Y-%m-%d'),
    usecols=['日付', '無機リン(P)'])
dates = df.index
p = df['無機リン(P)']

# プロット作成
colors = ['#0000FF', '#AAAA00', '#00FF00', '#009999', '#888888']
for i in range(5):
    y = 2019-i
    start = f'{y}-1-1'
    stop = f'{y}-12-31'
    create_plot(dates[(dates > start) & (dates < stop)], p[(dates > start) & (dates < stop)], f'{y}', colors[i])

# リン5.5未満が望ましい
plt.fill([datetime.datetime(2020,1,1), datetime.datetime(2020,12,31), datetime.datetime(2020,12,31), datetime.datetime(2020,1,1)], [5.5, 5.5, 7, 7], color='#FF000022')

# オプション
plt.legend(loc=1)
ticks = [datetime.datetime(2020, m+1, 15) for m in range(12)]
plt.xticks(ticks, [m.strftime('%m') for m in ticks])
plt.xlim('2020-01-01', '2020-12-31')
plt.ylim(3, 7)

f:id:wata_d:20200124145848p:plain

……わからん! 点数を減らすために平均を取ってみる。

def create_plot(dd, pp, label, color):
    norm_dates = [datetime.datetime(2020, d.month, d.day) for d in dd]
    # 月ごとの平均をプロットする
    mean = pp.groupby(dd.month).mean().values
    start = 13 - len(mean)
    x = [datetime.datetime(2020,i,15) for i in range(start, start+len(mean))]
    plt.plot(x, mean, label=label, color=color)

    # 他に pp.rolling(4).mean() で移動平均を取るとか、近似曲線もあるけど略

f:id:wata_d:20200124145859p:plain

2018年はわりとちゃんとやってたのに、去年(2019年)はだらしないな。なんとなくだけど、連休がある月に上がる傾向にあるように思える。前々から「食べなさすぎてもリンは上がるのでは」と考えているけど、自分は休日の方が食べないことの方が多いので関連付けたくなる。

この後statsmodelsとかも使って季節性とかも探ってみたかったけど、今のところうまくいっていないので没となっております。