var IO = require('./io'); var meteo = require('./meteo'); var stations = require('./stations'); var chalk = require('chalk'); // { // station-46011: { // id: str // name: str // lat: str // lon: str // avg1982: { // d: int[365] || null, // w: int[52] || null, // m: int[12] || null, // y: int || null // }, // avg1983: ... // }, // // { // id: str // ... // } // } module.exports = { // Zero indexed column. // #YY MM DD hh mm WDIR WSPD GST WVHT DPD APD MWD PRES ATMP WTMP DEWP VIS TIDE // 14 - WTMP (C) columnToAverage: 14, /** * */ parse: function(str) { var json = {}; try { json = JSON.parse(str); } catch(e) { IO.error(e); } return json; }, /** * */ getYearlyAverages: function(arr, col) { console.log('Yearly averages for column ' + col + '.'); if (arr.length === undefined) { return 0; } var sum = 0; var count = 0; var val = 0; arr.forEach(function(row) { val = parseFloat(row[col]); if (val === 999 || val === 0) { return; } sum += val; count++; }); var avg = Math.round((sum / count) * 10) / 10 || 0; return avg; }, /** * */ getMonthlyAverages: function(arr, col) { console.log('Monthly averages for column ' + col + '.'); if (arr.length === undefined) { return Array.apply(null, Array(12)).map(Number.prototype.valueOf,0); } var sum, count; var months = []; var averages = []; for (var i = 0; i < 12; i++) { months[i] = []; } // Assemble all the values for each month. arr.forEach(function(row, index) { months[row[1] - 1].push(parseFloat(row[col])); }); // Get the average for each collection of values in each day of the year. months.forEach(function(values, index) { sum = 0; count = 0; values.map(function(value) { if (value === 999 || value === 0) { return; } sum += parseFloat(value); count++; }); averages[index] = Math.round((sum / count) * 10) / 10 || 0; }); return averages; }, /** * */ getDailyAverages: function(arr, col) { console.log('Daily averages for column ' + col + '.'); if (arr.length === undefined) { return []; } var sum, count, a, b, doy; var days = []; var averages = []; var dayms = 1000 * 60 * 60 * 24; for (var i = 0; i <= 365; i++) { days[i] = []; } // Assemble all the values for each day of the year. arr.forEach(function(row) { a = new Date(row[0], row[1] - 1, row[2]); b = new Date(row[0], 0, 1); doy = Math.ceil((a - b) / dayms); // if (days[doy] === undefined) { // // problem here - there are still YYMMDD rows in data // console.log(row); // } days[doy].push(row[col]); }); // Get the average for each collection of values in each day of the year. days.forEach(function(values, index) { sum = 0; count = 0; values.map(function(val) { sum += parseInt(val); count++; }); averages[index] = Math.round((sum / count) * 10) / 10 || 0; }); return averages; }, /** * */ getAllDailyAverages: function(station, startYear, endYear) { var result = []; for (var year = startYear; year <= endYear; year++) { result.push( IO.read(meteo.dirs.json + station + '-' + year + '.json') .then(module.exports.parse) .then(function(arr) { return module.exports.getDailyAverages(arr, module.exports.columnToAverage); }) ); } return Promise.all(result); }, /** * */ getAllMonthlyAverages: function(station, startYear, endYear) { var result = []; for (var year = startYear; year <= endYear; year++) { result.push( IO.read(meteo.dirs.json + station + '-' + year + '.json') .then(module.exports.parse) .then(function(arr) { return module.exports.getMonthlyAverages(arr, module.exports.columnToAverage); }) ); } return Promise.all(result); }, /** * */ getAllYearlyAverages: function(station, startYear, endYear) { var result = []; for (var year = startYear; year <= endYear; year++) { result.push( IO.read(meteo.dirs.json + station + '-' + year + '.json') .then(module.exports.parse) .then(function(arr) { return module.exports.getYearlyAverages(arr, module.exports.columnToAverage, station === '46232'); }) ); } return Promise.all(result); }, /** * */ getAllStations: function(arr) { console.log('asdf') return null; }, /** * */ buildFinalJson: function() { var finalResult = {}; var startYear = 1982; var endYear = 2015; function next(index) { if (index === stations.ids.length) { // if (index === 1) { // IO.write('final-output.json', JSON.stringify(finalResult, null, 4)); IO.write('_stations.json', JSON.stringify(finalResult)); return; } var station = stations.ids[index]; // Init objects. finalResult['s' + station] = {}; for (var year = startYear; year <= endYear; year++) { finalResult['s' + station]['avgs' + year] = {}; } Promise.resolve() // Stations .then(IO.read.bind(null, stations.dirs.json + station + '.json')) .then(module.exports.parse) .then(function(json) { finalResult['s' + station].id = json.id; finalResult['s' + station].name = json.name; finalResult['s' + station].lat = json.lat; finalResult['s' + station].lon = json.lon; }) // Daily // .then(module.exports.getAllDailyAverages.bind(null, station, startYear, endYear)) // .then(function(arr) { // arr.forEach(function(averages, index) { // finalResult['s' + station]['avgs' + (startYear + index)].d = averages; // }); // }) // Monthly .then(module.exports.getAllMonthlyAverages.bind(null, station, startYear, endYear)) .then(function(arr) { arr.forEach(function(averages, index) { finalResult['s' + station]['avgs' + (startYear + index)].m = averages; }); }) // Yearly .then(module.exports.getAllYearlyAverages.bind(null, station, startYear, endYear)) .then(function(arr) { arr.forEach(function(averages, index) { finalResult['s' + station]['avgs' + (startYear + index)].y = averages; }); }) .then(next.bind(null, index + 1)) .catch(IO.error); }; next(0); } };