Пример #1
0
        /// <summary>
        /// Returns growth rate in percentage.
        /// </summary>
        public static IFigure Growth(IEnumerable <IFigure> series)
        {
            if (!series.Any())
            {
                return(null);
            }

            var sortedSeries = series
                               .OrderBy(d => d.Period)
                               .ToList();

            var rates = new List <double>(sortedSeries.Count - 1);

            for (int i = 1; i < sortedSeries.Count; ++i)
            {
                rates.Add(Growth(sortedSeries[i - 1].Value.Value, sortedSeries[i].Value.Value));
            }

            var result = new DerivedFigure()
            {
                Value = rates.Average()
            };

            result.Inputs.AddRange(series);

            return(result);
        }
Пример #2
0
        public sealed override object ProvideValue(IFigureProviderContext context)
        {
            var price = ( Price )context.Data.SeriesOf(typeof(Price)).Current();

            if (price == null)
            {
                return(new MissingData("Price", null));
            }

            var values = context.GetSeries(mySeriesName);

            if (!values.Any())
            {
                return(new MissingData(mySeriesName, null));
            }

            Contract.Requires(price.Currency != null, "Currency missing at price");

            var priceValue = price.Value.Value;

            if (values.Currency != null && price.Currency != values.Currency)
            {
                priceValue = context.TranslateCurrency(price.Value.Value, price.Currency, values.Currency);
            }

            var priceYear = price.Period.Year();

            var value = values.SingleOrDefault(e => e.Period.Year() == priceYear);

            if (value == null)
            {
                value = values.SingleOrDefault(e => e.Period.Year() == priceYear - 1);
                if (value == null)
                {
                    return(new MissingDataForPeriod(mySeriesName, null, new YearPeriod(priceYear), new YearPeriod(priceYear - 1)));
                }
            }

            var result = new DerivedFigure
            {
                Period = price.Period,
                Value  = myRatioCalculationOperator(priceValue, value.Value.Value)
            };

            if (PreserveCurrency)
            {
                result.Currency = values.Currency != null ? values.Currency : price.Currency;
            }

            result.Inputs.Add(price);
            result.Inputs.Add(value);

            return(result);
        }
Пример #3
0
        public sealed override object ProvideValue(IFigureProviderContext context)
        {
            var allLhs = context.GetSeries(myLhsSeriesName);

            if (!allLhs.Any())
            {
                return(new MissingData(myLhsSeriesName, FigureSeries.Empty));
            }

            var allRhs = context.GetSeries(myRhsSeriesName);

            if (!allRhs.Any())
            {
                return(new MissingData(myRhsSeriesName, FigureSeries.Empty));
            }

            EnsureCurrencyConsistancy(allLhs, allRhs);

            var resultSeries = new FigureSeries(typeof(DerivedFigure));

            foreach (var lhs in allLhs)
            {
                var rhs = allRhs.SingleOrDefault(e => e.Period.Equals(lhs.Period));

                if (rhs == null)
                {
                    continue;
                }

                var result = new DerivedFigure
                {
                    Value  = myJoinOperator(lhs.Value.Value, rhs.Value.Value),
                    Period = lhs.Period
                };

                if (PreserveCurrency)
                {
                    result.Currency = allLhs.Currency ?? allRhs.Currency;
                }

                result.Inputs.Add(lhs);
                result.Inputs.Add(rhs);

                resultSeries.Add(result);
            }

            return(resultSeries);
        }
Пример #4
0
        public static IFigure Average(IEnumerable <IFigure> series)
        {
            if (!series.Any())
            {
                return(null);
            }

            var result = new DerivedFigure()
            {
                Value = series.Average(d => d.Value)
            };

            var currencyFigures = series.OfType <ICurrencyFigure>();

            if (currencyFigures.Any())
            {
                result.Currency = currencyFigures.First().Currency;
            }

            result.Inputs.AddRange(series);

            return(result);
        }