2013-09-10 4 views
0

Первый пользователь Python и я потерян. Мне нужно создать таблицу из списка, которая отображает дневную температуру и текущее среднее значение температуры до этого дня.Создайте среднее значение из списка

xData = arange(1,32)  
tData = [86,87,84,86,86,86,84,83,90,89,88,85,86,79,83,81, \ 
    75,80,81,85,81,88,89,87,84,85,86,88,88,90,90] 
avg = [86.] # First value for monthly avg high temp is just the Day 1 temp 
+3

Где вы застряли? Что вы пробовали? – Blender

+0

Я просто не уверен, как начать, чтобы сделать его средним. Я знаю, как сделать «обычный» средний, я просто не знаю, как сделать его «бегущим» – user2763241

+0

Какая версия Python? Если вы можете подождать 3.4, просто «импортируйте статистику», и это однострочный. Для 3.1-3.3 вы можете использовать [backport] (https://pypi.python.org/pypi/stats/) в PyPI. В противном случае вам нужно написать несколько строк кода. – abarnert

ответ

5

Среднее значение для каждого значения в списке - среднее значение всех значений до этого. Для урезанной версии вашего примера:

>>> tData = [86,87,84,86] 

Ходовые средние 86/1, (86+87)/2, (86+87+84)/3 и (86+87+84+86)/4.

Таким образом, при каждом индексе текущее среднее - это общая сумма, делящаяся на (индекс + 1).

Вы можете получить погонных итоги с accumulate:

>>> list(accumulate(tData)) 
[86, 173, 257, 343] 

И вы можете получить (1 на основе) индексов с enumerate:

>>> list(enumerate(accumulate(tData, start=1)) 
[(1, 86), (2, 73), (3, 257), (4, 343)] 

Таким образом, просто разделить:

>>> [total/index for index, total in enumerate(accumulate(tData, start=1))] 
[86.0, 86.5, 85.66666666666667, 85.75] 

Или с помощью statistics в Python 3.4 или его портировать/предшественнику stats для 3,1-3,3:

>>> from stats import running_average 
>>> running_average(tData) 
[86, 86.5, 85.66666666666667, 85.75] 

Конечно, вы всегда можете сделать это в явном виде, если вы предпочитаете:

>>> running_sum, running_sums = 0, [] 
>>> for value in tData: 
...  running_sum += value 
...  running_sum.append(running_sum) 
>>> [value/index for index, value in enumerate(running_sums, start=1)] 
[86, 86.5, 85.66666666666667, 85.75] 

... или даже:

>>> running_sum, running_averages = 0, [] 
>>> for index, value in enumerate(tData, start=1): 
...  running_sum += value 
...  running_averages.append(running_sum/index) 
>>> running_averages 
[86, 86.5, 85.66666666666667, 85.75] 
+2

+1. 'enumerate' принимает второй аргумент для начального значения. Если вы начинаете с 1, вам не нужно добавлять его позже. Очень актуально с модулем 'статистика'. Вы скрываетесь в списке рассылки python dev? –

+1

@StevenRumbalski: Спасибо. Я не знаю, как я забыл о параметре 'start', но я обновил ответ. И я обожаю идеи python-dev и python, чтобы не отставать, а также иногда искать новые вещи в списке PEP. Даже отклоненные предложения часто включают интересные идеи ... – abarnert

0

Я бы пошел с этим:

def runningAvgs(data): 
    avg = data[0] 
    for i, d in enumerate(data[1:], start=1): 
     yield avg 
     avg = ((i * avg) + d)/(i + 1.0) 
    yield avg 

tData = [86,87,84,86,86,86,84,83,90,89,88,85,86,79,83,81, \ 
    75,80,81,85,81,88,89,87,84,85,86,88,88,90,90] 

print list(runningAvgs(tData)) 
0

Вот еще один способ сделать это:

def cumSeries(series): 
    result = [0] 
    for s in series: 
     result.append(s + result[-1]) 
    return result 

def runningAvg(series): 
    cs = cumSeries(series) 
    return [(cs[i] - cs[0])/float(i) for i in range(1, len(cs))] 


tData = [86,87,84,86,86,86,84,83,90,89,88,85,86,79,83,81, \ 
    75,80,81,85,81,88,89,87,84,85,86,88,88,90,90] 

print runningAvg(tData) 

Использование кумулятивной серии очень полезный способ работы с суммами по частям серии.

Смежные вопросы