Как pandas description () - top работает, когда несколько элементов имеют наибольшее количество? - PullRequest
1 голос
/ 04 июня 2019

Контекст :

Я пытаюсь понять, как top атрибут describe() работает в python (3.7.3) pandas (0.24.2).

Усилия до сих пор :

  1. Я изучил документацию pandas.DataFrame.describe .В нем говорится, что:

    Если несколько значений объекта имеют наибольшее количество, то число и верхние результаты будут произвольно выбраны из числа с самым высоким числом.

    Iя пытаюсь понять, какая часть кода точно приписывает «произвольный» вывод.

  2. Я вошел в код, который вызывается по очереди describe.Мой трассировка выглядит следующим образом:

describe()  #pandas.core.generic
describe_1d()  #pandas.core.generic
describe_categorical_1d()  #pandas.core.generic
value_counts()  #pandas.core.base
value_counts()  #pandas.core.algorithms
_value_counts_arraylike()  #pandas.core.algorithms
# In the above step it uses hash-table, to find keys and their counts
# I am not able to step further, as further implementations are in C.

Пример испытаний :

import pandas as pd
sample = pd.Series(["Down","Up","Up","Down"])
sample.describe()["top"]

Приведенный выше код может дать Down или Up случайно, как и ожидалось.

Вопрос :

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

    Если да,

    - Разве не каждый раз один и тот же ключ имеет одинаковый хэш и выбирается в том же порядке?

    - Как ключи хешируются, повторяются (для выборки всех ключей) и выбираются из хеш-таблицы?

Любой указатель высоко ценится!Заранее спасибо:)

1 Ответ

1 голос
/ 04 июня 2019

Как указывалось выше, он дает «Down» произвольно, но не случайно.На той же машине с той же версией Pandas выполнение приведенного выше кода должно всегда давать один и тот же результат (хотя это не гарантируется документами, см. Комментарии ниже).

Давайте воспроизведем то, что происходит.

Учитывая эту серию:

abc = pd.Series(list("abcdefghijklmnoppqq"))

Реализация value_counts сводится к следующему:

import pandas._libs.hashtable as htable
keys, counts = htable.value_count_object(np.asarray(abc), True)
result = pd.Series(counts, index=keys)

результат:

g    1
e    1
f    1
h    1
o    1
d    1
b    1
q    2
j    1
k    1
i    1
p    2
n    1
l    1
c    1
m    1
a    1
dtype: int64

Порядокрезультата дает реализация хеш-таблицы.Это то же самое для каждого вызова.

Вы можете посмотреть реализацию value_count_object , которая вызывает build_count_table_object, который использует реализацию khash чтобы получить более подробную информацию о хешировании.

После вычисления таблицы реализация value_counts будет сортировать результаты с быстрой сортировкой.Этот сорт не стабилен и в этом специально сконструированном примере переупорядочивает «p» и «q»:

result.sort_values(ascending=False)

q    2
p    2
a    1
e    1
f    1
h    1
o    1
d    1
b    1
j    1
m    1
k    1
i    1
n    1
l    1
c    1
g    1
dtype: int64

Таким образом, существует потенциально два фактора для упорядочения: первый - хеширование, а второй - нестабильная сортировка..

Отображаемое верхнее значение является просто первой записью отсортированного списка, в данном случае, "q".

На моей машине быстрая сортировка становится нестабильный на 17 записей, поэтому я выбрал приведенный выше пример.

Мы можем протестировать нестабильную сортировку с помощью этого прямого сравнения:

pd.Series(list("abcdefghijklmnoppqq")).describe().top
'q'

pd.Series(list(               "ppqq")).describe().top
'p'
...