Проблемы с производительностью при работе с панд и битовыми данными

#python #pandas #bitset

Вопрос:

Я запускаю скрипт, который обрабатывает данные набора битов в фрейм данных pandas. По сути, он проверяет набор битов, создает новый столбец для первого бита и присваивает значение строке для этого бита. Затем он повторяет этот шаг для следующего бита в исследуемом наборе битов, а затем продолжает этот процесс до конца этого диапазона наборов битов. Как только диапазон наборов битов будет заполнен 1 и 0 для этого момента времени (этой строки), он переходит к следующему индексу и устанавливает значения для следующей строки.

Я использую словарь для хранения битовых значений (новых столбцов) для каждого бита в битовых наборах. Некоторые из моих наборов битов имеют длину 16 бит, поэтому мне нужно создать 16 новых столбцов и установить значение для каждого из битов в этот момент времени. т. Е. Установить 16 «ячеек» в этой строке.

Это нетрудно заметить, когда я запускаю этот код (мой набор данных немного больше, чем в приведенном ниже примере, и я запускаю его примерно на 300 наборах бит, около 16 бит). У меня возникают серьезные проблемы с производительностью в этом цикле. Мне кажется очевидным, что Big-O связан с циклом for, но я не могу придумать лучшего способа.

Предложения были бы весьма признательны.

 def add_bitsets_to_df(df, mvb_dic, key):
    for new_col in mvb_dic[key]:
        df[new_col] = df[key].copy().apply(lambda x: get_bitset_value(x, mvb_dic[key][new_col]))

def get_bitset_value(cell_value, bit):
    return int(bin(cell_value >> bit amp; 0b1), 2)

mvb_dic = {'mvb_bitset_1': 'mvb_bit1_1': 0, 'mvb_bit1_2': 1, 'mvb_bit1_3': 2, 'mvb_bit1_4': 3, 'mvb_bit1_5': 4, 'mvb_bit1_6': 5, 'mvb_bit1_7': 6, 'mvb_bit1_8': 7}
 

Мой фрейм данных панд (df) будет выглядеть примерно так:

     mvb_bitset_1    mvb_bitset_2   . . . 
0   127             32
1   2               1
2   19              17
3   65              7
4   5               1
.
.
 

Из серии данных вы можете видеть, что несколько наборов битов «перевернуты», поэтому я вынужден использовать цикл для присвоения 1 или 0 каждому столбцу, представляющему каждый бит в наборе битов.

Я использую данные для создания графиков, чтобы просматривать журналы MVB, полученные с некоторых устройств, с которыми я работаю. Возможно, создание фреймов данных не является решением, так как я отбрасываю df после создания графика. Однако было бы неплохо иметь возможность создавать csv-файлы позже, поэтому я пошел по этому пути.