ny_quant: (Default)
[personal profile] ny_quant
Будь проклят тот день, когда я сел за баранку этого пылесоса! (с)

Я уже не буду говорить по сотому разу про семантику питона, индентацию и неудобный дебаггер. Самая феноменальная черта питона это непредсказуемое поведение, когда буквально один и тот же (скопипащенный) код в одном месте работает, а в другом нет, и понять в чем дело нельзя от слова никак. Сегодня у меня выдался особенно интересный день, в том смысле, что удалось наступить на одни и те же грабли дважды. Причем второй раз обошлось даже без копипасты, а прямо в одном и том же месте в цикле. Жил да был один dataframe, никого не трогал, починял примус. В одном месте к нему применялась операция groupby. И все шло хорошо пока я не поменял один из параметров, которые контролируют процесс наполнения этого dataframe. И вдруг ни с того ни с сего привет из черного ящика:

File "C:\Users\...\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\groupby\groupby.py", line 747, in get_group
raise KeyError(name)

Что-то где-то пошло не так, очевидно гораздо раньше, чем случилась ошибка. Дай думаю выведу данные на экран - может пойму в чем дело. Код выглядел так:

print(pos)
positions = pos.groupby(by='sign')
print(positions)
longs = positions.get_group(1)

Цикл этот проработал очень много раз без проблем. На предыдущей перед обломом итерации напечаталось:

... ......exdate ......strike. sign
619 20170616.0 2200.0 1.0
620 20170616.0 2200.0 1.0
<много похожих строк>
792 20170421.0 2475.0 -1.0
793 20170421.0 2475.0 -1.0

pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001DB90D0A760

(Точки я добавил в тело поста, чтобы подравнять заголовки колонок.) А в последний раз вот что:

... ......exdate ......strike. sign
619 20170616.0 2200.0 1.0
620 20170616.0 2200.0 1.0
<много похожих строк>
817 20170616.0 2445.0 -1.0
818 20170616.0 2445.0 -1.0

Empty DataFrame
Columns: [exdate, strike, sign]
Index: []

Empty DataFrame, вон оно как! Понятно теперь почему оттуда ничего нельзя вынуть и оно ломается. Но почему оно пустое??!! Колонка 'sign' есть? Есть. Числа в ней есть? Есть, причем в каждой строчке. Так какого же черта??? И что вообще люди делают в таких случаях? Идти дебаггером в библиотеку и искать почему оно ломается в groupby.py?

Пока что я схитрил и вместо

positions = pos.groupby(by='sign')
longs = positions.get_group(1)

написал

longs = pos[pos['sign'] > 0]

Это отлично сработало, причем для тех параметров, при которых groupby() работал без аварии, результаты получились идентичные. Это, конечно, хорошо, но не покидает ощущение, что ходишь по минному полю как ночью по тайге. Хотелось бы все же по ходу чему-то научиться и что-то понять. Особенно как искать черную кошку в темной комнате.

В комментарии особенно приглашается добродетельный юзер [livejournal.com profile] laoxia, который научил меня первым шагам с dataframe, а также все кто умеет питонить, особенно [livejournal.com profile] nefedor. Также я думаю, что скорее всего разбираются в теме [livejournal.com profile] misha_b и [livejournal.com profile] kobak. Извините если отвлек от важных дел.

Date: 2022-06-30 03:04 am (UTC)
From: [identity profile] ny-quant.livejournal.com
По-моему никакого мусора нет, быть не может, и главное на операцию groupby это по-моему влиять не должно, т.е. она должна бы работать с любым мусором. Иначе это баг. После стольких лет развития и миллионов пользователей? Правда?

IDLE 3.8

Я привык к тому, что если навести мышку на переменную, то покажут что у нее внутре. А тут хрен тебе. А если это не просто скаляр, а скажем dataframe, то и вовсе не покажут, надо делать print чтобы что-то увидеть - тоска смертная. Вверх-вниз (up/down) по стеку ходить нельзя, или я пока не сообразил как.

Date: 2022-06-30 03:34 am (UTC)
ak_47: (default)
From: [personal profile] ak_47
Сейчас такое качество софта везде, что уже ничего нельзя предполагать. Хотя насчёт миллионов пользователей и многих лет развития согласен. В популярных продуктах явные баги довольно быстро находят и оперативно чинят.

IDLE 3.8

Это жесткач. Я бы посоветовал хоть что-нибудь более юзабильное. Например, VSCode с плагином для питона. Там будет и нормальный дебаггер, и более приятный REPL.

С Pandas я никогда не работал, но эти трудности будут с любой продвинутой библиотекой. Особенно если там оптимизации для производительности. Похоже что dataframe это абстракция, которая сама не содержит данные, а только даёт доступ. Поэтому и не видно ничего.

Date: 2022-06-30 03:51 am (UTC)
From: [identity profile] ny-quant.livejournal.com
Я бы и сам посоветовал хоть что-нибудь более юзабильное, но будучи чайником не знал где его искать. Спасибо, попробую на досуге VSCode, хотя что такое REPL я все равно не знаю.

В С++ классы тоже вроде как абстракция, но в итоге оказалось возможно расколупать любой объект по ходу дебаггинга. А это какой-то блин прошлый век и, что самое поразительное, при огромном энтузиазме почтеннейшей публики.

Date: 2022-06-30 04:09 am (UTC)
ak_47: (default)
From: [personal profile] ak_47
REPL это read, eval, print loop, т.е. интерактивная среда в которой мы набираем код и тут же его интерпретируем и видим результаты. То окно, где вы пишете питоновский код после промпта ">>>".

В С++ тоже могут быть классы, которые не содержат в себе данные, а достают их по требованию. Т.е. пока метод не вызовешь ничего не узнаешь что там. В таких случаях в дебаггере надо быть осторожным, чтобы side effects от вызовов не поменяли сами данные.

Date: 2022-06-30 08:59 am (UTC)
From: [identity profile] iv6.livejournal.com
Полагаю, вам лучше подойдет Spyder. Там будет и Variable Explorer, и прочие радости.

Date: 2022-06-30 02:36 pm (UTC)
From: [identity profile] ny-quant.livejournal.com
Спасибо, а чем он лучше или лучше подойдет? Какие тут pros and cons?

Date: 2022-06-30 03:44 pm (UTC)
From: [identity profile] malyj-gorgan.livejournal.com
Тоже вариант
Можно в интерактив, можно в скрипты. Как код ломается, можно в интерактивно посмотреть значения переменных
Да хоть Jupyter-наше все-ноутбук

Date: 2022-06-30 07:16 pm (UTC)
From: [identity profile] iv6.livejournal.com
Богаче возможности изучения переменных, интерактивная консоль. Cons даже не знаю, какие. Иногда барахлит.

Date: 2022-06-30 07:56 pm (UTC)
From: [identity profile] ny-quant.livejournal.com
Ниже PyCharm рекомендуют.

Date: 2022-07-01 04:56 am (UTC)
From: [identity profile] iv6.livejournal.com
Тоже неплохо. Мне больше нравится Spyder, так как он больше похож на матлаб, и ориентирован скорее на работу с данными, тогда как PyCharm - на разработку программ.
(deleted comment)

Date: 2022-07-01 01:31 pm (UTC)
From: [identity profile] ny-quant.livejournal.com
Спасибо.

Profile

ny_quant: (Default)
ny_quant

January 2026

S M T W T F S
    123
45 6 7 8 9 10
11 12 13 14151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 14th, 2026 11:22 pm
Powered by Dreamwidth Studios