Aspiring Data Science – Telegram
Aspiring Data Science
386 subscribers
465 photos
12 videos
12 files
2.15K links
Заметки экономиста о программировании, прогнозировании и принятии решений, научном методе познания.
Контакт: @fingoldo

I call myself a data scientist because I know just enough math, economics & programming to be dangerous.
Download Telegram
#music #rock #chyop

Год тому познакомился с парнишкой в поезде. пишет сегодня, мол, Анатолий, зацени, новую песню выпустил. Как вам?

https://www.youtube.com/shorts/XfY2vntaaTI

https://lnkfi.re/Clouds_
#astronomy #dangers

«DART дал нам представление о сложной гравитационной физике, которую невозможно изучить в лаборатории, и все эти исследования помогают нам узнать больше для защиты Земли в случае возникновения реальной угрозы. Существует ненулевая вероятность того, что астероид или комета приблизится и подвергнет планету опасности. Теперь у нас есть дополнительная линия защиты от такого рода внешних угроз», — считает Ричардсон.

https://3dnews.ru/1109977/missiya-nasa-dart-pomogla-uchyonim-uznat-bolshe-o-geofizike-legashchey-v-osnove-formirovaniya-i-evolyutsii-asteroidov
#python #vb #with #contextmanagers

"Не исключено, что контекстные менеджеры окажутся почти такими же важными, как сами подпрограммы. Мы затронули лишь самую верхушку айсберга […].

В языке Basic есть предложение with, как и во многих других языках. Но все они делают совсем не то – они лишь экономят время на повторяющемся поиске атрибутов с точкой, не производя ни инициализации, ни очистки. Не нужно думать, что раз названия одинаковы, то одинаковы и функции. Предложение with – очень мощная штука.

– Рэймонд Хэттингер"

Капец. Так вот откуда Рэй взял идею конструкций with. А какого хрена тогда было не сделать так же, как в Visual Basic, вложенные with с сокращённой нотацией?! Это ж очень удобно. Для доступа к полю A.B.C в VB можно написать
with A.B
.C=...

Кстати, до сих пор не пойму, почему в Python переменная, объявленная в контекстном менеджере, доступна ПОСЛЕ выхода из контекста. Это выглядит крайне нелогично:
import pymc as pm

# Define a model using a context manager
with pm.Model() as model:
# Define random variables within the model
mu = pm.Normal('mu', mu=0, sigma=1)
sigma = pm.HalfNormal('sigma', sigma=1)
observed_data = pm.Normal('observed_data', mu=mu, sigma=sigma, observed=[1.2, 1.8, 2.4])

# Outside the context, you can still access the 'model' and the variables
model.do_something()
1
#fun #jobs

- Человек, пой снова, мне понравилось!
- Позабыты хлопоты, остановлен бег, вкалывают роботы, счастлив человек...

- Громче!!!
#law #security

"Было установлено, что Uber нарушала Общий регламент ЕС по защите персональных данных (GDPR), передавая и храня информацию о европейских таксистах на серверах в США в течение более двух лет. Речь идёт о разнообразной конфиденциальной информации, включая учётные записи водителей Uber, лицензии на работу в такси, данные о местоположении, фотографии, платёжные реквизиты, удостоверяющие личность документы и др.

DPA уже дважды штрафовала Uber. Первый штраф в размере €600 тыс. был наложен в 2018 году после того, как компания не сообщила об утечке данных, произошедшей двумя годами ранее. В 2023 году Uber была оштрафована на €10 млн за неполную детализацию периодов хранения данных о европейских таксистах. Нынешний штраф стал самым крупным, но Uber собирается его обжаловать."

Закон о хранении данных на серверах определённой страны, если честно, тупейший, и нарушает права людей. На мой взгляд, он не связан с безопасностью клиентских данных НИКАК. От того, расположен сервер в Брюсселе или Атланте, его безопасность не зависит (при условии нахождений в дата-центре с нужным сертификатом защиты). Единственное желание, которое прослеживается - это желание правительств иметь доступ ко всем данным своих граждан. А я ХОЧУ хранить свои личные данные в любой стране, где мне надо, и подите все нахер со своими указаниями, где можно хранить мои данные.

https://3dnews.ru/1110020/uber-oshtrafovali-v-niderlandah-na-290-mln-za-nebezopasnuyu-peredachu-dannih
#hardware #storage

"На территории Таиланда у американской компании Western Digital функционирует предприятие, отвечающее за выпуск 80 % всех жёстких дисков в мире. Компания собирается увеличить его штат почти в полтора раза и вложить в расширение производства $693 млн, данная инициатива уже получила поддержку со стороны местных властей.

