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-07-05 03:16 pm (UTC)
From: [identity profile] ny-quant.livejournal.com
Мне очень даже приходиось иметь дело с юнит-тестами. Когда речь шла о библиотеке на миллион строчек кода с сотнями классов, это было важно, нужно и полезно. На работе сейчас тоже есть некий framework но я там пока что ничего полезного не делаю. Для моих скромных домашних проектов, мне кажется это пока что не нужно. Если код будет расти (надеюсь, что нет) то надо будет пересмотреть.

Date: 2022-07-05 05:17 pm (UTC)
From: [identity profile] Алексей Орлов (from livejournal.com)
Вообще прекрасно!

Правда, когда набежал миллион строк кода, несколько поздно надевать пояс девственности. Двести строк тестов на тысячу строк собственной неосторожности, более или менее. Начинать рекомендуется сразу, a.k.a. TDD :)

Date: 2022-07-05 05:34 pm (UTC)
From: [identity profile] ny-quant.livejournal.com
Пока что у меня меньше 200. Кое что ещё надо добавить, чтобы предотвратить root cause "ошибки", из-за которой появился этот пост, но ясно, что и до 300 вряд ли дойдет. Дальше или на свалку или буду богатый и счастливый.

Вообще, лень трудно победить рациональными аргументами и опытом чужих ошибок ;)

Date: 2022-07-06 09:46 pm (UTC)
From: [identity profile] ta-conversation.livejournal.com
>> или буду богатый и счастливый

За чей-то счёт или же прибавочная стоимость? :-)

P.S.
Всем спасибо за этот пост :-)

Date: 2022-07-06 11:10 pm (UTC)
From: [identity profile] ny-quant.livejournal.com
Ммм, не знаю как ответить. За счет market-makers, наверное.

Date: 2022-07-07 05:46 pm (UTC)
From: [identity profile] ny-quant.livejournal.com
Понял, что ответил неправильно.

В данном случае, я торгую опционами, которые по своей природе игра с нулевой суммой, пренебрегая комиссионными.

Но market-makers, которые продают мне (или покупают у меня) опционы не просто сидят и смотрят чем кончится дело, а закрывают свои позиции путем сделок противоположного знака с другими участниками рынка, а также активно хеджируются. Так что, если у меня прибыль, то у кого именно убыток сказать невозможно.

Date: 2022-07-08 09:27 pm (UTC)
From: [identity profile] ta-conversation.livejournal.com
Спасибо. Всё равно желаю удачи :-)

Date: 2022-07-06 10:04 pm (UTC)
From: [identity profile] ta-conversation.livejournal.com
>> Я мог бы все это сделать в Матлабе в 10 раз быстрее, проще и удобнее.

И, на мой взгляд, если действительно есть хоть малейший шанс на успех, то обязательно пишите в той системе, которой уверенно владеете.

Date: 2022-07-06 11:12 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 1314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

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