Как улучшить время выполнения этого простого кода очистки данных? - PullRequest
0 голосов
/ 17 апреля 2019

Я предварительно обрабатываю большой массив данных для анализа.По сути, я пытаюсь найти наибольшее число или значение, близкое к наибольшему (в столбце «больше» определено больше, чем 0.9*largest number), и пометить его как 1, а остальные позиции оставить как 0, т.е. еслистолбец содержит [25, 3, 5, 24, 0] он должен быть преобразован в [1,0,0,1,0].Каким-то образом код, который я написал, работает вечно.

Я написал простое понимание списка для очистки данных столбец за столбцом.Код запустился менее чем за 1 секунду для первых 2000 столбцов.Однако это стало очень медленным и заняло больше получаса, когда я увеличил количество столбцов до 10000.В конце концов я хочу запустить этот код в наборе данных с 5 миллионами строк, есть ли что-то неправильное, что я должен изменить, чтобы сделать его более эффективным?

tic = time.time()

for col in temp_dataset_1.iloc[:,:10000]:
    temp_dataset_1[col] = [1 if i >= i.max()*.9 else 0 for i in temp_dataset_1[col]]

toc = time.time() - tic
print('Calculating 10,000 out of 5,810,172 rows took %d seconds' %toc)
#temp_dataset_1.iloc[:,:10000].head(n=5)

Мои знания о структуре данных ограничены, есть что-тоочевидно, что я пропускаю?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Попробуйте этот подход, используя numpy:

import time
import pandas as pd
import numpy as np

# Create fake data (this should take around 9s)
tic = time.time()
value2 = []
for x in range(10000):
    value1 = []
    for y in range(10000):
        value1.append(x)
    value2.append(value1)

print(time.time() - tic)
tic = time.time()
temp_dataset_1 = pd.DataFrame(value2)


for col in temp_dataset_1.iloc[:,:10]:
    max_value = max(temp_dataset_1[col])
    a = np.array(temp_dataset_1[col].values.tolist())
    temp_dataset_1[col] = np.where(a >= max_value*.9, 1, 0).tolist()

print(temp_dataset_1.shape)
toc = time.time() - tic
print('Calculating 10,000 out of 5,810,172 rows took %d seconds' %toc)

Для матрицы 10K x 10K время составило 19 секунд:

Calculating 10,000 out of 5,810,172 rows took 19 seconds
0 голосов
/ 17 апреля 2019

Найдите максимальное значение столбца перед шагом понимания списка и выполните итерации только по именам столбцов.

import pandas as pd
temp_dataset_1 = pd.DataFrame({'A':[25,3,5,25,0,1,2], 'B':[20, 21, 19, 18,17,25,26]})
for col in list(temp_dataset_1):
    compare_val = temp_dataset_1[col].max()*.9
    temp_dataset_1[col] = [1 if i >= compare_val else 0 for i in temp_dataset_1[col]]

исходный кадр данных:

   A   B
0  25  20
1   3  21
2   5  19
3  25  18
4   0  17
5   1  25
6   2  26

после изменения значений:

   A  B
0  1  0
1  0  0
2  0  0
3  1  0
4  0  0
5  0  1
6  0  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...