За десятилетие власти Таиланда в общей сложности одобрили инвестиции на развитие в стране производства жёстких дисков на сумму $2,43 млрд. В прошлом году разрешение вложить $470 млн на расширение своих производственных мощностей в стране получила американская компания Seagate Technology. Всего по итогам текущего года в различные сферы экономики Таиланда было вложено около $23,5 млрд."

А в России что? Климат не тот, видать.

https://3dnews.ru/1109993/vlasti-tailanda-odobrili-investitsii-western-digital-v-summe-693-mln-napravlyaemie-na-rasshirenie-proizvodstva-gyostkih-diskov
Forwarded from kyrillic
Новая программа для 🇪🇸 испанских номадов от Эстремадуры (региона на границе с Португалией): можно получить до 15к евро за переезд в маленький город региона.

Условия простые: испанский номад-внж и переезд в город региона. Если до 30 лет и в городе до 5 тыс населения, то дают 10к сразу и 5к через два года. Для остальных 8к сразу и 4к через два года (новость, источник).

Подавать можно будет после того, как программу опубликуют в официальном вестнике Эстремадуры через три недели.

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

Полагаю, что стоимость аренды дома/квартиры будет 400-600 евро/мес. На idealista есть и за 300 приличное.

Регион на границе с Португалией - всегда можно разнообразить жизнь поездкой к соседям. Жаль до моря неблизко!

Я бывал в регионе проездом, но никакого мнения не сложилось - вроде обычная приятная провинциальная Испания. Может кто-то из вас там живет или жил? Расскажите!

@kyrillic
Forwarded from kyrillic
⚡️ Быстрая диванная аналитика по обвинениям в отношении Телеграма:

1️⃣ Вменяют по всему сразу, о чем писал в посте - и все виды нелегальный контента, и отмывание денег. Но самое главное - по новой во французском кодексе статье про администрированию ресурсов, которые распространяют плохое. Кажется, что по ней доказать легче всего.

2️⃣ Телеграм теперь официально маргинальная площадка в ЕС. Если в медиа будет раскручиваться этот нарратив (не очень вероятно, но все же), то будут и ограничения всего телеграма в каком-то виде (думаю, что удаление из сторов).

3️⃣ Получение гражданства - это не только права, но и обязанности. Французы могут спокойно судить своего гражданина за преступления в других странах. Про такие риски получения паспорта не говорят, хотя эти строки прочитает множество репатриантов, которым формально запрещено въезжать например в Малайзию.

4️⃣ Ограничения телеграма, точечные по чернухе или глобальные, будут вводиться небыстро, отток из-за них будет медленный. Но начнется процесс и с другой стороны - те, кто рулит нелегальным, станут осторожнее использовать тг, а значит и желающих распространять нелегальное через тг будет меньше.

Очевидно, что и любые монеты, связанные с телеграмом тоже будут использовать меньше, доверия к ним будет меньше.

5️⃣ Если у вас есть средства в официальном кошельке wallet, то я бы их вывел на всякий случай. Там уже висит плашка, что транзакции обрабатываются с задержкой (как подсказывают в комментах - из-за листинга dogs). Ну и самым рисковым можно поиграть в ton, самое время!

@kyrillic
❤‍🔥111
#sklearn #mlgems

У Винсента всегда классные выступления. Кратко рассматривает кэширование конвейера (Pipeline(...,memory=...)), роутинг весов, дообучение для потоковых данных (partial_fit), модуль semi_supervised, Но вы этот раз всё очень кратко и галопом по Европам.

https://www.youtube.com/watch?v=es_8_iT-oQk
#python #books

С трудом дочитал "Л. Рамальо. Python – к вершинам мастерства: Лаконичное и эффективное программирование" (в оригинале - Fluent Python, 2nd Edition).

Книгу скорее не рекомендую. Под 900 страниц, но затронутые темы требуют кратно большего количества материала и примеров.

Мало ценных для бизнеса примеров, в основном какие-то дурацкие. Странная подача материала - при обсуждении продвинутых концепций вроде метаклассов автор в каждой такой главе умоляет не использовать их, обходясь более простыми (и ограниченными) средствами, вместо того чтобы привести конкретные примеры, где применение продвинутых техник наиболее полезно.

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

Русский перевод не рекомендую точно.

Мудила-переводчик перевел на русский абсолютно все термины, к примеру, framework у него не фреймфорк, а каркас. Ты, сука, где слышал, чтобы русскоязычные программисты говорили - я, мол, каркас новый написал давеча...

