読者です 読者をやめる 読者になる 読者になる

DPCデータの分析とかやるブログ

DPCデータの分析なんかをテキトーにやってます。

電子点数本を使ってDPCデータを拡張する(2)

前回はDPC点数本をDBに取り込むと便利かも、みたいな話で終わりました。
例えば

分類番号 病名 入院期間1 入院期間2 入院期間3
040080xx 肺炎 5 12 30

みたいなテーブルを用意します。今回は仮にdpcmasterというテーブル名とします。 Dファイルには分類番号が記録されていますので、それを結合キーに利用しましょう。 SQLだとこんな感じになります。

select データ識別番号,入院年月日,実施年月日,SUM(行為点数*行為回数),d.分類番号,
実施年月日 - 入院年月日 + 1 AS 在院日数,dpc.入院期間1,dpc.入院期間2,dpc.入院期間3,
CASE WHEN 実施年月日 - 入院年月日 + 1 <= dpc.入院期間1 THEN '入院期間I'
     WHEN 実施年月日 - 入院年月日 + 1 > dpc.入院期間1 AND 実施年月日 - 入院年月日 + 1 <= dpc.入院期間2 THEN '入院期間2'
     WHEN 実施年月日 - 入院年月日 + 1 > dpc.入院期間2 AND 実施年月日 - 入院年月日 + 1 <= dpc.入院期間3 THEN '入院期間3'
ELSE '出来高'
END AS DPC期間
from d1607 AS d
LEFT OUTER JOIN dpcmaster AS dpc
USING(分類番号)
Where データ区分 <> 97
group by データ識別番号,入院年月日,実施年月日,d.分類番号,dpc.入院期間1,dpc.入院期間2,dpc.入院期間3

あまり綺麗なSQLとは言い難いですが、とりあえずその日のDPC期間をカテゴライズ可能です。
こんなのスクリプトにやらせろよ!という向きに、Pythonのコードも用意しました。

import pandas.io.sql as psql
import psycopg2 as pg
import pandas as pd
import numpy as np


connection = pg.connect(database='DB名',
                user='ユーザー名',
                host='localhost',
                password='パスワード',
                port=ポート番号)

df = psql.read_sql("select データ識別番号,入院年月日,退院年月日,実施年月日,分類番号,簡易病名,入院期間1,入院期間2,入院期間3, \
sum(行為点数*行為回数) AS DPC総点数,実施年月日-入院年月日 + 1 AS 在院日数 \
from d1607 \
LEFT OUTER JOIN dpcmaster \
USING(分類番号) \
where データ区分 <> 97 \
group by データ識別番号,入院年月日,退院年月日,実施年月日,分類番号,簡易病名,入院期間1,入院期間2,入院期間3",connection)


#入院期間列を作成
Zaiin = df['在院日数']
Kikan1 = df['入院期間1']
Kikan2 = df['入院期間2']
Kikan3 = df['入院期間3']
DPCKIKAN = []

for zaiin,kikan1,kikan2,kikan3 in zip(Zaiin,Kikan1,Kikan2,Kikan3):
    if zaiin == 0:
        dpckikan = '出来高分岐'
    elif zaiin <= kikan1:
        dpckikan = '期間I'
    elif zaiin > kikan1 and zaiin <= kikan2:
        dpckikan = '期間II'
    elif zaiin > kikan2 and zaiin <= kikan3:
        dpckikan = '期間III'
    else:
        dpckikan = 'DPC期間超'
    DPCKIKAN.append(dpckikan)
df['DPC期間'] = DPCKIKAN

ひたすらelifを叩くばかりです。 あんまり綺麗じゃないですね…ただ、ちょっと込み入った分析をやろうとすれば、どうせPythonでやることになりますから、さっさとDataFrameに落としてしまうのは一つの手です。