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

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

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

EFファイル統合を自力でやってみる Python+Pandasでの実装

Pythonを使う理由

まず、SQLというのは大量のデータを保存し、登録し、抽出するのには向いていますが、整形には向いていません。 手っ取り早く表形式のデータを扱い、整形するとなると、一番お手頃なのがPythonとそのライブラリPandasを使うことです。
Anacondaをインストールすれば、一通り環境が整いますので、事前にインストールしておいて下さい。

Pythonを使う

手順は簡単です。

  1. ヘッダつきのEFファイル「testE.txt」と「testF.txt」を用意する。エンコーディングUTF-8にしておく。
  2. 適当なフォルダに1で用意したファイルを突っ込む。
  3. メモ帳を開き、下記のコードをコピペして、「何か適当な名前.py」という風に拡張子.pyで保存する。
  4. 「何か適当な名前.py」をダブルクリックして実行する。

これだけでEF統合ファイルが出来上がります。あれ?さっきの苦労はどこへ行ったの?となりますが、まあ、何をするにも道具選びは大切だということですね。

#まずPandasをインポートする
import pandas as pd

#EファイルとFファイルを読み込み。入院年月日はあとで並び替えるのに使うので、日付形式にして読み込む。

edata = pd.read_csv('testE.txt',delimiter='\t',parse_dates=['入院年月日'])
fdata = pd.read_csv('testF.txt',delimiter='\t',parse_dates=['入院年月日'])

#明細点数・金額列を作成する。ついでに不要になった列を消す
fdata['明細点数・金額'] = fdata['行為明細点数'] + fdata['行為明細薬剤料'] + fdata['行為明細材料料']
fdata.drop(['行為明細点数','行為明細薬剤料','行為明細材料料'],axis=1,inplace = True)

#2つのデータを縦に結合。ヘッダを見て上手いことくっつけてくれる
efdata = pd.concat([edata,fdata])

#Eファイル由来のレコードには行為明細番号が無いので0を付番しとく
efdata['行為明細番号'].fillna(0,inplace=True)

#ここで並び替え。ついでにindexを連番に直しておく。
efdata.sort_values(['データ識別番号','入院年月日','データ区分','順序番号','行為明細番号'],inplace = True)
efdata.reset_index(inplace=True)

#穴埋めしたい項目をリストに突っ込み、穴埋めを行う。
fill_list='行為回数','実施年月日','診療科区分','医師コード','病棟コード','病棟区分'

for val in fill_list:
efdata[val].fillna(method='pad',inplace=True)

#最終的に吐き出すデータは仕様どおりの順番にしないといけないので、ソート順をリストにしておく
sort_list = '施設コード','データ識別番号','退院年月日','入院年月日','データ区分',\
'順序番号','行為明細番号','病院点数マスタコード','レセプト電算コード','解釈番号','診療明細名称',\
'使用量','基準単位','明細点数・金額','円・点区分','出来高実績点数','出来高包括フラグ','行為点数','行為薬剤料',\
'行為材料料','行為回数','保険者番号','レセプト種別コード','実施年月日','レセプト科区分',\
'診療科区分','医師コード','病棟コード','病棟区分','入外区分','施設タイプ'

#ソートを行い、出力用のデータを作って、出力する。おしまい
efdata_sorted = efdata.reindex(columns=sort_list)

efdata_sorted.to_csv('eftest.csv',index=False)

まとめ

前回はSQLを使ってEFファイル統合を頑張りましたが、3つのテーブルを用意した挙句、最後の最後でエクセル加工が待っているなど、お世辞にも綺麗なものではありませんでした。
上記のように、Pythonでコードを書けば、大した労力もなく、より簡単にお目当のファイルを出力出来ます。
(ちなみにPrismのEF統合ツールMicrosoftSQL Server Expressをバックで動かしているようです。はて、どうしてるんだろう…?)