как получить процент от i-го значения из списка от общего числа i-х значений списков - PullRequest
1 голос
/ 06 мая 2019

Передо мной стоит небольшая задача по созданию определенной логики в python, я создаю набор данных, который имеет три списка, я хочу рассчитать процент каждого i-го значения списка и создать новые списки, вот пример того, чего я пытаюсь достичь

У меня есть эти три списка

 good=[500,400,300]
 opportunity=[300,200,100]
 bad=[100,50,20]

У меня есть список итоговых значений i

total=[x + y + z for x, y, z in zip(good, opportunity ,bad)]
##total=[900,650,420]

теперь я хочу, чтобы список был преобразован в проценты как

good=[(500/900)*100,(400/900)*100,(300/900)*100]
opportunity=[(300/650)*100,(200/650)*100,(100/650)*100]
bad=[(100/420)*100,(50/420)*100,(20/420)*100]

Ответы [ 4 ]

0 голосов
/ 06 мая 2019

В вашем примере ваши делители вычисляются по столбцам (i-е позиции), но применяются к строкам, а не к столбцам. Я предполагаю, что вы действительно хотели применить их к столбцам (например, good=[(500/900)*100,(400/650)*100,(300/420)*100])

Получив список итогов, вы можете использовать zip для преобразования каждого списка значений в список процентов:

totals             = [ sum(v)  for v   in zip(good,opportunity,bad) ]
goodPercent        = [ 100*v/t for v,t in zip(good,totals) ]
opportunityPercent = [ 100*v/t for v,t in zip(opportunity,totals) ]
badPercent         = [ 100*v/t for v,t in zip(bad,totals) ]

# goodPercent:        [55.55555555555556,  61.53846153846154,  71.42857142857143]
# opportunityPercent: [33.333333333333336, 30.76923076923077,  23.80952380952381]
# badPercent:         [11.11111111111111,   7.6923076923076925, 4.761904761904762]

# (columns add up to 100%)

С другой стороны, если вы хотите, чтобы проценты по строкам, вы должны обрабатывать каждый список по отдельности:

goodPercent        = [ 100*v/t for t in [sum(good)]        for v in good         ]
opportunityPercent = [ 100*v/t for t in [sum(opportunity)] for v in opportunity  ]
badPercent         = [ 100*v/t for t in [sum(bad)]         for v in bad          ]

# goodPercent:        [41.666666666666664, 33.333333333333336, 25.0]
# opportunityPercent: [50.0, 33.333333333333336, 16.666666666666668]
# badPercent:         [58.8235294117647, 29.41176470588235, 11.764705882352942]

# (rows add up to 100%)
0 голосов
/ 06 мая 2019

Вы можете использовать список списков и numpy, чтобы облегчить решение этой проблемы

import numpy as np

#List of lists from good, opportunity and bad
li = [[500,400,300],[300,200,100],[100,50,20]]

#Convert list to numpy arr
arr = np.array(li)

#Calculate total
total=[x + y + z for x, y, z in zip(*li)]

#Use numpy.divide to divide each element of list by total
print([np.divide(li[idx], total[idx]) for idx in range(3)])

Выход будет тогда

[array([0.55555556, 0.44444444, 0.33333333]), 
array([0.46153846, 0.30769231, 0.15384615]), 
array([0.23809524, 0.11904762, 0.04761905])]

Вы также можете присваивать свои проценты переменным следующим образом

perc_good, perc_opportunity, perc_bad = [np.divide(li[idx], total[idx]) for idx in range(3)]
print(list(perc_good))
print(list(perc_opportunity))
print(list(perc_bad))

Выход будет

[0.5555555555555556, 0.4444444444444444, 0.3333333333333333]
[0.46153846153846156, 0.3076923076923077, 0.15384615384615385]
[0.23809523809523808, 0.11904761904761904, 0.047619047619047616]
0 голосов
/ 06 мая 2019
good=[500,400,300]
opportunity=[300,200,100]
bad=[100,50,20]

datasets = [good, opportunity, bad]
p_list = [[], [], []]

total=[x + y + z for x, y, z in zip(good, opportunity ,bad)]

for i in range(len(datasets)):
    for element in datasets[i]:
        p_list[i].append(element / total[i] * 100)

print(p_list)

#[[55.55555555555556, 44.44444444444444, 33.33333333333333], 
#[46.15384615384615, 30.76923076923077, 15.384615384615385], 
#[23.809523809523807, 11.904761904761903, 4.761904761904762]]
0 голосов
/ 06 мая 2019
good = [(x/total[0])*100 for x in good]
opportunity=[(x/total[1])*100 for x in opportunity]
bad=[(x/total[2])*100 for x in bad]

выход:

[55.55555555555556, 44.44444444444444, 33.33333333333333]
[46.15384615384615, 30.76923076923077, 15.384615384615385]
[23.809523809523807, 11.904761904761903, 4.761904761904762]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...