питон: есть ли функция частоты? - PullRequest
1 голос
/ 03 августа 2010

В Excel есть функция частоты:

Функция Excel ЧАСТОТА полезная функция может анализировать серию ценностей и суммировать их в количество указанных диапазонов. За пример высоты некоторых детей можно сгруппировать в четыре категории [менее 150 см]; [151 - 160 см]; [161 - 170 см]; [Более 170 см].

Хотите узнать больше?

Excel 2003 Формулы от Джона Уокенбаха (с CD)

FREQUENCY () - необычный массив функция, и она работает по-другому, чтобы большинство других нормальных функций. Оно может не просто быть введенным в клетку или даже правильно введен с помощью Excel Мастер функций.

Обратите внимание, что эта функция не анализировать значения по категориям, например, расходы домохозяйств на такие группы как газ, электричество, вода, тарифы и т. д. Для проведения такого анализа Расширенный фильтр может быть уместным.

Функция частоты имеет два аргументы - первый диапазон ячейки, содержащие значения, которые будут проанализированы; второй диапазон ячейки, содержащие верхние значения каждая группа полосатая. например = ЧАСТОТА (A3: A120, B6: B10)

Второй аргумент (группа верхняя пределы) исключит любые значения, которые превышать высшую категорию или полосатость. Функция позволяет вам принять во внимание это и расширить Диапазон анализа до дополнительного категория, которая содержит все значения которые превышают указанный верхний предел.

http://www.meadinkent.co.uk/xlfreq.htm

есть ли такая вещь в питоне?

Ответы [ 4 ]

4 голосов
/ 03 августа 2010
import numpy
numpy.histogram( [ <data> ], [ <bins> ] )

Docs

numpy.histogram(a, bins=10, range=None, normed=False, weights=None)

Вычислить гистограмму набора данных. Параметры:

a: массив_подобный Входные данные. Гистограмма вычисляется по сглаженному массиву.

bins: int или последовательность скаляров, необязательно Если bin - это int, он определяет количество корзин равной ширины в заданный диапазон (по умолчанию 10). Если ящики это последовательность, она определяет мусорное ведро края, включая крайний правый край, с учетом неравномерной ширины бункера.

range: (плавать, плавать), необязательно Нижний и верхний диапазон бункеров. Если не указан, диапазон просто (a.min (), a.max ()). Ценности вне диапазона игнорируются.

normed: bool, необязательно Если False, результат будет содержать количество выборок в каждом бен. Если True, результатом является значение функции плотности вероятности при корзина, нормализованная так, что интеграл по диапазону равен 1. Примечание что сумма значений гистограммы не будет равен 1, если бункеры ширина единицы выбрана; это не функция вероятности массы.

weights: массив_подобный, необязательный Массив весов той же формы, что и. Каждое значение только вносит свой связанный вес в сторону количества бинов (вместо 1). Если нормировано, верно, веса нормирован, так что интеграл плотность в диапазоне остается 1

Возвращает:

hist: массив Значения гистограммы. См нормированные и веса для описание возможной семантики.

bin_edges: массив типа d float Вернуть ребра бункера (длина (история) +1).

Возможно, вам придется сначала установить numpy .

3 голосов
/ 03 августа 2010

Лучший вариант - использовать numpy.histogram, но если вы не хотите устанавливать numpy, вот тот, который работает так же, как Excel:

def frequency(data, bins):
    # work with local sorted copy of bins for performance
    bins = bins[:]
    bins.sort()
    freqs = [0] * (len(bins)+1)
    for item in data:
        for i, bin_val in enumerate(bins):
            if item <= bin_val:
                freqs[i] += 1
                break
        else:
            freqs[len(bins)] += 1
    return freqs

Вот пример в справке Excel, переведенной на python:

>>> data = [79, 85, 78, 85, 50, 81, 95, 88, 97]
... bins = [70, 79, 89]
... print frequency(data, bins)
[1, 2, 4, 2]

Есть одно незначительное отличие. В Excel, если bins пусто, длина данных возвращается как целое число. Эта версия Python возвращает это число в списке. Причина этого в том, что версия Python вернет согласованный тип данных (и все равно даст правильный ответ).

1 голос
/ 03 августа 2010

Я не знаю, есть ли такая функция в Python, но, очевидно, вы можете написать ее:

def frequency(values, groups):
    # Build the solution
    toret = dict()
    toret[ None ] = list()

    # Sort them
    values.sort()
    groups.sort()

    # Run over groups
    i = 0
    for maxValue in groups:
        while ( ( values[ i ] < maxValue ) and ( i < len( values ) ) ):
            if ( toret.get( maxValue ) == None ):
                toret[ maxValue ] = list()
            toret[ maxValue ].append( values[ i ] )
            i += 1

        if ( i >= len( values ) ):
            break

    if ( i < len( values ) ):
        while( i < len( values ) ):
            toret[ None ].append( values[ i ] )
            i += 1

    return toret


l=[ 15,9,3,5,6,4,8,2,1,7,11,12 ]
g=[ 3,6,9 ]
print( frequency( l, g ) )

В результате получается словарь, в котором каждый элемент является одним из максимальных значений всписок групп.Вы можете найти частоту, вычислив длину каждого списка.

Результат:

{None: [9, 11, 12, 15], 9: [6, 7, 8], 3: [1, 2], 6: [3, 4, 5]}
1 голос
/ 03 августа 2010

в зависимости от того, на что ссылается страница http://www.meadinkent.co.uk/xlfreq.htm говорится, что я написал функцию, я уверен, что есть более быстрые способы сделать это, но я уверен, что это правильно

def FREQUENCY(values, bands, max=None):
   counts = [0]*(len(bands)+1)
   for v in values:
       for i,b in enumerate(bands):
           if v <= b:
               counts[i] += 1
               break
           else if v > max:
               counts[-1] += 1
               break
   return counts
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...