LINUX.ORG.RU

Что делать, если количество атрибутов постоянно растет?

 


1

1

Допустим, пока он один, всё нормально, когда их два - это выглядит уже криво, но когда их больше, то это получается писец. Что делать в таких случаях? Использовать newattrs?

attr_1 = pd.read_csv(f"attr_1.csv", sep=';')
attr_2 = pd.read_csv(f"attr_2.csv", sep=';')
attr_3 = pd.read_csv(f"attr_3.csv", sep=';')

Вот рабочий, но крайне медленный из-за перезагрузок кот:

for x in texts:
    for i in range(5): 
        attr = pd.read_csv("attr_{}.csv".format(i), sep=';')
        data_filter(attr, x)

Я хочу избавиться от перезагрузок не склеивая датафреймы.

★★★★★

Последнее исправление: steemandlinux (всего исправлений: 3)

Ответ на: комментарий от steemandlinux

Не хочешь конкатить все прочитанное? Или не хочешь читать всё что есть? Тогда из задачи ускользает логика добавления этих атрибутов

phoen ★★
()
Последнее исправление: phoen (всего исправлений: 1)
Ответ на: комментарий от phoen

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

steemandlinux ★★★★★
() автор топика

Не совсем понятно, в чём проблема. Если я правильно понял, тебе нужен просто список attr вместо именования attr_1 и т.д.

number_of_attrs = 3  # количество атрибутов
attr = [pd.read_csv("attr_{}.csv".format(i), sep=';') for i in range(number_of_attrs+1)]
# ну и дальше просто используй attr[1] вместо attr_2, и так далее…

Если это не то, что было нужно, переформулируй задачу.

anonymous
()
Ответ на: комментарий от anonymous

Ну вообще-то каждая операция read_csv занимает 80% времени, а мне надо загрузить один раз и потом данные постоянно в памяти висели.

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Не надо мне данные аттрибута переписывать, а создавать новый, но я так понял придется newattrs использовать. Я думал может какой-то способ есть сохранить их во что-то типа словаря или массива.

steemandlinux ★★★★★
() автор топика
Последнее исправление: steemandlinux (всего исправлений: 1)
Ответ на: комментарий от steemandlinux

path = '/apps/share/'
def get_req(path):
    req_ar = []
    for r, d, f  in os.walk(path):
        for i in f:
            if i[-3:] == '.gz':
                df = pd.read_csv(r+i, compression='gzip', header=0, sep=',', quotechar='"', error_bad_lines=False)
                df['name'] =i
                req_ar.append(df)
    return req_ar

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

phoen ★★
()
Последнее исправление: phoen (всего исправлений: 3)
Ответ на: комментарий от anonymous
for x in range(9000):
    for i in range(5): 
        attr = [pd.read_csv("attr_{}.csv".format(i), sep=';') for i in range(number_of_attrs+1)]
        data_filter(attr)

Склеивание датафрейма и то быстрее будет.

steemandlinux ★★★★★
() автор топика

поместить свои переменные в массив и ехать по файлам в цикле, подставляя индекс элемента в часть имени файла, так вместо кучи переменных будут данные, каждый кусок по своему индексу, менять придется только одну циферку - количество файлов, а можно сделать что и менять не надо - сортируешь список файлов содержащих в имени индекс (натсорт) и в цикле как и раньше обрабатываешь.

deep-purple ★★★★★
()
Ответ на: комментарий от steemandlinux

Что это?

Я без понятия, что эта вся писанина делает, откуда взялось 9000 и 5, и почему data_filter делается на весь массив из attr, а не на каждый. Но наверное тебе надо так:

attr = [pd.read_csv("attr_{}.csv".format(i), sep=';') for i in range(1, number_of_attrs+1)]
for x in range(9000):
    for i in range(5): 
        data_filter(attr)

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

anonymous
()
Ответ на: комментарий от steemandlinux

Слушай, ты вообще сам понимаешь хоть примерно, что делаешь? Или кодинг исключительно методом копипасты?

anonymous
()
Ответ на: комментарий от deep-purple

++

И/или можешь попробовать использовать modin ( https://github.com/modin-project/modin ). Он тащит засобой redis, но помимо прочего хорошо сэкономишь на оперативе. И да, там до сих пор есть ряд неприятных багосов (смотри issues), так что возможность его применения сильно зависит от конкретно твоего кейса.

phoen ★★
()
Последнее исправление: phoen (всего исправлений: 2)
Ответ на: комментарий от anonymous

Ты о чем? Это поле с именем датафрейма, по которому потом отфильтровываются данные.

steemandlinux ★★★★★
() автор топика
Последнее исправление: steemandlinux (всего исправлений: 1)
Ответ на: комментарий от steemandlinux

В моем случае это предполагалось, но если нет нужды - выноси в имя например и просто вынимай нужный df из листа. Пока не сделаешь pd.concat(df_list) они ж все равно не склеятся.

phoen ★★
()

Что делать, если количество атрибутов постоянно растет?

Вот рабочий, но крайне медленный из-за перезагрузок кот:

Я хочу избавиться от перезагрузок не склеивая датафреймы.

Очень много специфичных терминов на квадратный сантиметр текста. Причем здесь «кот»? Ты переработал, иди, отдохни.

По теме. Набросок

# cперва подготавливаешь данные
for f in file_names:
    data[f]=read(f)
# можешь "упростить" всякими  list comprehensions

# потом работаешь с загруженными данными
for f in data:
    process(data[f])
anonymous
()
Ответ на: комментарий от steemandlinux

Снесёт целиком строку у которой в одном из полей есть Nan/Nat.

Первый пример в доке: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html

Зависит от данных, но часто безопасней использовать fillna() и заменить NaN’ы на нули.

phoen ★★
()
Последнее исправление: phoen (всего исправлений: 2)
Ответ на: комментарий от steemandlinux

Скажу больше - NaN это float :)

Ну и None != ‘None’ (первое объект, второе строка).

phoen ★★
()
Последнее исправление: phoen (всего исправлений: 2)
Ответ на: комментарий от anonymous

А я слоупок, доперло, я [] забыл и поэтому у меня листы не работали и сейчас дошло что ты просто лист сделал.

steemandlinux ★★★★★
() автор топика
Последнее исправление: steemandlinux (всего исправлений: 1)

нагородили… pd.concat(…, ignore_index=True,copy=False) сделает примерно то же что выкрутасы с внешней коллекцией стоблцов, просто надо дальше аккуратно работать с полным датафреймом, пока отфильтрованое подмножество не скопировали оттуда, и не будет просадки по скорости.

в частности фильтр заменить на: [code] data.loc[bool_array_1 & bool_array_2] [/code]

anonymous
()

Попробуй dask или datatable. Они шустрее гораздо.

sekekeke
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.