The troubleshooting data the assignments are marked against. All of it is synthetic, all of it is labelled, and this page says exactly how each set was made.
Everything on this page is synthetic. None of it is a measurement. It is generated so that the assignments have data with a diagnosable answer, and it is labelled in the page, in the filenames and in the first line of every file so that it cannot be mistaken for observation later.
Aquaponic cycling log
Sixty days of water chemistry from a 1,000 L system with a 4 m2 grow bed, constructed from the textbook shape of a nitrogen cycle with one fault deliberately introduced so that the dataset has a diagnosable answer.
What it is not: A measured log from a real system. The noise is generated, not observed.
synthetic dataSixty days of a 1,000 L system with a 4 m² grow bed. The shaded band is the fault window; the dashed line is the day the operator intervened. Generated by research/model/make_datasets.py.
The first three weeks are an ordinary cycle: ammonia rises as fish are fed and falls as the first group of nitrifiers establishes, nitrite rises and falls behind it as the second group follows, and nitrate accumulates because nothing in the system removes it except the plants.
Then something goes wrong, and the point of the exercise is that the symptom and the cause are different variables. Nitrite climbs again from day 25 while ammonia stays low — so the first nitrification step is still working and the second is not. Read the carbonate hardness column and the reason is there: it has been falling since day one, because nitrification consumes alkalinity and nothing replaced it. pH follows it down through 6.4, and below that the organisms oxidising nitrite slow markedly.
A student who reads only pH and nitrite will diagnose "pH crash" and buffer the system, which is what the operator did on day 46 and which does work. A student who reads the hardness column will notice that the same thing will happen again in seven weeks unless the feed rate and the buffering are reconciled. Both answers are defensible; only one of them is an engineering answer.
Day
Temp °C
pH
KH mg/L
NH₃ mg/L
NO₂ mg/L
NO₃ mg/L
Note
1
22.6
7.06
80
0.83
0.1
0.4
system started; 12 fish stocked, feeding 40 g/day
8
22.8
6.97
74
3.78
0.36
2.5
16
22.7
6.8
62
0.44
4.81
14.2
24
22.5
6.56
44
0.03
0.07
31.1
25
22.4
6.52
40
0.08
0.36
31.8
feed increased to 60 g/day
30
22.5
6.43
31
0.13
1.78
33.4
38
22.5
6.21
19
0.25
4.14
38.7
45
22.5
6.1
8
0.32
6.12
40.8
46
22.9
6.21
17
0.28
5.84
43.2
operator added carbonate buffer
53
23
6.65
50
0.18
2.81
53.7
60
22.9
7.06
77
0.06
0.09
65.1
synthetic dataSelected rows from the sixty-day log. The full file is linked below.
A dry year for each site, derived from that site's Bureau of Meteorology monthly rainfall statistics by scaling each month toward a low decile and perturbing with a fixed seed. The driest four months are cut hardest.
What it is not: A historical drought. No year in these sites' records is reproduced here, and nothing in this dataset should be described as observed rainfall.
synthetic dataDarwin: the synthetic dry year against the long-record monthly mean. The dry-season months are cut hardest, because that is where a storage design actually fails. Derived from Bureau of Meteorology station 014015 monthly statistics.
Use it to break your design. Re-run week 9's tank balance on the dry year and name what fails first, in which month.
Do not tune to it. A design sized for exactly this year is sized for a year that never happened. It is one dry year, not a distribution.
Do not cite it as evidence about a real climate. If your proposal needs a statement about drought frequency, get it from the Bureau, not from here.
Reproducing these files
Both sets are generated deterministically from a fixed seed, so the same run produces the same files. The generator is research/model/make_datasets.py in this site's repository, and the climate statistics it derives from are the Bureau of Meteorology long-record monthly tables for each site's station.
You do not need the repository or Python to do it. The generator below is the same code running in this page, from the same station statistics. With the published seeds it writes the six files above and checks them against the published copies. Change a seed and you get a different dry year and a different log, which is a quick way to see whether a design only survives the one year printed here.