예제 #1
0
        private decimal CalculateExpUsageForNomalizing(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);

            return(resultAsDecimal);
        }
예제 #2
0
        private HeatingCoolingDegreeDays HeatingCoolingDegreeDaysValueOf(ReadingsQueryResult result, 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 (result.B5 > 0 && weatherData.AvgTmp >= result.B5)
                {
                    hcdd.CDD += (weatherData.AvgTmp.Value - result.B5);
                }
                else if (result.B3 > 0 && weatherData.AvgTmp < result.B3)
                {
                    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);
                }
            }

            return(hcdd);
        }
예제 #4
0
        private decimal CalculateExpUsage(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, result.AccID, result.UtilID, result.RUnitID);

            if (success)
            {
                Log.Information($"Inserted 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} " +
                                $"RdngUnitID: {result.RUnitID} WthNormalParamsUnitID: {result.WnpUnitID}");

                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} " +
                          $"RdngUnitID: {result.RUnitID} WthNormalParamsUnitID: {result.WnpUnitID}");
            }

            return(resultAsDecimal);
        }
예제 #5
0
        private void PopulateMyWthExpUsage()
        {
            //List<ReadingsQueryResult> allReadings = _weatherRepository.GetReadingsFromExpUsageOriginal();
            List <ReadingsQueryResult> allReadings = _weatherRepository.GetReadingsFromExpUsageOriginalCorrected();

            var readingsByAccount = allReadings.GroupBy(r => new { r.AccID, r.UtilID, r.RUnitID });

            foreach (var group in readingsByAccount)
            {
                try
                {
                    List <ReadingsQueryResult> readings = group.ToList();
                    WthNormalParams            _params  =
                        _weatherRepository.GetParamsForReading(readings.First().AccID, readings.First().UtilID, readings.First().RUnitID);

                    foreach (ReadingsQueryResult reading in readings)
                    {
                        WthExpUsage wthExpUsage = new WthExpUsage();
                        wthExpUsage.RdngID = reading.RdngID;
                        wthExpUsage.AccID  = reading.AccID;
                        wthExpUsage.UtilID = reading.UtilID;
                        wthExpUsage.UnitID = reading.RUnitID;
                        decimal expUsage_Old = decimal.Round(Convert.ToDecimal(reading.ExpUsage), 4, MidpointRounding.AwayFromZero);
                        wthExpUsage.ExpUsage_Old = expUsage_Old;
                        wthExpUsage.Units        = reading.Units;

                        List <WeatherData> weatherDataList =
                            _weatherRepository.GetWeatherDataByZipStartAndEndDate(_params.WthZipCode, reading.DateStart, reading.DateEnd);

                        reading.B3 = _params.B3_New;
                        reading.B5 = _params.B5_New;

                        HeatingCoolingDegreeDays hcdd = HeatingCoolingDegreeDaysValueOf(reading, weatherDataList);

                        decimal expUsage_New = _params.B1_New * reading.Days
                                               + (_params.B2_New * decimal.Round(Convert.ToDecimal(hcdd.HDD), 4, MidpointRounding.AwayFromZero))
                                               + (_params.B4_New * decimal.Round(Convert.ToDecimal(hcdd.CDD), 4, MidpointRounding.AwayFromZero));

                        wthExpUsage.ExpUsage_New = expUsage_New;

                        if (reading.Units != 0)
                        {
                            wthExpUsage.PercentDelta_Old = Math.Abs((expUsage_Old - reading.Units) / reading.Units);
                            wthExpUsage.PercentDelta_New = Math.Abs((expUsage_New - reading.Units) / reading.Units);
                        }
                        wthExpUsage.DateStart = reading.DateStart;
                        wthExpUsage.DateEnd   = reading.DateEnd;

                        _weatherRepository.InsertMyWthExpUsage(wthExpUsage);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message + " " + group.ToList().First().RdngID + " " + group.ToList().First().AccID + " " + group.ToList().First().RUnitID
                                      + "\n" + e.StackTrace);
                }
            }
        }
        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 exists = _weatherRepository.GetWthExpUsageExists(result.RdngID);
            bool success;

            if (exists)
            {
                success = _weatherRepository.UpdateWthExpUsage(result.RdngID, resultAsDecimal);
            }
            else
            {
                success = _weatherRepository.InsertWthExpUsage(result.RdngID, resultAsDecimal);
            }

            if (exists && success)
            {
                Log.Information($"Update 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} " +
                                $"RdngUnitID: {result.RUnitID} WthNormalParamsUnitID: {result.WnpUnitID}");
            }
            else if (exists && !success)
            {
                Log.Error($"FAILED attempt: Update 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} " +
                          $"RdngUnitID: {result.RUnitID} WthNormalParamsUnitID: {result.WnpUnitID}");
            }
            else if (!exists && success)
            {
                Log.Information($"Inserted 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} " +
                                $"RdngUnitID: {result.RUnitID} WthNormalParamsUnitID: {result.WnpUnitID}");
            }
            else if (!exists && !success)
            {
                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} " +
                          $"RdngUnitID: {result.RUnitID} WthNormalParamsUnitID: {result.WnpUnitID}");
            }

            return(new bool[] { exists, success });
        }
