Одна вещь упомянуть также. У Вас уже есть база пользователей с OpenID, они просто должны войти в систему.
Почему бы просто не использовать numpy's ma ( masked array) module?
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)
Конечно, это работает, только если вы можете гарантировать, что время в каждой строке одинаково для всех массивов, т.е. set [i, 0] == set [j, 0] для всех i, j
Изменить: я изменил свой метод, отказавшись от scipy.nanmean в пользу замаскированных массивов.
Если это неясно что код делает в любой момент, сначала попробуйте поставить напечатайте инструкции. Если это все еще неясно, не стесняйтесь спрашивать; Я постараюсь объяснить. Уловка состоит в том, чтобы объединить t-значения. (Это было сделано с помощью метода searchsorted массива numpy.)
Игра с numpy привела меня к мысли, что его преимущества в скорости могут не существовать, пока наборы данных не станут достаточно большими (возможно, вам понадобится не менее 10 000 строк на набор данных). В противном случае решение на чистом питоне может быть проще в написании и быстрее.
Вот наборы данных игрушек, которые я использовал:
% cat set1
1, 10, 50
2, 13, 58
3,9,43
4,14,61
7, 4, 82
% cat set2
1, 12, 48
2, 7, 60
3,17,51
4,12,57
7,10,88
8,15,92
9,6,63
А вот код:
#!/usr/bin/env python
import numpy as np
filenames=('set1','set2') # change this to list all your csv files
column_names=('t','a','b')
# slurp the csv data files into a list of numpy arrays
data=[np.loadtxt(filename, delimiter=',') for filename in filenames]
# Find the complete list of t-values
# For each elt in data, elt[a,b] is the value in the a_th row and b_th column
t_values=np.array(list(reduce(set.union,(set(elt[:,0]) for elt in data))))
t_values.sort()
# print(t_values)
# [ 1. 2. 3. 4. 7. 8. 9.]
num_rows=len(t_values)
num_columns=len(column_names)
num_datasets=len(filenames)
# For each data set, we compute the indices of the t_values that are used.
idx=[(t_values.searchsorted(data[n][:,0])) for n in range(num_datasets)]
data2=np.ma.zeros((num_rows,num_columns,num_datasets))
for n in range(num_datasets):
data2[idx[n],:,n]=data[n][:,:]
data2=np.ma.masked_equal(data2, 0)
averages=data2.mean(axis=-1)
print(averages)
# [[1.0 11.0 49.0]
# [2.0 10.0 59.0]
# [3.0 13.0 47.0]
# [4.0 13.0 59.0]
# [7.0 7.0 85.0]
# [8.0 15.0 92.0]
# [9.0 6.0 63.0]]
Что ж, один из способов сделать это - перебрать каждую строку каждого набора данных и добавить заданное значение столбца в массив, который хранится в словаре, где индекс времени используется для его значения ключа. Затем вы перебираете словарь и извлекаете среднее значение для каждого хранимого в нем массива.
Это не особенно эффективно - другой вариант - найти самый длинный массив, перебрать его и запросить другие наборы данных, чтобы создать временный массив для усреднения. Таким образом вы сохраните вторичную итерацию по словарю.