При этом для зачастую сложных терминов, переведённых им по наитию, он постеснялся указать общепринятые англоязычные эквиваленты. А нахера, ведь его читатель, наверное, никогда не полезет в документацию, не появится на международных форумах, зачем упрощать ему жизнь?

Причем переводил, похоже, Промптом из 2000-х (привет многократноядерным машинам), слово в слово, из-за чего сложилось впечатление, что автор оригинальной книги - косноязычный идиот (так всегда бывает, когда плохой переводчик и редактор). Ощущение, что ни переводчик, ни редактор не являются программистами. Вы зачем тогда взяли эту работу? Через текст приходиться буквально продираться.

Тем не менее, я повыписывал вещи, которые не знал/забыл/показались достойными повторения. Изложу их в нескольких постах ниже.
👍1
#python #codegems

По умолчанию любой экземпляр пользовательского класса считается истинным, но положение меняется, если реализован хотя бы один из методов bool или len. Функция bool(x), по существу, вызывает x.bool() и использует полученный результат. Если метод bool не реализован, то Python пытается вызвать x.len() и при получении нуля функция bool возвращает False. В противном случае bool возвращает True.

В программе на Python переход на другую строку внутри пар скобок [], {} и () игнорируется. Поэтому при построении многострочных списков, списковых включений, генераторных выражений, словарей и прочего можно обходиться без косой черты для экранирования символа новой строки, которая к тому же не работает, если после нее случайно поставлен пробел.

Переменные, которым присвоено значение в операторе :=, остаются доступными и после возврата из включения или выражения – в отличие от локальных переменных, определенных в функции. В документе PEP 572 область видимости оператора := определена как объемлющая функция, если только соответствующая переменная не является частью объявления global или nonlocal.
>>> x = 'ABC'
>>> codes = [last := ord(c) for c in x]
>>> last
67


Если мы хотим произвести сопоставление (match) произвольной последовательности-субъекта, начинающейся с str и заканчивающейся вложенной последовательностью из двух float, то можем написать:
case [str(name), *_, (float(lat), float(lon))]:

Здесь *_ сопоставляется с любым числом элементов без привязки их к переменной. Если вместо *_ использовать *extra, то с переменной extra будет связан список list, содержащий 0 или более элементов.

В NumPy … используется для сокращенного задания среза многомерного массива; например, если x – четырехмерный массив, то x[i, ...] – то же самое, что x[i, :, :, :,]. Имя класса ellipsis записывается строчными буквами, а его экземпляр – встроенный объект Ellipsis. Точно так же обстоит дело с классом bool и его экземплярами True и False.

Остерегайтесь выражений вида a * n, где a – последовательность, содержащая изменяемые элементы, потому что результат может оказаться неожиданным. Например, при попытке инициализировать список списков my_list = [[]] * 3 получится список, содержащий три ссылки на один и тот же внутренний список, хотя вы, скорее всего, хотели не этого.

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

Строка my_dict.setdefault(key, []).append(new_value) дает такой же результат, как
if key not in my_dict:
my_dict[key] = []
my_dict[key].append(new_value)

… с тем отличием, что во втором фрагменте производится по меньшей мере два поиска ключа (три, если ключ не найден), тогда как setdefault довольствуется единственным поиском.


collections.ChainMap хранит список отображений, так что их можно просматривать как единое целое. Поиск производится в каждом отображении в порядке их перечисления в конструкторе и завершается успешно, если ключ найден хотя бы в одном. Например:
>>> d1 = dict(a=1, b=3)
>>> d2 = dict(a=2, b=4, c=6)
>>> from collections import ChainMap
>>> chain = ChainMap(d1, d2)
>>> chain['a']

1
>>> chain['c']

6

MappingProxyType можно использовать для защиты словаря от записи:

from types import MappingProxyType
>>> d = {1: 'A'}
>>> d_proxy = MappingProxyType(d)
>>> d_proxy
mappingproxy({1: 'A'})
>>> d_proxy[1]
'A'
>>> d_proxy[2] = 'x'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'mappingproxy' object does not support item assignment
#python #codegems

Для экономии памяти избегайте создания атрибутов экземпляров вне метода init. По умолчанию Python хранит атрибуты экземпляров в специальном атрибуте dict, который представляет собой словарь, являющийся принадлежностью экземпляра. С тех пор как в версии Python 3.3 было реализовано предложение PEP 412 «Key-Sharing Dictionary», экземпляры класса могут разделять общую хеш-таблицу, хранящуюся в самом классе. На эту общую хеш-таблицу ссылаются атрибуты dict каждого нового экземпляра, имеющего такие же имена атрибутов, что и первый экземпляр этого класса, возвращенный init.

