В чем разница между pandas «описать» и «описать ()»? - PullRequest
0 голосов
/ 14 марта 2020

Когда я вызываю функцию, опишите без круглых скобок в моем блокноте jupyter, результаты будут другими, однако я ожидаю сообщение об ошибке для вызова без скобок. При поиске я нашел только статьи о describe(), но ничего о describe. Я чувствую себя дураком, спрашивая это, потому что я уверен, что это просто, но я еще не понимаю.

Код выглядит так:

file_path = '../input/data.csv'
data = pd.read_csv(file_path)
data.describe #instead of data.describe()

Два результата выглядят так это:

описать () : describe() result

описать : describe

Ответы [ 3 ]

3 голосов
/ 14 марта 2020

.describe - связанный метод. Он связан с вашим фреймом данных, и представление связанного метода включает в себя вывод repr() того, с чем он связан.

Это можно увидеть в начале вывода:

<bound method NDFrame.describe of ...>

rest - это та же строка, что и repr(data).

Обратите внимание, что Python интерактивный интерпретатор всегда повторяет представление того, что было создано последним выражением (если оно не произвело None). data.describe создает связанный метод, data.describe() производит все, что этот метод был предназначен для создания.

Вы можете создать такой же тип вывода для любого связанного метода:

>>> class Foo:
...     def __repr__(self):
...         return "[This is an instance of the Foo class]"
...     def bar(self):
...         return "This is what Foo().bar() produces"
...
>>> Foo()
[This is an instance of the Foo class]
>>> Foo().bar
<bound method Foo.bar of [This is an instance of the Foo class]>
>>> Foo().bar()
"This is what Foo().bar() produces"

Обратите внимание, что Foo() имеет собственный метод __repr__, который вызывается для создания представления экземпляра.

Вы можете увидеть тот же тип вывода (представление целого датафрейм) для любого метода в фрейме данных, который вы на самом деле не вызываете , например, data.sum, data.query, data.pivot или data.__repr__.

Связанный метод является частью процесса, посредством которого Python передает в качестве первого аргумента при вызове его, аргумент обычно называется self. В основном это прокси-объект со ссылками на исходную функцию (data.describe.__func__) и экземпляр, который передается перед всеми остальными аргументами (data.describe.__self__). См. дескриптор HOWTO для получения подробной информации о том, как работает связывание.

Если вы хотите express реализацию __repr__ связанного метода как Python кода, это будет:

def __repr__(self):
    return f"<bound method {self.__func__.__qualname__} of {self.__self__!r}>"
1 голос
/ 14 марта 2020

С риском чрезмерного упрощения:
.describe - это метод класса NDFrame, который можно вызывать для получения статистики по вашему фрейму.

You используйте этот метод, вызывая функцию describe().

Для получения более подробной информации и отличного объяснения низкого уровня - см. Ответ Мартин .

1 голос
/ 14 марта 2020

Вывод сообщает вам, что происходит, но требует некоторого декодирования. Когда вы вызываете df.describe, вы получаете

bound method NDFrame.describe of <your dataframe

Другими словами, он возвращает описание метода describe, который bound, к вашему объекту фрейма данных

Хотя это не совсем аналогично, поскольку оно не привязано к объекту, оно похоже на следующий случай, когда мы определяем функцию, которая работает с пространством имен __main__, а затем вызываем ее как с круглыми скобками, так и без них

def myfunc():
    return "hello world"

myfunc()

'hello world'

myfunc #no parentheses

<function __main__.myfunc()>

Обратите внимание на второй случай, когда он сообщает нам, что это функция, ее имя myfunc, и он «связан» с пространством имен __main__, а не с объектом (не совсем, но достаточно близко)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...