我有一系列从程序输出的数据集。我的目标是将数据集的平均值绘制为pyplot或numpy中的折线图。我的问题是输出数据集的长度是不可控的。
例如,我有四个长度在200到400点之间变化的数据集,x值标准化为从0到1的数字,我想计算四个数据集的中间线。
到目前为止,我所能想到的是插入(线性地足够)将额外的数据点添加到较短的序列,或以某种方式周期性地从较长的序列中移除值。有没有人有任何建议?
目前我正在使用csv reader导入并逐行追加到列表中,因此输出是一个列表列表,每个列表都有一组xy坐标,我认为它们与二维数组相同?
我实际上认为删除多余的数据点比插入更容易,例如,从四个列表开始,我可以沿着x轴移除不必要的点,因为它们被标准化并且增加,然后剔除点太小通过引用最短列表步长来计算步长(这个解释可能不太清楚,我会尝试编写一个例子并明天将其放置)
示例数据集将是
1行= [[0.33,2],[0.66,5],[1,5]]
第2行= [[0.25,43],[0.5,53],[0.75,6.5],[1,986]]
答案 0 :(得分:0)
所以我使用的解决方案是按照上面的建议进行插值,我在下面提供了简化版本的代码:
首先将数据导入为字典,以便于访问和操作:
def average(files, newfile):
import csv
dict={}
ln=[]
max=0
for x in files:
with open(x+'.csv', 'rb') as file:
reader = csv.reader(file, delimiter=',')
l=[]
for y in reader:
l.append(y)
dict[x]=l
ln.append(x)
接下来建立最长数据集的长度:
for y in ln:
if max == 0:
max = len(dict[y])
elif len(dict[y]) >= max:
max = len(dict[y])
接下来需要定义每个数据集所需的迭代次数:
for y in ln:
dif = max - len(dict[y])
最后,中间值通过线性插值计算并插入到数据集
for i in range(dif):
loc = int( i* len(dict[y])/dif)
if loc ==0:
loc =1
new = [(float(dict[y][loc-1][x])+float(dict[y][loc][x]))/2
for x in range(len(dict[y][loc]))]
dict[y].insert(loc,new)
然后取平均值非常简单:
for x in range(len(dict[ln[0]])):
t = [sum(float(dict[u][x][0]) for u in ln)/len(ln),
sum(float(dict[u][x][1])/4 for u in ln)]
avg.append(t)
我不是说它是漂亮的代码,但是我做了我需要的......