Тогда dict в каждом экземпляре может хранить только собственные значения атрибутов в виде простого массива указателей. Добавление атрибута экземпляра после возврата из init заставляет Python создать новую хеш-таблицу для хранения dict только одного этого экземпляра (такое поведение подразумевалось по умолчанию для всех экземпляров до версии Python 3.3). Согласно PEP 412, эта оптимизация сокращает потребление памяти в объектно-ориентированных программах на 10–20%.

Если вы хотите устранить дубликаты, сохранив при этом порядок первого вхождения каждого элемента, можете воспользоваться простым словарем dict:
>>> dict.fromkeys(l).keys()
dict_keys(['spam', 'eggs', 'bacon'])

dict_keys и dict_items реализуют специальные методы для поддержки операторов над множествами & (пересечение), | (объединение), - (разность) и ^ (симметрическая разность). Например, с помощью & легко получить ключи, встречающиеся в двух словарях:
>>> d1 = dict(a=1, b=2, c=3, d=4)
>>> d2 = dict(b=20, d=40, e=50)
>>> d1.keys() & d2.keys()
{'b', 'd'}


Представление dict_items работает как множество, только если все значения в словаре допускают хеширование. Попытка применить операцию над множествами к представлению dict_items с нехешируемыми значениями приводит к исключению TypeError: unhashable type 'T', где T – тип недопустимого значения. С другой стороны, представление dict_keys всегда можно использовать как множество, потому что все ключи словаря являются хешируемыми по определению. Применение операторов множества к представлениям позволяет отказаться от многочисленных циклов и условных предложений при исследовании содержимого словарей. Заставьте эффективную реализацию Python, написанную на C, работать для вас!

Грег Гандербергер выступает за то, чтобы и дальше использовать класс collections.OrderedDict на том основании, что «явное лучше неявного», а также ради обратной совместимости и потому что некоторые инструменты и библиотеки предполагают, что порядок ключей в dict несуществен.

Истоки JSON следует искать в JavaScript, но так получилось, что это почти точное подмножество синтаксиса Python. JSON совместим с Python во всем, кроме написания значений true, false и null. Армин Ронахер пишет, что ему понравилось «подправить» глобальное пространство имен Python, добавив совместимые с JSON псевдонимы для символов Python True, False и None, так что теперь он может копировать JSON прямо на консоль. Вот как выглядит его идея:
>>> true, false, null = True, False, None
>>> fruit = {
... "type": "banana",
... "avg_weight": 123.2,
... "edible_peel": false,
... "species": ["acuminata", "balbisiana", "paradisiaca"],
... "issues": null,
... }
>>> fruit
{'type': 'banana', 'avg_weight': 123.2, 'edible_peel': False,
'species': ['acuminata', 'balbisiana', 'paradisiaca'], 'issues':
None}


Калеб Хэттинг предлагает всегда использовать кодек UTF-8-SIG при чтении файлов в кодировке UTF-8. Это безвредно, потому что UTF-8-SIG правильно читает файлы с BOM и без BOM и не возвращает сам символ BOM.

Код, который должен работать на разных машинах или в разных ситуациях, не должен зависеть от кодировки по умолчанию. Всегда явно задавайте аргумент encoding= при открытии текстовых файлов, потому что умолчания могут зависеть от машины и даже меняться на одной и той же машине.
#python #codegems

Формы нормализации NFKC и NFKD следует применять с осторожностью и только в особых случаях, например для поиска и индексирования, а не для постоянного хранения текста, поскольку выполняемые ими преобразования могут приводить к потере данных. Формы нормализации NFC и NFD безопасны и позволяют достаточно осмысленно сравнивать Unicode-строки. Для большинства приложений NFC – наилучшая нормализованная форма.

Для удаления всех диакритических знаков из str можно
1) Разложить все символы на базовые и модифицирующие.
2) Найти все модифицирующие символы.
3) Произвести обратную композицию:
import unicodedata
import string
def shave_marks(txt):
"""Remove all diacritic marks"""
norm_txt = unicodedata.normalize('NFD', txt)
shaved = ''.join(c for c in norm_txt if not unicodedata.combining(c))
return unicodedata.normalize('NFC'shaved)


