Maar allez.
Ik houd bij wanneer ik ga slapen en wanneer ik wakker word, al een tijd. Al sinds 10 augustus 2013 om exact te zijn.
Ik had daar ooit al eens deze semi-manuele grafiek van gemaakt (klik voor detail):
…en ik dacht, ik smijt er eens wat python tegen om die grafiek automatisch te maken.
De gegevens zijn te downloaden bij Sleepbot, dus hoe moeilijk kan het zijn? De ruwe data ziet er zo uit:
Dat is te downloaden als csv, dat kan ik inladen, en dan maak ik er twee kolommen van — starttime is Date plus Sleep Time en endtime is Date plus Awake Time:
starttime | endtime |
---|---|
27-12-16 02:53 | 27-12-16 02:53 |
26-12-16 01:49 | 26-12-16 01:49 |
25-12-16 02:55 | 25-12-16 02:55 |
24-12-16 01:37 | 24-12-16 01:37 |
23-12-16 00:42 | 23-12-16 00:42 |
22-12-16 01:34 | 22-12-16 01:34 |
21-12-16 02:15 | 21-12-16 02:15 |
20-12-16 03:14 | 20-12-16 03:14 |
19-12-16 04:11 | 19-12-16 04:11 |
18-12-16 01:39 | 18-12-16 01:39 |
So far, so good.
Alhoewel. Om die strings als datums geparsed te krijgen, heb ik een dik kwartier hard gevloekt. Kijk of ge de fout ziet:
import csv, pandas as pd df = pandas.read_csv('sleep.csv', sep=',') df['starttime'] = df.to_datetime(df['starttime'], format='%d/%m/%Y %H:%M')
Dat geeft een propere
AttributeError: 'DataFrame' object has no attribute 'to_datetime'
Ja, lach maar. Natuurlijk bestaat
df.to_datetime
niet en moest het
pd.to_datetime
zijn — uiteindelijk maakte ik er trouwens gewoon
df['starttime'] = pd.to_datetime(df['starttime'],infer_datetime_format=True) df['endtime'] = pd.to_datetime(df['endtime'],infer_datetime_format=True)
van, pandas was slim genoeg om het allemaal zelf te herkennen.
Het moet allemaal niet zo performant zijn, dus deed ik de bijzonder domme aanpak: loopen van de eerste datum tot de laatste datum, en dan voor elke minuut van elke dag kijken of die minuut ergens tussen een starttime en een endtime valt. Als dat zo is, dan zet ik een 1 in een lijst, anders een 0.
En op het einde maak ik een tweedimensionele array van die lange lijst, die ik via Pillow’s Image.fromarray() omzet naar een png, een beetje schaal en opsla.
Dat geeft mij dan iets als dit, dat er op het eerste zicht in orde uitziet:
…maar als ik naar beneden kijk, dan zitten er allemaal gaten in:
En neen, ik heb geen gaten in mijn data. Ik ben daar zeer consciëntieus in.
Iets mis met het “algoritme”? Welneen, dat is zo achterlijk dat het niet fout kan zijn.
Het heeft geen kwarier geduurd. Zelfs geen vijf minuten: de data was wel degelijk slecht, maar het is niet mijn schuld, het is de schuld van Sleepbot. Want ja, starttime is Date plus Sleep Time maar neen, endtime is niét Date plus Awake Time. Op die manier heb ik gegeven deze data
geslapen van 11/12/2016 om 23u07 tot 11/12/2016 om 9u55, in plaats van tot 12/12. Idem van 14/12 23u49 tot 14/12 7u02, in plaats van tot 15/12 7u02.
Gelukkig staat die Duration er ook bij, dus was het gewoon starttime is Date plus Sleep Time en endtime is starttime plus het aantal uren en minuten in Duration. Zucht.
Dat geeft dan een grafiek die er wel juist uitziet. Of euh wacht:
Getver. Het is omgekeerd, zowaar. Endtime is Date plus Sleep Time en starttime is endtime min het aantal uren en minuten in Duration. Dubbel zucht.
Maar jawel dus:
En als dat werkt, dan is het 1 fluit van 1 cent om er wat kleur aan te geven, en dat geeft dan deze grfiek voor elke minuut van elke dag sinds augustus 2013 (klik voor enorm groot beeld):
Euh ja, het is geen zicht. Een totaal onbruikbare grafiek. 🙂
Ik ga morgen dan eens kijken om er iets nuttigers van te maken.
Reacties
2 reacties op “Vuile data en grafieken maken”
Nuttigheid is overrated
^ What Tom said.
Ik heb vroeger ook Sleepbot gebruikt, maar ben uiteindelijk overgestapt naar Sleep for Android, omdat het toch net nog iets meer features heeft. Data was makkelijk te migreren overigens, waardoor ik niets kwijt ben. Mijn gedacht, ik zou ook es zo een grafiekje moeten maken…