Sunday, December 27, 2009

Toy decoding: vtech Push and Ride Alphabet Train

So, it's Christmas and you end up visiting people with kids... and they've got a fancy new vtech Push and Ride Alphabet Train. Now, you're the world's worst child minder because you see it and think: how does that work?

Specifically, when you insert one of the 26 alphabet blocks into the side of the train how does it know to say the correct letter? And how does it know which side (letter or word) is facing outwards (so it can say a letter or a corresponding word: "A is for Apple" etc.).

Now it quick examination shows that there are 6 small switches in each block receptacle and that each block has corresponding bits of plastic and holes to make different binary patterns. The top bit (bit 5) seems to be used to indicate which side of the block is showing.

That leaves 5 bits for the alphabet. Of course that means there are 32 possible combinations (actually 31 since 'block not present' indicated by all switches up is important), and 26 letters in the alphabet. So which 5 binary combinations are not needed for the alphabet and what do they do?

First here's the mapping between letters and their five bit patterns. Here 0 = button is depressed by little sliver of plastic, and 1 = button is left up because there's a space in the block.
`a 11010    b 00010    c 00011    d 00100    e 00101    f 00110g 00111    h 01000    i 01001    j 01010    k 01011    l 01100m 01101    n 01110    o 01111    p 10000    q 10001    r 10010s 10011    t 10100    u 10101    v 10110    w 10111    x 11000y 11001    z 00001`

As I'm sure you've noticed there's something very odd about this sequence. Letters b through y follow a nice pattern, but what's up with a and z? Here's the same information using decimal to make the problem clear:
`a 26    b  2    c  3    d  4    e  5    f  6g  7    h  8    i  9    j 10    k 11    l 12m 13    n 14    o 15    p 16    q 17    r 18s 19    t 20    u 21    v 22    w 23    x 24y 25    z 1`

As you can see it appears that the numbers for a and z are swapped. You'd expect a to be 1 and z to be 26. Now, there could be some clever explanation for this but I'm guessing it's the work of Captain Cock-up.

When I used to write software in a hardware company it was pretty common for there to be mistakes in the hardware design or implementation that had to be fixed in software. I remember one very snowy December outside of Route 128 at an HP works debugging something nasty with an EISA card on which our code was running inside some new HP workstation (pretty sure it was a Series 700 with the native GSC bus and something called the Wax ASIC to provide an EISA bus). Turned out that our hardware wasn't latching things onto the EISA bus with quite the perfect timing that the ASIC needed and corrupt data was hitting the main bus. This is not the sort of thing you want to have happen. The fix was done in software to alter the order of writing (which was done with two 16-bit writes) and a little loop to spin around checking for stability.

So, I bet vtech had a little mistake like that. Somehow the codes for a and z got swapped in software there's a fix.

