В массивном массиве dtype np.datetime64 или pandas объект datetime.date быстрее? - PullRequest
0 голосов
/ 26 января 2019

Я хочу отфильтровать массив данных как можно быстрее? Должен ли я использовать панды или NumPy? Если я использую numpy, какой тип данных мне следует использовать?

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

* ПРИМЕЧАНИЕ: После поиска вопросов, которые отвечают на этот вопрос, я не смог найти подходящий ответ, поэтому я опубликовал его на случай, если кто-то еще окажется в подобной ситуации. Ответ ниже.

1 Ответ

0 голосов
/ 26 января 2019

После тестирования трех вариантов использование numpy с объектами панд является самым быстрым.Это весьма важно, когда набор данных становится больше и когда вы тестируете «выходные данные» отдельно от создания массива numpy.

* Только кадр данных Pandas

%%timeit
start_date = date(2015, 1, 26)
end_date = date(2018, 1, 26)

df = pd.DataFrame(pd.date_range(start_date, end_date), columns=['Date'])
df['Date'] = pd.to_datetime(df['Date']).dt.date
df['Range'] = range(df.shape[0])

max_date = date(2017, 1, 1)
df.loc[df['Date'] <= max_date]
3.02 ms ± 126 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

* Только Numpy

%%timeit
start_date = date(2015, 1, 26)
end_date = date(2018, 1, 26)

df = pd.DataFrame(pd.date_range(start_date, end_date), columns=['Date'])
df['Date'] = pd.to_datetime(df['Date']).dt.date
df['Range'] = range(df.shape[0])

max_date = date(2017, 1, 1)
np_df = np.array(df.values, dtype=np.datetime64)
output = np.where(np_df[:,0] <= max_date)
3.99 ms ± 144 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Numpy с объектами панд

%%timeit
start_date = date(2015, 1, 26)
end_date = date(2018, 1, 26)

df = pd.DataFrame(pd.date_range(start_date, end_date), columns=['Date'])
df['Date'] = pd.to_datetime(df['Date']).dt.date
df['Range'] = range(df.shape[0])

max_date = date(2017, 1, 1)
np_df = np.array(df.values)
output = np.where(np_df[:,0] <= max_date)
2.44 ms ± 31.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...