Ответ 1
Python 3.4 включает statistics, поэтому вы можете использовать метод statistics.median
>>> from statistics import median
>>> median([1, 3, 5])
3
У меня есть такие данные.
Ram,500
Sam,400
Test,100
Ram,800
Sam,700
Test,300
Ram,900
Sam,800
Test,400
Каков самый короткий способ оценить "медианную" из вышеперечисленных данных. Мой результат должен быть чем-то вроде...
Медиана = 1/2 (n + 1), где n - количество значений данных в выборке.
Test 500
Sam 700
Ram 800
Python 3.4 включает statistics, поэтому вы можете использовать метод statistics.median
>>> from statistics import median
>>> median([1, 3, 5])
3
Используйте функцию numpy median.
Немного неясно, как на самом деле представлены ваши данные, поэтому я предположил, что это список кортежей:
data = [('Ram',500), ('Sam',400), ('Test',100), ('Ram',800), ('Sam',700),
('Test',300), ('Ram',900), ('Sam',800), ('Test',400)]
from collections import defaultdict
def median(mylist):
sorts = sorted(mylist)
length = len(sorts)
if not length % 2:
return (sorts[length / 2] + sorts[length / 2 - 1]) / 2.0
return sorts[length / 2]
data_dict = defaultdict(list)
for el in data:
data_dict[el[0]].append(el[1])
print [(key,median(val)) for key, val in data_dict.items()]
print median([5,2,4,3,1])
print median([5,2,4,3,1,6])
#output:
[('Test', 300), ('Ram', 800), ('Sam', 700)]
3
3.5
Функция median
возвращает медиану из списка. Если есть четное количество записей, оно принимает среднее значение средних двух записей (это стандартно).
Я использовал defaultdict для создания ключа, определяемого вашими данными и их значениями, что является более полезным представлением ваших данных.
Проверьте это:
def median(lst):
even = (0 if len(lst) % 2 else 1) + 1
half = (len(lst) - 1) / 2
return sum(sorted(lst)[half:half + even]) / float(even)
Примечание:
sorted(lst)
создает отсортированную копию lst
;
sum([1]) == 1
;
Самый простой способ получить медиану списка с целыми данными:
x = [1,3,2]
print "The median of x is:",sorted(x)[len(x)//2]
Я начал с ответа user3100512 и быстро понял, что он не работает для четного количества элементов. Я добавил некоторые условные выражения для вычисления медианы.
def median(x):
if len(x)%2 != 0:
return sorted(x)[len(x)/2]
else:
midavg = (sorted(x)[len(x)/2] + sorted(x)[len(x)/2-1])/2.0
return midavg
median([4,5,6,7])
должен вернуть 5.5