//supervises computation of regional multipliers for a BLS regional center based on a regression //equation previously determined by an external model public void computeAndSaveRegMult(BlsCenter BlsCity, List <Series> blsSeriesArr, double dynamicNationalIndex) { string[] validSeriesIDs = { "blsReadyMixConcID", "blsTractorShovelLoadersID", "blsEnergyID", "blsFuelsUtilitiesID" }; // var seriesLabelIDFrags = new List<string> { "PCU327320327320","PCU33312033312014","SA0E","SAH2" }; var seriesIDMap = ""; var blsVarDict = new Dictionary <string, double>(); if (blsSeriesArr != null) { foreach (Series serie in blsSeriesArr) { seriesIDMap = getSeriesIDMapping(serie.seriesID); foreach (var data in serie.data) { if (data.periodName == "Annual") { blsVarDict.Add(seriesIDMap, Convert.ToDouble(data.value)); Console.WriteLine("BLS Series #{0}: year:{1} periodName:{2} value:{3} saved for {4}", serie.seriesID, data.year, data.periodName, data.value, seriesIDMap); break; } } } } //perform regionalization calcs /* Feb 2018 replaced with city-specific model * BlsCity.regionalFactor = this.c0_intercept + * (this.c1_readyMix * blsVarDict[validSeriesIDs[0]]) + * (this.c2_tractorShovel * blsVarDict[validSeriesIDs[1]]) + * (this.c3_energy * blsVarDict[validSeriesIDs[2]]) + * (this.c4_fuelUtils * blsVarDict[validSeriesIDs[3]]);*/ //Feb 2018 city specific model BlsCity.regionalFactor = BlsCity.c0_intercept + (BlsCity.c1_readyMix * blsVarDict[validSeriesIDs[0]]) + (BlsCity.c2_tractorShovel * blsVarDict[validSeriesIDs[1]]) + (BlsCity.c3_energy * blsVarDict[validSeriesIDs[2]]) + (BlsCity.c4_fuelUtils * blsVarDict[validSeriesIDs[3]]); BlsCity.inflationFactor = Math.Round(BlsCity.regionalFactor / BlsCity.regModel2014Index, dcp); BlsCity.regionalFactor = Math.Round(BlsCity.regionalFactor / dynamicNationalIndex, dcp); if (BlsCity.blsCity == "NATIONAL") { BlsCity.selectString = String.Format("{0} ({1}) {2}", BlsCity.blsCity, "NA", BlsCity.regionalFactor); } else { BlsCity.selectString = String.Format("{0} ({1:F0} miles) {2}", BlsCity.blsCity, BlsCity.distToCurrentPoint, BlsCity.regionalFactor); } }
// computes reginal multipliers for a list of BLS centers public bool computeRegionalizationMult(List <BlsCenter> BlsCenters) { int count = 0; int currentYear = DateTime.Now.Year; int currentMonth = DateTime.Now.Month; int dataYear = currentYear - 1; bool status = true; //bls data is updated between the 15th and 20th of the month as of this writting so assume previous years data available in Feb if (currentMonth < 2) { dataYear = dataYear - 1; } // do the National series first to get the dynamicNationalIndex BlsCenter National = BlsCenters[3]; List <string> nationalIDs = new List <string>(); nationalIDs.Add(National.blsReadyMixConcID); nationalIDs.Add(National.blsTractorShovelLoadersID); nationalIDs.Add(National.blsEnergyID); nationalIDs.Add(National.blsFuelsUtilitiesID); status = status && getBLSData(National, nationalIDs.ToArray(), dataYear.ToString(), dataYear.ToString(), National.regionalFactor); foreach (BlsCenter BlsCity in BlsCenters) { count += 1; BlsCity.dataYear = dataYear; if (count > shortListCount + 1) { break; //do not compute for National and other cause default multipliers are always 1 however need to compute for National so can calc inflation } List <string> seriesIDs = new List <string>(); seriesIDs.Add(BlsCity.blsReadyMixConcID); seriesIDs.Add(BlsCity.blsTractorShovelLoadersID); seriesIDs.Add(BlsCity.blsEnergyID); seriesIDs.Add(BlsCity.blsFuelsUtilitiesID); status = status && getBLSData(BlsCity, seriesIDs.ToArray(), dataYear.ToString(), dataYear.ToString(), BlsCenters[3].regionalFactor); Console.WriteLine("Element #{0}: {1} {2} {3} {4} {5}", count, BlsCity.blsCity, BlsCity.blsReadyMixConcID, BlsCity.blsTractorShovelLoadersID, BlsCity.blsEnergyID, BlsCity.blsFuelsUtilitiesID); } return(status); }
//retrieves data via the BLS api given a valid BLS regional center, a series id and start/end year public bool getBLSData(BlsCenter BlsCity, string[] seriesIDs, string startyear, string endyear, double dynamicNationalIndex) { var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api.bls.gov/publicAPI/v2/timeseries/data/"); httpWebRequest.ContentType = "application/json"; httpWebRequest.Method = "POST"; using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { string newJson = Newtonsoft.Json.JsonConvert.SerializeObject(new SeriesPost() { seriesid = seriesIDs,//(new List<string>() { "CUUR0000SA0" }).ToArray(), startyear = startyear, endyear = endyear, catalog = false, calculations = false, annualaverage = true, registrationKey = "03ee11d0a8e54c08b09a34263273be15" }); //TODO comment out for production So you can see the JSON thats output //System.Diagnostics.Debug.WriteLine(newJson); streamWriter.Write(newJson); streamWriter.Flush(); streamWriter.Close(); } var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var result = streamReader.ReadToEnd(); blsResp obj = Newtonsoft.Json.JsonConvert.DeserializeObject <blsResp>(result); //check to see if success response received if (obj.ToString() == "Status: REQUEST_SUCCEEDED") { computeAndSaveRegMult(BlsCity, obj.Results.series, dynamicNationalIndex); } //Console.ReadLine(); } return(true); }