If you haven't played around with hardware much you might have been surprised that button depressed = 0 (see above). This is actually pretty common because it's typical to connect logic lines going into some logic (especially if it's TTL) to positive 5V (or similar) with a pull-up resistor.

In TTL logic an unconnected pin will float around and try to be high, and so most designers ensure that it is actually high with a pull-up. Then to change the input you connect the input pin to ground via your switch (with no resistance). Thus the input is normally high (which is typically interpreted as 1) and goes low (normally that's 0) when the switch is depressed.

Here's a typical circuit:

The only disappointed me was that the extra 5 combinations of 1s and 0s don't do anything. I was really hoping for an Easter Egg left by the developers.

Wednesday, December 23, 2009

Phew! Got the limited coverage error sorted out

I had been worried about reproducing the error range shown in Brohan et al. section 6.1 because I was getting much larger error bars than in the paper.

But I wrote some tests and dug into the code and discovered a problem where my regridder/subsampler was ignoring some data because of a difference in the way longitude was reported between my gridding program and the NetCDF file from the reanalysis data.

Bottom line: I now get values much, much closer to the published information and all my worries about the temperature for 2009 appearing inside the error bars for the 1860s are gone.

Phew.

Here's the new chart showing the smoothed trend line with 95% confidence bars.

And here for comparison is the chart from the paper (mine is northern hemisphere and this is global but you can clearly see the similarity now).

Now, I can retire from amateur climatology... I've worked through Brohan et al. using the Met Office data, found a few problems, but mostly reproduced their results.

Tuesday, December 22, 2009

And now for a bug in my code

There was a bug in my code that caused the global trend graph to be wrong. When I added the cosine weighting I hadn't updated the code that outputted the file for gnuplot for the global trend (it was correct for the northern and southern hemisphere). This is what happens when you hack things together and don't write a test suite. Slap on the wrist.

The corrected code is now in the repository.

Here's the corrected comparison between the output of my program and the output of the Met Office program (with my bug fix to their code).

Now that's a pretty picture.

There are some very small differences that could probably be looked into, but I'm getting a little tired and this is looking really nice now.

There's a hole in my bucket, dear Liza, dear Liza

So the Met Office released source code for analysis of the recently released land surface temperature data and there appears to be a bug in it.

If you take a look at lines 87-91 of station_gridder.perl there's a loop that reads data from the observation files and extract data between the start and end years. Unfortunately, this appears to be wrong and the program ends up reading suspect data and using it.
` # Push anomaly for each year and month to @GridA for (      my \$i = \$Station->{start_year} ;     \$i <= \$Station->{end_year} ;     \$i++   )`

The \$Station hash (actually hash reference) contains entries for start_year, end_year and first_good_year. These correspond to the entries Start year, End year and First Good year in the observation files.

The First Good year is documented as "First Good Year — data before that year are suspect." (see here). My program uses that to remove any suspect data, the Met Office version does not.

This means that it adds suspect data to the averages. I don't know if this really matters, but since they say data before those years is suspect I was assuming that it shouldn't be used.

You can fix the program by changing the lines to:
` # Push anomaly for each year and month to @GridA for (      my \$i = \$Station->{first_good_year} ;     \$i <= \$Station->{end_year} ;     \$i++   )`

If you run the two versions you'll see a slight change in the trend (which affects the early period when data was considered suspect). Here's a chart showing the original version (the red line) and the corrected version (the green line).

Notice something funny? There's a gap at 1855. In fact there's no data output for 1855. Digging in, this turns out to happen because there are no valid southern hemisphere measurements at all in 1855.

Hence there's no global average for 1855.

That's a bit odd, but not serious. But it makes me suspect something: I'll bet a mince pie that this code the Met Office has released is not the code they actually use to create CRUTEM3. I bet they wrote it especially for this release.

Of course, I could be wrong about that.

UPDATE. See this blog posting for the Met Office's reply. Looks like the bug is not a bug, it's an error in their documentation.

The Met Office source code

The Met Office has released the source code for analysis of the land surface temperature data.

It consists of two Perl scripts: station_gridder.perl and make_global_average_ts_ascii.perl.

The first one produces the gridded output for the temperature anomalies across the globe by year since 1850. The second takes the output of the first and produces a text file that can shows the global temperature anomaly since 1850.

I've run them both on the same data as my program (and produced an annual average version of the output of my script). Here's a graph that shows their trend (in red) and my trend (in green). Nice, I'm getting essentially the same results as they are.

Note. The output of station_gridder.perl is similar to the current CRUTEM3 file, but not the same. There are small differences.

Here's a graph that compares CRUTEM3 (in green) and the output of station_gridder.perl (in red) on the released data.

And finally a plot of all three data munches: CRUTEM3 (in green), station_gridder.perl (in red) and me (in blue):

Update to my program to analyze the Met Office data

I've pushed an update to the script to the project. It adds reading, verifying and using the standard deviation data. The standard deviations are used to remove outlying temperature observations as defined in Brohan et al.

If an observation is greater than 5 sigma from the normal then it is dropped.

I've recomputed everything and it makes a very minor difference to the results. Here's a graph showing the northern and southern hemisphere and global trends smoothed from the new data. It's barely different from before. But at least I'm doing what's specified in the paper.

Red is northern hemisphere, green is southern and blue is global.

I'm still worried about the limited coverage error and I'm still don't fully get the Met Office response. Will post more when I hear from them.

Here's the updated trend chart for the northern hemisphere with the error bars for 95% confidence from the sub-sampling:

UPDATE: Since I only have land data the chart I should probably be comparing with in Brohan et al. is this one (top chart from Figure 12):

This looks a lot more like the errors shown in my chart, now it's just a question of accounting for the magnitude, since for the 1860s this chart shows an error of about 0.3C whereas my chart has more like 1.4C.

So need to track that down.

If you also look at Figure 12 you can see that the anomaly errors for the sea component of HadCRUT3 are really minimal. That probably explains why the global chart I was looking at before didn't have the same error range as my analysis. Need to stay just looking at the land data.

Monday, December 21, 2009

Climate change skeptics / deniers pay better

I don't make any real money from my blog ads, in fact I make pennies. Until this last month when I've been writing about climate change. If I track the incoming links to my site and correlate with advertising revenue look what I find when I examine all clicks since December 1:

The top two sites there are blogs that cover climate change from a skeptical angle. The third is the general URL site StumbleUpon.

So the blogs account for \$3.04 and StumbleUpon for \$0.04 (all the other referrers resulted in \$0.00). Wow, those climate change skeptics account for 98.7% of my ad revenue (and, by the way, a typical month for me is \$0.50 in revenue). I made an additional \$0.28 from people who came directly to my site.

So, thanks, climate change skeptics.

I wonder if this implies something about gullibility.

The bipolar world

An article on a web site I'd not previously seen called American Thinker says the following about me:

(There are also efforts by true believers to justify the code. Try following the logic of the post in that last link.)

So, I'm a climate change 'true believer' am I? You mean because I blogged something that doesn't agree with your interpretation of the facts I must be from the other side?

Well, guess what. I don't believe in this bipolar world of yours where you're with us or against us, pro-choice or pro-life, or, frankly, any of the other ridiculous black or white notions beloved of people who get involved in politics (of any kind).

If I was a 'true believer', pray tell, why I would have analyzed raw data from the Met Office and found an error in it, or gone on TV in the UK and criticized the quality of code taken from CRU, blogged about all the errors in it?

My take on global warming is... unless you can demonstrate to me that it's false I'm going to believe the scientists who've been working on it. Pretty much the same way I do about any other bit of science. That's how science works, unlike politics.

The full respone from the Met Office

Here's my original mail to the Met Office and the full reply.

I suppose I need to begin this by declaring that I'm not a climate change nutjob... I am a mathematician by training who's had a great deal of fun using your recently released land surface dataset to reproduce some of your gridded data. If you are curious about what I did with your data, this YouTube video I made will take 9 minutes of your time and tell you about it:
http://www.jgc.org/blog/2009/12/met-office-land-surface-temperature.html

A couple of questions have arisen, and I'm hopeful that you can answer them for me.

1. I've noticed that there seems to be a big difference between the 'Normals' given in many of the datafiles for Australisia and the actual normal values calculated from the 1961-1990 data. See for example, this blog of entry of mine about one of them:

Do you know of any issues with these values?

2. In following through the calculations in section 6.1 of the Brohan paper I'm surprised that the sampling error isn't much greater for the mid-1800s. In the mid-1800s there were less than 100 stations reporting temperature and yet if you look at Figure 11 (top) in the paper the green band is the 95% error value based on sampling error.

It appears to be of similar size no matter what year is being examined. Yet my own recalculation of the values (by sub-sampling the NCEP/NCAR dataset) show that the standard deviation in the anomalies is about 1 whereas for 2009 it's around 0.05. Intuitively this makes sense given that the number of stations increased greatly over the years. Do you know why this isn't reflected in the paper?

3. The sub-sampling of NCEP/NCAR also gives a mean value for the sampling error. The paper doesn't seem to talk about using that mean value to adjust the calculated values. Is that correct? It would seem to me that you'd want to use the mean to adjust for sampling error. If you do it reduces the temperatures up until the mid-1970s by around 0.5C and then has a small effect on the warming trend after that. Is it reasonable to use the mean from the sub-sampled data in that way?

Thank you for taking the time to answer me questions and Merry Christmas.

Cheers,
John.

Dear John,

Thank you for your interest in the data.

1. First off, thank you for bringing this to our attention. We have undertaken further investigation upon the full dataset and confirmed this. The error affects <1% of the network and is primarily in Oceania. It arises because normals were calculated outside of the update cycle and the normals for these stations were not updated when extra data were added in the normals period as CRUTEM3 was being finalised for publication.

We intend to add this information to our online Q and A for the data and we would like to credit you with pointing out the error. Would you be happy to be mentioned in this way?

2. Figure 11 shows annual hemispheric-averages combined land and sea-surface temperature data, which have been smoothed using a 21-point binomial filter. A large proportion of the coverage error (the green area on the diagram) arises because there are few observations over the Arctic and Antarctic. Temperatures in these areas exhibit high variability and therefore contribute significantly to the uncertainty on estimates of hemispheric and global average temperature. Because this is a large component of the uncertainty on global average temperatures and because coverage at high latitudes is still relatively poor, the uncertainty range is not much narrower now than it was in the 19th century.

3. We do not use the mean NCEP error to 'correct' the data because it is important that CRUTEM3 and HadCRUT3 provide an observational estimate of temperature change that is independent of all models. Furthermore, the mean error would only be representative of changes during the period covered by the reanalysis and not applicable outside this range.

Best regards and Merry Christmas,

Tim Hill

I'm still not sure I 100% understand part 2 there, and I've sent a follow-up question to the Met Office. I'm guessing from their reply that the sub-sampling mentioned in the Brohan et al. paper isn't done in a simple fashion (as I had imagined) since they are specifically talking there about taking into account the variability at the high latitudes.

Will publish their response when I get it.

Friday, December 18, 2009

Well, I was right about one thing

Just received a nice mail from the Met Office in response to my queries about the data showing that I was right about one thing: there is something odd about the values in Australasia (or as they say, Oceania).

I had written to them saying:

I've noticed that there seems to be a big difference between the 'Normals' given in many of the datafiles for Australisia and the actual normal values calculated from the 1961-1990 data. See for example, this blog of entry of mine about one of them:

Do you know of any issues with these values?

Tonight they have replied:

First off, thank you for bringing this to our attention. We have undertaken further investigation upon the full dataset and confirmed this. The error affects <1% of the network and is primarily in Oceania. It arises because normals were calculated outside of the update cycle and the normals for these stations were not updated when extra data were added in the normals period as CRUTEM3 was being finalised for publication.

We intend to add this information to our online Q and A for the data and we would like to credit you with pointing out the error. Would you be happy to be mentioned in this way?

Wow. I shall now pat myself on the back, drink a little toast to Perl and openness in science, and go to bed.

Thursday, December 17, 2009

Adjusting for coverage bias and smoothing the Met Office data

As I've worked through Uncertainty estimates in regional and global observed temperature changes: a new dataset from 1850 to reproduce the work done by the Met Office I've come up against something I don't understand. I've written to the Met Office about it, but until I get a reply this blog post is to ask for opinions from any of my dear readers.

In section 6.1 Brohan et al. talk about the problem of coverage bias. If you read this blog post you'll see that in the 1800s there weren't many temperature stations operating and so only a small fraction of the Earth's surface was being observed. There was a very big jump in the number of stations operating in the 1950s.

That means that when using data to estimate the global (or hemispheric) temperature anomaly you need to take into account some error based on how well a small number of stations act as a proxy for the actual temperature over the whole globe. I'm calling this the coverage bias.

To estimate that Brohan et al. use the NCEP/NCAR 40-Year Reanalysis Project data to get an estimate of the error for the groups of stations operating in any year. Using that data it's possible on a year by year basis to calculate the mean error caused by limited coverage and its standard deviation (assuming a normal distribution).

I've now done the same analysis and I have two problems:

1. I get much wider error range for the 1800s than is seen in the paper.

2. I don't understand why the mean error isn't taken into account.

Note that in the rest of this entry I am using smoothed data as described by the Met Office here. I am applying the same 21 point filter to the data to smooth it. My data starts at 1860 because the first 10 years are being used to 'prime' the filter. I extend the data as described on that page.

First here's the smooth trend line for the northern hemisphere temperature anomaly derived from the Met Office data as I have done in other blog posts and without taking into account the coverage bias.

And here's the chart showing the number of stations reporting temperatures by year (again this is smoothed using the same process).

Just looking at that chart you can see that there were very few stations reporting temperature in the mid-1800s and so you'd expect a large error when trying to extrapolate to the entire northern hemisphere.

This chart shows the number of stations by year (as in the previous chart), it's the green line, and then the mean error because of the coverage bias (red line). For example, in 1860 the coverage bias error is just under 0.4C (meaning that if you use the 1860 stations to get to the northern hemisphere anomaly you'll be too hot by about 0.4C. You can see that as the number of stations increases and global coverage improves the error drops.

And more interesting still is the coverage bias error with error bars showing one standard deviation. As you might expect the error is much greater when there are fewer stations and settles down as the number increases. With lots of stations you get a mean error near 0 with very little variation: i.e. it's a good sample.

Now, to put all this together I take the mean coverage bias error for each year and use it to adjust the values from the Met Office data. This causes a small downward change which emphasizes that warming appears to have started around 1900. The adjusted data is the green line.

Now if you plot just the adjusted data but put back in the error bars (and this time the error bars are 1.96 standard deviations since the published literature uses a 95% confidence) you get the following picture:

And now I'm worried because something's wrong, or at least something's different.

1. The published paper on HadCRUT3 doesn't show error bars anything like this for the 1800s. In fact the picture (below) shows almost no difference in the error range (green area) when the coverage is very, very small.

So I think there are two possibilities:

A. There's an error in the paper and I've managed to find it. I consider this a remote possibility and I'd be astonished if I'm actually right and the peer reviewed paper is wrong.

B. There's something wrong in my program in calculating the error range from the sub-sampling data.

If I am right and the paper is wrong there's a scary conclusion... take a look at the error bars for 1860 and scan your eyes right to the present day. The current temperature is within the error range for 1860 making it difficult to say that we know that it's hotter today than 150 years ago. The trend is clearly upwards but the limited coverage appears to say that we can't be sure.

So, dear readers, is there someone else out there who can double check my work? Go do the sub-sampling yourself and see if you can reproduce the published data. Read the paper and tell me the error of my ways.

UPDATE It suddenly occurred to me that the adjustment that they are probably using isn't the standard deviation but the standard error. I'll need to rerun the numbers to see what the shape looks like, but it should reduce the error bounds a lot.

UPDATE Here's what the last graph looks like if I swap out the standard deviation for the standard error.

That's more like it, I'm going to guess that this what Brohan et al. are doing (without saying it explicitly). But that doesn't explain why their error seems to remain constant. Anyone help with that?

UPDATE The Met Office has replied to my email with an explanation of what's going on with the mean and standard deviation and I'll post it shortly.

UPDATE Please read this post which shows that my code contained an error in interpreting longitude which results in a chart that looks like the one from the Met Office.

Data Visualization Disease

A few days ago I moaned about an inaccurate and ininterpretable visualization appearing in a book touting its own excellence at visualization. Now, I'm pointed to a visualization of the recently released Met Office land surface temperature record that makes similar mistakes.

Folks, data visualization isn't about pretty colours, or slapping some data into a CSV and asking Excel to make you a line graph. It's about thinking about how the data needs to be interpreted and then creating an appropriate visualization. Many of the 'infoporn' graphics that adorn the blogs and magazines of the digerati (a pejorative term) are little more than the fantasies of a graphic designer sprinkled with some magical 'data' or 'statistics' pixie dust.

But these designers shouldn't be messing around with magic like that. They aren't trained to handle it, Hermione.

Here's the first graph from the blog. It appears to show that it's 10C hotter now than in the 1800s. Holy cow, Batman, the Earth's on fire!

It's all wrong.

All they've done is averaged the temperature readings from across the globe to try to get a sense of global warming. Averages are fun because any fool can calculate them, but pity the fool who averages without thinking. Some questions:

1. Did they ask themselves about the distribution of temperature readings across the globe to ensure that the average correctly reflected the entire Earth's surface? For example, are there lots of thermometers clustered close to each other that might bias the average?

2. Did they ponder the fact that there's much more land in the northern hemisphere, hence many more readings, hence without weighting the average is dominated by northern climes?

3. Did they ask themselves if an average is what you want? Is it reasonable to take the temperature in London in December and the temperature in Sydney in December and average them? Given that it's winter up north and summer down south what does an average tell you?

4. Did they ever ask themselves why the standard deviation is so freakin' huge (see the 2008 numbers in the graph above)?

No, they made a CSV file and graphed it. And since they get some 'warming' out of it they are happy.

This is what I call Data Visualization Disease. You grab some data, you think of a fancy (or not so fancy) way to show it. You shade that it in pastel colours you picked by wandering around Habitat, label it in a sans-serif font, and you're a God of visualization.

What they should have done is taken the thermometer readings, calculated a long term average for each location, calculated the difference between each reading and the average (to understand how much temperature has changed, not the absolute values), mapped those onto a grid laid across the Earth's surface, averaged (perhaps with variance adjustment) values from all the thermometers in each grid square to get a grid anomaly value, then produced a weighted average for the hemispheres based on weighting by the cosine of the latitude (since the grid box area varies with latitude) to get hemisphere averages.

Then they could have plotted that.

But there's no infoporn in doing that, that sounds like actual work, and worse, thinking. Phew! No, thanks. Pass the Crayola.

Update: since writing this rant I've seen that the blog I'm criticizing has listened to the complaints of people who pointed out similar problems.

Monday, December 14, 2009

An open source project for my Met Office data analyzer

Since some other people have been playing with my little Perl program to analyze the Met Office land surface temperature data, I've registered a project at SourceForge so that others can work with me on it.

I've also imported my latest version of the script which outputs data about the number of stations used to create the gridding data, and does cosine weighting of the northern and southern hemisphere trend data.

It can all be found at Land Surface Temperature Analyzer.

One more thing about the Met Office Land Surface Temperature data

If you've been following my posts you might have spotted an oddity: if you run the animation of gridding since 1850 it's pretty clear that there weren't many stations going into the mix up until the 1950s.

This introduces uncertainty when calculating the hemisphere and global figures. To get an idea about how little coverage there was, here's a graph showing the average number of stations used for calculating the monthly trend since 1850 (I've averaged over a year so that the graph is smaller).

In the 1850s there were around 50 stations to cover the whole world. By the 1990 there are over 1400. So the question is, how much uncertainty do the relative paucity of measurements in the 1850s introduce?

The answer in the published literature (see this paper section 6.1 for details) is 'very little'. If you take a look at the Figure 10 (below) from that paper the green error seems almost unchanged from the 1850s to today.

Since that's counter-intuitive that looks like a good place to start in checking the calculations performed. Would you expect 50 stations to give the same accuracy as 1400?

I really need to find the time to process the NCEP/NCAR 40-Year Reanalysis Project data and perform my own calculation of the uncertainty. If anyone else beats me to it, please let me know!

Friday, December 11, 2009

Met Office Land Surface Temperature Data: The Video

If you don't have all the time to follow all my blog posts on messing with the Met Office data, I've made you a 9 minute YouTube that gives you the highlights...

Thursday, December 10, 2009

Source code for processing the Met Office Land Surface Temperature data

The source code used to validate the Met Office data and produce all the visualizations on this blog is here. Enjoy!

This code does the following:

1. Reads and validates the Met Office Land Surface Temperature data file.

2. Spits out errors if it finds problems with the data.

3. Produces a Google Maps/Google Earth compatible KML file with pin marks of the locations of the weather stations used in step 4.

4. Performs gridding of temperature data on a 5 degree square grid.

5. Produces a Google Maps/Google Earth compatible KML file with gridded data for October 2009 to match the latest visualization from the Met Office. This gridding size can be adjusted and any month/year chosen.

6. Dumps CSV files for every weather station in 4 showing month by month anomaly data.

7. Dumps gnuplot compatible .dat files for northern and southern hemisphere and global temperature anomalies since 1850. These are used to produce these visualizations. Note that this does not do cosine-weighting of the grid temperatures (as in the the published literature). Adding it would be simple, but even without it the trend is clear.

8. Produces an experimental animated KML file showing the change in anomaly for October for every year since 1850 to 2009. My machine isn't powerful enough to run this through Google Earth very successfully so I can't guarantee that this is perfect.

If you do use it please refer back to me and this blog.

There's something seriously odd about "NAPIER NELSON PK"

If you are messing with the Met Office temperature data there's one file which is really odd: 93/933710. It has temperature data for NAPIER NELSON PK at (-39.5, -176.8) There is actually a Napier Nelson Park in New Zealand but not quite at those coordinates. And I can't find a reference to a WMO station with the number 933710.

But leave that aside.

The really odd thing is the data in the file. There's a mismatch between the 1961-1990 data (which is present and complete) and the Normals (i.e. the averages for 1961-1990). According to the file the Normals come from the data itself, but they are off: almost consistently by 1C.

Here are the differences (Normals as is reported; Calculated is my calculation from the file):
`Month    Normals    Calculated   DifferenceJan      19.5       18.31        -1.19Feb      19.0       17.94        -1.06Mar      17.8       16.68        -1.12Apr      14.8       13.85        -0.95May      12.0       10.87        -1.13Jun       9.7        8.55        -1.15Jul       9.0        8.05        -0.95Sep      11.9       10.88        -1.02Oct      14.1       13.04        -1.06Nov      16.2       15.05        -1.15Dec      18.2       16.94        -1.26`

So the normal temperature for this station is 1C higher than the observations indicate. That would end up meaning that any trend is actually lower than the real figures.

Very odd. And very odd that's almost exactly 1C off. Why? Some systematic error? Human intervention?

Reconstruction of the 1850 to present day warming trend from Met Office data

Having got the gridding working of the recently released Met Office Land Surface Temperature data it was a short step to reconstruct the temperature trends for 1850 to the present day.

I've performed the same gridding as the HadCRUT3 dataset with one exception: I have not removed outliers (the papers on the subject describe removing outliers in the anomaly data that are greater than five standard deviations from the normals). I've left outliers in just to get a feel for the data as is, without clean up. That means that the graphs below are a bit more noisy than in the published literature, but the warming trends are clear.

Here's the northern hemisphere chart:

and here's the (less dramatic) southern hemisphere chart:

and here's the global chart (which is taken by averaging the north and south on a month by month basis):

Tuesday, December 08, 2009

A first look at gridded data from the Met Office Land Surface Temperature Record

Well, I've got it working and here's a KML file for you to explore in Google Earth. When I say 'it' I mean:

1. Extract the data from the Met Office files

2. Check the Normals

3. Calculate anomaly data for all stations

4. Grid data onto 5 degree square portions of globe using algorithm in the HadCRUT3 paper

5. Turn all that into a coloured KML file for display in Google Earth

And here it is (that is the gridded anomaly data for October 2009 with the 1961-1990 average baseline):

For comparison here's the Met Office's higher resolution picture for the same period. Just staring at the two you can see that approximately the same thing is being plotted with western Europe warmer and Scandinavia and central Europe cooler (you can just make out the same cool spot in Scotland on both).

Phew. That was hard work.

I'll release the code once I've convinced myself that it works correctly.

Problems to watch for in the Met Office Land Surface Temperature Data

As I've been working through verifying the integrity of this data I've noticed a number of problems/gotchas that you'll need to watch for.

These have come up while verifying the 'Normals' data which should be the monthly average data for 1961 to 1990 where there's data and at least 15 years worth of data available (see Uncertainty estimates in regional and global observed temperature changes: a new dataset from 1850 for details of how the calculations should be performed).

1. If the Normals source is Data then the normals values have been calculated from within the file itself. You should be able to verify (with appropriate rounding to one decimal place) the averages on a month by month basis. I have done this.

2. If the Normals source is WMO or Extrapolated then the normals values came from the WMO or from the extrapolation by A Grid Point Surface Air Temperature Data Set for the Northern Hemisphere. You will not be able to check these against the data in the files and there are significant variances (sometime of the order of 1 or 2 degrees).

A question for the Met Office is how they work with data series that have an average drawn from a different series of data. If the average is off by 1 or 2 degrees for these data points what's the resulting influence on the final data or error bars?

Concrete example is 48/489300 where there are 16 readings between 1961 and 1990 giving an average value for February of 20.6C, but the WMO data gives a value of 19.1C (variance of 1.5C).

Also, in that file the average comes from WMO, but the standard deviation from the data in the file. That's odd.

3. There's something odd about Australia and New Zealand. Specifically in the files 93/* and 94/* files there are lots of variances between the calculated normals for these areas and the reported normals. The differences are of the order of fractions of a degree (although there are some up to 1C).

Here's the full output of my program reporting anomalies:
`31/314160: Normals -0.1 != -0.00333333333333334 (diff 0.0966666666666667) (mon 3)35/357460: Normals -0.1 != -0.00999999999999999 (diff 0.09) (mon 10)44/442300: Normals -0.1 != -0.0285714285714286 (diff 0.0714285714285714) (mon 9)47/474260: Normals -0.1 != -0.00666666666666668 (diff 0.0933333333333333) (mon 2)93/930120: Normals 19.3 != 19.45 (diff 0.150000000000002) (mon 0)93/930120: Normals 19.8 != 19.97 (diff 0.169999999999995) (mon 1)93/930120: Normals 19.0 != 19.0966666666667 (diff 0.0966666666666676) (mon 2)93/930120: Normals 16.7 != 16.85 (diff 0.150000000000002) (mon 3)93/930120: Normals 14.4 != 14.5366666666667 (diff 0.136666666666663) (mon 4)93/930120: Normals 11.7 != 11.77 (diff 0.0700000000000021) (mon 6)93/930120: Normals 12.0 != 12.1233333333333 (diff 0.123333333333331) (mon 7)93/930120: Normals 12.8 != 13.0033333333333 (diff 0.203333333333335) (mon 8)93/930120: Normals 14.1 != 14.3666666666667 (diff 0.266666666666666) (mon 9)93/930120: Normals 15.8 != 15.98 (diff 0.18) (mon 10)93/930120: Normals 17.7 != 17.8166666666667 (diff 0.116666666666671) (mon 11)93/931190: Normals 19.3 != 19.4533333333333 (diff 0.153333333333332) (mon 0)93/931190: Normals 16.3 != 16.21 (diff -0.0899999999999999) (mon 3)93/931190: Normals 10.8 != 10.6533333333333 (diff -0.146666666666665) (mon 6)93/931190: Normals 11.5 != 11.4 (diff -0.0999999999999996) (mon 7)93/931190: Normals 16.0 != 16.0966666666667 (diff 0.0966666666666676) (mon 10)93/932920: Normals 19.0 != 19.4758620689655 (diff 0.475862068965519) (mon 0)93/932920: Normals 18.7 != 19.0724137931035 (diff 0.372413793103451) (mon 1)93/932920: Normals 17.3 != 17.7137931034483 (diff 0.413793103448274) (mon 2)93/932920: Normals 14.6 != 15.0448275862069 (diff 0.444827586206891) (mon 3)93/932920: Normals 11.8 != 12.2862068965517 (diff 0.486206896551721) (mon 4)93/932920: Normals 9.9 != 10.1931034482759 (diff 0.293103448275863) (mon 5)93/932920: Normals 9.2 != 9.47241379310345 (diff 0.272413793103446) (mon 6)93/932920: Normals 10.0 != 10.3724137931034 (diff 0.372413793103446) (mon 7)93/932920: Normals 11.6 != 11.9586206896552 (diff 0.358620689655176) (mon 8)93/932920: Normals 13.5 != 14.0034482758621 (diff 0.50344827586207) (mon 9)93/932920: Normals 15.6 != 16.0413793103448 (diff 0.441379310344827) (mon 10)93/932920: Normals 17.6 != 17.9413793103448 (diff 0.341379310344827) (mon 11)93/933090: Normals 17.5 != 17.6033333333333 (diff 0.103333333333339) (mon 0)93/933710: Normals 19.5 != 18.3133333333333 (diff -1.18666666666667) (mon 0)93/933710: Normals 19.0 != 17.9366666666667 (diff -1.06333333333333) (mon 1)93/933710: Normals 17.8 != 16.6766666666667 (diff -1.12333333333333) (mon 2)93/933710: Normals 14.8 != 13.8533333333333 (diff -0.946666666666671) (mon 3)93/933710: Normals 12.0 != 10.8666666666667 (diff -1.13333333333333) (mon 4)93/933710: Normals 9.7 != 8.55333333333333 (diff -1.14666666666666) (mon 5)93/933710: Normals 9.0 != 8.05 (diff -0.949999999999998) (mon 6)93/933710: Normals 10.0 != 8.94666666666667 (diff -1.05333333333333) (mon 7)93/933710: Normals 11.9 != 10.8833333333333 (diff -1.01666666666667) (mon 8)93/933710: Normals 14.1 != 13.0366666666667 (diff -1.06333333333334) (mon 9)93/933710: Normals 16.2 != 15.0466666666667 (diff -1.15333333333333) (mon 10)93/933710: Normals 18.2 != 16.94 (diff -1.26) (mon 11)93/934340: Normals 16.7 != 16.9233333333333 (diff 0.223333333333336) (mon 0)93/934340: Normals 16.8 != 16.99 (diff 0.190000000000001) (mon 1)93/934340: Normals 15.8 != 15.9366666666667 (diff 0.136666666666661) (mon 2)93/934340: Normals 13.5 != 13.6866666666667 (diff 0.186666666666667) (mon 3)93/934340: Normals 9.0 != 9.10666666666667 (diff 0.106666666666667) (mon 7)93/934340: Normals 10.4 != 10.5066666666667 (diff 0.106666666666667) (mon 8)93/934340: Normals 11.9 != 12.0666666666667 (diff 0.166666666666666) (mon 9)93/934340: Normals 13.4 != 13.5666666666667 (diff 0.166666666666664) (mon 10)93/934340: Normals 15.3 != 15.4833333333333 (diff 0.183333333333328) (mon 11)93/936150: Normals 7.8 != 7.89666666666667 (diff 0.0966666666666667) (mon 5)93/936150: Normals 7.2 != 7.33666666666667 (diff 0.136666666666667) (mon 6)93/937800: Normals 17.1 != 17.02 (diff -0.0800000000000054) (mon 0)93/937800: Normals 16.6 != 16.7066666666667 (diff 0.106666666666662) (mon 1)93/937800: Normals 15.1 != 15.1966666666667 (diff 0.0966666666666676) (mon 2)93/937800: Normals 6.3 != 6.39 (diff 0.0899999999999999) (mon 5)93/937800: Normals 5.9 != 6.12666666666667 (diff 0.226666666666666) (mon 6)93/937800: Normals 7.2 != 7.37333333333333 (diff 0.173333333333332) (mon 7)93/937800: Normals 11.7 != 11.55 (diff -0.149999999999997) (mon 9)93/937800: Normals 13.8 != 13.4966666666667 (diff -0.303333333333331) (mon 10)93/937800: Normals 15.9 != 15.6066666666667 (diff -0.293333333333337) (mon 11)93/938440: Normals 13.9 != 13.9766666666667 (diff 0.0766666666666662) (mon 0)93/938440: Normals 13.8 != 13.7366666666667 (diff -0.0633333333333308) (mon 1)93/938440: Normals 12.7 != 12.6133333333333 (diff -0.0866666666666713) (mon 2)93/938440: Normals 10.4 != 10.3366666666667 (diff -0.0633333333333308) (mon 3)93/938440: Normals 7.8 != 7.73666666666667 (diff -0.0633333333333344) (mon 4)93/938440: Normals 9.8 != 9.94666666666667 (diff 0.146666666666665) (mon 9)93/939450: Normals 6.0 != 5.91666666666667 (diff -0.0833333333333321) (mon 4)93/939450: Normals 5.3 != 5.09333333333333 (diff -0.206666666666666) (mon 5)93/939450: Normals 5.0 != 4.93333333333333 (diff -0.0666666666666664) (mon 6)93/939450: Normals 5.4 != 5.26 (diff -0.139999999999999) (mon 7)93/939450: Normals 5.7 != 5.61 (diff -0.0900000000000007) (mon 8)93/939450: Normals 8.8 != 8.88666666666667 (diff 0.086666666666666) (mon 11)93/939870: Normals 14.3 != 14.3766666666667 (diff 0.0766666666666644) (mon 2)93/939870: Normals 8.1 != 8.00333333333333 (diff -0.0966666666666676) (mon 6)93/939870: Normals 9.2 != 9.29 (diff 0.0900000000000016) (mon 8)93/939870: Normals 11.6 != 11.68 (diff 0.0800000000000001) (mon 10)93/939940: Normals 21.9 != 21.9866666666667 (diff 0.086666666666666) (mon 0)93/939940: Normals 22.1 != 22.17 (diff 0.0699999999999967) (mon 2)93/939940: Normals 20.5 != 20.5966666666667 (diff 0.0966666666666569) (mon 3)93/939940: Normals 18.7 != 18.7833333333333 (diff 0.0833333333333286) (mon 4)93/939940: Normals 17.5 != 17.56 (diff 0.0600000000000023) (mon 5)93/939940: Normals 16.2 != 16.31 (diff 0.110000000000007) (mon 6)93/939940: Normals 16.1 != 16.19 (diff 0.0899999999999963) (mon 7)93/939940: Normals 16.4 != 16.52 (diff 0.120000000000001) (mon 8)93/939940: Normals 17.4 != 17.5166666666667 (diff 0.116666666666667) (mon 9)94/941200: Normals 25.2 != 25.27 (diff 0.0700000000000038) (mon 5)94/942030: Normals 29.4 != 29.0866666666667 (diff -0.313333333333329) (mon 1)94/942030: Normals 29.5 != 29.11 (diff -0.390000000000004) (mon 2)94/942030: Normals 28.3 != 28.1366666666667 (diff -0.163333333333334) (mon 3)94/942030: Normals 25.0 != 24.57 (diff -0.43) (mon 4)94/942030: Normals 22.1 != 21.3433333333333 (diff -0.756666666666671) (mon 5)94/942030: Normals 21.1 != 20.85 (diff -0.25) (mon 6)94/942030: Normals 22.4 != 21.68 (diff -0.720000000000002) (mon 7)94/942030: Normals 25.1 != 24.2566666666667 (diff -0.843333333333334) (mon 8)94/942030: Normals 27.5 != 27.4333333333333 (diff -0.06666666666667) (mon 9)94/942030: Normals 29.4 != 28.9433333333333 (diff -0.456666666666671) (mon 10)94/942030: Normals 30.2 != 29.6666666666667 (diff -0.533333333333328) (mon 11)94/942120: Normals 30.2 != 30.4964285714286 (diff 0.296428571428571) (mon 0)94/942120: Normals 29.7 != 29.9862068965517 (diff 0.286206896551718) (mon 1)94/942120: Normals 28.9 != 29.248275862069 (diff 0.348275862068963) (mon 2)94/942120: Normals 26.9 != 27.1266666666667 (diff 0.22666666666667) (mon 3)94/942120: Normals 23.5 != 24.0233333333333 (diff 0.52333333333333) (mon 4)94/942120: Normals 20.3 != 20.8933333333333 (diff 0.593333333333337) (mon 5)94/942120: Normals 19.7 != 20.1633333333333 (diff 0.463333333333335) (mon 6)94/942120: Normals 22.4 != 22.9066666666667 (diff 0.506666666666664) (mon 7)94/942120: Normals 26.3 != 26.6827586206897 (diff 0.38275862068965) (mon 8)94/942120: Normals 29.9 != 30.151724137931 (diff 0.251724137931031) (mon 9)94/942120: Normals 31.4 != 31.748275862069 (diff 0.34827586206897) (mon 10)94/942120: Normals 31.3 != 32.1766666666667 (diff 0.876666666666662) (mon 11)94/942380: Normals 30.3 != 30.1045454545454 (diff -0.19545454545456) (mon 1)94/942380: Normals 18.1 != 18.2772727272727 (diff 0.177272727272726) (mon 6)94/942380: Normals 31.3 != 31.4090909090909 (diff 0.109090909090909) (mon 11)94/942870: Normals 25.4 != 25.27 (diff -0.129999999999999) (mon 3)94/942870: Normals 21.7 != 21.5866666666667 (diff -0.113333333333333) (mon 5)94/942870: Normals 21.2 != 21.02 (diff -0.179999999999996) (mon 6)94/942870: Normals 22.0 != 21.94 (diff -0.0600000000000023) (mon 7)94/942870: Normals 23.4 != 23.2066666666667 (diff -0.193333333333328) (mon 8)94/942870: Normals 24.9 != 24.8166666666667 (diff -0.0833333333333321) (mon 9)94/942870: Normals 26.4 != 26.3133333333333 (diff -0.086666666666666) (mon 10)94/942940: Normals 27.8 != 27.9566666666667 (diff 0.156666666666666) (mon 0)94/942940: Normals 26.7 != 26.8066666666667 (diff 0.106666666666669) (mon 2)94/942940: Normals 20.5 != 20.4 (diff -0.100000000000001) (mon 7)94/942940: Normals 22.6 != 22.5166666666667 (diff -0.0833333333333393) (mon 8)94/942940: Normals 26.9 != 26.8266666666667 (diff -0.0733333333333412) (mon 10)94/942940: Normals 27.7 != 27.7966666666667 (diff 0.096666666666664) (mon 11)94/943000: Normals 26.9 != 27.1266666666667 (diff 0.22666666666667) (mon 0)94/943000: Normals 28.1 != 28.3466666666667 (diff 0.246666666666666) (mon 1)94/943000: Normals 26.9 != 27.2466666666667 (diff 0.346666666666668) (mon 2)94/943000: Normals 23.9 != 24.4033333333333 (diff 0.50333333333333) (mon 3)94/943000: Normals 20.4 != 20.9666666666667 (diff 0.566666666666666) (mon 4)94/943000: Normals 16.3 != 16.6433333333333 (diff 0.34333333333333) (mon 6)94/943000: Normals 17.2 != 16.9233333333333 (diff -0.276666666666664) (mon 7)94/943000: Normals 19.1 != 19.4533333333333 (diff 0.353333333333328) (mon 8)94/943000: Normals 23.0 != 23.5066666666667 (diff 0.506666666666657) (mon 10)94/943000: Normals 24.9 != 25.3166666666667 (diff 0.416666666666664) (mon 11)94/943120: Normals 30.9 != 30.8137931034483 (diff -0.0862068965517295) (mon 0)94/943120: Normals 30.8 != 30.8785714285714 (diff 0.0785714285714221) (mon 1)94/943120: Normals 30.5 != 30.4275862068966 (diff -0.0724137931034434) (mon 2)94/943120: Normals 28.1 != 27.58 (diff -0.520000000000003) (mon 3)94/943120: Normals 23.8 != 23.73 (diff -0.0700000000000003) (mon 4)94/943120: Normals 19.6 != 19.7433333333333 (diff 0.143333333333334) (mon 6)94/943120: Normals 21.0 != 20.82 (diff -0.18) (mon 7)94/943120: Normals 23.8 != 23.63 (diff -0.170000000000009) (mon 8)94/943120: Normals 26.4 != 26.3275862068966 (diff -0.0724137931034399) (mon 9)94/943120: Normals 28.7 != 28.4931034482759 (diff -0.206896551724135) (mon 10)94/943130: Normals 31.5 != 31.5966666666667 (diff 0.0966666666666676) (mon 1)94/943130: Normals 30.5 != 30.7266666666667 (diff 0.226666666666663) (mon 2)94/943130: Normals 21.9 != 21.7866666666667 (diff -0.11333333333333) (mon 4)94/943130: Normals 18.7 != 18.5666666666667 (diff -0.133333333333333) (mon 5)94/943260: Normals 28.7 != 28.6 (diff -0.100000000000001) (mon 0)94/943260: Normals 27.9 != 27.6366666666667 (diff -0.263333333333332) (mon 1)94/943260: Normals 24.9 != 24.6866666666667 (diff -0.213333333333324) (mon 2)94/943260: Normals 20.2 != 20.3733333333333 (diff 0.173333333333332) (mon 3)94/943260: Normals 15.6 != 15.5233333333333 (diff -0.0766666666666644) (mon 4)94/943260: Normals 12.4 != 12.0166666666667 (diff -0.383333333333333) (mon 5)94/943260: Normals 14.2 != 13.9533333333333 (diff -0.246666666666664) (mon 7)94/943260: Normals 18.2 != 18.2633333333333 (diff 0.0633333333333361) (mon 8)94/943260: Normals 22.8 != 22.7366666666667 (diff -0.0633333333333326) (mon 9)94/943260: Normals 25.9 != 25.7766666666667 (diff -0.123333333333331) (mon 10)94/943260: Normals 27.8 != 27.51 (diff -0.289999999999999) (mon 11)94/943400: Normals 30.4 != 30.0384615384615 (diff -0.361538461538455) (mon 0)94/943400: Normals 29.9 != 29.4285714285714 (diff -0.471428571428575) (mon 1)94/943400: Normals 28.3 != 27.9827586206896 (diff -0.317241379310353) (mon 2)94/943400: Normals 25.2 != 24.9821428571429 (diff -0.217857142857145) (mon 3)94/943400: Normals 17.1 != 17.3310344827586 (diff 0.231034482758616) (mon 6)94/943400: Normals 19.2 != 19.5 (diff 0.300000000000001) (mon 7)94/943400: Normals 22.8 != 23.0103448275862 (diff 0.210344827586201) (mon 8)94/943400: Normals 26.5 != 26.8172413793103 (diff 0.317241379310339) (mon 9)94/943400: Normals 29.2 != 29.2777777777778 (diff 0.0777777777777757) (mon 10)94/943400: Normals 30.4 != 30.1384615384615 (diff -0.261538461538471) (mon 11)94/943460: Normals 29.2 != 29.1 (diff -0.100000000000009) (mon 1)94/943460: Normals 27.2 != 27.0733333333333 (diff -0.126666666666665) (mon 2)94/943460: Normals 23.8 != 23.5827586206896 (diff -0.217241379310352) (mon 3)94/943460: Normals 25.1 != 25.0233333333333 (diff -0.0766666666666644) (mon 9)94/943460: Normals 29.7 != 29.6357142857143 (diff -0.0642857142857203) (mon 11)94/943670: Normals 20.5 != 20.5833333333333 (diff 0.0833333333333321) (mon 4)94/943670: Normals 17.6 != 17.6733333333333 (diff 0.0733333333333306) (mon 5)94/943670: Normals 25.3 != 25.3633333333333 (diff 0.063333333333329) (mon 10)94/943740: Normals 26.8 != 27.03 (diff 0.230000000000004) (mon 0)94/943740: Normals 26.6 != 26.6733333333333 (diff 0.0733333333333341) (mon 1)94/943740: Normals 25.5 != 25.5666666666667 (diff 0.0666666666666664) (mon 2)94/943740: Normals 16.9 != 17.0633333333333 (diff 0.163333333333334) (mon 5)94/943740: Normals 16.0 != 16.1266666666667 (diff 0.126666666666665) (mon 6)94/943740: Normals 17.5 != 17.7 (diff 0.200000000000003) (mon 7)94/943740: Normals 20.1 != 20.4533333333333 (diff 0.353333333333328) (mon 8)94/943740: Normals 23.1 != 23.3666666666667 (diff 0.266666666666666) (mon 9)94/943740: Normals 25.2 != 25.3866666666667 (diff 0.186666666666664) (mon 10)94/943740: Normals 26.5 != 26.6266666666667 (diff 0.126666666666662) (mon 11)94/944030: Normals 25.1 != 25.2033333333333 (diff 0.103333333333328) (mon 0)94/944030: Normals 26.0 != 26.0833333333333 (diff 0.0833333333333357) (mon 1)94/944030: Normals 15.5 != 15.5666666666667 (diff 0.0666666666666647) (mon 8)94/944030: Normals 17.7 != 17.7733333333333 (diff 0.0733333333333306) (mon 9)94/944030: Normals 22.9 != 22.9666666666667 (diff 0.0666666666666664) (mon 11)94/944300: Normals 31.2 != 31.825 (diff 0.624999999999996) (mon 0)94/944300: Normals 30.1 != 30.1892857142857 (diff 0.0892857142857153) (mon 1)94/944300: Normals 23.1 != 23.33 (diff 0.229999999999993) (mon 3)94/944300: Normals 17.7 != 17.9633333333333 (diff 0.263333333333335) (mon 4)94/944300: Normals 14.3 != 14.4733333333333 (diff 0.173333333333332) (mon 5)94/944300: Normals 13.1 != 13.4933333333333 (diff 0.393333333333334) (mon 6)94/944300: Normals 14.8 != 15.01 (diff 0.209999999999999) (mon 7)94/944300: Normals 18.4 != 18.5433333333333 (diff 0.143333333333334) (mon 8)94/944300: Normals 22.2 != 22.48 (diff 0.279999999999998) (mon 9)94/944300: Normals 25.9 != 26.31 (diff 0.410000000000004) (mon 10)94/944300: Normals 29.3 != 29.5896551724138 (diff 0.289655172413791) (mon 11)94/944610: Normals 30.2 != 29.99 (diff -0.209999999999997) (mon 0)94/944610: Normals 22.6 != 22.85 (diff 0.25) (mon 3)94/944610: Normals 17.3 != 17.8433333333333 (diff 0.543333333333329) (mon 4)94/944610: Normals 14.1 != 13.9733333333333 (diff -0.126666666666663) (mon 5)94/944610: Normals 13.2 != 13.58 (diff 0.380000000000004) (mon 6)94/944610: Normals 15.4 != 15.89 (diff 0.490000000000002) (mon 7)94/944610: Normals 19.8 != 19.34 (diff -0.460000000000001) (mon 8)94/944610: Normals 24.0 != 24.5766666666667 (diff 0.576666666666661) (mon 9)94/944610: Normals 27.1 != 27.4866666666667 (diff 0.386666666666667) (mon 10)94/944610: Normals 29.2 != 29.0466666666667 (diff -0.15333333333334) (mon 11)94/944760: Normals 30.1 != 30.0083333333333 (diff -0.0916666666666721) (mon 0)94/944760: Normals 29.7 != 29.624 (diff -0.0759999999999934) (mon 1)94/944760: Normals 26.6 != 26.2740740740741 (diff -0.32592592592593) (mon 2)94/944760: Normals 21.5 != 21.3 (diff -0.199999999999996) (mon 3)94/944760: Normals 16.5 != 16.3807692307692 (diff -0.119230769230771) (mon 4)94/944760: Normals 13.3 != 13.1714285714286 (diff -0.128571428571428) (mon 5)94/944760: Normals 12.9 != 12.4962962962963 (diff -0.403703703703705) (mon 6)94/944760: Normals 15.1 != 14.4115384615385 (diff -0.688461538461533) (mon 7)94/944760: Normals 18.6 != 18.4074074074074 (diff -0.19259259259259) (mon 8)94/944760: Normals 22.8 != 22.6037037037037 (diff -0.1962962962963) (mon 9)94/944800: Normals 29.7 != 29.35 (diff -0.349999999999994) (mon 0)94/944800: Normals 29.4 != 28.9866666666667 (diff -0.413333333333334) (mon 1)94/944800: Normals 26.5 != 26.0466666666667 (diff -0.45333333333333) (mon 2)94/944800: Normals 21.5 != 20.98 (diff -0.52) (mon 3)94/944800: Normals 16.6 != 15.98 (diff -0.620000000000003) (mon 4)94/944800: Normals 13.2 != 12.8034482758621 (diff -0.396551724137931) (mon 5)94/944800: Normals 12.4 != 12.27 (diff -0.130000000000003) (mon 6)94/944800: Normals 14.2 != 13.7103448275862 (diff -0.489655172413789) (mon 7)94/944800: Normals 17.8 != 17.4931034482759 (diff -0.306896551724137) (mon 8)94/944800: Normals 21.8 != 21.451724137931 (diff -0.348275862068967) (mon 9)94/944800: Normals 25.3 != 25.1366666666667 (diff -0.163333333333338) (mon 10)94/944800: Normals 28.2 != 27.8833333333333 (diff -0.316666666666659) (mon 11)94/944850: Normals 28.7 != 28.9241379310345 (diff 0.22413793103448) (mon 0)94/944850: Normals 28.2 != 28.56 (diff 0.359999999999996) (mon 1)94/944850: Normals 25.3 != 25.4433333333333 (diff 0.143333333333331) (mon 2)94/944850: Normals 20.3 != 20.662962962963 (diff 0.36296296296296) (mon 3)94/944850: Normals 15.4 != 15.5555555555556 (diff 0.155555555555553) (mon 4)94/944850: Normals 12.0 != 12.4033333333333 (diff 0.403333333333332) (mon 5)94/944850: Normals 11.2 != 11.5433333333333 (diff 0.343333333333334) (mon 6)94/944850: Normals 13.0 != 13.52 (diff 0.520000000000001) (mon 7)94/944850: Normals 16.8 != 17.19 (diff 0.390000000000001) (mon 8)94/944850: Normals 20.9 != 21.27 (diff 0.370000000000001) (mon 9)94/944850: Normals 24.5 != 24.7833333333333 (diff 0.283333333333335) (mon 10)94/944850: Normals 27.5 != 27.5833333333333 (diff 0.083333333333325) (mon 11)94/945100: Normals 27.8 != 27.562962962963 (diff -0.237037037037041) (mon 1)94/945100: Normals 25.2 != 25.3137931034483 (diff 0.113793103448273) (mon 2)94/945100: Normals 17.6 != 17.5 (diff -0.100000000000005) (mon 8)94/945100: Normals 22.0 != 21.9275862068966 (diff -0.0724137931034434) (mon 9)94/945100: Normals 25.2 != 25.2966666666667 (diff 0.0966666666666605) (mon 10)94/945100: Normals 27.5 != 27.5827586206897 (diff 0.0827586206896527) (mon 11)94/945680: Normals 25.3 != 24.9758620689655 (diff -0.324137931034485) (mon 0)94/945680: Normals 24.9 != 24.6433333333333 (diff -0.256666666666664) (mon 1)94/945680: Normals 23.4 != 23.1266666666667 (diff -0.27333333333333) (mon 2)94/945680: Normals 20.7 != 20.29 (diff -0.409999999999993) (mon 3)94/945680: Normals 17.1 != 16.7766666666667 (diff -0.323333333333334) (mon 4)94/945680: Normals 14.2 != 13.8266666666667 (diff -0.373333333333333) (mon 5)94/945680: Normals 13.1 != 12.6666666666667 (diff -0.433333333333334) (mon 6)94/945680: Normals 14.4 != 13.9166666666667 (diff -0.483333333333334) (mon 7)94/945680: Normals 17.3 != 16.8866666666667 (diff -0.413333333333338) (mon 8)94/945680: Normals 20.4 != 20.0266666666667 (diff -0.373333333333335) (mon 9)94/945680: Normals 22.7 != 22.4 (diff -0.300000000000001) (mon 10)94/945680: Normals 24.6 != 24.3310344827586 (diff -0.26896551724138) (mon 11)94/945890: Normals 22.7 != 23.19 (diff 0.489999999999995) (mon 0)94/945890: Normals 23.0 != 23.3034482758621 (diff 0.303448275862063) (mon 1)94/945890: Normals 22.1 != 22.3333333333333 (diff 0.233333333333327) (mon 2)94/945890: Normals 20.1 != 20.2366666666667 (diff 0.136666666666663) (mon 3)94/945890: Normals 17.3 != 17.4733333333333 (diff 0.173333333333336) (mon 4)94/945890: Normals 14.9 != 15.05 (diff 0.15) (mon 5)94/945890: Normals 13.9 != 14.05 (diff 0.150000000000006) (mon 6)94/945890: Normals 14.8 != 14.9766666666667 (diff 0.176666666666661) (mon 7)94/945890: Normals 16.8 != 17.0266666666667 (diff 0.22666666666667) (mon 8)94/945890: Normals 18.7 != 19.0866666666667 (diff 0.386666666666667) (mon 9)94/945890: Normals 20.3 != 20.71 (diff 0.409999999999997) (mon 10)94/945890: Normals 21.8 != 22.3033333333333 (diff 0.503333333333334) (mon 11)94/946010: Normals 20.7 != 20.6357142857143 (diff -0.0642857142857167) (mon 1)94/946010: Normals 16.7 != 16.4266666666667 (diff -0.273333333333333) (mon 4)94/946010: Normals 14.9 != 14.7344827586207 (diff -0.165517241379311) (mon 5)94/946010: Normals 13.7 != 13.7703703703704 (diff 0.0703703703703695) (mon 7)94/946010: Normals 14.4 != 14.4821428571429 (diff 0.0821428571428591) (mon 8)94/946010: Normals 15.5 != 15.5933333333333 (diff 0.0933333333333337) (mon 9)94/946010: Normals 17.1 != 17.21 (diff 0.109999999999999) (mon 10)94/946010: Normals 19.0 != 19.0733333333333 (diff 0.073333333333327) (mon 11)94/946100: Normals 24.2 != 24.2866666666667 (diff 0.0866666666666696) (mon 0)94/946100: Normals 24.7 != 24.7666666666667 (diff 0.0666666666666664) (mon 1)94/946100: Normals 22.7 != 22.8266666666667 (diff 0.126666666666669) (mon 2)94/946100: Normals 14.1 != 13.99 (diff -0.109999999999998) (mon 5)94/946100: Normals 13.0 != 12.9333333333333 (diff -0.0666666666666664) (mon 6)94/946100: Normals 14.6 != 14.48 (diff -0.120000000000001) (mon 8)94/946100: Normals 16.4 != 16.2866666666667 (diff -0.11333333333333) (mon 9)94/946190: Normals 26.4 != 26.4689655172414 (diff 0.0689655172413808) (mon 0)94/946190: Normals 26.2 != 26.5586206896552 (diff 0.358620689655176) (mon 1)94/946190: Normals 23.8 != 24.0206896551724 (diff 0.220689655172414) (mon 2)94/946190: Normals 19.5 != 19.8586206896552 (diff 0.358620689655169) (mon 3)94/946190: Normals 15.4 != 15.7379310344828 (diff 0.337931034482761) (mon 4)94/946190: Normals 12.7 != 12.9928571428571 (diff 0.292857142857146) (mon 5)94/946190: Normals 11.6 != 11.7793103448276 (diff 0.17931034482759) (mon 6)94/946190: Normals 12.1 != 12.3172413793103 (diff 0.217241379310348) (mon 7)94/946190: Normals 14.3 != 14.5172413793103 (diff 0.217241379310348) (mon 8)94/946190: Normals 20.9 != 21.0133333333333 (diff 0.113333333333333) (mon 10)94/946190: Normals 24.2 != 24.29 (diff 0.0900000000000034) (mon 11)94/946370: Normals 25.1 != 25 (diff -0.0999999999999979) (mon 1)94/946370: Normals 19.0 != 18.8333333333333 (diff -0.166666666666671) (mon 3)94/946370: Normals 14.5 != 14.3566666666667 (diff -0.143333333333329) (mon 4)94/946370: Normals 10.7 != 10.5466666666667 (diff -0.153333333333331) (mon 6)94/946370: Normals 11.8 != 11.6666666666667 (diff -0.133333333333333) (mon 7)94/946370: Normals 15.1 != 14.9233333333333 (diff -0.176666666666662) (mon 8)94/946370: Normals 18.4 != 18.3233333333333 (diff -0.076666666666668) (mon 9)94/946370: Normals 21.6 != 21.5166666666667 (diff -0.0833333333333357) (mon 10)94/946380: Normals 20.9 != 21.0636363636364 (diff 0.163636363636368) (mon 0)94/946380: Normals 20.1 != 20.2954545454545 (diff 0.195454545454545) (mon 2)94/946380: Normals 15.5 != 15.5863636363636 (diff 0.0863636363636378) (mon 4)94/946380: Normals 13.4 != 13.4909090909091 (diff 0.0909090909090917) (mon 5)94/946380: Normals 12.6 != 12.7090909090909 (diff 0.109090909090911) (mon 6)94/946380: Normals 13.1 != 13.2181818181818 (diff 0.118181818181821) (mon 7)94/946380: Normals 15.9 != 15.9818181818182 (diff 0.0818181818181802) (mon 9)94/946380: Normals 19.6 != 19.8318181818182 (diff 0.231818181818184) (mon 11)94/946530: Normals 20.0 != 19.9166666666667 (diff -0.0833333333333321) (mon 2)94/946530: Normals 17.6 != 17.46 (diff -0.140000000000001) (mon 3)94/946530: Normals 14.6 != 14.66 (diff 0.0600000000000041) (mon 4)94/946530: Normals 12.3 != 12.22 (diff -0.0800000000000018) (mon 5)94/946530: Normals 11.6 != 11.48 (diff -0.119999999999997) (mon 6)94/946530: Normals 12.3 != 12.1666666666667 (diff -0.133333333333336) (mon 7)94/946530: Normals 14.6 != 14.47 (diff -0.130000000000001) (mon 8)94/946530: Normals 16.9 != 16.74 (diff -0.16) (mon 9)94/946530: Normals 20.8 != 20.7366666666667 (diff -0.0633333333333361) (mon 11)94/946550: Normals 27.1 != 26.5407407407407 (diff -0.559259259259257) (mon 0)94/946550: Normals 27.1 != 26.1928571428571 (diff -0.907142857142862) (mon 1)94/946550: Normals 24.3 != 23.725 (diff -0.575000000000006) (mon 2)94/946550: Normals 19.7 != 19.2068965517241 (diff -0.493103448275857) (mon 3)94/946550: Normals 15.4 != 15.0448275862069 (diff -0.355172413793106) (mon 4)94/946550: Normals 12.3 != 12.0793103448276 (diff -0.220689655172412) (mon 5)94/946550: Normals 11.7 != 11.351724137931 (diff -0.348275862068961) (mon 6)94/946550: Normals 13.1 != 12.8137931034483 (diff -0.286206896551723) (mon 7)94/946550: Normals 16.4 != 15.9689655172414 (diff -0.431034482758619) (mon 8)94/946550: Normals 20.0 != 19.5827586206897 (diff -0.41724137931034) (mon 9)94/946550: Normals 23.2 != 22.9275862068966 (diff -0.272413793103443) (mon 10)94/946550: Normals 25.4 != 25.2551724137931 (diff -0.14482758620689) (mon 11)94/946590: Normals 26.4 != 26.4966666666667 (diff 0.0966666666666711) (mon 1)94/946590: Normals 19.3 != 19.1966666666667 (diff -0.103333333333335) (mon 3)94/946590: Normals 14.9 != 14.7566666666667 (diff -0.143333333333336) (mon 4)94/946590: Normals 12.0 != 11.8033333333333 (diff -0.196666666666667) (mon 5)94/946590: Normals 11.3 != 11.38 (diff 0.0800000000000001) (mon 6)94/946590: Normals 12.6 != 12.4966666666667 (diff -0.10333333333333) (mon 7)94/946590: Normals 15.7 != 15.8 (diff 0.100000000000007) (mon 8)94/946720: Normals 21.8 != 22.7266666666667 (diff 0.926666666666673) (mon 0)94/946720: Normals 21.9 != 22.84 (diff 0.939999999999998) (mon 1)94/946720: Normals 20.0 != 20.6933333333333 (diff 0.693333333333332) (mon 2)94/946720: Normals 17.0 != 17.5266666666667 (diff 0.526666666666664) (mon 3)94/946720: Normals 14.0 != 14.3466666666667 (diff 0.346666666666668) (mon 4)94/946720: Normals 11.6 != 11.9566666666667 (diff 0.356666666666667) (mon 5)94/946720: Normals 10.9 != 11.17 (diff 0.27) (mon 6)94/946720: Normals 11.7 != 11.96 (diff 0.260000000000002) (mon 7)94/946720: Normals 13.4 != 13.9233333333333 (diff 0.523333333333337) (mon 8)94/946720: Normals 15.7 != 16.41 (diff 0.709999999999997) (mon 9)94/946720: Normals 18.2 != 19.0033333333333 (diff 0.803333333333335) (mon 10)94/946720: Normals 20.1 != 20.96 (diff 0.859999999999996) (mon 11)94/946810: Normals 20.9 != 21.1233333333333 (diff 0.223333333333329) (mon 1)94/946810: Normals 18.4 != 18.7433333333333 (diff 0.343333333333337) (mon 2)94/946810: Normals 14.9 != 15.3103448275862 (diff 0.410344827586206) (mon 3)94/946810: Normals 11.7 != 11.7933333333333 (diff 0.0933333333333337) (mon 4)94/946810: Normals 11.3 != 11.4166666666667 (diff 0.116666666666665) (mon 8)94/946810: Normals 14.1 != 14.2266666666667 (diff 0.126666666666665) (mon 9)94/946810: Normals 17.1 != 17.01 (diff -0.0899999999999999) (mon 10)94/946810: Normals 19.1 != 19.1733333333333 (diff 0.0733333333333377) (mon 11)94/946930: Normals 24.1 != 23.99 (diff -0.109999999999999) (mon 1)94/946930: Normals 16.9 != 16.7566666666667 (diff -0.143333333333331) (mon 3)94/946930: Normals 13.1 != 12.9133333333333 (diff -0.186666666666667) (mon 4)94/946930: Normals 11.1 != 10.9433333333333 (diff -0.156666666666666) (mon 7)94/946930: Normals 13.7 != 13.4433333333333 (diff -0.256666666666664) (mon 8)94/946930: Normals 16.8 != 16.6366666666667 (diff -0.16333333333333) (mon 9)94/946930: Normals 20.0 != 19.8333333333333 (diff -0.166666666666668) (mon 10)94/946930: Normals 22.6 != 22.24 (diff -0.359999999999996) (mon 11)94/947090: Normals 24.9 != 24.576 (diff -0.323999999999995) (mon 1)94/947090: Normals 21.7 != 21.5782608695652 (diff -0.121739130434783) (mon 2)94/947090: Normals 17.0 != 17.095652173913 (diff 0.0956521739130416) (mon 3)94/947090: Normals 12.8 != 12.6153846153846 (diff -0.184615384615386) (mon 4)94/947090: Normals 9.5 != 9.592 (diff 0.0920000000000023) (mon 5)94/947090: Normals 8.6 != 8.48461538461538 (diff -0.115384615384615) (mon 6)94/947090: Normals 19.6 != 19.8423076923077 (diff 0.242307692307694) (mon 10)94/947090: Normals 22.9 != 23.0363636363636 (diff 0.136363636363637) (mon 11)94/947110: Normals 26.6 != 26.448275862069 (diff -0.151724137931037) (mon 1)94/947110: Normals 23.5 != 23.3413793103448 (diff -0.158620689655166) (mon 2)94/947110: Normals 18.9 != 18.3862068965517 (diff -0.513793103448275) (mon 3)94/947110: Normals 14.3 != 13.9758620689655 (diff -0.324137931034484) (mon 4)94/947110: Normals 11.0 != 11.0620689655172 (diff 0.0620689655172431) (mon 5)94/947110: Normals 10.2 != 9.90689655172414 (diff -0.293103448275861) (mon 6)94/947110: Normals 11.8 != 11.5827586206897 (diff -0.217241379310348) (mon 7)94/947110: Normals 15.1 != 14.8413793103448 (diff -0.258620689655169) (mon 8)94/947110: Normals 19.0 != 18.8413793103448 (diff -0.158620689655169) (mon 9)94/947110: Normals 22.5 != 21.8241379310345 (diff -0.675862068965515) (mon 10)94/947110: Normals 25.5 != 25.248275862069 (diff -0.251724137931038) (mon 11)94/947300: Normals 20.0 != 20.37 (diff 0.369999999999997) (mon 0)94/947300: Normals 19.6 != 20.0066666666667 (diff 0.406666666666666) (mon 1)94/947300: Normals 17.2 != 17.55 (diff 0.350000000000005) (mon 2)94/947300: Normals 13.0 != 13.43 (diff 0.430000000000001) (mon 3)94/947300: Normals 9.2 != 9.44333333333333 (diff 0.243333333333334) (mon 4)94/947300: Normals 6.4 != 6.74666666666667 (diff 0.346666666666667) (mon 5)94/947300: Normals 5.2 != 5.52333333333334 (diff 0.323333333333335) (mon 6)94/947300: Normals 6.8 != 7.00333333333333 (diff 0.203333333333334) (mon 7)94/947300: Normals 9.2 != 9.56 (diff 0.360000000000003) (mon 8)94/947300: Normals 12.5 != 12.75 (diff 0.249999999999998) (mon 9)94/947300: Normals 15.3 != 15.65 (diff 0.350000000000001) (mon 10)94/947300: Normals 18.3 != 18.7166666666667 (diff 0.416666666666661) (mon 11)94/947500: Normals 20.1 != 20.8533333333333 (diff 0.753333333333337) (mon 0)94/947500: Normals 20.2 != 20.9966666666667 (diff 0.796666666666667) (mon 1)94/947500: Normals 18.9 != 19.7833333333333 (diff 0.883333333333336) (mon 2)94/947500: Normals 16.5 != 17.2233333333333 (diff 0.723333333333336) (mon 3)94/947500: Normals 13.8 != 14.19 (diff 0.390000000000001) (mon 4)94/947500: Normals 11.6 != 11.9166666666667 (diff 0.31666666666667) (mon 5)94/947500: Normals 10.6 != 10.9166666666667 (diff 0.316666666666666) (mon 6)94/947500: Normals 11.5 != 11.88 (diff 0.379999999999999) (mon 7)94/947500: Normals 13.4 != 14.0033333333333 (diff 0.603333333333333) (mon 8)94/947500: Normals 15.5 != 16.17 (diff 0.670000000000002) (mon 9)94/947500: Normals 17.2 != 17.8466666666667 (diff 0.646666666666672) (mon 10)94/947500: Normals 19.0 != 19.8185185185185 (diff 0.81851851851852) (mon 11)94/947670: Normals 21.4 != 21.5933333333333 (diff 0.193333333333332) (mon 2)94/947670: Normals 18.8 != 19.2066666666667 (diff 0.406666666666663) (mon 3)94/947670: Normals 15.7 != 16.1566666666667 (diff 0.456666666666671) (mon 4)94/947670: Normals 13.1 != 13.6233333333333 (diff 0.523333333333333) (mon 5)94/947670: Normals 12.2 != 12.7533333333333 (diff 0.553333333333335) (mon 6)94/947670: Normals 13.3 != 13.8133333333333 (diff 0.51333333333333) (mon 7)94/947670: Normals 15.5 != 15.9133333333333 (diff 0.413333333333332) (mon 8)94/947670: Normals 18.0 != 18.1366666666667 (diff 0.13666666666667) (mon 9)94/947670: Normals 19.7 != 19.8266666666667 (diff 0.126666666666662) (mon 10)94/947670: Normals 21.7 != 21.7966666666667 (diff 0.096666666666664) (mon 11)94/947760: Normals 22.5 != 22.8633333333333 (diff 0.363333333333333) (mon 0)94/947760: Normals 22.3 != 22.4966666666667 (diff 0.196666666666665) (mon 1)94/947760: Normals 20.7 != 21.23 (diff 0.529999999999998) (mon 2)94/947760: Normals 18.0 != 18.45 (diff 0.449999999999999) (mon 3)94/947760: Normals 14.8 != 15.2533333333333 (diff 0.45333333333333) (mon 4)94/947760: Normals 12.3 != 12.64 (diff 0.340000000000002) (mon 5)94/947760: Normals 11.2 != 11.4866666666667 (diff 0.286666666666667) (mon 6)94/947760: Normals 12.2 != 12.4066666666667 (diff 0.206666666666669) (mon 7)94/947760: Normals 14.7 != 15.0566666666667 (diff 0.356666666666671) (mon 8)94/947760: Normals 17.4 != 17.59 (diff 0.190000000000001) (mon 9)94/947760: Normals 19.5 != 19.8633333333333 (diff 0.363333333333333) (mon 10)94/947760: Normals 21.7 != 22.0533333333333 (diff 0.353333333333335) (mon 11)94/947910: Normals 23.0 != 23.0966666666667 (diff 0.0966666666666676) (mon 0)94/947910: Normals 23.0 != 22.8133333333333 (diff -0.186666666666667) (mon 1)94/947910: Normals 19.6 != 19.4866666666667 (diff -0.113333333333333) (mon 3)94/947910: Normals 16.5 != 16.41 (diff -0.0899999999999999) (mon 4)94/947910: Normals 14.1 != 14.01 (diff -0.0900000000000016) (mon 5)94/947910: Normals 12.9 != 12.7633333333333 (diff -0.136666666666667) (mon 6)94/947910: Normals 16.3 != 16.3833333333333 (diff 0.0833333333333321) (mon 8)94/947910: Normals 20.3 != 20.4966666666667 (diff 0.196666666666669) (mon 10)94/948020: Normals 19.4 != 19.3166666666667 (diff -0.0833333333333321) (mon 0)94/948020: Normals 19.8 != 19.5366666666667 (diff -0.263333333333332) (mon 1)94/948020: Normals 18.9 != 18.61 (diff -0.289999999999992) (mon 2)94/948020: Normals 16.7 != 16.5 (diff -0.199999999999999) (mon 3)94/948020: Normals 14.5 != 14.34 (diff -0.159999999999998) (mon 4)94/948020: Normals 12.5 != 12.35 (diff -0.149999999999997) (mon 5)94/948020: Normals 11.7 != 11.2266666666667 (diff -0.473333333333333) (mon 6)94/948020: Normals 11.9 != 11.6633333333333 (diff -0.236666666666668) (mon 7)94/948020: Normals 12.8 != 12.5233333333333 (diff -0.276666666666669) (mon 8)94/948020: Normals 15.9 != 15.5666666666667 (diff -0.333333333333336) (mon 10)94/948020: Normals 17.9 != 18.16 (diff 0.260000000000002) (mon 11)94/948120: Normals 18.3 != 18.368 (diff 0.0680000000000014) (mon 0)94/948120: Normals 18.3 != 18.4125 (diff 0.112499999999997) (mon 1)94/948120: Normals 15.7 != 15.6318181818182 (diff -0.0681818181818183) (mon 3)94/948120: Normals 11.8 != 12.1583333333333 (diff 0.358333333333333) (mon 5)94/948120: Normals 11.2 != 11.012 (diff -0.187999999999999) (mon 6)94/948120: Normals 11.7 != 11.544 (diff -0.155999999999999) (mon 7)94/948120: Normals 12.7 != 12.6192307692308 (diff -0.0807692307692278) (mon 8)94/948120: Normals 14.2 != 14.0892857142857 (diff -0.110714285714286) (mon 9)94/948120: Normals 15.7 != 15.4518518518519 (diff -0.248148148148145) (mon 10)94/948120: Normals 17.1 != 16.9666666666667 (diff -0.133333333333336) (mon 11)94/948210: Normals 18.5 != 18.5733333333333 (diff 0.0733333333333341) (mon 1)94/948210: Normals 14.5 != 14.6966666666667 (diff 0.196666666666665) (mon 3)94/948210: Normals 9.9 != 10.0566666666667 (diff 0.156666666666666) (mon 7)94/948210: Normals 11.1 != 11.04 (diff -0.0600000000000023) (mon 8)94/948210: Normals 12.5 != 12.4333333333333 (diff -0.0666666666666664) (mon 9)94/948210: Normals 16.5 != 16.6033333333333 (diff 0.103333333333335) (mon 11)94/948270: Normals 18.7 != 18.9344827586207 (diff 0.23448275862069) (mon 2)94/948270: Normals 14.9 != 15.3633333333333 (diff 0.463333333333331) (mon 3)94/948270: Normals 9.1 != 9.33666666666667 (diff 0.236666666666668) (mon 5)94/948270: Normals 8.6 != 8.51333333333333 (diff -0.086666666666666) (mon 6)94/948270: Normals 11.4 != 11.53 (diff 0.129999999999999) (mon 8)94/948270: Normals 13.9 != 14.17 (diff 0.27) (mon 9)94/948270: Normals 19.3 != 19.39 (diff 0.0899999999999963) (mon 11)94/948420: Normals 17.1 != 17.0172413793103 (diff -0.0827586206896598) (mon 0)94/948420: Normals 17.6 != 17.72 (diff 0.120000000000001) (mon 1)94/948420: Normals 16.6 != 16.7933333333333 (diff 0.193333333333335) (mon 2)94/948420: Normals 14.7 != 14.77 (diff 0.0700000000000021) (mon 3)94/948420: Normals 12.7 != 12.76 (diff 0.0600000000000041) (mon 4)94/948420: Normals 10.9 != 10.9833333333333 (diff 0.0833333333333357) (mon 5)94/948420: Normals 10.7 != 10.8933333333333 (diff 0.193333333333333) (mon 7)94/948420: Normals 11.8 != 11.59 (diff -0.209999999999997) (mon 8)94/948420: Normals 14.4 != 14.01 (diff -0.390000000000002) (mon 10)94/948420: Normals 15.6 != 15.6689655172414 (diff 0.0689655172413826) (mon 11)94/948650: Normals 19.3 != 19.6766666666667 (diff 0.376666666666665) (mon 0)94/948650: Normals 19.6 != 19.9933333333333 (diff 0.393333333333334) (mon 1)94/948650: Normals 18.0 != 18.1833333333333 (diff 0.183333333333334) (mon 2)94/948650: Normals 15.0 != 15.2666666666667 (diff 0.266666666666669) (mon 3)94/948650: Normals 12.1 != 12.2333333333333 (diff 0.133333333333336) (mon 4)94/948650: Normals 9.6 != 9.53666666666667 (diff -0.0633333333333326) (mon 5)94/948650: Normals 8.9 != 9.04 (diff 0.140000000000001) (mon 6)94/948650: Normals 9.9 != 9.98666666666667 (diff 0.0866666666666678) (mon 7)94/948650: Normals 11.4 != 11.7066666666667 (diff 0.306666666666668) (mon 8)94/948650: Normals 13.5 != 13.7166666666667 (diff 0.216666666666669) (mon 9)94/948650: Normals 15.5 != 15.7266666666667 (diff 0.226666666666667) (mon 10)94/948650: Normals 17.6 != 17.9366666666667 (diff 0.336666666666666) (mon 11)94/948930: Normals 17.9 != 17.4689655172414 (diff -0.431034482758623) (mon 0)94/948930: Normals 18.4 != 17.89 (diff -0.509999999999998) (mon 1)94/948930: Normals 17.3 != 17.0896551724138 (diff -0.210344827586209) (mon 2)94/948930: Normals 15.3 != 15.0689655172414 (diff -0.23103448275862) (mon 3)94/948930: Normals 11.4 != 11.1896551724138 (diff -0.210344827586207) (mon 5)94/948930: Normals 10.6 != 10.3068965517241 (diff -0.293103448275859) (mon 6)94/948930: Normals 10.9 != 10.5793103448276 (diff -0.320689655172416) (mon 7)94/948930: Normals 11.9 != 11.6607142857143 (diff -0.239285714285712) (mon 8)94/948930: Normals 13.4 != 13.051724137931 (diff -0.348275862068967) (mon 9)94/948930: Normals 14.7 != 14.35 (diff -0.349999999999996) (mon 10)94/948930: Normals 16.2 != 15.7206896551724 (diff -0.479310344827589) (mon 11)94/949070: Normals 19.1 != 18.9266666666667 (diff -0.173333333333336) (mon 0)94/949070: Normals 17.7 != 17.91 (diff 0.210000000000001) (mon 2)94/949070: Normals 14.6 != 14.3733333333333 (diff -0.226666666666665) (mon 3)94/949070: Normals 9.0 != 9.18333333333334 (diff 0.183333333333335) (mon 5)94/949070: Normals 8.4 != 8.62 (diff 0.219999999999999) (mon 6)94/949070: Normals 9.6 != 9.82666666666667 (diff 0.226666666666667) (mon 7)94/949070: Normals 11.3 != 11.6833333333333 (diff 0.383333333333335) (mon 8)94/949070: Normals 13.5 != 13.7466666666667 (diff 0.24666666666667) (mon 9)94/949070: Normals 15.5 != 15.6233333333333 (diff 0.123333333333335) (mon 10)94/949070: Normals 17.4 != 17.27 (diff -0.129999999999999) (mon 11)94/949100: Normals 23.7 != 23.4166666666667 (diff -0.283333333333339) (mon 0)94/949100: Normals 23.9 != 23.6166666666667 (diff -0.283333333333328) (mon 1)94/949100: Normals 20.8 != 20.5533333333333 (diff -0.246666666666663) (mon 2)94/949100: Normals 16.1 != 15.9233333333333 (diff -0.176666666666668) (mon 3)94/949100: Normals 11.7 != 11.5433333333333 (diff -0.156666666666665) (mon 4)94/949100: Normals 8.5 != 8.39333333333333 (diff -0.106666666666666) (mon 5)94/949100: Normals 7.5 != 7.34333333333333 (diff -0.156666666666665) (mon 6)94/949100: Normals 18.1 != 17.9966666666667 (diff -0.103333333333332) (mon 10)94/949100: Normals 21.6 != 21.38 (diff -0.220000000000002) (mon 11)94/949170: Normals 19.2 != 19.29 (diff 0.0899999999999999) (mon 0)94/949170: Normals 15.6 != 15.6678571428571 (diff 0.0678571428571431) (mon 3)94/949170: Normals 12.6 != 12.8033333333333 (diff 0.203333333333335) (mon 4)94/949170: Normals 10.3 != 10.5344827586207 (diff 0.234482758620686) (mon 5)94/949170: Normals 9.6 != 9.85714285714286 (diff 0.257142857142858) (mon 6)94/949170: Normals 10.7 != 10.7655172413793 (diff 0.0655172413793093) (mon 7)94/949170: Normals 12.3 != 12.4827586206897 (diff 0.182758620689656) (mon 8)94/949170: Normals 16.1 != 15.8586206896552 (diff -0.241379310344829) (mon 10)94/949260: Normals 13.5 != 13.2966666666667 (diff -0.20333333333333) (mon 3)94/949260: Normals 9.4 != 9.25 (diff -0.15) (mon 4)94/949260: Normals 6.5 != 6.38333333333333 (diff -0.116666666666666) (mon 5)94/949260: Normals 5.5 != 5.35 (diff -0.150000000000001) (mon 6)94/949370: Normals 19.7 != 19.8827586206897 (diff 0.182758620689661) (mon 0)94/949370: Normals 20.0 != 20.21 (diff 0.209999999999994) (mon 1)94/949370: Normals 19.1 != 19.2966666666667 (diff 0.196666666666662) (mon 2)94/949370: Normals 14.2 != 14.3033333333333 (diff 0.103333333333335) (mon 4)94/949370: Normals 11.8 != 12.0166666666667 (diff 0.216666666666667) (mon 5)94/949370: Normals 11.0 != 11.1 (diff 0.100000000000001) (mon 6)94/949370: Normals 13.4 != 13.3333333333333 (diff -0.0666666666666682) (mon 8)94/949370: Normals 15.3 != 15.41 (diff 0.109999999999998) (mon 9)94/949370: Normals 18.6 != 18.7620689655172 (diff 0.162068965517239) (mon 11)94/949670: Normals 15.3 != 14.9 (diff -0.4) (mon 0)94/949670: Normals 15.6 != 15.3777777777778 (diff -0.222222222222221) (mon 1)94/949670: Normals 14.7 != 14.4965517241379 (diff -0.203448275862067) (mon 2)94/949670: Normals 13.1 != 12.825 (diff -0.274999999999995) (mon 3)94/949670: Normals 11.0 != 10.8571428571429 (diff -0.142857142857142) (mon 4)94/949670: Normals 9.4 != 9.18666666666667 (diff -0.213333333333333) (mon 5)94/949670: Normals 8.7 != 8.59310344827586 (diff -0.106896551724137) (mon 6)94/949670: Normals 9.2 != 8.68666666666667 (diff -0.513333333333334) (mon 7)94/949670: Normals 10.3 != 10.1133333333333 (diff -0.186666666666669) (mon 8)94/949670: Normals 11.5 != 11.4 (diff -0.100000000000001) (mon 9)94/949670: Normals 12.6 != 12.3266666666667 (diff -0.273333333333333) (mon 10)94/949830: Normals 17.0 != 16.6566666666667 (diff -0.343333333333337) (mon 0)94/949830: Normals 17.5 != 17.2266666666667 (diff -0.273333333333333) (mon 1)94/949830: Normals 16.8 != 16.6620689655172 (diff -0.137931034482762) (mon 2)94/949830: Normals 14.8 != 14.4466666666667 (diff -0.353333333333337) (mon 3)94/949830: Normals 12.7 != 12.4233333333333 (diff -0.276666666666662) (mon 4)94/949830: Normals 10.7 != 10.4633333333333 (diff -0.236666666666663) (mon 5)94/949830: Normals 9.9 != 9.50344827586207 (diff -0.396551724137931) (mon 6)94/949830: Normals 10.2 != 9.84 (diff -0.359999999999998) (mon 7)94/949830: Normals 11.4 != 11.2166666666667 (diff -0.183333333333332) (mon 8)94/949830: Normals 12.7 != 12.5068965517241 (diff -0.19310344827586) (mon 9)94/949830: Normals 14.2 != 13.8034482758621 (diff -0.396551724137932) (mon 10)94/949830: Normals 15.6 != 15.2793103448276 (diff -0.32068965517241) (mon 11)`

The first value is the normals value from the Met Office, the second value is the calculated value, then I show the difference and then the month (0 = Jan).

Anyone help me understand that part?