找到中位数的简单方法

时间:2014-10-06 14:23:50

标签: python numpy dictionary median

我有一个数据文件,我对数据执行了一些操作。我可以很好地获得所有其他操作的解决方案。我无法仅计算中位数。

输入:来自巨大输入的几行。

00904bcabb02 00904bf7d758 676.0
0030657cc312 00904b1f1154 120.0
00306597852d 00904b48a3b6 572.0
00904b1f1154 00904bcabb02 120.0
00904b1f1154 00904bf7d758 120.0
00904b48a3b6 00904ba7a3eb 572.0
00022d1aa531 0006254f5810 2.0
00022dac729c 0006254f5810 2.0
00022dbd5c9e 0006254f5810 2.0
0006254f5810 0050dad80267 2.0
0006254f5810 00904be2b271 2.0
00022d097904 004096f41eb8 20.0
00022d2d30dd 004096f41eb8 20.0
004096f41eb8 00904b1e7852 20.0
00022d1406df 00022d36a6df 8.0
00022d36a6df 00022d8cb682 8.0
00022d36a6df 0030654a05fa 8.0
0004230dd7de 000423cbac29 33.0
0004231e4f43 000423cbac29 33.0
0030659b49f1 00904b310619 29.0

对于每对col[0] col[1],我找到freq和相应的值的Average和Sum。我试图在pairtime的集合中找到中位数。我正在使用numpy.median,但这似乎不起作用。任何建议表示赞赏。谢谢

代码:

from collections import defaultdict
import numpy as np
paircount = defaultdict(int)
pairtime = defaultdict(float)
pairper = defaultdict(float)
timeavg = defaultdict(float)
timefreq = defaultdict(int)

#get number of pair occurrences and total time
with open('Input.txt', 'r') as f, open('Output.txt', 'w') as o:
    for numline, line in enumerate((line.split() for line in f), start=1):
        pair = line[0], line[1]
        paircount[pair] += 1
        pairtime[pair] += float(line[2])
    #timeavg = pairtime[pair]/paircount[pair]
    #pairper = dict((pair, c * 100.0 / numline) for (pair, c) in paircount.iteritems())
    for pair, freq in paircount.iteritems():
        timeavg = pairtime[pair] / freq
        med = np.median(np.pairtime[pair])
        #print pair[0], pair[1], c, pairper[pair], pairtime[pair]

        o.write("%s %s %s %.2f %.2f %s \n" % (pair[0], pair[1], freq, pairtime[pair], timeavg, med))
print 'done'

错误:

 Traceback (most recent call last):
  File "pair_one.py", line 20, in <module>
    med = np.median(np.pairtime[pair])
AttributeError: 'module' object has no attribute 'pairtime'

5 个答案:

答案 0 :(得分:3)

你的错误与中位数无关,所以这篇文章应该有不同的标题!

当Python说need more than 2 values to unpack时,看看它抱怨的那一行。你的迭代想要med, pair, freq - 换句话说,它一次想要三个值,而你给它的是iteritems()的结果。 iteritems()总是会一次为您提供两个值,因为它始终返回(key, val)对。

我认为您只需要从for循环中删除med,

答案 1 :(得分:2)

你的主要问题是你将一个浮点传递到&#34;中位数&#34; function(pairtime [pair]包含给定c1,c2对的第3列值的总和)。您需要传递值列表。计算中位数的方式是:

1)取一个数字列表

2)排序

3)拨出列表中心的数字。这是中位数。

这是我重写的错误。我没有运行它,因此可能存在语法问题。但它应该给你一般的想法。

from collections import defaultdict
import numpy as np
paircount = defaultdict(int)
pairtime = defaultdict(float)
pairtimelist = defaultdict(list)
pairper = defaultdict(float)
timeavg = defaultdict(float)
timefreq = defaultdict(int)

#get number of pair occurrences and total time
with open('Input.txt', 'r') as f, open('Output.txt', 'w') as o:
    for numline, line in enumerate((line.split() for line in f), start=1):
        pair = line[0], line[1]
        paircount[pair] += 1
        pairtime[pair] += float(line[2])
        pairtimelist[pair].append(pairtime[pair])
    #timeavg = pairtime[pair]/paircount[pair]
    #pairper = dict((pair, c * 100.0 / numline) for (pair, c) in paircount.iteritems())
    for pair, freq in paircount.iteritems():
        timeavg = pairtime[pair] / freq
        med = np.median(pairtimelist[pair])
        #print pair[0], pair[1], c, pairper[pair], pairtime[pair]

        o.write("%s %s %s %.2f %.2f %s \n" % (pair[0], pair[1], freq, pairtime[pair], timeavg, med))
print 'done'

答案 2 :(得分:1)

中位数表示数组的中间数。也许你的意思是这个?

timelist=[]
for pair, freq in paircount.iteritems():
    timeavg = pairtime[pair] / freq
    parttimeArr=np.array(pairtime[pair])
    timelist.append(pairtime[pair])
timeArr=np.array(timelist)
median=np.median(timeArr)
print median

答案 3 :(得分:0)

替换:

med = np.median(np.pairtime[pair])

使用:

med = np.median(pairtime[pair])

pairtime是一个局部变量,而不是numpy属性。

修改

正如@Fred S指出的那样,pairtime[pair]只包含时间的总和,而不是完整的系列。我之前没有注意到它。由于您将从时间序列中计算出许多统计数据,我认为更好的方法是保留整个时间序列而不仅仅是@Fred S在答案中所做的总和。然后,您可以计算所有关于时间序列的统计数据。

以下是可能的解决方案:

from collections import defaultdict
import numpy as np
pairtimelist = defaultdict(list)

with open('Input.txt', 'r') as f, open('Output.txt', 'w') as o:
    for numline, line in enumerate((line.split() for line in f), start=1):
        pair = line[0], line[1]
        pairtimelist[pair].append(float(line[2]))
    for pair in pairtimelist.iterkeys():
        timeavg = np.mean(pairtimelist[pair])
        timemed = np.median(pairtimelist[pair])
        timesum = np.sum(pairtimelist[pair])
        freq = len(pairtimelist[pair])

        o.write("%s %s %s %.2f %.2f %s \n" % (pair[0], pair[1], freq, timesum, timeavg, timemed))

答案 4 :(得分:0)

错误的原因是你在pairtime前加np,而NumPy不知道是什么时间。如果打算将pairtime转换为NumPy数组,则应编写np.array(pairtime)。这应该是合法的:

from collections import defaultdict
import numpy as np
paircount = defaultdict(int)
pairtime = defaultdict(float)
pairper = defaultdict(float)
timeavg = defaultdict(float)
timefreq = defaultdict(int)

#get number of pair occurrences and total time
with open('Input.txt', 'r') as f, open('Output.txt', 'w') as o:
    for numline, line in enumerate((line.split() for line in f), start=1):
        pair = line[0], line[1]
        paircount[pair] += 1
        pairtime[pair] += float(line[2])
    #timeavg = pairtime[pair]/paircount[pair]
    #pairper = dict((pair, c * 100.0 / numline) for (pair, c) in paircount.iteritems())
    for pair, freq in paircount.iteritems():
        timeavg = pairtime[pair] / freq
        med = np.median(np.array(pairtime[pair]))
        # med = np.median(pairtime[pair]) # should work as well without np.array
        #print pair[0], pair[1], c, pairper[pair], pairtime[pair]

        o.write("%s %s %s %.2f %.2f %s \n" % (pair[0], pair[1], freq, pairtime[pair], timeavg, med))
print 'done'