Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,6 @@
*.pyc
*.egg-info
.pytest_cache

venv
.venv
60 changes: 60 additions & 0 deletions examples.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import glob as glob
import os as os


class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height

def get_area(self):
return self.width * self.height

class Circle:
def __init__(self, radius):
self.radius = radius

def get_area(self):
#typically top of the file, doing it this way can increase speed though
import math

return math.pi * self.radius * self.radius

#-----------------------------------------
#running code
#-----------------------------------------
my_circle = Circle(10)
my_rectangle = Rectangle(5,3)

my_shapes = [my_circle, my_rectangle]
#get_area() exists in both classes and can both be called. Is polymorphism
total_area = sum(shape.get_area() for shape in my_shapes)
#-----------------------------------------
class JSONDataSource:
def __init__(self, dir_path):
self.dir_path = dir_path

def load_inflammation_data(self):
from inflammation import models

data_file_paths = glob.glob(os.path.join(self.dir_path, 'inflammation*.csv'))

if len(data_file_paths) == 0:
raise ValueError(f"No inflammation data CSV files found in path {self.dir_path}")
data_loc = map(models.load_csv, data_file_paths)
return list(data_loc)

#-----------------------------------------
#running code
#-----------------------------------------
"""
_, extension = os.path.splitext(infiles[0])
if extension == '.json':
data_source = JSONDataSource(os.path.dirname(infiles[0]))
elif extension == '.csv':
data_source = CSVDataSource(os.path.dirname(infiles[0]))
else:
raise ValueError(f'Unsupported data file format: {extension}')
analyse_data(data_source)
"""
#-----------------------------------------
26 changes: 21 additions & 5 deletions inflammation-analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
"""Software for managing and analysing patients' inflammation data in our imaginary hospital."""

import argparse
import os

from inflammation import models, views
from inflammation.compute_data import analyse_data


def main(args):
Expand All @@ -13,18 +15,27 @@ def main(args):
- selecting the necessary models and views for the current task
- passing data between models and views
"""
InFiles = args.infiles
if not isinstance(InFiles, list):
InFiles = [args.infiles]
infiles = args.infiles
if not isinstance(infiles, list):
infiles = [args.infiles]


for filename in InFiles:
if args.full_data_analysis:
analyse_data(os.path.dirname(infiles[0]))
return

for filename in infiles:
inflammation_data = models.load_csv(filename)

view_data = {'average': models.daily_mean(inflammation_data), 'max': models.daily_max(inflammation_data), 'min': models.daily_min(inflammation_data)}
view_data = {
'average': models.daily_mean(inflammation_data),
'max': models.daily_max(inflammation_data),
'min': models.daily_min(inflammation_data)
}

views.visualize(view_data)


if __name__ == "__main__":
parser = argparse.ArgumentParser(
description='A basic patient inflammation data management system')
Expand All @@ -34,6 +45,11 @@ def main(args):
nargs='+',
help='Input CSV(s) containing inflammation series for each patient')

parser.add_argument(
'--full-data-analysis',
action='store_true',
dest='full_data_analysis')

args = parser.parse_args()

main(args)
44 changes: 44 additions & 0 deletions inflammation/compute_data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
"""Module containing mechanism for calculating standard deviation between datasets.
"""

import glob
import os
import numpy as np

from inflammation import models, views
"""Calculates the standard deviation by day between datasets."""

"""Gets all the inflammation data from CSV files within a directory"""
class CSVDataSource:

def __init__(self, dir_path):
self.dir_path = dir_path

def load_inflammation_data(self):
data_file_paths = glob.glob(os.path.join(self.dir_path, 'inflammation*.csv'))

if len(data_file_paths) == 0:
raise ValueError(f"No inflammation data CSV files found in path {self.dir_path}")
data_loc = map(models.load_csv, data_file_paths)
return list(data_loc)

"""
works out the mean inflammation value for each day across all datasets,
then plots the graphs of standard deviation of these means.
"""

def analyse_data(data):
means_by_day = map(models.daily_mean, data)
means_by_day_matrix = np.stack(list(means_by_day))

daily_standard_deviation = np.std(means_by_day_matrix, axis=0)

graph_data = {
'standard deviation by day': daily_standard_deviation,
}
views.visualize(graph_data)

data_source = CSVDataSource(os.path.dirname(infiles[0]))
analyse_data(data_source)


4 changes: 4 additions & 0 deletions inflammation/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,7 @@ def daily_min(data):
"""Calculate the daily min of a 2d inflammation data array."""
return np.min(data, axis=0)

def analyse_data(data_source):
from compute_data import CSVDataSource

data = data_source.load
26 changes: 26 additions & 0 deletions tests/test_compute_data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from unittest.mock import Mock
import glob
import os
from inflammation import models

def test_computer_data_mock_source():
from inflammation.compute_data import analyse_data
data_source = Mock()

#TODO - create mock data to pass---------------

data_dir = "data/" #could have a different folder of mock data
data_file_paths = glob.glob(os.path.join(data_dir, 'inflammation*.csv'))

if len(data_file_paths) == 0:
raise ValueError(f"No inflammation data CSV files found in path {self.dir_path}")

data_loc = map(models.load_csv, data_file_paths)
mock_data = list(data_loc)

data_source.method_to_mock.return_value = mock_data

#----------------------------------------------


#TODO