Стандартный способ сортировки не-ASCII текстов в Python – функция locale.strxfrm, которая, «преобразует строку, так чтобы ее можно было использовать в сравнениях с учетом локали». Чтобы можно было воспользоваться функцией locale.strxfrm, необходимо сначала установить локаль, отвечающую нуждам приложения, и надеяться, что ОС ее поддерживает. В системах на базе GNU/Linux (Ubuntu 14.04) при выборе локали pt_BR нужный результат дает последовательность команд

import locale
my_locale = locale.setlocale(locale.LC_COLLATE, 'pt_BR.UTF-8')
print(my_locale)
fruits = ['caju', 'atemoia', 'cajá', 'açaí', 'acerola']
sorted_fruits = sorted(fruits, key=locale.strxfrm)
print(sorted_fruits)

'pt_BR.UTF-8'
['açaí', 'acerola', 'atemoia', 'cajá', 'caju']


Типизированный именованный кортеж можно построить, задав поля в виде именованных аргументов:
Coordinate = typing.NamedTuple('Coordinate', lat=float, lon=float)

Этот код проще читать, а кроме того, он позволяет задать отображение полей на типы в виде **fields_and_types.

Ключевое различие между построителями классов dataclass/namedtuple/NamedTuple – тот факт, что collections.namedtuple и typing.NamedTuple строят подклассы tuple, поэтому экземпляры оказываются неизменяемыми. По умолчанию @dataclass порождает изменяемые классы. Но декоратор принимает именованный аргумент frozen, показанный в примере 5.3. Если frozen=True, то класс возбудит исключение при попытке присвоить какому-либо полю значение после инициализации экземпляра.

Экземпляры класса, построенного с помощью namedtuple, потребляют ровно столько памяти, сколько кортежи, потому что имена полей хранятся в определении класса.

@dataclass эмулирует неизменяемость, генерируя методы setattr и delattr, которые возбуждают исключение dataclass.FrozenInstanceError – подкласс AttributeError, – когда пользователь пытается изменить или удалить поле. Если frozen=False (по умолчанию), то @dataclass установит атрибут hash равным None, сигнализируя о том, что экземпляры не хешируемые, и тем самым отменив метод hash, унаследованный от суперкласса.

Опция default в классе данных существует, потому что обращение к field заменяет значение по умолчанию в аннотации поля. Если мы хотим создать поле athlete со значением по умолчанию False, но не включать это поле в метод repr, то должны будем написать такое определение:
@dataclass
class ClubMember:
name: str
guests: list = field(default_factory=list)
athlete: bool = field(default=False, repr=False)


Декоратору @dataclass безразличны типы в аннотациях, за исключением двух случаев. Один из них такой: если тип атрибута равен ClassVar, то для него не генерируется поле экземпляра. Второй случай, когда тип поля имеет значение для @dataclass, – объявление переменных только для инициализации.

Пример из документации по модулю dataclasses, иллюстрирующий использование переменных только для инициализации:

@dataclass
class C:
i: int
j: int = None
database: InitVar[DatabaseType] = None
def __post_init__(self, database):
if self.j is None and database is not None:
self.j = database.lookup('j')
c = C(10, database=my_database)
#python #codegems

Если используется @dataclass, то аннотации типов перестают быть факультативными. Последние семь лет, с момента выхода документа PEP 484 «Type Hints», нам обещали, что аннотации всегда будут необязательными. А теперь мы имеем важное новое средство языка, которое без них работать не может. Если вам не нравится весь этот уклон в сторону статической типизации, то можете вместо этого пользоваться attrs.

Синтаксис, предлагаемый в PEP 526 для аннотирования атрибутов класса и экземпляра, выворачивает наизнанку установившееся соглашение о предложениях class: все, что объявлено на верхнем уровне блока class, является атрибутом класса (методы – тоже атрибуты класса). А в PEP 526 и @dataclass всякий атрибут, объявленный на верхнем уровне с аннотацией типа, становится атрибутом экземпляра:
@dataclass
class Spam:
repeat: int # атрибут экземпляра


Но если аннотаций типов нет, то мы внезапно возвращаемся в старые добрые времена, когда объявления, находящиеся на верхнем уровне класса, принадлежали самому классу, а не его экземплярам:
@dataclass
class Spam:
repeat = 99 # атрибут класса!

Наконец, если мы хотим аннотировать атрибут класса типом, то не можем использовать регулярные типы, потому что тогда получим атрибут экземпляра. И приходится прибегать к аннотации псевдотипа ClassVar:
@dataclass
class Spam:
repeat: ClassVar[int] = 99 # ррррр!