Как можно рассчитать средневзвешенную цену после группы? - PullRequest
2 голосов
/ 28 марта 2012

У меня есть дата ниже:

qty     price     date
5         2        1/25
6         1        1/25
8         3        4/25
1         2        4/25

, и я хочу:

qty     price    date
11       1.45     1/25
9        2.88     4/25

Я уже сгруппировал данные по дате с

 var groups = ToCalc.AsEnumerable().GroupBy(r => r.Field("trade_date"));

иКол-во сумма выглядит так:

            foreach (var group in groups)
            {
                qty = Convert.ToDouble( group.Sum(r => r.Field("EXEC_QTY")));
            }

, но я не знаю, как рассчитать средневзвешенную цену.Есть идеи?

Ответы [ 4 ]

3 голосов
/ 28 марта 2012
weightedAverage = group.Sum(r => r.Field("EXEC_QTY") * r.Field("price"))
     / group.Sum(r => r.Field("EXEC_QTY"));

Добавьте Convert.ToDouble, если вам действительно это нужно.

Поскольку вы прокомментируете, что qty - это двойное число, а цена - десятичное число:

weightedAverage = group.Sum(r => (decimal)r.Field("EXEC_QTY") * r.Field("price"))
     / group.Sum(r => (decimal)r.Field("EXEC_QTY"));

(не так лиИмеет ли смысл, чтобы цена была десятичной, а количество - двойным? Или для обоих - десятичным?)

0 голосов
/ 28 марта 2012

Вы можете выполнить все группировки внутри одного метода, используя this Enumerable.GroupBy перегрузка:

var groups = ToCalc.AsEnumerable()
    .GroupBy(r => r.date, (k, g) => new
    {
        date = k,
        qty = g.Sum(i => i.qty),
        price = g.Sum(i => i.qty * i.price) / g.Sum(i => i.qty)
    });

Это даст вам что-то вроде:

{ date = "1/25", qty = 11, price = 1.4545454545454546 }
{ date = "4/25", qty = 9, price = 2.8888888888888888 }
0 голосов
/ 28 марта 2012

Я бы сделал что-то вроде этого:

var results = ToCalc.AsEnumerable()
    .GroupBy(r => r.Field("trade_date"))
    .Select(grp => 
            {
                var quantity = grp.Sum(r => r.Field("EXEC_QTY"));
                var avg = grp.Sum(r => r.Field("EXEC_QTY") * r.Field("price")) / quantity;
                return new { 
                               TradeDate = grp.Key, 
                               Quantity = quantity, 
                               WeightedAverage = avg
                           };
            });

results будет тогда множеством анонимных объектов, содержащих нужную вам информацию, это гораздо более доступная структура.

0 голосов
/ 28 марта 2012
    class Data
    {
        public int Qty { get; set; }
        public double Price { get; set; }
        public string Date { get; set; }
    }
    static void Main(string[] args)
    {
        var data = new Data[] { 
            new Data { Qty = 5, Price = 2, Date = "1/25"  },
            new Data { Qty = 6, Price = 1, Date = "1/25"  },
            new Data { Qty = 8, Price = 3, Date = "4/25"  },
            new Data { Qty = 1, Price = 2, Date = "4/25"  },
        };

        var weighted = data.GroupBy(x => x.Date)
                           .Select(group => new Data { 
                               Date = group.Key, 
                               Qty = group.Sum(i => i.Qty), 
                               Price = group.Sum(i => i.Price * i.Qty) / group.Sum(i => i.Qty)
                       });            
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...