Чем плохи фильтры в пандасе?
Казалось бы - ничем. Нужно вот так фильтровать
Тут нет ничего плохого. Но начинаются мелкие неудобства, например когда нужно сделать group by, а потом что-то отфильтровать. Тут уже нужно две строки
Вторая бесячая вещь - это group by
Есть проблема с множественными агрегация
Так работает, но появляется мультииндекс. И хз что с ним делать. Нужно как-то избавляться от мультииндекса - переименовывать колонки.
Перед тем как писать пост я погуглил. Оказывается можно еще использовать
И получиться что-то в духе
Выглядит уже громоздко. А что если нам нужно название новой колонки получить из переменной? Тогда все будем совсем страшно.
Но выход есть - библиотека polars. Она создана для того чтобы заменить pandas. Главная фишка polars в том, что он работает сильно быстрее пандаса. Но мне больше всего нравиться его API, который сильно напоминает API pyspark.
В поларсе фильтр это метод. Это позволяет фильтровать сразу после group by в одну строку.
Если у нас много фильтром и в процессе исследования данных мы хотим их постоянно включать и выключать, то можно сделать так
В пандасе так тоже можно. Но когда потребуется больше.
Посчитать несколько агрегация тоже можно с помощью меньшего количества кода
Бонус. В функцию len не нужно передавать имя поля. Для этой функции не важно какое поле передать, но меня всегда смущало когда я не могу просто посчитать число объектов. То есть в polars. Вместо
Казалось бы - ничем. Нужно вот так фильтровать
df = df[df[col_name]==value] Тут нет ничего плохого. Но начинаются мелкие неудобства, например когда нужно сделать group by, а потом что-то отфильтровать. Тут уже нужно две строки
gb = df.group_by(“key”, as_index=False)[“sales”].mean()
gb[gb[“sales”]>100.0]Вторая бесячая вещь - это group by
Есть проблема с множественными агрегация
df.groupby("key").agg({"value":["min", "mean", "max", “size”]})Так работает, но появляется мультииндекс. И хз что с ним делать. Нужно как-то избавляться от мультииндекса - переименовывать колонки.
Перед тем как писать пост я погуглил. Оказывается можно еще использовать
pd.NamedAgg, но тогда нужно городить огородИ получиться что-то в духе
df.groupby("key").agg(
value_min=pd.NamedAgg(column="value", aggfunc="min"),
value_mean=pd.NamedAgg(column="value", aggfunc="mean"),
value_max=pd.NamedAgg(column="value", aggfunc="max"),
)Выглядит уже громоздко. А что если нам нужно название новой колонки получить из переменной? Тогда все будем совсем страшно.
df.groupby("key").agg(**
{
value_min_name: pd.NamedAgg(column="value", aggfunc="min"),
value_mean_name: pd.NamedAgg(column="value", aggfunc="mean"),
value_max_name: pd.NamedAgg(column="value", aggfunc="max"),
size_name: pd.NamedAgg(column="value", aggfunc="size"),
}
)Но выход есть - библиотека polars. Она создана для того чтобы заменить pandas. Главная фишка polars в том, что он работает сильно быстрее пандаса. Но мне больше всего нравиться его API, который сильно напоминает API pyspark.
В поларсе фильтр это метод. Это позволяет фильтровать сразу после group by в одну строку.
df.group_by(“key”).agg(pl.mean(“sales”)).filter(pl.col(“sales”)>100.0)Если у нас много фильтром и в процессе исследования данных мы хотим их постоянно включать и выключать, то можно сделать так
(
df
.filter(pl.col(“value1”)==value1)
# .filter(pl.col(“value2”)==value2)
.filter(pl.col(“value3”)>value3)
.filter(pl.col(“value4”)<value4)
)В пандасе так тоже можно. Но когда потребуется больше.
Посчитать несколько агрегация тоже можно с помощью меньшего количества кода
(df.group_by(“key”)
.agg(pl.min(“value”).alias(min_value_name),pl.mean(“value”).alias(mean_value_name)pl.max(“value”).alias(max_value_name)pl.len().alias(size_name),)
)
Бонус. В функцию len не нужно передавать имя поля. Для этой функции не важно какое поле передать, но меня всегда смущало когда я не могу просто посчитать число объектов. То есть в polars. Вместо
{“value”:”size”} илиpd.NamedAgg(column="value", aggfunc="size") нужно писать просто pl.len()👌1
Интересно мне одному не нравится слово айтишник? Это же не самоназвание. Ни один айтишник не представиться, айтишником. Он представиться тестировщиком, разработчиков, дата саентистом или кем-то ещё. Ни одна компания не размещает вакансию с названием айтишник.
Если мне нужно рассказать кто я человеку, который совсем не в теме. То я говорю примерно следующее.
"Слышали ли ты слова АI, искусственный интеллект, data science, машинное обучение, big data, большие данные? Вот этим всем я занимаюсь"
Меня удивляет, что есть люди которые отвечают нет. Тогда приходиться смириться с "айтишник"
Если мне нужно рассказать кто я человеку, который совсем не в теме. То я говорю примерно следующее.
"Слышали ли ты слова АI, искусственный интеллект, data science, машинное обучение, big data, большие данные? Вот этим всем я занимаюсь"
Меня удивляет, что есть люди которые отвечают нет. Тогда приходиться смириться с "айтишник"
❤2
Я живу в Сочи. Меня часто спрашивают, куда тут можно сходить. А если не спрашивают, то мне обязательно хочется рассказать. Рассказать развернуто, а не просто перечислить список заведений. Чтобы не повторяться, я составил подборку баров. В каждом из них я был не один раз.
❤2👍1
Напомню почему коэффициент Стьюдента так называется. Выдержка из Википедии.
Довольно известная и забавная история. Но если задуматься, то все выглядит безумно. Чувак работал на компанию. Придумал крутую штуку. Хотел про нее рассказать, но ему запрещало NDA. И тогда он опубликовал свою работу под псевдонимом!
Представьте если бы сейчас какой-нибудь сотрудник Open AI опубликовал, например, архитектуру GPT 4. А чтобы никто ничего не понял взял бы псевдоним Школьник. Вообще было бы не подозрительно.
Данный критерий был разработан Уильямом Госсетом для оценки качества пива в компании Гиннесс. В связи с обязательствами перед компанией по неразглашению коммерческой тайны (руководство Гиннесса считало таковой использование статистического аппарата в своей работе), статья Госсета вышла в 1908 году в журнале «Биометрика» под псевдонимом «Student» (Студент).Довольно известная и забавная история. Но если задуматься, то все выглядит безумно. Чувак работал на компанию. Придумал крутую штуку. Хотел про нее рассказать, но ему запрещало NDA. И тогда он опубликовал свою работу под псевдонимом!
Представьте если бы сейчас какой-нибудь сотрудник Open AI опубликовал, например, архитектуру GPT 4. А чтобы никто ничего не понял взял бы псевдоним Школьник. Вообще было бы не подозрительно.
❤3
когда рекомендации начали шуметь
В телеге можно посмотреть похожие телеграм каналы. Хз как они их считают. Скорее всего что-то на основе пересечений групп подписчиков. Я часто заглядывают в "похожие" каналы. Обычно там все понятно. Похожие каналы - это часто сайд проекты, либо друзья авторов, которые друг друга репостят и пиарят.
Но вот с похожими каналами ИТ-пикника получилось веселее. Тут на первом месте новости UFC. А на втором и третьем месте блоги про котов и собак.
В телеге можно посмотреть похожие телеграм каналы. Хз как они их считают. Скорее всего что-то на основе пересечений групп подписчиков. Я часто заглядывают в "похожие" каналы. Обычно там все понятно. Похожие каналы - это часто сайд проекты, либо друзья авторов, которые друг друга репостят и пиарят.
Но вот с похожими каналами ИТ-пикника получилось веселее. Тут на первом месте новости UFC. А на втором и третьем месте блоги про котов и собак.
❤1
Мне на литкоде попалась задача, которая формулируется примерно так. У вас есть несколько бутылок пива. Вы можете их:
- выпить
- пустые бутылки сдать в прием стеклотары
- на вырученные деньги купить еще пива
Сколько пива вы сможете выпить, если у вас N бутылок пива. А чтобы купить еще одну бутылку вам нужно сдать M пустых.
В задаче правда про речь про воду. Что-то мне в это не верится.
- выпить
- пустые бутылки сдать в прием стеклотары
- на вырученные деньги купить еще пива
Сколько пива вы сможете выпить, если у вас N бутылок пива. А чтобы купить еще одну бутылку вам нужно сдать M пустых.
В задаче правда про речь про воду. Что-то мне в это не верится.
❤1
Треугольник дата саентиста - способ визуализировать разные специализации в области DS и около DS. Он достаточно известен, но, по-моему, он слишком сложен и не совсем точен. Поэтому я представляю разные специализации не в сложном пространстве, а на линии, где с одного края люди больше про бизнес, а с другого люди больше про технологии.
Сюда же вписывается концепция T-shape. T-shape существует в рамках одномерного распределения.
Сюда же вписывается концепция T-shape. T-shape существует в рамках одномерного распределения.
❤5
Наткнулся на статью “Как Python чуть не стал JavaScript’ом”. В одной из бета-версий Python 3.12 был добавлен класс AttrDict. Этот класс, по сути, является обычным словарём, но позволяет получать доступ к элементам не только через квадратные скобки, но и через точку.
То есть, если создать такой словарь:
То можно получить доступ к элементам как через квадратные скобки, так и через точку:
Причём pull request сделал один человек, даже без ревью. Но потом довольно быстро его откатили назад. Один из аргументов за такую функцию был в том, что это реализовано в Pandas, где можно обращаться к колонке как через квадратные скобки, так и как к атрибуту через точку. Однако, как сказал автор видео: “Pandas не является хорошим примером для подражания”. И самое интересное, что в комментариях многие с ним согласны.
https://www.youtube.com/watch?v=nDd2WVb_Enw&t=171s&ab_channel=anthonywritescode
То есть, если создать такой словарь:
d = AttrDict(x=1, bar=2)
print(d)
# {'x': 1, 'bar': 2}То можно получить доступ к элементам как через квадратные скобки, так и через точку:
print(d.x)
# 1
print(d.bar)
# 2Причём pull request сделал один человек, даже без ревью. Но потом довольно быстро его откатили назад. Один из аргументов за такую функцию был в том, что это реализовано в Pandas, где можно обращаться к колонке как через квадратные скобки, так и как к атрибуту через точку. Однако, как сказал автор видео: “Pandas не является хорошим примером для подражания”. И самое интересное, что в комментариях многие с ним согласны.
https://www.youtube.com/watch?v=nDd2WVb_Enw&t=171s&ab_channel=anthonywritescode
YouTube
python 3.12 was ALMOST javascript
today we're talking about AttrDict, maintainability of cpython, and the burden of maintenance.
==========
twitch: https://twitch.tv/anthonywritescode
dicsord: https://discord.gg/xDKGPaW
twitter: https://twitter.com/codewithanthony
github: https://github.com/asottile…
==========
twitch: https://twitch.tv/anthonywritescode
dicsord: https://discord.gg/xDKGPaW
twitter: https://twitter.com/codewithanthony
github: https://github.com/asottile…
👍1
Людям сразу после курсов сложно найти работу. Есть разные версии, почему. Кто-то говорит, что курсы плохие. Кто-то видит причину в том, что виноваты работодатели, которые не хотят брать джунов.
Мне кажется, что проблема не в этом, а в том, что три месяца, полгода и даже год — это мало для получения серьезной профессии. Посмотрим хотя бы на среднее специальное образование. Не буду рассуждать на тему полезности, пригодности в жизни, устарелости программы. Оно занимает три года. Год из этого — это школьная программа 10-11 классов. Остается два года обучения профессии, причем два года обучения full-time. Полдня учишься в аудитории, а потом еще дома. Если сравнивать с высшим образованием, то даже если выкинуть нерелевантные курсы, все равно получится больше двух лет.
То есть наши "деды", которые придумывали систему образования, закладывали минимум два года на освоение профессии. По сравнению с этим даже год — это мало. Тем более подразумевается, что курсы можно совмещать с работой, то есть это не full-time.
Мне кажется, что проблема не в этом, а в том, что три месяца, полгода и даже год — это мало для получения серьезной профессии. Посмотрим хотя бы на среднее специальное образование. Не буду рассуждать на тему полезности, пригодности в жизни, устарелости программы. Оно занимает три года. Год из этого — это школьная программа 10-11 классов. Остается два года обучения профессии, причем два года обучения full-time. Полдня учишься в аудитории, а потом еще дома. Если сравнивать с высшим образованием, то даже если выкинуть нерелевантные курсы, все равно получится больше двух лет.
То есть наши "деды", которые придумывали систему образования, закладывали минимум два года на освоение профессии. По сравнению с этим даже год — это мало. Тем более подразумевается, что курсы можно совмещать с работой, то есть это не full-time.
❤1👍1
Бывает такое, что получаешь сообщение.
И каждый раз я думаю, а правда ли это авария, или у вас просто что-то упало? Не слишком ли громкое слово авария. Когда я вижу слово
Но что-то мне подсказывает, что чаще всего это и близко не так. Скорее всего кто-то где-то накосячил, что-то нажал и что-то сломалось. Причем сломалась какая-нибудь хрень, которая не тянет на такое громкое слово. Лично я всегда использую слово сломалось или упало в таких случаях.
Произошла авария, которая затронула работу системы Х. И теперь Х не работает.
И каждый раз я думаю, а правда ли это авария, или у вас просто что-то упало? Не слишком ли громкое слово авария. Когда я вижу слово
авария, хочется представить метеорит, который упал на датацентр. Или администраторов, которые голыми руками выпонят жесткие диски из пожара.Но что-то мне подсказывает, что чаще всего это и близко не так. Скорее всего кто-то где-то накосячил, что-то нажал и что-то сломалось. Причем сломалась какая-нибудь хрень, которая не тянет на такое громкое слово. Лично я всегда использую слово сломалось или упало в таких случаях.
Не используйте метод drop в ваших data пайплайнах. Из-за drop неясно, какие колонки остаются в получившемся датасете.
Читая код, не понимаешь, какие поля обязательные. Особенно сложно, если в коде большая вложенность.
Вот сиди и думай, какой список полей на выходе из fun3.
Сначала нужно понять, что находится в датафрейме, который читается. Потом разобраться, какие колонки дропаются на выходе каждой из функций. Еще неясно, какие колонки добавляются. Придется искать их по всему коду.
Если же каждый раз явно указывать список полей, то все становится понятно:
Читая код, не понимаешь, какие поля обязательные. Особенно сложно, если в коде большая вложенность.
def fun1(df: pd.DataFrame) -> pd.DataFrame:
# some code
return df.drop("price", axis=1)
def fun2(df: pd.DataFrame) -> pd.DataFrame:
# some code
df = fun1(df)
return df.drop("total_sum", axis=1)
df = pd.read_csv"path)
def fun3(df: pd.DataFrame) -> pd.DataFrame:
df = fun2(df)
# some code
return df.drop("cluster_id", axis=1)Вот сиди и думай, какой список полей на выходе из fun3.
Сначала нужно понять, что находится в датафрейме, который читается. Потом разобраться, какие колонки дропаются на выходе каждой из функций. Еще неясно, какие колонки добавляются. Придется искать их по всему коду.
Если же каждый раз явно указывать список полей, то все становится понятно:
def fun3(df: pd.DataFrame) -> pd.DataFrame:
df = fun2(df)
# some code
return df[["product_id", "store_id", "sales", "volume"]]👍3
Бывает такое, что какой-то код в ноутбуке нужно временно закомментить, чтобы потом, по необходимости, раскомментить обратно. В то же время бывает, тянется рука удалить закомментированный код, чтобы он не отвлекал. Поэтому, чтобы временно не использовать какой-то код и точно его не удалять, я добавляю условие if False/if True.
Это выглядит немного странно и кажется, не имеет смысла. Ведь код внутри if False можно удалить, и ничего не поменяется. И строчка if True не имеет смысла. Но зато я в любой момент могу поменять True на False или наоборот и случайно не удалю код внутри условия.
Теперь текст с расставленными запятыми выглядит правильно. Все необходимые запятые расставлены.
Это выглядит немного странно и кажется, не имеет смысла. Ведь код внутри if False можно удалить, и ничего не поменяется. И строчка if True не имеет смысла. Но зато я в любой момент могу поменять True на False или наоборот и случайно не удалю код внутри условия.
Теперь текст с расставленными запятыми выглядит правильно. Все необходимые запятые расставлены.
👍2