dinsdag 3 november 2015

Diagnostiek - deel 2

Het valt in eerste instantie niet mee om de userdefined variabelen eruit te halen. Met het indrukwekkende commando


Data = Data[np.core.defchararray.rjust(Data[:,1],8) != 'USERDEFP']

lukt het uiteindelijk. (Het veld begint met USERDEFP gevolgd door een volgnummer)

Daarnaast wil ik, inplaats van de nullen in de nieuwe kolommen en rijen, gebruik maken van 'nan', de manier om in Python / Numpy aan te geven dat er geen data beschikbaar is . Dat maakt het berekenen van het gemiddelde, bij de data opschoning straks, meer betrouwbaar. Nulwaarden halen anders wellicht het gemiddelde omlaag.
Ook dit blijkt lastig vooral omdat het toevoegen van kolommen en rijen dezelfde array-structuur vereist. Dat had ik natuurlijk eerder ook al opgelost maar de korte methode voor het aanvullen met 'nan' (vermenigvuldigen met np.nan) blijkt iets te doen aan de datastructuur. Of heb ik toch ook iets anders aangepast? Hier wreekt zich het niet werken met versies want ik kan mijn eerdere code niet terugkijken. Nu ja, na veel experimenteren lijkt het weer gelukt. Weer een keer 11.000 excels door. Dat gaat weer even wat tijd nemen. Dus gelegenheid om dit verslagje te maken. :-)

Hier is de gebruikte code:

import os
import xlrd
import numpy as np
import pickle
import pandas as pd
XLDir = "/Volumes/Slot 4 2tB/Ziekenhuis data"
Ldir = os.listdir(XLDir)
XLList = [s for s in Ldir if s[-4:] == ".xls"]
XLCount = len(XLList)
SelCol = ['SeriesInstanceUID','ParameterId','ResultIdentifier','ResultValue']
SelColn = [61,108, 110, 111]

stop = 0
best = 0
collist = ['SeriesInstanceUID']
first = True # Eerste aanmaak van X (input matrix)
for xl in XLList:
    #stop += 1
    if stop > 10:
        break
    
    book = xlrd.open_workbook(XLDir + '/' + xl, logfile=open(os.devnull, 'w'))
    sh = book.sheet_by_index(0)
    if sh.ncols >= 129 and sh.cell(0,129).value =='FindingId': # Alleen waar deze cel FindingId bevat!"
        best +=1
        print best, xl
        Data = []
        for rx in range(sh.nrows):                                                      # Inlezen spreadsheet in Data
            Data.append(sh.row_values(rx))
        Data = np.array(Data)                                                           # Omzetten naar numpy array
        Data = Data[:,SelColn]                                                          # Select only the 4 interesting columns
        Data = Data[Data[:,2] == 'Average']                                             # Select only 'Avarage' values
        Data = Data[np.core.defchararray.rjust(Data[:,1],8) != 'USERDEFP']              # Remove USERDEFP columns
        R,C = Data.shape
        if R > 0:                                                                       # Anders zijn er geen 'Avarage' waardes aangetroffen
            if first:                                                                   # Eerste keer dat X wordt aangemaakt krijgt deze alleen 1 x de eerste onderzoeks identifier 'SeriesInstanceUID'
                X=np.array([[Data[0][0]]])
                first = False
            else:
                #print X.shape, len(X)
                X=np.vstack((X,np.append([Data[0][0]], np.nan*np.zeros(len(X[0])-1))))  # Als X al bestaat wordt er een record toegevoegd van de identifier en de huidige hoeveelheid kolommen (nan's)
    
            for i in range(len(Data)):                                                  # Alle rijen uit de 'uitgedunde excel' langs
                if Data[i][1] not in collist:                                           # 'ParameterID' niet in collist
                    collist = collist + [Data[i][1]]                                    # Voeg aan collist toe
                    X = np.append(X,np.nan*np.zeros((len(X),1)), 1)                     # Voeg kolom met nan's toe aan X
                X[(len(X)-1)][collist.index(Data[i][1])] = Data[i][3]                   # Fill proper column with Resultvalue

np.save('/Volumes/Slot 4 2tB/Ziekenhuis data/X',X)
np.save('/Volumes/Slot 4 2tB/Ziekenhuis data/collist',collist)

X = np.load('/Volumes/Slot 4 2tB/Ziekenhuis data/X.npy')
D_PD = pd.DataFrame(X)
print collist
print(D_PD.head(10))
print(D_PD.describe())  

Geen opmerkingen:

Een reactie posten