예제 #7
0
        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)
                {
                    //Console.WriteLine(result.DateStart + ", " + result.DateEnd + ", " + result.Days + ",  result.B1 = " + result.B1 + ",  result.B2 = " + result.B2 + ", result.B3 = " + result.B3 + ",  result.B4 = " + result.B4);
                    try
                    {
                        List <WeatherData>       weatherDataList          = _weatherRepository.GetWeatherDataByZipStartAndEndDate(result.Zip, result.DateStart, result.DateEnd);
                        HeatingCoolingDegreeDays heatingCoolingDegreeDays = HeatingCoolingDegreeDaysValueOf(result, weatherDataList);

                        CalculateExpUsage(result, heatingCoolingDegreeDays);
                    }
                    catch (Exception e)
                    {
                        Log.Error(e.Message);
                        Log.Error(e.StackTrace);
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex.Message);
                Log.Error(ex.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");

            expectedWthExpUsageInserts = 0;
            actualWthExpUsageInserts   = 0;
        }
예제 #8
0
        private void PopulateMyWthExpUsage(AccordResult accord)
        {
            //List<ReadingsQueryResult> allReadings = _weatherRepository.GetReadingsFromExpUsageOriginal();
            List <ReadingsQueryResult> allReadings = _weatherRepository.GetReadingsFromExpUsageOriginalCorrected(accord);

            var readingsByAccount = allReadings.GroupBy(r => new { r.AccID, r.UtilID, r.RUnitID });

            foreach (var group in readingsByAccount)
            {
                try
                {
                    List <ReadingsQueryResult> readings = group.ToList();
                    WthNormalParams            _params  =
                        _weatherRepository.GetParamsForReading(readings.First().AccID, readings.First().UtilID, readings.First().RUnitID);

                    foreach (ReadingsQueryResult reading in readings)
                    {
                        WthExpUsage wthExpUsage = new WthExpUsage();
                        wthExpUsage.RdngID = reading.RdngID;
                        wthExpUsage.AccID  = reading.AccID;
                        wthExpUsage.UtilID = reading.UtilID;
                        wthExpUsage.UnitID = reading.RUnitID;
                        decimal expUsage_Old = decimal.Round(Convert.ToDecimal(reading.ExpUsage), 4, MidpointRounding.AwayFromZero);
                        wthExpUsage.ExpUsage_Old = expUsage_Old;
                        wthExpUsage.Units        = reading.Units;

                        List <WeatherData> weatherDataList =
                            _weatherRepository.GetWeatherDataByZipStartAndEndDate(_params.WthZipCode, reading.DateStart, reading.DateEnd);

                        decimal B1 = 0;
                        decimal B2 = 0;
                        decimal B4 = 0;

                        reading.B3 = accord.HeatingBP;
                        reading.B5 = accord.CoolingBP;

                        if (accord.IsSimpleSingleRegression)
                        {
                            if (reading.B3 > 0)
                            {
                                B1 = decimal.Round(Convert.ToDecimal(accord.SimpleLinearRegression.Intercept), 12, MidpointRounding.AwayFromZero);
                                B2 = decimal.Round(Convert.ToDecimal(accord.SimpleLinearRegression.Slope), 12, MidpointRounding.AwayFromZero);
                                B4 = 0;
                            }
                            else if (reading.B5 > 0)
                            {
                                B1 = decimal.Round(Convert.ToDecimal(accord.SimpleLinearRegression.Intercept), 12, MidpointRounding.AwayFromZero);
                                B2 = 0;
                                B4 = decimal.Round(Convert.ToDecimal(accord.SimpleLinearRegression.Slope), 12, MidpointRounding.AwayFromZero);
                            }
                        }
                        else
                        {
                            if (reading.B3 > 0 && reading.B5 > 0)
                            {
                                B1 = decimal.Round(Convert.ToDecimal(accord.MultipleRegression.Weights[0]), 12, MidpointRounding.AwayFromZero);
                                B2 = decimal.Round(Convert.ToDecimal(accord.MultipleRegression.Weights[1]), 12, MidpointRounding.AwayFromZero);
                                B4 = decimal.Round(Convert.ToDecimal(accord.MultipleRegression.Weights[2]), 12, MidpointRounding.AwayFromZero);
                            }
                            else if (reading.B3 > 0)
                            {
                                B1 = decimal.Round(Convert.ToDecimal(accord.MultipleRegression.Weights[0]), 12, MidpointRounding.AwayFromZero);
                                B2 = decimal.Round(Convert.ToDecimal(accord.MultipleRegression.Weights[1]), 12, MidpointRounding.AwayFromZero);
                            }
                            else if (reading.B5 > 0)
                            {
                                B1 = decimal.Round(Convert.ToDecimal(accord.MultipleRegression.Weights[0]), 12, MidpointRounding.AwayFromZero);
                                B4 = decimal.Round(Convert.ToDecimal(accord.MultipleRegression.Weights[1]), 12, MidpointRounding.AwayFromZero);
                            }
                        }

                        HeatingCoolingDegreeDays hcdd = HeatingCoolingDegreeDaysValueOf(reading, weatherDataList);

                        decimal expUsage_New = (B1 * reading.Days)
                                               + (B2 * decimal.Round(Convert.ToDecimal(hcdd.HDD), 12, MidpointRounding.AwayFromZero))
                                               + (B4 * decimal.Round(Convert.ToDecimal(hcdd.CDD), 12, MidpointRounding.AwayFromZero));

                        wthExpUsage.ExpUsage_New = expUsage_New;

                        if (reading.Units != 0)
                        {
                            wthExpUsage.PercentDelta_Old = Math.Abs((expUsage_Old - reading.Units) / reading.Units);
                            wthExpUsage.PercentDelta_New = Math.Abs((expUsage_New - reading.Units) / reading.Units);
                        }
                        wthExpUsage.DateStart = reading.DateStart;
                        wthExpUsage.DateEnd   = reading.DateEnd;

                        _weatherRepository.InsertMyWthExpUsage(wthExpUsage, Accord: true);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message + " " + group.ToList().First().RdngID + " " + group.ToList().First().AccID + " " + group.ToList().First().RUnitID
                                      + "\n" + e.StackTrace);
                }
            }
        }
예제 #9
0
        private List <BalancePointPair> CalculateOneYearOfDegreeDaysForAllBalancePoints(string DesiredStartDate, WthNormalParams accountUtilAndUnit)
        {
            List <BalancePointPair> allBalancePointPairs = new List <BalancePointPair>();

            List <ReadingsQueryResult> readings = _weatherRepository.GetReadingsForRegressionYear(DesiredStartDate, accountUtilAndUnit);

            if (readings.Count == 0)
            {
                return(allBalancePointPairs);
            }

            DateTime _ReadDateStart = readings.First().DateStart;
            DateTime _ReadDateEnd   = readings.Last().DateEnd;
            int      days           = 0;

            foreach (ReadingsQueryResult reading in readings)
            {
                days += reading.Days;
            }

            foreach (ReadingsQueryResult reading in readings)
            {
                HeatingCoolingDegreeDays hcdd = new HeatingCoolingDegreeDays
                {
                    CDD = 0.0,
                    HDD = 0.0
                };

                List <WeatherData> weatherDataList = _weatherRepository.GetWeatherDataByZipStartAndEndDate(reading.Zip, reading.DateStart, reading.DateEnd);

                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);
                    }

                    //for (int j = 0; j < range; j++)
                    //{
                    //    int[] allBoth = new int[2] { rangeMin + i, rangeMin + j };
                    //    comboList.Add(allBoth);
                    //}
                }

                comboList.Add(new int[] { 0, 0 });

                //int expectedComboListCount = 0;

                ///* cases where (heating bp) != (cooling bp) */
                //expectedComboListCount = (range + 1) * ((range) / 2);
                //if (range % 2 != 0)
                //{
                //    expectedComboListCount += ((range) / 2) + 1;
                //}

                ///* cases where (heating bp) != 0 && (cooling bp) == 0 or
                // *             (heating bp) == 0 && (cooling bp) != 0; and
                // *             (heating bp) == 0 && (cooling bp) == 0.
                // */
                //expectedComboListCount += (range * 2) + 1;

                foreach (int[] combo in comboList)
                {
                    reading.B3 = combo[0];
                    reading.B5 = combo[1];

                    hcdd = HeatingCoolingDegreeDaysValueOf(reading, weatherDataList);

                    BalancePointPair balancePoint = new BalancePointPair
                    {
                        RdngID               = reading.RdngID,
                        DaysInReading        = reading.Days,
                        CoolingBalancePoint  = reading.B5,
                        HeatingBalancePoint  = reading.B3,
                        CoolingDegreeDays    = hcdd.CDD,
                        HeatingDegreeDays    = hcdd.HDD,
                        ActualUsage          = reading.Units,
                        YearOfReadsDateStart = _ReadDateStart,
                        YearOfReadsDateEnd   = _ReadDateEnd,
                        ReadingsInNormalYear = readings.Count,
                        DaysInNormalYear     = days,
                        WthZipCode           = reading.Zip
                    };

                    allBalancePointPairs.Add(balancePoint);
                }
            }

            return(allBalancePointPairs);
        }
        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(fromDateStartStr, normalParams);

                    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}.");
                            }

                            BalancePointPair balancePointPair = new BalancePointPair()
                            {
                                HeatingBalancePoint = normalParams.B3,
                                CoolingBalancePoint = normalParams.B5
                            };

                            HeatingCoolingDegreeDays heatingCoolingDegreeDays = HeatingCoolingDegreeDaysValueOf(balancePointPair, weatherDataList);

                            bool[] existsSuccess = DoCalculation(result, heatingCoolingDegreeDays);

                            if (existsSuccess[1])
                            {
                                if (existsSuccess[0])
                                {
                                    updateCount++;
                                }
                                else
                                {
                                    insertCount++;
                                }
                            }
                            else
                            {
                                failCount++;
                            }
                        }
                        catch (Exception e)
                        {
                            Log.Error(e.Message + " " + e.StackTrace);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Log.Error(ex.Message + " " + ex.StackTrace);
                }
            }

            Log.Information($"Finished UpdateWthExpUsage(). 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().MoID;
            int      daysInYear            = 0;

            foreach (WNRdngData reading in wNRdngData)
            {
                var t = reading.DateEnd.Subtract(reading.DateStart).Days;
                daysInYear += t;
            }

            foreach (WNRdngData reading in wNRdngData)
            {
                int daysInReading = reading.DateEnd.Subtract(reading.DateStart).Days;

                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)
                {
                    Log.Error($"WeatherData.Count != daysInReading: " + weatherDataList.Count + " "
                              + daysInReading + " AccID: " + reading.AccID + " UtilID: " + reading.UtilID + " UnitID: " + 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);
        }
예제 #12
0
        private List <BPPairAccord> CalculateOneYearOfDegreeDaysForAllBalancePoints(List <WNRdngData> wNRdngData)
        {
            List <BPPairAccord> allBalancePointPairs = new List <BPPairAccord>();

            DateTime _yearOfReadsDateStart = wNRdngData.First().DateStart;
            DateTime _yearOfReadsDateEnd   = wNRdngData.Last().DateEnd;
            int      _readingsCount        = wNRdngData.First().MoID;
            int      daysInYear            = 0;

            foreach (WNRdngData reading in wNRdngData)
            {
                var t = reading.DateEnd.Subtract(reading.DateStart).Days;
                daysInYear += t;
            }

            foreach (WNRdngData reading in wNRdngData)
            {
                int daysInReading = reading.DateEnd.Subtract(reading.DateStart).Days;

                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)
                {
                    Log.Error($"WeatherData.Count != daysInReading: " + weatherDataList.Count + " "
                              + daysInReading + " AccID: " + reading.AccID + " UtilID: " + reading.UtilID + " UnitID: " + 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 });

                //int expectedComboListCount = 0;

                ///* cases where (heating bp) != (cooling bp) */
                //expectedComboListCount = (range + 1) * ((range) / 2);
                //if (range % 2 != 0)
                //{
                //    expectedComboListCount += ((range) / 2) + 1;
                //}

                ///* cases where (heating bp) != 0 && (cooling bp) == 0 or
                // *             (heating bp) == 0 && (cooling bp) != 0; and
                // *             (heating bp) == 0 && (cooling bp) == 0.
                // */
                //expectedComboListCount += (range * 2) + 1;

                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.YearOfReadsDateStart = _yearOfReadsDateStart;
                    //bpPair.YearOfReadsDateEnd = _yearOfReadsDateEnd;
                    //bpPair.ReadingsInNormalYear = _readingsCount;
                    ////DaysInNormalYear = days;
                    //bpPair.WthZipCode = reading.Zip;
                    //bpPair.DaysInReading = daysInReading;

                    BPPairAccord bpPair = new BPPairAccord
                    {
                        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);
        }
예제 #13
0
        private List <BalancePointPair> CalculateOneYearExpUsageForAllBalancePoints(string DesiredStartDate, WthNormalParams accountUtilAndUnit)
        {
            List <BalancePointPair> allBalancePointPairs = new List <BalancePointPair>();

            List <ReadingsQueryResult> readings = _weatherRepository.GetReadingsForRegressionYear(DesiredStartDate, accountUtilAndUnit);

            DateTime _ReadDateStart = readings.First().DateStart;
            DateTime _ReadDateEnd   = readings.Last().DateEnd;
            int      days           = 0;

            decimal expUsage_Original = 0;

            foreach (ReadingsQueryResult reading in readings)
            {
                days += reading.Days;
                //expUsage_Original += _weatherRepository.GetExpUsageOriginal(reading.RdngID);
            }

            foreach (ReadingsQueryResult reading in readings)
            {
                HeatingCoolingDegreeDays hcdd = new HeatingCoolingDegreeDays
                {
                    CDD = 0.0,
                    HDD = 0.0
                };

                List <WeatherData> weatherDataList = _weatherRepository.GetWeatherDataByZipStartAndEndDate(reading.Zip, reading.DateStart, reading.DateEnd);

                int coolingBalancePoint = reading.B5;
                int heatingBalancePoint = reading.B3;

                double coolingCoefficiant = reading.B4;
                double heatingCoefficiant = reading.B2;

                if (heatingCoefficiant == 0 && coolingCoefficiant == 0)
                {
                    decimal expUsage = CalculateExpUsageForNomalizing(reading, hcdd);

                    BalancePointPair balancePointPair = new BalancePointPair
                    {
                        RdngID               = reading.RdngID,
                        DaysInReading        = reading.Days,
                        CoolingBalancePoint  = reading.B5,
                        HeatingBalancePoint  = reading.B3,
                        CoolingDegreeDays    = (double)hcdd.CDD,
                        HeatingDegreeDays    = (double)hcdd.HDD,
                        ExpUsage_New         = expUsage,
                        ActualUsage          = reading.Units,
                        ExpUsage_Original    = expUsage_Original,
                        YearOfReadsDateStart = _ReadDateStart,
                        YearOfReadsDateEnd   = _ReadDateEnd,
                        ReadingsInNormalYear = readings.Count,
                        DaysInNormalYear     = days,
                        WthZipCode           = reading.Zip
                    };

                    allBalancePointPairs.Add(balancePointPair);
                }
                else
                {
                    int[] allCoolingBalancePoints = new int[31];
                    for (int k = 45; k <= 75; k++)
                    {
                        allCoolingBalancePoints[k - 45] = k;
                    }

                    int[] allHeatingBalancePoints = new int[31];
                    for (int k = 45; k <= 75; k++)
                    {
                        allHeatingBalancePoints[k - 45] = k;
                    }

                    if (coolingCoefficiant > 0)
                    {
                        foreach (int coolingPointInstance in allCoolingBalancePoints)
                        {
                            reading.B5 = coolingPointInstance;

                            if (heatingCoefficiant > 0)
                            {
                                foreach (int heatingPointInstance in allHeatingBalancePoints)
                                {
                                    reading.B3 = heatingPointInstance;

                                    hcdd = HeatingCoolingDegreeDaysValueOf(reading, weatherDataList);

                                    decimal expUsage = CalculateExpUsageForNomalizing(reading, hcdd);

                                    BalancePointPair balancePoint = new BalancePointPair
                                    {
                                        RdngID              = reading.RdngID,
                                        DaysInReading       = reading.Days,
                                        CoolingBalancePoint = reading.B5,
                                        HeatingBalancePoint = reading.B3,
                                        CoolingDegreeDays   = (double)hcdd.CDD,
                                        HeatingDegreeDays   = (double)hcdd.HDD,
                                        ExpUsage_New        = expUsage,
                                        ActualUsage         = reading.Units,
                                        //ExpUsageOriginal = WthExpUsageOriginal,
                                        YearOfReadsDateStart = _ReadDateStart,
                                        YearOfReadsDateEnd   = _ReadDateEnd,
                                        ReadingsInNormalYear = readings.Count,
                                        DaysInNormalYear     = days,
                                        WthZipCode           = reading.Zip
                                    };

                                    allBalancePointPairs.Add(balancePoint);
                                }
                            }
                            else
                            {
                                hcdd = HeatingCoolingDegreeDaysValueOf(reading, weatherDataList);

                                decimal expUsage = CalculateExpUsageForNomalizing(reading, hcdd);

                                BalancePointPair balancePoint = new BalancePointPair
                                {
                                    RdngID              = reading.RdngID,
                                    DaysInReading       = reading.Days,
                                    CoolingBalancePoint = reading.B5,
                                    HeatingBalancePoint = reading.B3,
                                    CoolingDegreeDays   = (double)hcdd.CDD,
                                    HeatingDegreeDays   = (double)hcdd.HDD,
                                    ExpUsage_New        = expUsage,
                                    ActualUsage         = reading.Units,
                                    //ExpUsageOriginal = WthExpUsageOriginal,
                                    YearOfReadsDateStart = _ReadDateStart,
                                    YearOfReadsDateEnd   = _ReadDateEnd,
                                    ReadingsInNormalYear = readings.Count,
                                    DaysInNormalYear     = days,
                                    WthZipCode           = reading.Zip
                                };

                                allBalancePointPairs.Add(balancePoint);
                            }
                        }
                    }
                    else if (heatingCoefficiant > 0)
                    {
                        foreach (int heatingIncrement in allHeatingBalancePoints)
                        {
                            reading.B3 = heatingIncrement;

                            hcdd = HeatingCoolingDegreeDaysValueOf(reading, weatherDataList);

                            decimal expUsage = CalculateExpUsageForNomalizing(reading, hcdd);

                            BalancePointPair balancePoint = new BalancePointPair
                            {
                                RdngID              = reading.RdngID,
                                DaysInReading       = reading.Days,
                                CoolingBalancePoint = reading.B5,
                                HeatingBalancePoint = reading.B3,
                                CoolingDegreeDays   = (double)hcdd.CDD,
                                HeatingDegreeDays   = (double)hcdd.HDD,
                                ExpUsage_New        = expUsage,
                                ActualUsage         = reading.Units,
                                //ExpUsageOriginal = WthExpUsageOriginal,
                                YearOfReadsDateStart = _ReadDateStart,
                                YearOfReadsDateEnd   = _ReadDateEnd,
                                ReadingsInNormalYear = readings.Count,
                                DaysInNormalYear     = days,
                                WthZipCode           = reading.Zip
                            };

                            allBalancePointPairs.Add(balancePoint);
                        }
                    }
                }
            }

            return(allBalancePointPairs);
        }