public static ITimeAxisStatisticsProcessing ConstructStatisticsCalculator(AxisKind axisKind, Array axis, DateTime baseOffset)
        {
            IDataMaskProvider      stepDMP           = new DataMaskProviders.StepFunctionDataMaskProvider();
            IDataCoverageEvaluator coverageEvaluator = new DataCoverageEvaluators.ContinousMeansCoverageEvaluator();

            switch (axisKind)
            {
            case AxisKind.Years:
                traceSource.TraceEvent(TraceEventType.Information, 1, "Constructing StepFunction Years Value Groupping facade");
                return(new TimeAxisStatisticsProcessing.TimeAxisValueGrouppingFacade(axis, new TimeAxisProjections.ContinousYears(baseOffset.Year), stepDMP, coverageEvaluator));

            case AxisKind.Days:
                traceSource.TraceEvent(TraceEventType.Information, 2, "Constructing StepFunction Days Value Groupping facade");
                return(new TimeAxisStatisticsProcessing.TimeAxisValueGrouppingFacade(axis, new TimeAxisProjections.ContinuousDays(baseOffset), stepDMP, coverageEvaluator));

            case AxisKind.Hours:
                traceSource.TraceEvent(TraceEventType.Information, 3, "Constructing StepFunction Hours Value Groupping facade");
                return(new TimeAxisStatisticsProcessing.TimeAxisValueGrouppingFacade(axis, new TimeAxisProjections.ContinuousHours(baseOffset), stepDMP, coverageEvaluator));

            default:
                throw new NotImplementedException("unexpected enum value");
            }
        }
        public static ITimeAxisAvgProcessing ConstructAverager(AxisKind axisKind, Array axis, DateTime baseOffset)
        {
            IWeightProvider        stepFunctionWP    = new WeightProviders.StepFunctionInterpolation();
            IDataCoverageEvaluator coverageEvaluator = new DataCoverageEvaluators.ContinousMeansCoverageEvaluator();

            switch (axisKind)
            {
            case AxisKind.Years:
                traceSource.TraceEvent(TraceEventType.Information, 1, "Constructing StepFunction Years Integrator");
                return(new TimeAxisAvgFacade(axis, new TimeAxisProjections.ContinousYears(baseOffset.Year), stepFunctionWP, coverageEvaluator));

            case AxisKind.Days:
                traceSource.TraceEvent(TraceEventType.Information, 2, "Constructing StepFunction Days Integrator");
                return(new TimeAxisAvgFacade(axis, new TimeAxisProjections.ContinuousDays(baseOffset), stepFunctionWP, coverageEvaluator));

            case AxisKind.Hours:
                traceSource.TraceEvent(TraceEventType.Information, 3, "Constructing StepFunction Hours Integrator");
                return(new TimeAxisAvgFacade(axis, new TimeAxisProjections.ContinuousHours(baseOffset), stepFunctionWP, coverageEvaluator));

            default:
                throw new NotImplementedException("unexpected enum value");
            }
        }