-
Notifications
You must be signed in to change notification settings - Fork 0
Data opschonen
Lijstje van wat ik heb gedaan qua data cleaning.
Indien de individuele personen relevant zouden zijn, zou een nieuwe kolom met een ID bij elke rij toegevoegd hebben, wat resulteert in een array van id-objecten die op zichzelf ook weer een object bevatten. Dat zou dan als volgt eruit zien:
const Questionnaire = [{
"Persoon 1": {
"geboortedatum": "13-01-1994",
"rijbewijs": "ja"
},
"Persoon 2": {
"geboortedatum": "02-02-1997",
"rijbewijs": "nee"
}] Er zat een duplicate entry op line 68; deze heb ik uit de dataset gehaald. Ik heb de kolom 'hoogste bedrag ooit uitgegeven' gesorteerd A-Z om te kijken of er nog meer duplicates in zouden zitten, maar dit was gelukkig niet het geval.
Daarnaast zijn de entries 11, 58 en 63 OOK hetzelfde, geen idee wie de dataset drie keer in heeft zitten vullen maar ik heb er in ieder geval twee van verwijderd.
Ik heb dit wel handmatig gedaan dus eigenlijk telt het niet zo voor functional programming.
Om de data te cleanen heb ik de volgende aanpassingen gedaan:
VERSIE 1.0 van m'n patterns; want ik heb nog een versie 2.0 bij Lievelingskleur in HEX die actually functional is ipv hardcoded 'eyeColor'-variabelen.
Ik haalde de data op middels
module.exports = function getData(datasource, variable) { // get data from questionnaire file
return new Promise((resolve, reject) => {
const colors = datasource.filter(item => ({
[variable]: item[variable]
}))
resolve(colors)
})
}Eigenlijk zou ik volgens FP-principe, een aparte functie voor fetchen en aparte functie voor filteren moeten gebruiken.
Waar geen '#' voor stond, heb ik een '#' voor geplaatst.
module.exports = function addHash(data, withHash) { // add hash to answers that don't start with a hash yet
return data.map((item) => {
let eyeColor = item.eyeColor
if (eyeColor.startsWith('#')) {
return {eyeColor: eyeColor}
} else {
const newEyecolor = '#'.concat(eyeColor)
return {eyeColor: newEyecolor}
}
})
}Waar een spatie in het antwoord verwerkt zat, heb ik deze uitgehaald
module.exports = function removeWhitespace(data) { // remove excessive tabs at the start or end of a value
return data.map((item) => {
const trimmed = item.eyeColor.trim()
return {eyeColor: trimmed}
})
}Waar een RGB-kleur ipv HEX is ingevuld, heb ik omgezet naar hexadecimaal. Ik heb hiervoor wel een package gebruikt; ik heb eerst geprobeerd zelf uit te zoeken wat de juiste berekeningen zouden (moeten) zijn maar na iets meer dan een uur zat ik van 'waar ben ik mee bezig lol' en besloot ik een package hiervoor te gebruiken. Ik had opzich ook een functie ervoor van internet kunnen halen en credits in de codecomments kunnen geven maar hey, support your npmlocals.
const rgbHex = require('rgb-hex')
module.exports = function rgbToHex(data) { // check for rgb answers, then convert them to hex
return data.map((item) => {
let eyeColor = item.eyeColor
const matches = eyeColor.substring(1, 4).match(/rgb+/g)
if (matches == 'rgb' || matches == 'RGB') {
const hexColor = matchRGB(eyeColor)
return {eyeColor: hexColor}
} else {
return {eyeColor: eyeColor}
}
})
}
function matchRGB(rgb) { // convert rgb answers to hex, using the rgbHex-package
const cleanRGB = rgb.replace(/\./gi, ',').substring(1)
return `#${rgbHex(cleanRGB)}`
}Waar alleen een kleur is ingevuld als 'lichtblauw' of 'bruin', heb ik de data vervangen met de bijbehorende algemene hex-kleur volgens de Web Colors standaarden . Hiervoor heb ik de kleuren van de webpagina gehaald, in excel gegooid, geëxporteerd als csv en omgezet naar JSON.
const htmlcolors = require('../../_data/html-kleurcodes.js')
module.exports = function wordToHex(data) { // look for the matching hex in the htmlcolors-file
return data.map((item) => {
let eyeColor = item.eyeColor
const match = /^#(?:[0-9a-fA-F]{3}){1,2}$/i.test(eyeColor) // source for regex: https://stackoverflow.com/questions/1636350/how-to-identify-a-given-string-is-hex-color-format
if (match == false) {
let word = eyeColor.replace(/#/gi, '').toLowerCase()
for (color of htmlcolors) {
if (color.NL == word || color.EN == word) {
return {eyeColor: color.HEX}
}
}
return {eyeColor: eyeColor}
} else if (match == true) {
return {eyeColor: eyeColor}
}
})
}Of het verder met uppercase of lowercase-letters moet, ligt aan de programmeertaal. Voor CSS maakt het momenteel gelukkig geen zak uit, maar alsnog heb ik daar een aanpassing aan gedaan.
module.exports = function toUpperCase(lowercase) { // convert all values to uppercase
return lowercase.map((item) => {
let uppercase = item.eyeColor.toUpperCase()
return {eyeColor: uppercase}
})
}
Hier heb ik de punten (.) vervangen door komma's (,).
const CleanSizes = require('../lib/clean-sizes.js')
const RenderSizes = require('../lib/render-sizes.js')
module.exports = async () => {
return eyesizes = await CleanSizes('bedroomSize')
.then(data => RenderSizes(data, 'bedroomSize'))
}const questionnaire = require('../_data/Survey_Information_Design_clean-parsed.js')
const getData = require('./filters/get-data.js')
const removeWhitespace = require('./filters/remove-whitespace.js')
const pointToComma = require('./filters/point-to-comma.js')
module.exports = async (variable) => {
try {
return cleanColors = await getData(questionnaire, variable) // wait for data
.then(data => removeWhitespace(data, variable)) // remove whitespace
.then(data => pointToComma(data, variable))
} catch (err) {
console.error(err)
}
}module.exports = function pointToComma(data, variable) {
return data.map((item) => {
return {[variable]: item[variable].replace(/\./gi, ',')}
})
}
Ook hier heb ik de punten (.) vervangen door komma's (,)
const CleanSizes = require('../lib/clean-sizes.js')
module.exports = async () => {
return shoeSizes = await CleanSizes('shoeSize')
}const questionnaire = require('../_data/Survey_Information_Design_clean-parsed.js')
const getData = require('./filters/get-data.js')
const removeWhitespace = require('./filters/remove-whitespace.js')
const pointToComma = require('./filters/point-to-comma.js')
module.exports = async (variable) => {
try {
return cleanColors = await getData(questionnaire, variable) // wait for data
.then(data => removeWhitespace(data, variable)) // remove whitespace
.then(data => pointToComma(data, variable))
} catch (err) {
console.error(err)
}
}module.exports = function pointToComma(data, variable) {
return data.map((item) => {
return {[variable]: item[variable].replace(/\./gi, ',')}
})
}
## Lievelingskleur in HEX
* Waar ipv een '#', een ' stond, vervangen door '#'
* #000 naar #000000
Alles geïmporteerd voor Eleventy middels
```js
const CleanColors = require('../lib/clean-colors.js')
const RenderColors = require('../lib/render-colors.js')
// export de async functie, die wacht dan weer to CleanEyecolor is uitgevoerd, return dan de door die functie gereturnde waarde en render deze dan
// dit is async aangezien er komende week nog meer uit te voeren functies bijkomen die asynchroon uitgevoerd mogen worden
module.exports = async () => {
return eyeColors = await CleanColors('favoriteColor')
.then(data => RenderColors(data, 'favoriteColor'))
}waarbij ik de cleaning uitvoer middels
const questionnaire = require('../_data/Survey_Information_Design_clean-parsed.js')
const getData = require('./filters/get-data.js')
const removeWhitespace = require('./filters/remove-whitespace.js')
const addHash = require('./filters/add-hash.js')
const toUpperCase = require('./filters/to-uppercase.js')
const wordToHex = require('./filters/word-to-hex.js')
const rgbToHex = require('./filters/rgb-to-hex.js')
// I should refactor everything in a way that I map over the values at first, then filter and reduce instead of repeating to map
// I should also swap the adding of the hash and the converting..
module.exports = async (variable) => {
try {
return cleanColors = await getData(questionnaire, variable) // wait for data
.then(data => removeWhitespace(data, variable)) // remove whitespace
.then(trimmed => addHash(trimmed, variable)) // add hashtag
.then(withHash => wordToHex(withHash, variable)) // convert text to hex
.then(allColors => rgbToHex(allColors, variable)) // convert rgb to hex
.then(cleanHEX => toUpperCase(cleanHEX, variable)) // make uppercase
} catch (err) {
console.error(err)
}
}Ik fetch hierin de data middels
module.exports = function getData(datasource, variable) { // get data from questionnaire file
return new Promise((resolve, reject) => {
const colors = datasource.map(item => ({
[variable]: item[variable]
}))
resolve(colors)
})
}Waar geen '#' voor stond, heb ik een '#' voor geplaatst.
module.exports = function addHash(data, variable) { // add hash to answers that don't start with a hash yet
return data.map((item) => {
if (item[variable].startsWith('#')) {
return {[variable]: item[variable]}
} else {
return {[variable]: '#'.concat(item[variable])}
}
})
}Waar een spatie in het antwoord verwerkt zat, heb ik deze uitgehaald
module.exports = function removeWhitespace(data, variable) { // remove excessive tabs at the start or end of a value
return data.map((item) => {
return {[variable]: item[variable].trim()}
})
}Waar een RGB-kleur ipv HEX is ingevuld, heb ik omgezet naar hexadecimaal. Ik heb hiervoor wel een package gebruikt; ik heb eerst geprobeerd zelf uit te zoeken wat de juiste berekeningen zouden (moeten) zijn maar na iets meer dan een uur zat ik van 'waar ben ik mee bezig lol' en besloot ik een package hiervoor te gebruiken. Ik had opzich ook een functie ervoor van internet kunnen halen en credits in de codecomments kunnen geven maar hey, support your npmlocals.
const rgbHex = require('rgb-hex')
module.exports = function rgbToHex(data, variable) { // check for rgb answers, then convert them to hex
return data.map((item) => {
const matches = item[variable].substring(1, 4).match(/rgb+/g) // check if the string (without the hash) has 'rgb' in it
if (matches == 'rgb' || matches == 'RGB') {
return {[variable]: matchRGB(item[variable])}
} else {
return {[variable]: item[variable]}
}
})
}
function matchRGB(rgb) { // convert rgb answers to hex, using the rgbHex-package
const cleanRGB = rgb.replace(/\./gi, ',').substring(1)
return `#${rgbHex(cleanRGB)}`
}Waar alleen een kleur is ingevuld als 'lichtblauw' of 'bruin', heb ik de data vervangen met de bijbehorende algemene hex-kleur volgens de Web Colors standaarden . Hiervoor heb ik de kleuren van de webpagina gehaald, in excel gegooid, geëxporteerd als csv en omgezet naar JSON.
const htmlcolors = require('../../_data/html-kleurcodes.js')
module.exports = function wordToHex(data, variable) { // look for the matching hex in the htmlcolors-file
return data.map((item) => {
const match = /^#(?:[0-9a-fA-F]{3}){1,2}$/i.test(item[variable]) // source for regex: https://stackoverflow.com/questions/1636350/how-to-identify-a-given-string-is-hex-color-format
if (match == false) {
let word = item[variable].replace(/#/gi, '').toLowerCase()
for (color of htmlcolors) {
if (color.NL == word || color.EN == word) {
return {[variable]: color.HEX}
}
}
return {[variable]: item[variable]}
} else if (match == true) {
return {[variable]: item[variable]}
}
})
}Of het verder met uppercase of lowercase-letters moet, ligt aan de programmeertaal. Voor CSS maakt het momenteel gelukkig geen zak uit, maar alsnog heb ik daar een aanpassing aan gedaan.
module.exports = function toUpperCase(data, variable) { // convert all values to uppercase
return data.map((item) => {
return {[variable]: item[variable].toUpperCase()}
})
}Wat ik gecleaned zou hebben:
- Het antwoord '/' weggehaald
- De volledige namen vervangen door hun afkortingen zoals op deze lijst aangeduid
- Alles wat op 'ben er niet zo mee bezig' neerkomt, vervangen door 'Niet zo mee bezig'.
- Alles wat op 'geen idee' neerkomt, vervangen door 'Geen idee'.
- Alles wat op 'gaat je niets aan/wil ik niet vertellen' neerkomt, vervangen door 'Zeg ik liever niet'.
- 'Geen voorkeur' in hetzelfde format qua capitals
Verder is er door iemand "Optie 17, optie 16" ingevuld, maar kom er niet uit waar dat voor zou moeten staan. Blanco, stemonthouding, geen idee.
Voor zover ik weet is de nummering van de kandidatenlijsten nog niet bekend, maar in 2017 waren het in ieder geval:
- Forum voor Democratie
- De BurgerBeweging (19 kieskringen)
Wat ik gecleaned zou hebben:
- Bij het antwoord 'anders', data vervangen door het antwoord dat in de volgende vraag gegeven is
- Antwoorden als 'x' of '-' of 'nvt' eruit gehaald
- Overeenkomende/dubbele antwoorden eruit gehaald
- "Tech" met Frontend op 1 hoop gegooid, tenzij anders aangegeven (backend bijv wel apart benoemd)
Wat ik gecleaned zou hebben:
- Lege velden of iets dat op 'nee' neerkomt, vervangen door 'Nee'
- '0' ook vervangen door 'Nee'.
- 'Ja' aan het begin van de zin verwijderen zodat alleen de titel van de baan overblijft
- Van alles een zelfstandig naamwoord gemaakt (bijv: 'ja, horeca' = 'Horecamedewerker')
- Alles wat op 'bediening' of ' serveerder/serveerster' neerkomt vervangen door: 'Bediende'
- 'Front-end' vervangen door 'frontend'
- 'Winkelbediende' vervangen door 'winkelmedewerker'
Wat ik gecleaned zou hebben:
- Alles met 'beide', aangepast naar 'Beide'
- Grammaticale fouten of spelfouten verbeterd
- Iets met 'Interessant' = 'Interessant'
- Iets met 'Leuk' = Leuk
- Beknopte zinnen van gemaakt
Wat ik gecleaned zou hebben:
- '?'. 'geen idee' of iets in die trant, veranderen in 'Weet ik nog niet'
- 'Frontend Developer'-varianten veranderen naar 'Frontend Developer'
- Vormgever etc naar ' Visual Designer'
- 'Webdesign' naar 'Web Designer'
Wat ik gecleaned zou hebben:
- '00 naar 0
Wat ik gecleaned zou hebben:
- Alles met 'geen' naar 'Geen'
- Hoofdletters
- 'h&m divided' naar 'H&M'
- 'Pokemon' naar 'Pokémon'
- 'Addidas' naar 'Adidas'
- 'Ben niet merkengeil' en 'geef ik niets om' naar 'Geen'
Wat ik gecleaned zou hebben:
- 'Anders' uit antwoord verwijderd
- '6300 minuten per dag' naar '630 minuten per dag' veranderd aangezien er maar 1440 minuten in een dag zitten