【问题标题】:python average bitrate per secondpython平均每秒比特率
【发布时间】:2013-02-01 18:03:08
【问题描述】:

我有一个看起来像这样的txt 文件:

0.065998       81   
0.319601      81   
0.539613      81  
0.768445      81  
1.671893      81  
1.785064      81  
1.881242      954  
1.921503      193  
1.921605      188  
1.943166      81  
2.122283      63  
2.127669      83  
2.444705      81  

第一列是以字节为单位的数据包到达和第二个数据包大小。

我需要获取每秒字节的平均值。例如,在第一秒,我只有值为 81 的数据包,因此平均比特率为81*8= 648bit/s。然后我应该以秒为单位绘制一个图表 x 轴时间,每秒 y 轴平均比特率。

到目前为止,我只设法将我的数据作为数组上传:

import numpy as np

d = np.genfromtxt('data.txt')

x = (d[:,0])  
y = (d[:,1 ])

print x  
print(y*8)

我是 Python 新手,因此非常感谢您从哪里开始提供任何帮助!

这是结果脚本:

import matplotlib.pyplot as plt  
import numpy as np  
x, y = np.loadtxt('data.txt', unpack=True)  
bins = np.arange(60+1)  
totals, edges = np.histogram(x, weights=y, bins=bins)  
counts, edges = np.histogram(x, bins=bins)  

print counts  
print totals*0.008/counts  

plt.plot(totals*0.008/counts, 'r')  
plt.xlabel('time, s')  
plt.ylabel('kbit/s')  
plt.grid(True)  
plt.xlim(0.0, 60.0)  
plt.show()      

脚本读取包含数据包大小(字节)和到达​​时间的 .txt 文件,并绘制一个时间段内的平均比特率/秒。用于监控服务器传入/传出流量!

【问题讨论】:

  • 第一秒,你只收到了 81*4 位,对吧?
  • 您能否指定“平均比特率”的定义。想要自数据开始以来的平均值?还是对平均值的最新估计?
  • 是的,第一秒我收到了 4 个 81 字节的数据包。我想获得每秒的平均数据包大小(以比特为单位)。假设我们在第一秒收到了 10 个不同大小的数据包,所以我需要在第一秒获取这 10 个数据包的平均值,以此类推。

标签: python average bitrate


【解决方案1】:

您的数据已经按时间排序,所以我可能只使用 itertools.groupby 这个:

from itertools import groupby
with open('data.txt') as d:
     data = ([float(x) for x in line.split()] for line in d)
     for i_time,packet_info in groupby(data,key=lambda x:int(x[0])):
         print i_time, sum(x[1] for x in packet_info)

输出是:

0 324.0
1 1578.0
2 227.0

【讨论】:

  • 好答案,虽然 OP 想要平均水平。
  • @sotapme -- 我不确定 OP 所说的“每秒平均字节数”是什么意思。
  • 你是对的,它确实读起来令人困惑——我假设他在 81 秒的 1 秒内有 4 个样本,平均为 81 ;然后将比特率乘以 8。不管怎样——你的回答已经让他们完成了 90% 的工作,剩下的只是细节。
【解决方案2】:

如果要使用numpy,可以使用numpy.histogram

>>> import numpy as np
>>> x, y = np.loadtxt('data.txt', unpack=True)
>>> bins = np.arange(10+1)
>>> totals, edges = np.histogram(x, weights=y, bins=bins)
>>> totals
array([  324.,  1578.,   227.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.])

这给出了每个 bin 的总数,您可以除以 bin 的宽度以获得近似的瞬时速率:

>>> totals/np.diff(bins)
array([  324.,  1578.,   227.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.])

(好吧,因为 bin 宽度都是一,这不是很有趣。)

[更新]

我不确定我是否理解您的后续评论,即您需要每秒的平均数据包大小——我在您的问题中没有看到任何地方提到过这一点,但我因错过了显而易见的事情而臭名昭著。 :-/ 在任何情况下,如果您想要一个时间箱中的数据包数量,那么您根本不需要设置权重(默认为 1):

>>> counts, edges = np.histogram(x, bins=bins)
>>> counts
array([4, 6, 3, 0, 0, 0, 0, 0, 0, 0])

其中 counts 是到达每个 bin 的数据包数。

【讨论】:

  • 感谢您的回答!这几乎完成了这项工作,由此我得到了在那一秒到达的所有包中每秒传输的总比特数。但我需要每秒获得平均数据包大小。我需要在那一秒用 len(y) 将我从总数中得到的结果除以,因为我每秒得到不规则数量的数据包。如何计算每秒的 len(y)?
  • 非常感谢!如果您有兴趣了解我所说的平均值,我已经在第一篇文章中编辑了代码。 :)
【解决方案3】:

由于到达时间是不规则的,我建议将它们量化为整数秒,然后汇总给定秒内所有到达的总字节数。完成此操作后,绘图和其他分析变得容易得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多