【问题标题】:Statistics for data in multiple tuples of names and data名称和数据的多个元组中的数据统计
【发布时间】:2019-04-10 20:13:31
【问题描述】:

一位初学者在这里寻求一些帮助,以从元组列表中获取统计信息,其中元组包含名称和数据。

我有以下格式的列表:

list = [(name1, name2, name3, name(...), value1, value2, value3, value(...))]

例子:

mylist = [('red', 1, 100, 0.075, 0.055, 1.88),
      ('red', 1, 100, 0.0825, 0.05, 1.84),
      ('red', 1, 2, 3.7, 0.08, 4.20),
      ('green', 2, 2, 0.37, 0.8, 0.9),
      ('green', 2, 2, 0.85, 0.35, 1.24)]

我需要的是名称相同的元组中值的平均值和标准差。

输出应该是:

output = [(name1, name2, name3, name(...), value1_mean, value1_stdev, value2_mean, value2_stdev, value3_mean, value3_stdev, value(...)_mean, value(...)_stdev)]

对于所有唯一的name1, name2, name3, name(...) 组合。

对于上面的列表,所需的输出如下:

output = [('green', 2, 2, 0.61, 0.33941125496954283, 0.575, 0.3181980515339464, 1.07, 0.2404163056034261),
      ('red', 1, 2, 3.7, 0, 0.08, 0, 4.2, 0),
      ('red', 1, 100, 0.07875, 0.005303300858899111, 0.052500000000000005, 0.003535533905932736, 1.8599999999999999, 0.02828427124746177)]

我设法让它工作,而不是以优雅的方式,我被限制为 3 个名称和 3 个值:

import statistics

mylist = [('red', 1, 100, 0.075, 0.055, 1.88),
          ('red', 1, 100, 0.0825, 0.05, 1.84),
          ('red', 1, 2, 3.7, 0.08, 4.20),
          ('green', 2, 2, 0.37, 0.8, 0.9),
          ('green', 2, 2, 0.85, 0.35, 1.24)]

d_0 = []
d_1 = []
d_2 = []

for i in mylist:

    d_0.append(i[0])
    d_1.append(i[1])
    d_2.append(i[2])

s_d_0 = set(d_0)
s_d_1 = set(d_1)
s_d_2 = set(d_2)

for d0 in s_d_0:
    for d1 in s_d_1:
        for d2 in s_d_2:
            for c in [3,4,5]:
                exec('v' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ' = []')

results = []
for t in mylist:
    for d0 in s_d_0:
        for d1 in s_d_1:
            for d2 in s_d_2:
                if d0 == t[0] and d1 == t[1] and d2 == t[2]:
                    for c in [3,4,5]:
                        exec('v' + str(c) + '_' + str(d0) + str(d1) + str(d2) + '.append( t[' + str(c) + '])')


for d0 in s_d_0:
    for d1 in s_d_1:
        for d2 in s_d_2:
            asd = [d0, d1, d2]
            for c in [3, 4, 5]:
                length = 0
                exec('length = len(v' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ')')
                if length == 0:
                    exec('mean' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ' = 0')
                    exec('stdev' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ' = 0')
                if not length == 0:

                    exec('mean' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ' = statistics.mean(v' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ')')
                    exec('stdev' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ' = 0')

                if not length == 1 and not length == 0:
                    exec('stdev' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ' = statistics.stdev(v' + str(
                        c) + '_' + str(d0) + str(d1) + str(d2) + ')')

                exec('fgh = (mean' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ', stdev' + str(c) + '_' + str(d0) + str(d1) + str(d2) + ')')
                asd.append(fgh)
            results.append(asd)

final = []
for z in results:
    if z[3][0] is not 0:
        final.append(z)

output = []
for fin in final:

    final3 = []
    for fiin in fin:
        if not isinstance(fiin, tuple):

            final3.append(fiin)
        if isinstance(fiin, tuple):

            fiin1, fiin2 = fiin[0], fiin[1]

            final3.append(fiin1)
            final3.append(fiin2)

    output.append(tuple(final3))

for f in output:
    print(f)

有没有办法以更强大的方式获得相同的输出,可能使用numpypandas?最好我可以指定一个不同于 3 的数字来定义元组的左值中有多少个定义 names

谢谢!

【问题讨论】:

    标签: python-3.x pandas numpy statistics tuples


    【解决方案1】:

    我不确定我是否非常准确地回答了你的问题。以下函数将您的 myList 作为参数并返回

    output = [(name1, name2, name3, name(...), value1_mean, value1_stdev, value2_mean, value2_stdev, value3_mean, value3_stdev, value(...)_mean, value(...)_stdev)]
    
    import numpy as np
    
    mylist = [('red', 1, 100, 0.075, 0.055, 1.88),
          ('red', 1, 100, 0.0825, 0.05, 1.84),
          ('red', 1, 2, 3.7, 0.08, 4.20),
          ('green', 2, 2, 0.37, 0.8, 0.9),
          ('green', 2, 2, 0.85, 0.35, 1.24)]
    
    def getStats(myList):
        # dict containing mean and std for each name, ie dico[name1][value_number]=[list of value_numbers]
        dico={}
    
        # Fill dico
        for t in myList: # For each tuple
            name=t[0] # Get the name
            if name not in dico: # Check wether the name is already registered in dico. If not, add it
                dico[name]={nv:[] for nv in range(len(t)-1)}
    
            l=[]
            for nval in range(len(t)-1): # Browse values
                dico[name][nval].append(t[nval+1]) # Store them at the right place in dico
    
        # Create the output
        output=[]
    
        # Fill output
        for name in dico: # Browse through dico's names
            lval=[name]
            for nval in dico[name]: # For each value_i from tuple
                l=dico[name][nval]
                mu=np.mean(l) # Compute mean...
                std=np.std(l) # ... and standard deviation thanks to NumPy
                lval.append(mu)
                lval.append(std)
            output.append(tuple(lval)) # Format output to match your desires
    
        return(output)
    
    >>> getStats(mylist)
    [('red', 1.0, 0.0, 67.33333333333333, 46.197643037521104, 1.2858333333333334, 1.7070763668395805, 0.06166666666666667, 0.013123346456686353, 2.64, 1.1032074449833391), ('green', 2.0, 0.0, 2.0, 0.0, 0.61, 0.24, 0.575, 0.22500000000000003, 1.07, 0.16999999999999998)]
    

    希望它能满足您的需求!我建议您深入了解 dict 的使用 [https://www.w3schools.com/python/python_dictionaries.asp] 以了解有关此强大工具的更多信息,尤其是在您必须处理多维数据集时。

    【讨论】:

    • 在您的代码中,只有元组中的第一个值被指定为名称,而在我的情况下,第一个值中的 n 个是名称:'red' 可以是 '1' 或 '2'并且“红色”“1”可以是“100”或“2”,“红色”“2”可以是“100”或“2”,对于每种我都需要统计数据。基本上,元组的前 3 个值是可能的名称,后 3 个值是我需要统计的数据。这就是为什么在我的解决方案中有一个循环考虑所有元组的 t[0]、t[1]、t[2] 的唯一值的所有可能组合。您的代码输出平均了我需要考虑的名称。
    猜你喜欢
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    相关资源
    最近更新 更多