浅谈分组统计

在现实生活中,分组统计是很常用的。例如人民银行要求商业银行报送的反洗钱报表中就有一个项目是当月发生的大额交易的笔数和金额, 其中大额交易定义为某个客户的当日累计发生额在人民币20万元或者外币等值1万美元以上。这样就要从大量的交易流水账中按交易日期进行分 组统计。

让我们来生成要统计的数据,如下所示:

IEnumerable<Tuple<int, double>> GetTuples(int  n)
{
 var tuples = new Tuple<int, double>[n];
 var rand = new Random();
 for (int k  = 1, i = 0; i < n; i++)
 {
  var r = rand.Next(n);
  k += (r >= n - 3) ? 2 :  ((r >= n - 9) ? 1 : 0);
  tuples[i] = new Tuple<int, double>(k, rand.NextDouble());
 }
 return tuples;
}

该方法生成 n 项已经排好序的数据。

现在,让我们来按关键字分组,并统计每组的 个数和平均值。

首先,使用 C# 的 foreach 循环,如下所示:

IEnumerable<Tuple<int, int, double>>  ForEach(IEnumerable<Tuple<int, double>> tuples)
{
 var result = new List<Tuple<int,  int, double>>();
 var count = 0;
 var sum = 0.0;
 int? key = null;
 foreach (var v  in tuples)
 {
  if (key != v.Item1)
  {
   if (key != null) result.Add(new  Tuple<int, int, double>(key.Value, count, sum / count));
   sum = count = 0;
   key =  v.Item1;
  }
  count++;
  sum += v.Item2;
 }
 if (key != null) result.Add(new  Tuple<int, int, double>(key.Value, count, sum / count));
 return result;
}

这种方法有个 最大的缺点就是在 foreach 循环结束之后还要进行一次统计,闻到了代码的“坏味道”。

那么,就让我们来重构吧,这次 ,使用迭代器进行循环:

IEnumerable<Tuple<int, int, double>> Iterate(IEnumerable<Tuple<int,  double>> tuples)
{
 var result = new List<Tuple<int, int, double>>();
 var count  = 0;
 var sum = 0.0;
 int? key = null;
 for (var iter = tuples.GetEnumerator(); ; count++,  sum += iter.Current.Item2)
 {
  var hasValue = iter.MoveNext();
  if (!hasValue || key !=  iter.Current.Item1)
  {
   if (key != null) result.Add(new Tuple<int, int, double>(key.Value,  count, sum / count));
   if (!hasValue) break;
   sum = count = 0;
   key =  iter.Current.Item1;
  }
 }
 return result;
}

这样,就消灭了“坏味道”。

时间: 2024-10-26 14:31:51

浅谈分组统计的相关文章

浅谈网站统计工具的运用高招

中介交易 SEO诊断 淘宝客 云主机 技术大厅 做站长对网站数据分析对网站发展是重要之举,实时掌握网站动态对网站尽可能地控制在所预想的范围内是各站长的目标所在.随着网络信息时代的到来,出现了各大网站统计工具,这也让站长们更为方便快捷明了的知道网站运营情况.相信站长们对站长工具都已不陌生,有的可能一个站点同时用到了内个统计工具,下面我要说的是一些统计的运用技巧. 纵览网络,当今运用最多的统计工要数Google Analytic.CNZZ.51.la.51yes等主流统计工具,各大统计工具各有各的特

岳浩:浅谈百度统计十大数据分析指标

在众多的网站统计工具中,百度统计以其强大的数据分析功能被众多站长称道.大部分网站统计工具主要是对网站的各项数量指标加以统计,而百度统计引入了一些先进的网站质量分析指标,让很多站长了解到网站的用户体验到底好不好.网站的转化率高不高.用户如何来看待这个网站.但是百度统计与以往的统计工具又不太相同,一下子让很多站长找不到头绪.因此岳浩就和大家简单聊聊百度统计的十个数据分析指标,让大家能够更好的理解和使用百度统计这一工具. 一.访客数(UV) 访客数就是指一天之内到底有多少不同的用户访问了你的网站.百度

浅谈SQL Server中统计对于查询的影响分析_MsSql

