import pandas as pd
import numpy as np
data = pd.read_excel('dataset.xls')
data
max_id = data.loc[:, ['PATIENT_VISIT_IDENTIFIER']].max().values[0]
print(f'Max ID: {max_id}')
data.iloc[:10,:]
attributes = []
columns = [
'PATIENT_VISIT_IDENTIFIER',
'AGE_PERCENTIL',
'AGE_ABOVE65',
'DISEASE GROUPING 1',
'DISEASE GROUPING 2',
'DISEASE GROUPING 3',
'DISEASE GROUPING 4',
'DISEASE GROUPING 5',
'DISEASE GROUPING 6',
'OXYGEN_SATURATION_MEDIAN',
'OXYGEN_SATURATION_MIN',
'RESPIRATORY_RATE_MIN',
'RESPIRATORY_RATE_MAX'
]
for i in range(max_id + 1):
visit_data = data[data['PATIENT_VISIT_IDENTIFIER'] == i]
selected_attributes = visit_data.loc[i * 5, columns]
icu = visit_data.iloc[:, -1].max()
filtered_data = np.append(selected_attributes.values, icu)
attributes.append(filtered_data)
print(np.array(attributes))
filtered_df = pd.DataFrame(data = attributes, columns = columns + ['ICU'])
to_round = [
'OXYGEN_SATURATION_MEDIAN',
'OXYGEN_SATURATION_MIN',
'RESPIRATORY_RATE_MIN',
'RESPIRATORY_RATE_MAX'
]
for att in to_round:
filtered_df.loc[:, [att]] = np.round(filtered_df.loc[:, [att]] * 10)
filtered_df
set(filtered_df['OXYGEN_SATURATION_MEDIAN'])
from pgmpy.models import BayesianModel
model = BayesianModel([('ICU', att) for att in columns])
model.nodes()
from pgmpy.estimators import BayesianEstimator, MaximumLikelihoodEstimator
# model.fit(
# data=filtered_df,
# estimator=MaximumLikelihoodEstimator,
# complete_samples_only=False
# )
model.fit(
data=filtered_df,
estimator=BayesianEstimator,
prior_type="BDeu",
equivalent_sample_size=100,
complete_samples_only=False
)
print(model.get_cpds()[10])
from pgmpy.inference import VariableElimination
inference = VariableElimination(model)
print(inference.map_query(['ICU'], evidence={'AGE_ABOVE65': 0 }))
y = []
y_pred = []
new_cols = [
# 'PATIENT_VISIT_IDENTIFIER',
'AGE_PERCENTIL',
'AGE_ABOVE65',
'DISEASE GROUPING 1',
'DISEASE GROUPING 2',
'DISEASE GROUPING 3',
'DISEASE GROUPING 4',
'DISEASE GROUPING 5',
'DISEASE GROUPING 6',
'OXYGEN_SATURATION_MEDIAN',
'OXYGEN_SATURATION_MIN',
'RESPIRATORY_RATE_MIN',
'RESPIRATORY_RATE_MAX'
]
for index, row in filtered_df.iterrows():
y.append(row['ICU'])
data = row[new_cols].dropna()
ev = {}
for att in new_cols:
if att in data:
ev[att] = data[att]
# print(row[new_cols].dropna())
# print(ev)
# print()
y_pred.append(inference.map_query(['ICU'], evidence=ev, show_progress=False)['ICU'])
from sklearn.metrics import precision_score, r2_score
from sklearn.metrics import confusion_matrix
confusion_matrix(y, y_pred)