Example #1
0
        /// <summary>
        /// This method evalutes trending data based on demand supply variant
        /// </summary>
        /// <typeparam name="T">T represents generic class, user model which extends the TDemandSupplyModel</typeparam>
        /// <param name="windowPeriod">Window Period to consider for bucketing your input data. E.g. Last 6 months data means window period is 6</param>
        /// <param name="numberOfSegmentsOfEachUnit">Number of segments in each window unit. E.g. each window is divided into 2 buckets</param>
        /// <param name="listOfModels">List of TModel containing the input list of data used for finding trending data</param>
        /// <returns></returns>
        public IEnumerable <T> FindTrendingData <T>(int windowPeriod, int numberOfSegmentsOfEachUnit, List <T> listOfModels) where T : TDemandSupplyModel
        {
            var validationMessage = IsInputDataValid(windowPeriod, numberOfSegmentsOfEachUnit, listOfModels.ConvertAll(x => (TModel)x));

            if (!string.IsNullOrWhiteSpace(validationMessage))
            {
                throw new ArgumentNullException(validationMessage);
            }

            validationMessage = IsCountWithPeriodsDataValid(windowPeriod, numberOfSegmentsOfEachUnit, listOfModels.ConvertAll(x => (TModel)x));
            if (!string.IsNullOrWhiteSpace(validationMessage))
            {
                throw new ArgumentException(validationMessage);
            }


            AbstractTrendingCalculator baseCalculator = new DemandSupplyTrendingCalculator();
            var trendingModels = baseCalculator.CalculateTrending(windowPeriod, numberOfSegmentsOfEachUnit, listOfModels);
            var result         = (baseCalculator as DemandSupplyTrendingCalculator).GetSortedCombinedResult(trendingModels);
            var processedModel = new List <(T item, double localZ, double globalZ)>();

            foreach (var model in result)
            {
                processedModel.Add((model.item, model.localZ, model.globalZ));
            }

            return(baseCalculator.PostProcessZScore <T>(processedModel).Select(x => x.item));
        }
Example #2
0
        public void TestTrendingCalculatorDemandSupplyCriteria_ShouldRunSuccessfully_Suite2()
        {
            var trendingStrategy = new DemandSupplyTrendingCalculator();
            var inputData        = DataPreparator.PrepareDemandData_Suite2();
            var output           = trendingStrategy.CalculateTrending(6, 1, inputData);

            Assert.AreEqual("ABC", output[1].First().item.MovieName);
            Assert.AreEqual("PQR", output.Last().First().item.MovieName);
        }