而每次查询分析器寻找路径时,并不会每一次都去统计索引中包含的行数,值的范围等,而是根据一定条件创建和更新这些信息后保存到数据库中,这也就是所谓的统计信息. 如何查看统计信息 查看SQL Server的统计信息非常简单,使用如下指令: DBCC SHOW_STATISTICS('表名','索引名') 所得到的结果如图1所示.         图1.统计信息 统计信息如何影响查询     下面我们通过一个简单的例子来看统计信息是如何影响查询分析器.我建立一个测试表,有两个INT值的列,其中id为自增

浅谈SQL Server中统计对于查询的影响

简介 SQL Server查询分析器是基于开销的.通常来讲,查询分析器会根据谓词来确定该如何选择高效的查询路线,比如该选择哪个索引.而每次查询分析器寻找路径时,并不会每一次都去统计索引中包含的行数,值的范围等,而是根据一定条件创建和更新这些信息后保存到数据库中,这也就是所谓的统计信息. 如何查看统计信息 查看SQL Server的统计信息非常简单,使用如下指令: DBCC SHOW_STATISTICS('表名','索引名') 所得到的结果如图1所示. 图1.统计信息 统计信息如何影响查询 下面

浅谈SQL Server中统计对于查询的影响分析

而每次查询分析器寻找路径时,并不会每一次都去统计索引中包含的行数,值的范围等,而是根据一定条件创建和更新这些信息后保存到数据库中,这也就是所谓的统计信息. 如何查看统计信息 查看SQL Server的统计信息非常简单,使用如下指令: DBCC SHOW_STATISTICS('表名','索引名') 所得到的结果如图1所示. 图1.统计信息 统计信息如何影响查询 下面我们通过一个简单的例子来看统计信息是如何影响查询分析器.我建立一个测试表,有两个INT值的列,其中id为自增,ref上建立非聚集索引

浅谈TeeChart组件在ASP中的应用

chart 浅谈TeeChart组件在ASP中的应用 由于TeeChart VCL 版本广泛应用于多种开发环境并得到很好的认可,西班牙Steema Software SL公司于1997年10月又开发了TeeChart Pro ActiveX.对于B/S的开发模式无疑是一个好消息,由于它只需安装在服务器端,客户端无需安装其他软件,只要使用通用浏览器即可显示统计图形,因此一面市更是又一次得到极大的欢迎. 下面我们结合ASP技术介绍一下TeeChart Pro V5 ActiveX组件常用属性及应用.

浅谈网站日常维护工作哪些是关键

对于网站维护者而言平时需做哪些事,相信广大的站长朋友们都十分的清楚,但哪些工作才是日常网站维护工作当中最为关键的呢?下面A5站长网SEO诊断优化团队就来和广大的站长朋友们浅谈下究竟网站日常维护工作哪些才是关键? 稳定新鲜的内容更新 内容这项工作永远都会是网站维护者工作的重点所在,无论是什么类型的网站,网站都需要更新内容,没有内容的支撑,网站就别提发展,想要网站有生机,就要每天有规律的写些新鲜的内容,进行网站更新,网站只有有新内容的增加,才能吸引搜索引擎蜘蛛和用户的访问,否则,搜索引擎蜘蛛每次来你

浅谈iOS Crash(一)

本文讲的是浅谈iOS Crash(一),一.捕获iOS Crash 1.设置异常断点并运行 设置异常断点.png 说明:设置Xcode异常断点后运行程序,发生Crash时,断点会定位到出错的代码行,但仅适用于开发阶段.线上APP的Crash还需要通过收集Crash机制来捕获Crash并记录在日志中. 2.Mach异常 和 Unix信号 iOS Crash发生时,先产生Mach异常(最底层的内核级异常),然后Mach异常在host层被ux_exception转换为相应的Unix信号,并通过thre

浅谈sqlserver下float的不确定性

很多时候,大家都知道,浮点型这个东西,本身存储就是一个不确定的数值,你永远无法知道,它是 0 = 0.00000000000000123 还是 0 = 0.00000000000999这样的东西.也许一开始使用的时候没有问题,但是有时候做统计的时候,就会看出端倪 简单的举个例子,就知道统计的时候,有可能出现意外的效果,导致可能需要存储过程或者接收程序的代码左额外的取舍数位的处理,所以在此其实我是推荐使用Numeric来替代float进行一个替代使用,避免一个sum ,然后明明明细看每一条数据都是