使用Numpy查找跨数据集的平均值,以及一些丢失的数据

Lem*_*mur 5 python numpy

我有几个(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时,稍后的操作会出错.

有什么建议?

Rup*_*ash 3

为什么不只使用 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]