Помощь зала
Jun. 29th, 2022 06:13 pmБудь проклят тот день, когда я сел за баранку этого пылесоса! (с)
Я уже не буду говорить по сотому разу про семантику питона, индентацию и неудобный дебаггер. Самая феноменальная черта питона это непредсказуемое поведение, когда буквально один и тот же (скопипащенный) код в одном месте работает, а в другом нет, и понять в чем дело нельзя от слова никак. Сегодня у меня выдался особенно интересный день, в том смысле, что удалось наступить на одни и те же грабли дважды. Причем второй раз обошлось даже без копипасты, а прямо в одном и том же месте в цикле. Жил да был один 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() работал без аварии, результаты получились идентичные. Это, конечно, хорошо, но не покидает ощущение, что ходишь по минному полю как ночью по тайге. Хотелось бы все же по ходу чему-то научиться и что-то понять. Особенно как искать черную кошку в темной комнате.
В комментарии особенно приглашается добродетельный юзер
laoxia, который научил меня первым шагам с dataframe, а также все кто умеет питонить, особенно
nefedor. Также я думаю, что скорее всего разбираются в теме
misha_b и
kobak. Извините если отвлек от важных дел.
Я уже не буду говорить по сотому разу про семантику питона, индентацию и неудобный дебаггер. Самая феноменальная черта питона это непредсказуемое поведение, когда буквально один и тот же (скопипащенный) код в одном месте работает, а в другом нет, и понять в чем дело нельзя от слова никак. Сегодня у меня выдался особенно интересный день, в том смысле, что удалось наступить на одни и те же грабли дважды. Причем второй раз обошлось даже без копипасты, а прямо в одном и том же месте в цикле. Жил да был один 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() работал без аварии, результаты получились идентичные. Это, конечно, хорошо, но не покидает ощущение, что ходишь по минному полю как ночью по тайге. Хотелось бы все же по ходу чему-то научиться и что-то понять. Особенно как искать черную кошку в темной комнате.
В комментарии особенно приглашается добродетельный юзер
no subject
Date: 2022-06-30 02:44 pm (UTC)Самый trouble free вариант - PyCharm. И для профессионала годится, и для любителя. Бесплатный, no strings attached (есть родственные продукты, подписные, но PyCharm Community бесплатен для кого угодно). Гуманен к пользователю.
Начинать отсюда: https://www.jetbrains.com/toolbox-app/
no subject
Date: 2022-06-30 02:59 pm (UTC)no subject
Date: 2022-06-30 03:03 pm (UTC)no subject
Date: 2022-06-30 03:09 pm (UTC)На какой операционной системе дело происходит (Windows, Mac, Linux)?
no subject
Date: 2022-06-30 03:39 pm (UTC)В общем, это всё что нужно знать, если есть выбор на чем писать.
Про virtual environment никогда не слышал - пролетело выше головы.
Windows.
no subject
Date: 2022-06-30 03:45 pm (UTC)no subject
Date: 2022-06-30 04:11 pm (UTC)no subject
Date: 2022-06-30 06:21 pm (UTC)Если действовать по принципу "на охоту идти - собак кормить", скверность будет преследовать упорно. Осваивать еще одну профессию, тоже перспектива так себе. Лучше поискать лично приемлемый компромисс и преодолеть порог вхождения малой кровью.
Могу порекомендовать книгу Fluent Python, by Luciano Ramalho. Текст не просто содержательный - элегантный, я бы сказал. Редкость для учебника. Уровень не нулевой, но что-то мне подсказывает - подойдет как раз.
Если окажется out of print, или еще что, найдем способ переслать pdf.
И еще: без гита (гитхаба) в наши дни писать программу длиннее пятнадцати строк не рекомендуется. Освоить надо непременно. Это без питона жизнь есть, без гита - уже нет. Можно еще иметь в виду, что гит архиполезен при работе с любой plain text информацией, не только с текстами программ, где он нынче незаменим.
no subject
Date: 2022-06-30 09:20 pm (UTC)That was the idea.
Книжку украл, спасибо. Правда не знаю когда буду читать.
Git я как бы пользую по работе, но поскольку он нужен примерно раз в квартал, то от раза к разу забываю что к чему, так что только по шпаргалке.
Дома тоже как-то раз ставил, использовал для одного проекта, и не помню чтоб сносил, но по факту его нет. Чудеса. Но надо будет и правда поставить, хотя я всё же привык к SVN и переучиваться на старости лет мне лень.
no subject
Date: 2022-07-01 05:44 am (UTC)В шезлонге у бассейна, не?
>> Git я как бы пользую по работе, но поскольку он нужен примерно раз в квартал, то от раза к разу забываю что к чему, так что только по шпаргалке.
О, для начала вполне достаточно! Одной проблемой меньше. Уровень лучше, чем по шпаргалке, требуется, когда дело до совместной работы доходит. Но это же не прям завтра? SVN не надо бы, там сегодня пустыня и голодные стервятники вокруг скелета саблезубого тигра.
no subject
Date: 2022-07-01 01:47 pm (UTC)То то на работе заставили на git перейти.
Напрягать голову у бассейна не хочется даже если это нужно по работе, но посмотрим как пойдет.
(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2022-06-30 04:01 pm (UTC)VE - это в PyCharm настраивается элементарно.
На самом деле не все так страшно. У тебя с самого начала есть некий набор - определённая версия питона, нампая, сайпая и панды. Долгое время ты будешь работать именно с этим. В отдаленном будущем, да, возможно сломать устойчивость апгрейдом, скажем, панды до новой версии - но это всегда так, в любой системе.
Питон и нампай - очень устойчивые, обычно код десятилетней давности работает (кроме питон2->питон3). А вот про панду я слышал нехорошие вещи.
А ещё для рисерчеров есть Jupiter notebook. Это как раз про воспроизводимость результатов.
no subject
Date: 2022-06-30 04:13 pm (UTC)no subject
Date: 2022-06-30 03:19 pm (UTC)Я с PyCharm только и работаю. Не знаю как я жил раньше ;)
no subject
Date: 2022-06-30 03:39 pm (UTC)no subject
Date: 2022-07-05 09:36 am (UTC)Визуальный отладчик - это красиво, как галифе от Гуго Босса, но далеко не всегда так же полезно. Есть понятие юнит-тестирования (Unit Test). Это, по сути дела, та же трассировка (print("whatever you are curious about")), но с азартными играми и барышнями. При этом: (1) трассировка не засирает основной код; (2) она сохраняется; (3) всегда можно посмотреть снова; (4) это комментарии, которые никогда не врут; (5) и это только начало...
https://stackoverflow.com/questions/41852686/how-do-you-unit-test-python-dataframes
Стандартный питон: при поиске попадутся библиотеки unittest и pytest. Промышленным стандартом, на сегодняшний день, является pytest.
no subject
Date: 2022-07-05 03:16 pm (UTC)no subject
Date: 2022-07-05 05:17 pm (UTC)Правда, когда набежал миллион строк кода, несколько поздно надевать пояс девственности. Двести строк тестов на тысячу строк собственной неосторожности, более или менее. Начинать рекомендуется сразу, a.k.a. TDD :)
no subject
Date: 2022-07-05 05:34 pm (UTC)Вообще, лень трудно победить рациональными аргументами и опытом чужих ошибок ;)
no subject
Date: 2022-07-06 09:46 pm (UTC)За чей-то счёт или же прибавочная стоимость? :-)
P.S.
Всем спасибо за этот пост :-)
no subject
Date: 2022-07-06 11:10 pm (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2022-07-06 10:04 pm (UTC)И, на мой взгляд, если действительно есть хоть малейший шанс на успех, то обязательно пишите в той системе, которой уверенно владеете.
(no subject)
From:no subject
Date: 2022-07-02 01:01 am (UTC)no subject
Date: 2022-07-04 05:47 pm (UTC)Что в нем такого эдакого? То же самое что и раньше, только много удобнее.
no subject
Date: 2022-07-04 09:23 pm (UTC)