Desvio-padrão de uma lista

Quero encontrar a média e o desvio padrão da 1ª, 2ª, 2ª ... .. dígitos de várias listas (Z). Por exemplo, eu tenho

A_rank=[0.8,0.4,1.2,3.7,2.6,5.8]
B_rank=[0.1,2.8,3.7,2.6,5,3.4]
C_Rank=[1.2,3.4,0.5,0.1,2.5,6.1]
# etc (up to Z_rank )...

Agora quero tomar a média e DST de *_Rank[0], A média e DST de *_Rank[1], etc.
(ou seja: média e DST do primeiro dígito de todos os (A..Z) _anque listas;
a média e DST do segundo dígito de todos os (A..Z) _anque listas;
a média e DST do terceiro dígito...; etc).

Author: SherylHohman, 2013-03-13

7 answers

Desde Python 3.4 / PEP450 existe uma statistics module na biblioteca padrão, que tem um método stdev para calcular o desvio-padrão dos iterables como o seu:

>>> A_rank = [0.8, 0.4, 1.2, 3.7, 2.6, 5.8]
>>> import statistics
>>> statistics.stdev(A_rank)
2.0634114147853952
 92
Author: Bengt, 2017-06-29 17:59:19

Gostaria de colocar A_Rank et al em 2D NumPy matriz e, em seguida, usar numpy.mean() e numpy.std() para calcular as médias e os desvios-padrão:

In [17]: import numpy

In [18]: arr = numpy.array([A_rank, B_rank, C_rank])

In [20]: numpy.mean(arr, axis=0)
Out[20]: 
array([ 0.7       ,  2.2       ,  1.8       ,  2.13333333,  3.36666667,
        5.1       ])

In [21]: numpy.std(arr, axis=0)
Out[21]: 
array([ 0.45460606,  1.29614814,  1.37355985,  1.50628314,  1.15566239,
        1.2083046 ])
 86
Author: NPE, 2013-03-13 15:50:43
Aqui está um código Python puro que você pode usar para calcular a média e o desvio padrão.

Todo o código abaixo é baseado no statistics módulo em Python 3.4+.

def mean(data):
    """Return the sample arithmetic mean of data."""
    n = len(data)
    if n < 1:
        raise ValueError('mean requires at least one data point')
    return sum(data)/n # in Python 2 use sum(data)/float(n)

def _ss(data):
    """Return sum of square deviations of sequence data."""
    c = mean(data)
    ss = sum((x-c)**2 for x in data)
    return ss

def stddev(data, ddof=0):
    """Calculates the population standard deviation
    by default; specify ddof=1 to compute the sample
    standard deviation."""
    n = len(data)
    if n < 2:
        raise ValueError('variance requires at least two data points')
    ss = _ss(data)
    pvar = ss/(n-ddof)
    return pvar**0.5

Nota: para maior precisão ao somar flutuadores, o módulo statistics usa uma função personalizada _sum em vez da função incorporada sum que usei no seu lugar.

Agora temos, por exemplo:
>>> mean([1, 2, 3])
2.0
>>> stddev([1, 2, 3]) # population standard deviation
0.816496580927726
>>> stddev([1, 2, 3], ddof=1) # sample standard deviation
0.1
 43
Author: Alex Riley, 2017-10-08 10:30:41

No Python 2.7.1, pode calcular o desvio-padrão usando numpy.std() para:

  • Population std : basta usar {[[0]} sem argumentos adicionais para além da sua lista de dados.
  • amostra std : tem de passar ddof (ou seja, graus Delta de liberdade) a 1, como no seguinte exemplo:

Numpy.DDT (, ddof=1)

O divisor utilizado nos cálculos é N - ddof, em que N representa a número de elementos. Por padrão ddof é zero.

Calcula a DST da amostra em vez da DST da população.

 20
Author: Ome, 2015-09-15 12:49:25

Em python 2.7 podes usar o Numpy's numpy.std() indica o desvio-padrão da população .

Em Python 3.4 statistics.stdev() devolve o desvio-padrão da amostra. A função pstdv() é a mesma que numpy.std().

 8
Author: ab-user, 2017-04-13 12:19:15

Código python puro:

from math import sqrt

def stddev(lst):
    mean = float(sum(lst)) / len(lst)
    return sqrt(float(reduce(lambda x, y: x + y, map(lambda x: (x - mean) ** 2, lst))) / len(lst))
 3
Author: Elad Yehezkel, 2017-06-08 15:24:56

As outras respostas cobrem como fazer std dev em python suficientemente, mas ninguém explica como fazer a travessia bizarra que descreveste.

Vou assumir que A A-Z é toda a população. If not see Ome ' s answer on how to inerence from a sample.

Então para obter o desvio padrão / média do primeiro dígito de cada lista você precisaria de algo assim:

#standard deviation
numpy.std([A_rank[0], B_rank[0], C_rank[0], ..., Z_rank[0]])

#mean
numpy.mean([A_rank[0], B_rank[0], C_rank[0], ..., Z_rank[0]])

Para encurtar o código e generalizar isto para qualquer dígito n-ésimo, use a seguinte função Eu criei para ti:

def getAllNthRanks(n):
    return [A_rank[n], B_rank[n], C_rank[n], D_rank[n], E_rank[n], F_rank[n], G_rank[n], H_rank[n], I_rank[n], J_rank[n], K_rank[n], L_rank[n], M_rank[n], N_rank[n], O_rank[n], P_rank[n], Q_rank[n], R_rank[n], S_rank[n], T_rank[n], U_rank[n], V_rank[n], W_rank[n], X_rank[n], Y_rank[n], Z_rank[n]] 
Agora você pode simplesmente obter a DST e a média de todos os lugares de A-Z como este:
#standard deviation
numpy.std(getAllNthRanks(n))

#mean
numpy.mean(getAllNthRanks(n))
 2
Author: Samy Bencherif, 2017-05-22 16:11:16