private HeatingCoolingDegreeDays HeatingCoolingDegreeDaysValueOf(ReadingsQueryResult result, List <WeatherData> weatherDataList) { HeatingCoolingDegreeDays hcdd = new HeatingCoolingDegreeDays(); hcdd.CDD = 0.0; hcdd.HDD = 0.0; if (result.B3 == 0 && result.B5 == 0) { return(hcdd); } foreach (WeatherData weatherData in weatherDataList) { if (result.B5 > 0) { if (weatherData.AvgTmp >= result.B5) { hcdd.CDD = hcdd.CDD + (weatherData.AvgTmp.Value - result.B5); } } else if (result.B3 > 0) { if (weatherData.AvgTmp <= result.B3) { hcdd.HDD = hcdd.HDD + (result.B3 - weatherData.AvgTmp.Value); } } } return(hcdd); }
private void DoCalculation(ReadingsQueryResult result, HeatingCoolingDegreeDays heatingCoolingDegreeDays) { // Normalized Energy Usage = E = B1(DAYS) + B2(HDDB3) + B4(CDDB5) double? resultAsDouble = (result.B1 * result.Days) + (result.B2 * heatingCoolingDegreeDays.HDD) + (result.B4 * heatingCoolingDegreeDays.CDD); decimal resultAsDecimal = decimal.Round(Convert.ToDecimal(resultAsDouble), 4, MidpointRounding.AwayFromZero); bool success = _weatherRepository.InsertWthExpUsage(result.RdngID, resultAsDecimal); if (success) { Log.Debug($"Inserted into WthExpUsage >> RdngID: {result.RdngID} WthExpUsage: {resultAsDecimal} (actual usage: {result.Units}) ... " + $"B1: {result.B1} Days: {result.Days}, " + $"B2: {result.B2} B3: {result.B3} Hdd: {heatingCoolingDegreeDays.HDD}, " + $"B4: {result.B4} B5: {result.B5} Cdd: {heatingCoolingDegreeDays.CDD}, " + $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}, R2: {result.R2}."); _actualWthExpUsageInserts++; } else { Log.Error($"FAILED attempt: insert into WthExpUsage >> RdngID: {result.RdngID} WthExpUsage: {resultAsDecimal} ... B1: {result.B1} B2: " + $"{result.B2} B3: {result.B3} Hdd: {heatingCoolingDegreeDays.HDD} B4: {result.B4} B5: {result.B5} Cdd: {heatingCoolingDegreeDays.CDD} " + $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}, R2: {result.R2}"); } }
private bool[] DoCalculation(ReadingsQueryResult result, HeatingCoolingDegreeDays heatingCoolingDegreeDays) { double resultAsDouble = (result.B1 * result.Days) + (result.B2 * heatingCoolingDegreeDays.HDD) + (result.B4 * heatingCoolingDegreeDays.CDD); decimal resultAsDecimal = decimal.Round(Convert.ToDecimal(resultAsDouble), 4, MidpointRounding.AwayFromZero); bool existed = _weatherRepository.GetWthExpUsageExists(result.RdngID); bool success; if (existed) { success = _weatherRepository.UpdateWthExpUsage(result.RdngID, resultAsDecimal); } else { success = _weatherRepository.InsertWthExpUsage(result.RdngID, resultAsDecimal); } if (existed && success) { Log.Debug($"Updated WthExpUsage >> RdngID: {result.RdngID} WthExpUsage: {resultAsDecimal} (actual usage: {result.Units}) ... " + $"B1: {result.B1} Days: {result.Days}, " + $"B2: {result.B2} B3: {result.B3} Hdd: {heatingCoolingDegreeDays.HDD}," + $" B4: {result.B4} B5: {result.B5} Cdd: {heatingCoolingDegreeDays.CDD}, " + $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}, R2: {result.R2}."); } else if (existed && !success) { Log.Error($"Failed attempt: Update WthExpUsage >> RdngID: {result.RdngID} WthExpUsage: {resultAsDecimal} (actual usage: {result.Units}) ... " + $"B1: {result.B1} Days: {result.Days}, " + $"B2: {result.B2} B3: {result.B3} Hdd: {heatingCoolingDegreeDays.HDD}, " + $"B4: {result.B4} B5: {result.B5} Cdd: {heatingCoolingDegreeDays.CDD}, " + $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}, R2: {result.R2}."); } else if (!existed && success) { Log.Debug($"Inserted into WthExpUsage >> RdngID: {result.RdngID} WthExpUsage: {resultAsDecimal} (actual usage: {result.Units}) ... " + $"B1: {result.B1} Days: {result.Days}, " + $"B2: {result.B2} B3: {result.B3} Hdd: {heatingCoolingDegreeDays.HDD}, " + $"B4: {result.B4} B5: {result.B5} Cdd: {heatingCoolingDegreeDays.CDD}, " + $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}, R2: {result.R2}."); } else if (!existed && !success) { Log.Error($"Failed attempt: Insert into WthExpUsage >> RdngID: {result.RdngID} WthExpUsage: {resultAsDecimal} (actual usage: {result.Units}) ... " + $"B1: {result.B1} Days: {result.Days}, " + $"B2: {result.B2} B3: {result.B3} Hdd: {heatingCoolingDegreeDays.HDD}, " + $"B4: {result.B4} B5: {result.B5} Cdd: {heatingCoolingDegreeDays.CDD}, " + $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}, R2: {result.R2}."); } return(new bool[] { success, existed }); }
private void PopulateWthExpUsageTable() { Log.Information("Starting PopulateWthExpUsage()..."); string fromDateStartStr = $"{fromDateStart.Month}-{fromDateStart.Day}-{fromDateStart.Year}"; try { List <ReadingsQueryResult> readings = _weatherRepository.GetReadings(fromDateStartStr); expectedWthExpUsageInserts = readings.Count; foreach (ReadingsQueryResult result in readings) { try { List <WeatherData> weatherDataList = _weatherRepository.GetWeatherDataByZipStartAndEndDate(result.Zip, result.DateStart, result.DateEnd); if (weatherDataList.Count != result.Days) { Log.Error($"WeatherDataList.Count != reading.Days; WeatherDataList.Count = {weatherDataList.Count} reading.Days = {result.Days}. " + $"RdngID: {result.RdngID}."); } HeatingCoolingDegreeDays heatingCoolingDegreeDays = HeatingCoolingDegreeDaysValueOf(result, weatherDataList); DoCalculation(result, heatingCoolingDegreeDays); } catch (Exception e) { Log.Error(e.Message); Log.Error(e.StackTrace); } } int expectedTotalWthExpUsageEntries = _weatherRepository.GetExpectedWthExpUsageRowCount(fromDateStartStr); int actualTotalWthExpUsageEntries = _weatherRepository.GetActualWthExpUsageRowCount(); Log.Information($"Finished PopulateWthExpUsage(). Expected inserts: {expectedWthExpUsageInserts}, Actual: {actualWthExpUsageInserts}"); Log.Information($"Expected WthExpUsage total entries: {expectedTotalWthExpUsageEntries}, Actual: {actualTotalWthExpUsageEntries}.\n"); } catch (Exception ex) { Log.Error(ex.Message + " " + ex.StackTrace); } expectedWthExpUsageInserts = 0; actualWthExpUsageInserts = 0; }
private HeatingCoolingDegreeDays HeatingCoolingDegreeDaysValueOf(ReadingsQueryResult result, List <WeatherData> weatherDataList) { HeatingCoolingDegreeDays hcdd = new HeatingCoolingDegreeDays(); hcdd.CDD = 0.0; hcdd.HDD = 0.0; if (result.B3 == 0 && result.B5 == 0) { return(hcdd); } foreach (WeatherData weatherData in weatherDataList) { if (!weatherData.AvgTmp.HasValue) { throw new Exception($"WeatherData.AvgTmp is null for {weatherData.ZipCode} on {weatherData.RDate}"); } //else if (result.B5 > 0) //{ // if (weatherData.AvgTmp >= result.B5) // { // hcdd.CDD = hcdd.CDD + (weatherData.AvgTmp.Value - result.B5); // } //} //else if (result.B3 > 0) //{ // if (weatherData.AvgTmp <= result.B3) // { // hcdd.HDD = hcdd.HDD + (result.B3 - weatherData.AvgTmp.Value); // } //} if (result.B5 > 0 && weatherData.AvgTmp >= result.B5) { hcdd.CDD = hcdd.CDD + (weatherData.AvgTmp.Value - result.B5); } if (result.B3 > 0 && weatherData.AvgTmp <= result.B3) { hcdd.HDD = hcdd.HDD + (result.B3 - weatherData.AvgTmp.Value); } } return(hcdd); }
private HeatingCoolingDegreeDays HeatingCoolingDegreeDaysValueOf(BalancePointPair balancePointPair, List <WeatherData> weatherDataList) { HeatingCoolingDegreeDays hcdd = new HeatingCoolingDegreeDays { CDD = 0.0, HDD = 0.0, }; foreach (WeatherData weatherData in weatherDataList) { if (!weatherData.AvgTmp.HasValue) { throw new Exception("WeatherData.AvgTmp is null for " + weatherData.ZipCode + " on " + weatherData.RDate); } //else if (balancePointPair.CoolingBalancePoint > 0 && weatherData.AvgTmp >= balancePointPair.CoolingBalancePoint) //{ // hcdd.CDD += (weatherData.AvgTmp.Value - balancePointPair.CoolingBalancePoint); //} //else if (balancePointPair.HeatingBalancePoint > 0 && weatherData.AvgTmp < balancePointPair.HeatingBalancePoint) //{ // hcdd.HDD += (balancePointPair.HeatingBalancePoint - weatherData.AvgTmp.Value); //} if (balancePointPair.CoolingBalancePoint > 0 && weatherData.AvgTmp >= balancePointPair.CoolingBalancePoint) { hcdd.CDD += (weatherData.AvgTmp.Value - balancePointPair.CoolingBalancePoint); } if (balancePointPair.HeatingBalancePoint > 0 && weatherData.AvgTmp <= balancePointPair.HeatingBalancePoint) { hcdd.HDD += (balancePointPair.HeatingBalancePoint - weatherData.AvgTmp.Value); } } return(hcdd); }
private void UpdateWthExpUsage(List <WthNormalParams> newNormalParamsList) { Log.Information("Starting UpdateWthExpUsage()..."); //string fromDateStartStr = $"{_fromDateStart.Month}-{_fromDateStart.Day}-{_fromDateStart.Year}"; int updateCount = 0; int insertCount = 0; int failCount = 0; foreach (WthNormalParams normalParams in newNormalParamsList) { try { List <ReadingsQueryResult> readings = _weatherRepository.GetReadingsForExpUsageUpdate(_MoID, normalParams); foreach (ReadingsQueryResult result in readings) { try { if (normalParams.R2 < Convert.ToDecimal(0.75)) { bool exists = _weatherRepository.GetWthExpUsageExists(result.RdngID); if (exists) { bool updateNoModel = _weatherRepository.UpdateWthExpUsage(result.RdngID, result.Units.Value); if (updateNoModel) { updateCount++; Log.Debug($"Updated WthExpUsage (No Valid Model) >> RdngID: {result.RdngID} ExpUsage: {result.Units.Value} << " + $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}."); } else { failCount++; Log.Error($"Failed attempt : Update WthExpUsage (No Valid Model) >> RdngID: {result.RdngID} ExpUsage: {result.Units.Value} << " + $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}."); } } else { bool insertNoModel = _weatherRepository.InsertWthExpUsage(result.RdngID, result.Units.Value); if (insertNoModel) { insertCount++; Log.Debug($"Inserted into WthExpUsage (No Valid Model) >> RdngID: {result.RdngID} ExpUsage: {result.Units.Value} << " + $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}."); } else { failCount++; Log.Error($"Failed attempt : Insert into WthExpUsage (No Valid Model) >> RdngID: {result.RdngID} ExpUsage: {result.Units.Value} << " + $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}."); } } continue; } if (result.DateStart == DateTime.MinValue || result.DateEnd == DateTime.MinValue) { throw new Exception($"Cannot compute ExpUsage for RdngID: {result.RdngID} >> DateStart and/or DateEnd is null."); } int daysInReading = result.DateEnd.Subtract(result.DateStart).Days; List <WeatherData> weatherDataList = _weatherRepository.GetWeatherDataByZipStartAndEndDate(result.Zip, result.DateStart, result.DateEnd); if (weatherDataList.Count != daysInReading) { throw new Exception($"WeatherDataList.Count != daysInReading; WeatherDataList.Count = {weatherDataList.Count}, " + $"daysInReading = {daysInReading}. Reading.EndDate = {result.DateEnd}"); } BalancePointPair balancePointPair = new BalancePointPair() { HeatingBalancePoint = normalParams.B3, CoolingBalancePoint = normalParams.B5 }; HeatingCoolingDegreeDays heatingCoolingDegreeDays = HeatingCoolingDegreeDaysValueOf(balancePointPair, weatherDataList); bool[] successCommaAlreadyExisted = DoCalculation(result, heatingCoolingDegreeDays); if (successCommaAlreadyExisted[0]) { if (successCommaAlreadyExisted[1]) { updateCount++; } else { insertCount++; } } else { failCount++; } } catch (Exception e) { failCount++; Log.Debug($"Failure. Cannot calculate ExpUsage for RdngID: {result.RdngID} >> {e.Message} {e.StackTrace}"); } } } catch (Exception ex) { Log.Error($"AccID/UtilID/UnitID: {normalParams.AccID}/{normalParams.UtilID}/{normalParams.UnitID} >> {ex.Message}"); Log.Debug($"{ex.StackTrace}"); } } if (failCount == 0) { Log.Information($"Finished UpdateWthExpUsage() on Readings going back to MoID: {_MoID}. " + $"Inserts: {insertCount}, Updates: {updateCount}, Failures: {failCount}."); } else { Log.Warning($"Finished UpdateWthExpUsage() on Readings going back to MoID: {_MoID}. " + $"Inserts: {insertCount}, Updates: {updateCount}, Failures: {failCount}."); } }
private List <BalancePointPair> CalculateOneYearOfDegreeDaysForAllBalancePoints(List <WNRdngData> wNRdngData) { List <BalancePointPair> allBalancePointPairs = new List <BalancePointPair>(); DateTime _yearOfReadsDateStart = wNRdngData.First().DateStart; DateTime _yearOfReadsDateEnd = wNRdngData.Last().DateEnd; int _readingsCount = wNRdngData.First().MoCt; int daysInYear = 0; bool badData = false; foreach (WNRdngData reading in wNRdngData) { if (reading.DateStart == DateTime.MinValue || reading.DateEnd == DateTime.MinValue) { badData = true; Log.Warning($"MoID: {reading.MoID} >> DateStart and/or DateEnd is null for " + $"AccID/UtilID/UnitID: {reading.AccID}/{reading.UtilID}/{reading.UnitID}"); } else { var t = reading.DateEnd.Subtract(reading.DateStart).Days; daysInYear += t; } } if (badData) { throw new BadWNRdngDataException($"Bad/null WNRdngData for AccID/UtilID/UnitID: " + $"{wNRdngData.First().AccID}/{wNRdngData.First().UtilID}/{wNRdngData.First().UnitID}."); } foreach (WNRdngData reading in wNRdngData) { int daysInReading = reading.DateEnd.Subtract(reading.DateStart).Days; if (daysInReading == 0) { continue; } HeatingCoolingDegreeDays hcdd = new HeatingCoolingDegreeDays { CDD = 0.0, HDD = 0.0 }; List <WeatherData> weatherDataList = _weatherRepository.GetWeatherDataByZipStartAndEndDate(reading.Zip, reading.DateStart, reading.DateEnd); if (weatherDataList.Count != daysInReading) { throw new BadWNRdngDataException($"WeatherData.Count != daysInReading ({weatherDataList.Count} != {daysInReading}) << " + $"Acc/Util/UnitID: {reading.AccID}/{reading.UtilID}/{reading.UnitID}, Zip: {reading.Zip} MoID: {reading.MoID}"); } int rangeMin = 45; int rangeMax = 75; int range = rangeMax - rangeMin + 1; List <int[]> comboList = new List <int[]>(); for (int i = 0; i < range; i++) { int[] hdsOnly = new int[2] { rangeMin + i, 0 }; int[] cdsOnly = new int[2] { 0, rangeMin + i }; comboList.Add(hdsOnly); comboList.Add(cdsOnly); int k = range - 1 - i; while (k >= 0) { int[] both = new int[2] { rangeMin + i, rangeMin + i + k }; k--; comboList.Add(both); } } comboList.Add(new int[] { 0, 0 }); foreach (int[] combo in comboList) { BalancePointPair bpPair = new BalancePointPair { CoolingBalancePoint = combo[1], HeatingBalancePoint = combo[0] }; hcdd = HeatingCoolingDegreeDaysValueOf(bpPair, weatherDataList); bpPair.CoolingDegreeDays = hcdd.CDD; bpPair.HeatingDegreeDays = hcdd.HDD; bpPair.ActualUsage = reading.Units; bpPair.ZipCode = reading.Zip; bpPair.DaysInReading = daysInReading; bpPair.DaysInYear = daysInYear; allBalancePointPairs.Add(bpPair); } } return(allBalancePointPairs); }
public void PopulateWthExpUsageTable() { Log.Information("Starting PopulateWthExpUsage()..."); //string fromDateStartStr = $"{_fromDateStart.Month}-{_fromDateStart.Day}-{_fromDateStart.Year}"; try { List <ReadingsQueryResult> readings = _weatherRepository.GetReadings(_MoID); _expectedWthExpUsageInserts = readings.Count; foreach (ReadingsQueryResult result in readings) { try { if (!result.R2.HasValue //|| result.R2.Value > 1 //|| result.R2 < 0 ) { continue; } if (result.R2.Value < 0.7500) { bool successAndNoModel = _weatherRepository.InsertWthExpUsage(result.RdngID, result.Units ?? 0); if (successAndNoModel) { _actualWthExpUsageInserts++; Log.Debug($"Inserted into WthExpUsage (No Weather Model) >> RdngID: {result.RdngID} ExpUsage: {result.Units ?? 0} << " + $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}, Actual Units: {result.Units}."); } else { Log.Error($"Failed attempt: Insert into WthExpUsage (without an accepted weather model) " + $">> RdngID: {result.RdngID} ExpUsage: {result.Units ?? 0} << " + $"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID}, Actual Units: {result.Units}"); } continue; } if (result.DateStart == DateTime.MinValue || result.DateEnd == DateTime.MinValue) { throw new Exception("DateStart and/or DateEnd is null."); } int daysInReading = result.DateEnd.Subtract(result.DateStart).Days; List <WeatherData> weatherDataList = _weatherRepository.GetWeatherDataByZipStartAndEndDate(result.Zip, result.DateStart, result.DateEnd); if (weatherDataList.Count != daysInReading) { throw new Exception($"WeatherDataList.Count != daysInReading; WeatherDataList.Count = {weatherDataList.Count}, " + $"daysInReading = {daysInReading}. Reading.StartDate = {result.DateStart} Reading.EndDate = {result.DateEnd}"); } HeatingCoolingDegreeDays heatingCoolingDegreeDays = HeatingCoolingDegreeDaysValueOf(result, weatherDataList); DoCalculation(result, heatingCoolingDegreeDays); } catch (Exception e) { Log.Error($"AccID/UtilID/UnitID: {result.AccID}/{result.UtilID}/{result.UnitID} >> " + $"Cannot calculate ExpUsage for RdngID: {result.RdngID} >> {e.Message}"); Log.Debug(e.StackTrace); } } int expectedTotalWthExpUsageEntries = _weatherRepository.GetExpectedWthExpUsageRowCount(_MoID); int actualTotalWthExpUsageEntries = _weatherRepository.GetActualWthExpUsageRowCount(); Log.Information($"Finished PopulateWthExpUsage(). Expected inserts: {_expectedWthExpUsageInserts}, Actual: {_actualWthExpUsageInserts}"); Log.Information($"Expected WthExpUsage total entries: {expectedTotalWthExpUsageEntries}, Actual: {actualTotalWthExpUsageEntries}."); } catch (Exception ex) { Log.Error($"Problem getting Readings >> {ex.Message} { ex.StackTrace}"); } _expectedWthExpUsageInserts = 0; _actualWthExpUsageInserts = 0; }