def buychance(new_objects): import pandas as pd import numpy as np #werkkopie van de historische data objectHistory = oldTransactions.copy() #oldTransactions is de te gebruiken aankoopgeschiedenis. #de nieuwe objecten worden in een lijst gestopt om de bewerking te versnellen varlist = new_objects.values.tolist() #leeg dataFrame om de resultaten naartoe te schrijven resultDF = pd.DataFrame() #voor elke nieuw object worden de volgende stappen genomen for newObject in varlist: #kenmerken worden in variabelen gestopt kleurObject = newObject["Kleur"] merkObject = newObject["Merk"] typeObject = newObject["Type"] staatObject = newObject["Staat"] leeftijdObject = newObject["Leeftijd"] prijsKlasseObject = newObject["PrijsKlasse"] newObjectID = newObject["ID"] #als een kenmerk van nieuw object gelijk is aan het kenmerk van een object in de historie wordt er een score gegeven objectHistory.loc[:,'kleurScore']= np.where(objectHistory.loc[:,'Kleur'] == kleurObject, 1, 0) objectHistory.loc[:,'merkScore']= np.where(objectHistory.loc[:,'Merk'] == merkObject, 1, 0) objectHistory.loc[:,'typeScore']= np.where(objectHistory.loc[:,'Type'] == typeObject, 1, 0) objectHistory.loc[:,'staatScore']= np.where(objectHistory.loc[:,'Staat'] == staatObject, 1, 0) #De twee nabijgelegen klasses voor leeftijd en prijsklasse moeten ook een (lichtere) score krijgen #hiervoor wordt eerst de diff genomen tussen de scores van de history en het nieuwe object objectHistory.loc[:,'leeftijdScore']= abs(objectHistory.loc[:,'Leeftijd'] - leeftijdObject) #Hierna worden de condities bepaald voor elke nabijgelegen klasse, conditionsAge = [ (objectHistory['leeftijdScore']==0), (objectHistory['leeftijdScore']<=2) & (objectHistory['leeftijdScore']>0), (objectHistory['leeftijdScore']<=4) & (objectHistory['leeftijdScore']>2), (objectHistory['leeftijdScore']<=6) & (objectHistory['leeftijdScore']>4), ] choicesAge = [1,0.75,0.5,0.25] objectHistory['leeftijdScore'] = np.select(conditionsAge, choicesAge, default=0) #diff tussen de scores van de history en het huidige object objectHistory.loc[:,'prijsScore']= abs(objectHistory.loc[:,'PrijsklasseCode'] - prijsKlasseObject) #Hierna worden de condities bepaald voor elke nabijgelegen klasse, conditionsPrice = [ (objectHistory['prijsScore']==0), (objectHistory['prijsScore']<=2) & (objectHistory['prijsScore']>0), (objectHistory['prijsScore']<=4) & (objectHistory['prijsScore']>2), (objectHistory['prijsScore']>6 & (objectHistory['prijsScore']>4) ] choicesPrice = [1,0.75,0.5,0.25] objectHistory['prijsScore'] = np.select(conditionsPrice, choicesPrice, default=0) #koperID wordt meegenomen om over te groeperen objectHistory.loc[:,'newObjectID']= newObjectID #cumulatieve score van de verschillende kenmerken objectHistory.loc[:,'cumScore']=objectHistory.loc[:,'kleurScore':'prijsScore'].sum(axis=1) #weging van de score, enkele tellen zwaarder objectHistory.loc[:,'objectScore']=objectHistory.loc[:,'kleurScore':'prijsScore'].multiply([0.1,0.1,0.2,0.2,0.2,0.2], axis=1).sum(axis=1) objectHistory.loc[:,'objectCount']=objectHistory.loc[:,'objectID'] #dit moet een uniek ID zijn voor de gekochte objecten in de historie #definieren van de aggregatie voor de verschillende kenmerken groupdict = {'objectCount': ['count'], 'kleurScore' : ['sum'], 'merkScore' : ['sum'], 'typeScore' : ['sum'], 'staatScore': ['sum'], 'leeftijdScore': ['sum'], 'prijsScore': ['sum'], 'objectScore':['median'] #mediaan zorgt ervoor dat er gelijk voor aantallen wordt gecorrigeerd } grouper = ['koperID','newObjectID'] #variabelen waarover wordt gegroepeerd groupeddf = objectHistory.groupby(grouper).agg(groupdict).reset_index() #omzetten nummerieke score naar categoriale 'A' tot 'D' conditions = [ (groupeddf['objectScore']>=0.5), (groupeddf['objectScore']>=0.4) & (groupeddf['objectScore']<0.5), (groupeddf['objectScore']>=0.3) & (groupeddf['objectScore']<0.4) ] groupeddf['vehicleScoreCat'] = np.select(conditions, ['A','B','C'], default='D') groupeddf.columns = groupeddf.columns.droplevel(1) #groeperen creeert een extra index, deze wordt hiermee verwijderd #sorteren van de data voor eventuele selectie van de top 5, kan ook later in powerBI of excel of anders groupeddf.sort_values(by=['objectScore','objectCount'], inplace=True, ascending=False) resultDF = groupeddf return resultDF