Я пытаюсь реализовать следующий алгоритм в Python, и, хотя я успешно добился того же результата, мое время обработки действительно медленное.Автор этого алгоритма утверждает, что его производительность по крайней мере в несколько раз выше, чем у меня.
Некоторые подробности о обрабатываемых мной базах данных:
- нет таблиц: 200
- общий размер: 3 ГБ
Input: attributes: set of attribute objects with their sorted values and their
respective refs sets (the IND candidates)
Output: Set of satisfied INDs.
Min-Heap heap := new Min-Heap( attributes )
while heap != ∅ do
//getattributes with equal min.value
att := heap.removeMinAttributes()
foreach A ∈ att do
// update list A.refs
A.refs := A.refs ∩ att
// process next value
if A has next value then
A.moveCursor()
heap.add(A)
else
foreach B ∈ A.refs do
INDs := INDs ∪ { A ⊆ B }
return INDs
Определения:
- attributes
: столбцы, в которых хранятся только уникальные значения, и они сортируются в порядке возрастания
- att
: все столбцы, в которых они имеют одинаковые минимальные значенияв куче
- IND
: пара столбцов, например, столбец A и столбец B, где все значения в столбце A указаны в столбце B
- A.refs
: список всех столбцов, которые содержат значениястолбец A
Структура данных кучи должна выглядеть примерно так:
A B C
1 1
3 3
5 5 5
7
Моя текущая структура данных выглядит как
A B C
1 1 1 nan
3 3 nan 3
5 5 5 5
7 nan nan 7
Итак, моя реализация алгоритмазаключается в том, что для каждого индекса фрейма данных получают имена столбцов с таким значением.
Это правильный способ реализации min heap
?Если нет, то как мне это сделать?
РЕДАКТИРОВАТЬ Ниже приведен мой код для реализации
ind_dict = {'A': ['B', 'C'],
'B': ['A', 'C'],
'C': ['A', 'B']}
dataframe = pd.DataFrame(data={'A': [1, 3, 5, np.nan],
'B': [1, np.nan, 5, np.nan],
'C': [np.nan, 3, 5, 7]},
index=[1, 3, 5, 7])
def algorithm(self, dataframe, ind_dict):
# for each cursor value, get all columns that has it
for cursor, i in zip(dataframe.index, range(0, len(dataframe.index))):
# columns that contain the current cursor value
column_containing_cursor = [i for i, x in enumerate(dataframe.iloc[i]) if x == cursor]
atts = [list(dataframe.iloc[i].index)[n] for n in column_containing_cursor]
# for each column in ind_dict.keys(), intersect its values with atts to get the remaining att.refs
# if the current column value is null, then do nothing
for key in ind_dict.keys():
column_val = dataframe.loc[cursor, key]
if (column_val == column_val) & (column_val != ''):
ind_dict[key] = list(set(ind_dict[key]).intersection(atts))