-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPatientRecord.py
More file actions
113 lines (96 loc) · 4.62 KB
/
PatientRecord.py
File metadata and controls
113 lines (96 loc) · 4.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
###################################################################
class PatientRecord:
"""Simple storage class for patient records."""
ColumnToMemberList = [ ('PatientId', 'PatientID'),
('Age (months)', 'Age'),
('Sex', 'Sex'),
('Weight (kg)', 'Weight'),
('Pre or PostSurgery', 'SurgeryStatus'),
('Surgery?', 'SurgeryChosen'),
('XA_TVC', 'CrossSectionalArea_TVC'),
('XA_Subglottis', 'CrossSectionalArea_Subglottis'),
('XA_MidTrachea', 'CrossSectionalArea_MidTrachea'),
('XA_Ratio', 'CrossSectionalArea_Ratio'),
('XA_Atlas_Score', 'CrossSectionalArea_AtlasScore'),
('XA_Ratio_Score', 'CrossSectionalArea_RatioScore'),
('HD_TVC', 'HydraulicDiameter_TVC'),
('HD_Subglottis', 'HydraulicDiameter_Subglottis'),
('HD_MidTrachea', 'HydraulicDiameter_MidTrachea'),
('HD_Ratio', 'HydraulicDiameter_Ratio'),
('HD_Atlas_Score', 'HydraulicDiameter_AtlasScore'),
('HD_Ratio_Score', 'HydraulicDiameter_RatioScore') ]
def __init__(self):
for pair in PatientRecord.ColumnToMemberList:
setattr(self, pair[1], None)
def Print(self):
for pair in PatientRecord.ColumnToMemberList:
member = pair[1]
print member, ":", getattr(self, member)
###################################################################
###################################################################
def is_float(value):
try:
float(value)
except ValueError:
return False
return True
###################################################################
###################################################################
class PatientRecordList:
def __init__(self, rows):
self.PatientRecords = []
if (len(rows) > 1):
for row in rows[1:]:
self.PatientRecords.append(PatientRecord())
for pair in PatientRecord.ColumnToMemberList:
columnName = pair[0]
memberName = pair[1]
columnIndex = rows[0].index(columnName)
for pr, row in zip(self.PatientRecords, rows[1:]):
columnValue = row[columnIndex]
if (is_float(columnValue)):
setattr(pr, memberName, float(columnValue))
else:
setattr(pr, memberName, columnValue)
def AddPatientRecord(self, patientRecord):
self.PatientRecords.append(patientRecord)
def GetNumberOfRecords(self):
return len(self.PatientRecords)
def Filter(self, queryList):
# A query is a triplet ('MemberName', 'operator', 'comparisonValue')
# All queries are implicitly "and-ed"
newPatientRecordList = PatientRecordList([])
for pr in self.PatientRecords:
keep = True
for query in queryList:
memberName = query[0]
operator = query[1]
comparisonValue = query[2]
value = getattr(pr, memberName, None)
if (operator == '=='):
keep = keep and (value == comparisonValue)
elif (operator == '!='):
keep = keep and (value != comparisonValue)
elif (operator == '<'):
keep = keep and (value < comparisonValue)
elif (operator == '<='):
keep = keep and (value <= comparisonValue)
elif (operator == '>'):
keep = keep and (value > comparisonValue)
elif (operator == '>='):
keep = keep and (value >= comparisonValue)
if (keep):
newPatientRecordList.AddPatientRecord(pr)
return newPatientRecordList
def GetArraysOfMembers(self, memberList):
arrayDict = {}
for memberName in memberList:
memberArray = []
for pr in self.PatientRecords:
memberArray.append(getattr(pr, memberName))
arrayDict[memberName] = memberArray
return arrayDict
def Print(self):
for pr in self.PatientRecords:
pr.Print()
print