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