From 6a9d23ec8fd8a7fe3e3d3708eb7a8e06e36dd90b Mon Sep 17 00:00:00 2001 From: Tanushree Tunstall Date: Thu, 24 Mar 2022 17:42:02 +0000 Subject: [PATCH] added sample test data for processing to get correct annotations --- test_data/processing.py | 61 ++++++++++++++++++++++++++++++++++++++ test_data/sample_data.csv | 26 ++++++++++++++++ test_data/sample_data.ods | Bin 0 -> 18903 bytes 3 files changed, 87 insertions(+) create mode 100644 test_data/processing.py create mode 100644 test_data/sample_data.csv create mode 100644 test_data/sample_data.ods diff --git a/test_data/processing.py b/test_data/processing.py new file mode 100644 index 0000000..011eae2 --- /dev/null +++ b/test_data/processing.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Thu Mar 24 15:01:59 2022 + +@author: tanu +""" +import sys, os +import pandas as pd +import numpy as np +from statistics import mean, median, mode +#from statistics import multimode +from collections import Counter +import math + +# https://stackoverflow.com/questions/43321455/pandas-count-null-values-in-a-groupby-function +#https://stackoverflow.com/questions/33457191/python-pandas-dataframe-fill-nans-with-a-conditional-mean +#%% +drug = "pyrazinamide" + +data = pd.read_csv("/home/tanu/git/ML_AI_training/test_data/sample_data.csv") +data.columns + +# Convert DM/OM labels to numeric +dm_om_map = {'DM': 1, 'OM': 0} # pnca, OM is minority, other genes: DM is minority +data['dm_om_numeric'] = data['mutation_info_labels'].map(dm_om_map) +# sanity check +data['dm_om_numeric'].value_counts() +data['mutation_info_labels'].value_counts() + +# COPY dst column +data['dst'] = data[drug] +# sanity check +data[drug].value_counts() +data[drug].isnull().sum() + +data['dst'].value_counts() +data['dst'].isnull().sum() + +data['mutationinformation'].value_counts() +#data.C.isnull().groupby([df['A'],df['B']]).sum().astype(int).reset_index(name='count') +data[drug].isnull().groupby(data['mutationinformation']).sum() + +# GOAL is to populate na in the dst column from the count of the dm_om_numeric column +data['dst'].isnull().groupby(data['mutationinformation']).sum() + + +# round up +int(math.ceil(mean(foo))) +#https://stackoverflow.com/questions/33457191/python-pandas-dataframe-fill-nans-with-a-conditional-mean +#FIXME +# STAGE 1: replace mean with Max(multimode), atm it is MEAN +#na_val = data.groupby(data['mutationinformation'])['dst'].mean() + +data['dst'] = data['dst'].fillna(data.groupby('mutationinformation')['dst'].transform('mean')) + +# FIXME +#STAGE 2: Fill TRUE nan with DM.OM column value, atm it is MEAN +data['dst2'] = data['dst'].fillna(data.groupby('mutationinformation')['dm_om_numeric'].transform('mean')) +data['dst2'] = data['dst'].fillna(data.groupby('mutationinformation').transform(['dm_om_numeric'])) + \ No newline at end of file diff --git a/test_data/sample_data.csv b/test_data/sample_data.csv new file mode 100644 index 0000000..5fd5515 --- /dev/null +++ b/test_data/sample_data.csv @@ -0,0 +1,26 @@ +id,mutationinformation,position,pyrazinamide,mutation_info_labels,drtype +S1,M1A,1,0,DM,MDR +S2,M1A,1,1,DM,Pre-MDR +S3,M1A,1,1,OM,Sensitive +S4,M1A,1,NA,OM,Others +S5,M1A,1,1,OM,Pre-XDR +S6,M1A,1,1,DM,XDR +S7,M1B,1,NA,OM,MDR +S8,M1B,1,1,DM,MDR +S9,M1B,1,NA,DM,Other +S10,M1B,1,0,OM,Sensitive +S11,M1C,1,NA,OM,Pre-XDR +S12,M1C,1,NA,OM,Pre-XDR +S13,M1C,1,1,OM,MDR +S14,M1C,1,NA,DM,MDR +S15,A2B,2,0,OM,Others +S16,A2B,2,0,OM,XDR +S17,A2C,2,NA,DM,Pre-MDR +S18,A2C,2,1,DM,Pre-MDR +S19,D3E,3,1,DM,XDR +S20,D3E,3,NA,DM,MDR +S21,D3E,3,NA,OM,Pre-MDR +S22,D3P,3,0,OM,Pre-MDR +S23,D3A,3,0,OM,Sensitive +S24,P4A,4,NA,OM,Others +S25,P5A,5,1,DM,Sensitive diff --git a/test_data/sample_data.ods b/test_data/sample_data.ods new file mode 100644 index 0000000000000000000000000000000000000000..aff3cca690da48b2bf00cac9e14a9f225495681f GIT binary patch literal 18903 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 literal 0 HcmV?d00001