#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-файлы позже, поэтому я пошел по этому пути.