求中值的简单方法

2024-04-20 14:35:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据文件,我对数据执行了一些操作。我可以为所有其他操作找到解决方案。我不能只计算中位数。在

输入:大量输入的几行。在

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],我找到频率和相应值的平均值和和。我试图找到pairtime集合中的中值。我正在使用numpy.median,但似乎不起作用。任何建议都可以。谢谢

代码:

^{pr2}$

错误:

 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'

Tags: 数据代码numpy数据文件npcol解决方案建议
3条回答

您的主要问题是将一个浮点数传入“中值”函数(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'

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

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

我想您只需要从for循环中删除med,。在

替换:

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

使用:

^{pr2}$

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))

相关问题 更多 >