我有几个(10个左右)CSV格式的数据集.数据集的每一列代表正在运行的系统的一个方面(可用RAM,CPU使用率,开放TCP连接等).每行包含某个时刻这些列的值.
在相同测试的单独运行期间捕获数据集.每个数据集中的行数不保证相同(即:某些测试的运行时间比其他测试长).
我想生成一个新的CSV文件,它表示所有数据集中给定时间偏移量和给定列的"平均"值.理想情况下,将忽略一个数据集中缺失的值.但是,如有必要,可以假定缺失值与上一个已知值相同,或者该行的已知值的平均值.
一个简化的例子:
+---------------+ +---------------+ +---------------+
| Set 1 | | Set 2 | | Average |
+---+-----+-----+ +---+-----+-----+ +---+-----+-----+
| t | A | B | | t | A | B | | t | A | B |
+---+-----+-----+ +---+-----+-----+ +---+-----+-----+
| 1 | 10 | 50 | | 1 | 12 | 48 | | 1 | 11 | 49 |
| 2 | 13 | 58 | | 2 | 7 | 60 | | 2 | 10 | 59 |
| 3 | 9 | 43 | | 3 | 17 | 51 | => | 3 | 13 | 47 |
| 4 | 14 | 61 | | 4 | 12 | 57 | | 4 | 13 | 59 |
| : | : | : | | : | : | : | | : | : | : |
| 7 | 4 | 82 | | 7 | 10 | 88 | | 7 | 7 | 86 |
+---+-----+-----+ | 8 | 15 | 92 | | 8 | 15 | 92 |
| 9 | 6 | 63 | | 9 | 6 | 63 |
+---+-----+-----+ +---+-----+-----+
Run Code Online (Sandbox Code Playgroud)
我是numpy的新手,专门为这个项目挑选了它.最好的方法是什么?对于具有相同行数的数据集(我通过将较长的数据集缩短来强制执行),我只是这样做:
d_avg = sum(dsets) / float(len(dsets))
Run Code Online (Sandbox Code Playgroud)
其中"dsets"是包含每个CSV文件中数据的ndarrays列表.这很好用,但我不想丢弃长时间运行的数据.
我也可以将较短的行程调整为最长的长度,但所有新字段都填充"NoneType".添加(例如)float和NoneType时,稍后的操作会出错.
有什么建议?
为什么不只使用 numpy 的 ma(屏蔽数组)模块?
maxLen = reduce(lambda a,b : max(a, b.shape[0]),
dSets, 0)
all = N.ma.zeros((maxLen,)+ dSets[0].shape[1:] + (len(dSets),),
dtype=float) # set the dtype to whatever
all.mask = True
for i, set in enumerate(dSets):
all.mask[:len(set),...,i] = False
all[:len(set),...,i] = set
mean = all.mean(axis=-1)
Run Code Online (Sandbox Code Playgroud)
当然,只有当您可以保证所有数组中每行的时间相同时,这才有效,即对于所有 i,j set[i,0] == set[j,0]
| 归档时间: |
|
| 查看次数: |
4357 次 |
| 最近记录: |