Правильная условная цепочка в PolarsPython

Программы на Python
Anonymous
Правильная условная цепочка в Polars

Сообщение Anonymous »

У меня есть фрагмент кода, который условно применяет дополнительные манипуляции к столбцу (

Код: Выделить всё

'NaicsDescription'). Я не уверен, что это лучший/самый чистый способ сделать это в Polars. Несмотря на то, что это, кажется, работает, и мы будем признательны за некоторые рекомендации.
Идея состоит в том, чтобы...
[list]
[*]применить к столбцу операцию нижнего регистра,
[*]условно применить некоторые дополнительные операции
[*]и, наконец, завершить некоторыми дополнительными общими операциями.
[/list]
Есть это правильно?
import polars as pl
from unicodedata import normalize
from lingua import Language, LanguageDetectorBuilder
from nltk.corpus import stopwords

languages = [Language.ENGLISH, Language.FRENCH]
detector = LanguageDetectorBuilder.from_languages(*languages).build()

test = pl.DataFrame(
{
"id": [1, 2, 3, 4],
"NaicsDescription": ['Full service restuarants', 'The Manufacturing of toys and trains', 'POWER GENERATING STATIONS', 'the short term rental of cottages']
}
)

def lang_identifier(text: str):
'''
Language identification of text. This is just a simple wrapper around lingua function.

Parameters
----------
text : str
Input string to identify language for.

Returns
-------
language : str
Returns either 'EN' or 'FR' or None if input text is not of type string.

'''
language = None
if isinstance(text, str):
language = detector.detect_language_of(text)
if language:
language = language.iso_code_639_1.name
return language

en_stopwords = '|'.join(set(w.lower() for w in stopwords.words('english')))
fr_stopwords = '|'.join(set(w.lower() for w in stopwords.words('french')))
bilingual_stopwords = '|'.join(set(w.lower() for w in stopwords.words('english') + stopwords.words('french')))

test = test.with_columns(
pl.col('NaicsDescription')
.str.to_lowercase().alias('NaicsDescription_')
).with_columns(
pl.when(pl.col('NaicsDescription').map_elements(lang_identifier, return_dtype=pl.String) == 'FR')
.then(
pl.col('NaicsDescription_').str.replace_all(r'\b(?:' + fr_stopwords + r')\b', ' ')
)
.when(pl.col('NaicsDescription').map_elements(lang_identifier, return_dtype=pl.String) == 'EN')
.then(
pl.col('NaicsDescription_').str.replace_all(r'\b(?:' + en_stopwords + r')\b', ' ')
)
.otherwise(
pl.col('NaicsDescription_').str.replace_all(r'\b(?:' + bilingual_stopwords + r')\b', ' ')
)
).with_columns(
pl.col('NaicsDescription_').map_elements(lambda x: normalize('NFKD',x)
.encode('ascii', errors='ignore')
.decode('utf-8'), return_dtype=pl.String)
.str.replace_all(r'(?:[^\s\w]|_\d)+', ' ')
.str.replace_all(r'\b(?:\d+|\w{1,2})\b', ' ')
.str.replace_all(r'\s\s+', ' ')
.str.strip_chars()
.replace('', None)
)
редактировать: добавлен полный рабочий пример...


Подробнее здесь: https://stackoverflow.com/questions/785 ... -in-polars

Вернуться в «Python»