CS 368-1 (2011 Summer) — Day 14 Homework
Due Thursday, August 4, at the start of class.
Weather Forecast Analysis, Part III
The purpose of this three-part project is to compare weather forecasts
against actual weather observations. In this third and final part, the goal
is to do the comparisons and print a textual report of the findings.
Details
We have daily forecast data.
We have hourly observation data.
Now we want to make a report that looks like this:
On July 29, the high was forecast to be in the upper 80s and the actual
high was 86.5F, 0.5F lower than predicted; the low was forecast to be
in the lower 60s and the actual low was 71.2F, 8.2F higher than
predicted.
On July 30, the high was forecast to be in the upper 80s and the actual
high was 88.1F, as predicted; the low was forecast to be in the upper
60s and the actual low was 72.1F, 3.1F higher than predicted.
On July 31, the high was forecast to be in the upper 80s and the actual
high was 89.1F, 0.1F higher than predicted; the low was forecast to be
in the upper 60s and the actual low was 74.7F, 5.7F higher than
predicted.
Skipped 2011-08-01: Only 7 hours of data
Skipped 2011-08-02: No actuals found
The starting script is available here.
As always, there are some challenges to this assignment:
-
Our forecasts are strings like “AROUND 70”,
“LOWER 70S”, “MID 80S”, and
“UPPER 80S”. But to compare our actual highs and lows to
these forecasts, we must convert the textual descriptions into a
range — that is, a minimum and maximum forecast temperature.
You will do this in the compute_forecast_range()
subroutine. The comment block preceding that subroutine gives examples of
the numeric ranges to use for each type of prediction. For example, we
want to convert “UPPER 80S” to the range [87.0, 89.0].
-
We have actual observations of temperatures (minimum and maximum) for each
hour. But which observations should we examine for a given day’s
forecast? For example, suppose we are analyzing the daily forecast issued
at 6:47 a.m. on July 29; it predicted a high “in the upper
80s” and a low “in the lower 60s”. When would that high
occur? As it happened, the high was 86.5°F during the
6 p.m. hour. And the low? 71.2°F during the 5 a.m.
on the next day, July 30. So, I made the design decision
to examine actual observations for a day from noon on that day until the
11 a.m. hour on the following day. While not defensible in the long
run, it is adequate for this exercise. Furthermore, you do not really
have to worry about it too much, because I am giving you the subroutine
that finds the actual high and low for each forecast date.
-
For each day, we have a single sentence that is the report for that day.
It contains a repeated section of text, once for the forecast high and
once for the forecast low. Hmmm… repeated output formats…
what should we do about that? Of course: Write a subroutine! And in
fact, you will write this subroutine, named
report_temperatures(). It takes a string indicating the
type of forecast (literally, “high” or “low”), the
forecast string (e.g., “UPPER 80S”), and the actual
corresponding high or low. It should return a fragment of the report,
“the [high/low] was forecast to
be … predicted”. See the comment block preceding
the subroutine for more examples.
-
The final report consists of a lot of long sentences. Let’s imagine
that we are going to email this text to someone, and we want to keep each
line of text within 72 characters. How do we do this, for all lines of
the report? You tell me, specifically in the
print_report() subroutine. Hint: My solution took only a
line or two of code, so this should be fairly easy.
Optional Work
-
Write unit tests for the code. I tried to design most of the subroutines
to be good for testing. And you have now seen the Test::More pattern a
few times, so you should be able to write some tests.
-
If you want to make the assignment a bit more challenging, simply delete
the contents of any other subroutines in the script, and try writing them
yourself.
-
If you like, you are welcome to write the entire script on your own.
Reminders
Do the work yourself, consulting reasonable reference materials as needed;
any reference material that gives you a complete or nearly complete solution
to this problem or a similar one is not OK to use. Asking the instructors
for help is OK, asking other students for help is not.
Hand In
A printout of your own portions of the final script,
ideally on a single sheet of paper printed on both sides; if you need to
have multiple pages, that is OK. Be sure to put your own name in the
initial comment block of the code. Identifying your work is important, or
you may not receive appropriate credit.