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