python求中位数众数极差_【Python】不⽤numpy⽤纯python
求极差、平均数。。。
python作为数据分析的利器,求极差、平均数、中位数、众数与⽅差是很常⽤的,然⽽,在python进⾏统计往往要使⽤外部的python库numpy,这个库不难装,然⽽,如果单纯只是求极差、平均数、中位数、众数与⽅差,还是⾃⼰写⽐较好,因为,给⼀个.py程序别⼈的机器,别⼈的机器上没有python库numpy,⼜要别⼈折腾⼀番,这很不好。不过看情况咯,如果你要处理上亿级的数据,还是配置⼀下外部的python库numpy吧。
先给⼤家回归⼀下极差、平均数、中位数、众数与⽅差是什么⿁:
1、极差:最⼤值与最⼩值之差。它是标志值变动的最⼤范围。英⽂:range
公式:R=Xmax-Xmin(其中,Xmax为最⼤值,Xmin为最⼩值)
2、平均数:⼀组数据中所有数据之和再除以数据的个数。反映数据集中趋势的⼀项指标。英⽂:average
公式:
3、中位数:对于有限的数集,可以通过把所有观察值⾼低排序后出正中间的⼀个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。英⽂:median
公式:
从⼩到⼤排序为
则N为奇数时,
N为偶数时,
4、众数:众数是样本观测值在频数分布表中频数最多的那⼀组的组中值,主要应⽤于⼤⾯积普查研究之中。英⽂:mode
例如:1,2,3,3,4的众数是3。
但是,如果有两个或两个以上个数出现次数都是最多的,那么这⼏个数都是这组数据的众数。
例如:1,2,2,3,3,4的众数是2和3。
还有,如果所有数据出现的次数都⼀样,那么这组数据没有众数。
例如:1,2,3,4,5没有众数。
5、⽅差:⽅差是实际值与期望值之差平⽅的平均值,⽅差是在概率论和统计⽅差衡量随机变量或⼀组数据是离散程度的度量。英⽂:variance
公式:或者
(就是在《概率论与数理统计》中那条,⽅差就是平⽅的期望-期望的平⽅)
因此,根据上述的理论,得到如下的代码:
#-*-coding:utf-8-*-
import time;
import random;
class Math:
#求极差
@staticmethod
def range(l):
def avg(l):
return float(sum(l))/len(l);
#求中位数
@staticmethod
def median(l):
l=sorted(l);#先排序
if len(l)%2==1:
return l[len(l)/2];
else:
return (l[len(l)/2-1]+l[len(l)/2])/2.0; #求众数
@staticmethod
def mode(l):
#统计list中各个数值出现的次数
count_dict={};
for i in l:
if count_dict.has_key(i):
count_dict[i]+=1;
else:
count_dict[i]=1;
#求出现次数的最⼤值
max_appear=0
for v in count_dict.values():
if v>max_appear:
max_appear=v;
if max_appear==1:
return;
mode_list=[];
for k,v in count_dict.items():
if v==max_appear:
mode_list.append(k);
def variance(l):#平⽅的期望-期望的平⽅
s1=0;
s2=0;
for i in l:
s1+=i**2;
s2+=i;
return float(s1)/len(l)-(float(s2)/len(l))**2;
#求⽅差2
@staticmethod
def variance2(l):#平⽅-期望的平⽅的期望
ex=float(sum(l))/len(l);
s=0;
for i in l:
s+=(i-ex)**2;
return float(s)/len(l);
#主函数,测试
arr=[1,2,3,2,3,1,4];
print "极差为:{0}".format(Math.range(arr));
print "平均数为:{0:.2f}".format(Math.avg(arr));
print "中位数为:{0}".dian(arr));
print "众数为:{0}".de(arr));
print "⽅差为:{0:.2f}".format(Math.variance(arr));
print "⽅差为:{0:.2f}".format(Math.variance2(arr)); print;
#性能测试
arraylist=[];
for i in range(1,1000000):
arraylist.append(i);
random.shuffle(arraylist);
time_start=time.time();
print "⽅差为:{0:.2f}".format(Math.variance(arraylist));
time_end=time.time();
print "{0}s".format(time_end-time_start);
time_start=time.time();
print "⽅差为:{0:.2f}".format(Math.variance2(arraylist));
time_end=time.time();
print "{0}s".format(time_end-time_start);
运⾏结果如下:
关于这个程序有⼏点说明的:
(1)开头引⼊time与random主要是为了最后部分测试两种求⽅差的⽅式那种性能较优使⽤,⼀般情况下使⽤上述我⾃定义的Math类,⽆须引⼊任何python包。
(2)求任何⼀个统计量,⽤到除法,注意先将int先转float,否则精度损失严重,你是得到不到最后的正确答案的。
(3)python中⾃带有求list所有元素之和的sum,求list中的最值max,min,对list中的元素进⾏从⼩到⼤的排序sort()都⽤了,其余只能让我们⾃⼰现实了。
(4)这⾥⽆须考虑如果形式参数被传⼊⼀个字符串数组怎么办,因为这些⼯具类都是我们⾃⼰使⽤了,⾃⼰控制好要传递的数值,⽆须考虑这么多。
(5)求众数最艰难,因为⽤不到任何python⾃带的⽅法,还要返回⼀个list,因为众数的个数不定,统计数组中出现次数最多的数的时候,⽤到了python中的字典dict,《【Python】容器类》(点击打开链接),这
个字典中,key是list中的数字,values是该数字出现的次数。然后要求出现次数的最⼤值,最后再求出改最⼤值对应的key。其中⽤count_dict.items()返回字典中的key-value对的数组
集,count_dict.values()返回字典中的value集,当然同时也有count_dict.keys()返回key集。
(6)由于求⽅差的⽅法有两种,此程序在最后部分⽣成了⼀个百万级、打乱顺序的list,对两种求⽅差的⽅法进⾏测试,令⼈吃惊的是,万万没想到是我们愚蠢的⼈类最不爱⽤,也最难⽤的,最不好⽤的平⽅-期望的平⽅的期望,优于更好记忆的、更常⽤的平⽅的期望-期望的平
⽅:。
。从上述的运⾏结果可以看出这种求⽅差的⽅法速度是
的⼀倍!这就是聪明的计算机与愚蠢的⼈类的区别吧~
python 定义数组(7)最后,python的打印到控制台,其实你完全可以print得更好的,你不换⾏还要在print后⾯补逗号吗,再print⼀个什么东东,或者将数值⽤str先转字符串才能与纯正的字符串连接起来,⽽字符串的format⽅法,配合print相当于C语⾔的printf,同时python的format⽤{0}, {1}...代表后⾯的第0、1……参数。{0:.2f}代表这个参数以保留2位⼩数的⽅式输出。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。