Browse Source

adding simple assessment of a table in a single run given a list of quasi identifiers

Steve L. Nyemba -- The Architect 6 years ago
parent
commit
cb58675cd3
1 changed files with 34 additions and 25 deletions
  1. 34 25
      src/pandas_risk.py

+ 34 - 25
src/pandas_risk.py

@@ -35,25 +35,32 @@ class deid :
         """
             @param  id          name of patient field            
             @params num_runs    number of runs (default will be 100)
+	    @params quasi_id 	list of quasi identifiers to be used (this will only perform a single run)
         """
         
         id  = args['id']
-        
-        num_runs  = args['num_runs'] if 'num_runs' in args else 100
+        if 'quasi_id' in args :
+		num_runs = 1
+		columns = list(set(args['quasi_id'])- set(id) )
+	else :
+		num_runs  = args['num_runs'] if 'num_runs' in args else 100
+		columns = list(set(self._df.columns) - set([id]))
         r   = pd.DataFrame()
         
-        columns = list(set(self._df.columns) - set([id]))
         k = len(columns)
         for i in range(0,num_runs) :
             #
             # let's chose a random number of columns and compute marketer and prosecutor risk
             # Once the fields are selected we run a groupby clause
             #
-
-            n   = np.random.randint(2,k) #-- number of random fields we are picking
-            ii = np.random.choice(k,n,replace=False)
-            cols = np.array(columns)[ii].tolist()
-            x_ = self._df.groupby(cols).count()[id].values
+	    if 'quasi_id' not in args :
+		    n   = np.random.randint(2,k) #-- number of random fields we are picking
+		    ii = np.random.choice(k,n,replace=False)
+		    cols = np.array(columns)[ii].tolist()
+            else:
+	    	cols 	= columns
+		n 	= len(cols)
+	    x_ = self._df.groupby(cols).count()[id].values
             r = r.append(
                 pd.DataFrame(
                     [
@@ -72,20 +79,22 @@ class deid :
         return r
 
 
-# import pandas as pd
-# import numpy as np
-# from io import StringIO
-# csv = """
-# id,sex,age,profession,drug_test
-# 1,M,37,doctor,-
-# 2,F,28,doctor,+
-# 3,M,37,doctor,-
-# 4,M,28,doctor,+
-# 5,M,28,doctor,-
-# 6,M,37,doctor,-
-# """
-# f = StringIO()
-# f.write(unicode(csv))
-# f.seek(0)
-# df = pd.read_csv(f)     
-# print df.deid.risk(id='id',num_runs=2)   
+import pandas as pd
+import numpy as np
+from io import StringIO
+csv = """
+id,sex,age,profession,drug_test
+1,M,37,doctor,-
+2,F,28,doctor,+
+3,M,37,doctor,-
+4,M,28,doctor,+
+5,M,28,doctor,-
+6,M,37,doctor,-
+"""
+f = StringIO()
+f.write(unicode(csv))
+f.seek(0)
+df = pd.read_csv(f)     
+print df.deid.risk(id='id',num_runs=2)   
+print " *** "
+print df.deid.risk(id='id',quasi_id=['sex','age','profession'])