Exemplo n.º 1
0
        public Dictionary <string, string> GetStatistics()
        {
            if (_statistics != null)
            {
                return(_statistics);
            }

            Logger.Current.Info("Calculating dataContainer '{0}' statistics...", Id);
            _statistics = new Dictionary <string, string>();

            long   matrixCount = (long)Users.Count * Items.Count;
            double sparsity    = (double)100L * (matrixCount - Feedbacks.Count) / matrixCount;

            var users = new Dictionary <string, int>();
            var items = new Dictionary <string, int>();

            foreach (Feedback f in Feedbacks)
            {
                string userId = f.User.Id;
                string itemId = f.Item.Id;

                if (!users.ContainsKey(userId))
                {
                    users[userId] = 1;
                }
                else
                {
                    users[userId]++;
                }

                if (!items.ContainsKey(itemId))
                {
                    items[itemId] = 1;
                }
                else
                {
                    items[itemId]++;
                }
            }

            var feedbackAttrs = Feedbacks.First().Attributes.Values.Select(a => a.Name).Distinct().ToList();
            var userAttrs     = Feedbacks.First().User.Attributes.Values.Select(a => a.Name).Distinct().ToList();
            var itemAttrs     = Feedbacks.First().Item.Attributes.Values.Select(a => a.Name).Distinct().ToList();

            _statistics.Add("containerId", Id);

            _statistics.Add("feedbacks", Feedbacks.Count.ToString());
            _statistics.Add("users", Users.Count.ToString());
            _statistics.Add("items", Items.Count.ToString());
            _statistics.Add("sparsity", string.Format("{0:0.00}", sparsity));

            _statistics.Add("usrMinFb", users.Values.Min().ToString());
            _statistics.Add("usrMaxFb", users.Values.Max().ToString());
            _statistics.Add("usrAvgFb", string.Format("{0:0.00}", users.Values.Average()));

            _statistics.Add("itmMinFb", items.Values.Min().ToString());
            _statistics.Add("itmMaxFb", items.Values.Max().ToString());
            _statistics.Add("itmAvgFb", string.Format("{0:0.00}", items.Values.Average()));

            _statistics.Add("allFeedbackAttrs", feedbackAttrs.Count > 0 ? feedbackAttrs.Aggregate((a, b) => a + "|" + b) : "NA");
            _statistics.Add("allUserAttrs", userAttrs.Count > 0 ? userAttrs.Aggregate((a, b) => a + "|" + b) : "NA");
            _statistics.Add("allItemAttrs", itemAttrs.Count > 0 ? itemAttrs.Aggregate((a, b) => a + "|" + b) : "NA");

            return(_statistics);
        }