-
Notifications
You must be signed in to change notification settings - Fork 0
Functional Pattern Cleaning Filtering
-
π Cleaning/Fitering van data π
-
Transformeren van data
-
Verzamelen van data
Ik vind het vrij moeilijk om al gelijk aan de slag te gaan met het importeren van de Survey data van DV-2, omdat het een hele tijd geleden is dat ik heb gewerkt met JSON bestanden. Na veel onderzoek op internet gedaan te hebben en nagevraagd te hebben bij mijn medestudenten, ben ik er gelukkig wel uitgekomen.
Op deze pagina vind je:
Ik ben na het college van Laurens op 21/10/2020 zelf aan de slag gegaan met het opschonen van de data.
Er zijn 3 methodes om een nieuw array te maken:
Manier 1 is de 'handmatige map'. Dat is eigenlijk veel code die elke stap duidelijk langsgaat. Dit is vrij toegankelijk voor een beginner, omdat je dan zo stapsgewijs de code schrijft.
let kolomNaam = "grootteSlaapkamer" // create a column name that is equal to the question in the survey
let lijstAntwoorden = getAnswersForQuestion(myData, kolomNaam) // Hoisted invoked function with 2 parameters - myData refers to survey data
function getAnswersForQuestion(answers, question) {
let answersForQuestion=[]
for (answer of answers){ // loop for each of the values of the column name
answersForQuestion.push(answer[question])
}
return answersForQuestion //aray from answers for a specific question
}
Naarmate je meer code-bekwaam bent, kan je de manier 2 toepassen. Dit is de map
methode. Deze code is een stuk eenvoudiger te schrijven en functioneert eigenlijk hetzelfde als manier 1.
let kolomNaam = "grootteSlaapkamer"
let lijstAntwoorden = getAnswersForQuestion(myData, kolomNaam)
function getAnswersForQuestion(answers, question) {
return answers.map(answer => answer[question])
}
console.log("Grootte van de slaapkamer is:", lijstAntwoorden);

Ik zat heel lang te twijfelen welke manier ik nou moest kiezen, maar ik ben toch voor de laatste (map
) gegaan, omdat ik dat makkelijker schrijven vond omdat het veel minder code is. Overigens is het voor mij als developer als lezer duidelijker te lezen.
Een derde manier om map
te gebruiken is om het zonder functie te schrijven. Dan kan je een variabele aanmaken en daarin map
gebruiken. Dit heeft precies dezelfde uitkomst als wanneer je map in een functie gebruikt. Vervolgens console.log
je deze variabele en komt de data in de console in je browser terecht:
let kolomNaam = "grootteSlaapkamer" // create a column name that is equal to the question in the survey
const uniqueAnswers = myData.map(answer => answer[kolomNaam])
console.log("Unique answers are:", uniqueAnswers)
Ik snap nu veel beter hoe map()
werkt en hoe je het kunt toepassen en in welke context. Ik zou dit heel goed kunnen gebruiken bij de dataset die bij mijn eigen concept horen.
Ik heb een complex cleaning patroon geschreven die de waardes van de kolom naamAnderGeslacht
opschoont. Het gaat hier om namen.
Alle code-stappen zijn in script.js (functional-programming repository) te vinden.
Om een kolom van een dataset op te schonen, heb ik een array nodig met de waardes van die kolom erin. Dat doe ik met de map()
methode.
let anderGeslachtNaam = 'naamAnderGeslacht';
let allNames = myData.map((name) => name[anderGeslachtNaam]); // Makes new Array of all names
console.log('(1) Namenlijst', allNames); // List of ALL names

Er zijn naast correct ingevoerde antwoorden (voornamen) ook antwoorden zoals " "
, "-"
, "/"
, "nvt"
etc. Hoewel dit incorrecte antwoorden zijn, wil ik ze alsnog in de dataset laten staan, omdat het wel een antwoord is. Daarom vervang ik dit antwoord met null
.
let checkedNames = allNames.map((name) => {
if (
name == '-' ||
name == '/' ||
name == '' ||
name == 'geen' ||
name == 'nvt' ||
name.indexOf(' ') > 0
) {
return null;
}
return name;
});
console.log('(2A) Gecorrigeerde namenlijst', checkedNames); // List of ALL names, with 'null' mentioning

Ik kan er ook voor kiezen om deze incorrecte antwoorden eruit te filteren. Dat doe ik met behulp van filter()
. Dit kun je doen op het moment dat je echt alleen de voornamen nodig hebt.
// Filters out a list of incorrect answers
let filteredNames = allNames.filter((name) => {
return (
name != '-' &&
name != '/' &&
name != '' &&
name != 'geen' &&
name != 'nvt' &&
name.indexOf(' ') < 1 // https://stackoverflow.com/q/17616624 - Checks if there are 1 or more whitespaces
);
});
console.log('(2B) Namenlijst gefilterd (zonder incorrecte antwoorden)', filteredNames); // List of FILTERED names

Namen horen altijd geschreven te worden met als eerste letter een hoofdletter. Voor dit principe heb ik een herbruikbare functie geschreven die hiervoor zorgt.
let capitalizeNames = checkedNames.map(function (name) {
return name != null ? name.charAt(0).toUpperCase() + name.slice(1) : name;
})
console.log('(3) Namenlijst met hoofdletter', capitalizeNames) // List of ALL names, with uppercased first letter

De lijst hierboven geeft een duidelijke, mooie en schone weergave van de namenlijst β
Bij de data die ik gebruikte voor mijn eigen concept, was het nodig dat het werd gefilterd. Dit versta ik onder cleaning van data, want ik haal de overige datavariabelen weg en ik maak een nieuw array aan met de data die ik nodig heb. Hiervoor heb ik .map()
gebruikt, omdat ik dat de mooiste en meest begrijpbare manier vond. Er zullen vast ook andere methoden zijn om dit mooier en misschien wel beter te doen, maar dit is een methode die past bij mijn niveau.
{
point: {
lat: 52.21061864,
lng: 5.17506312
},
id: "28008b58-5a03-11ea-8ed4-42010a840fd0",
status: {
available: "2",
charging: "0"
},
power: 11040,
publicaccess: "Public"
}
function filteredDataset(dataDay) {
const cleanDataDay = dataDay.data.map((element) => {
const object = {};
object.point = element.point;
object.status = element.status;
return object;
});
{
point: {
lat: 52.21061864,
lng: 5.17506312
},
status: {
available: "2",
charging: "0"
}
Frontend-Data, Tech Track | a project of @ralfz123