Лучше ли устанавливать set_index в Pandas, а затем конвертировать в Dask или наоборот? - PullRequest
1 голос
/ 05 июня 2019

Документация Dask гласит, что set_index Dask намного дороже, чем у Pandas (http://docs.dask.org/en/latest/dataframe-api.html#dask.dataframe.DataFrame.set_index)

Имея это в виду, что из следующего должно быть наилучшей практикой (столбец 'time' заполнен объектами datetime).

set_index в Dask:

        df['time_index'] = df['time']
        df = dd.from_pandas(df, npartitions=100)
        df = df.set_index('time_index', sorted=True)

set_index в пандах

        df['time_index'] = df['time']
        df = df.set_index('time_index')
        df = dd.from_pandas(df, npartitions=100)

Я приветствую любые рекомендации по улучшению моего примера кода.

1 Ответ

1 голос
/ 05 июня 2019

Мне интересно, зачем вам нужно дублировать столбец time до time_index, в любом случае вот пример

Создать df

import numpy as np
import pandas as pd
import dask.dataframe as dd


N =  int(1e7)
times = pd.date_range(start="2019-01-01", periods=N, freq="1s")
df = pd.DataFrame({"time":times,
                   "value":np.random.randn(N)})

df.to_csv("df.csv", index=False)
df.to_parquet("df.parq")

Установить индекс в пандах

%%time
df = pd.read_csv("df.csv", parse_dates=['time'])
df = df.set_index("time")
df = dd.from_pandas(df, npartitions=100)

a = df.divisions

CPU times: user 10.7 s, sys: 503 ms, total: 11.2 s
Wall time: 9.81 s

Установить индекс в dask

time
df = pd.read_csv("df.csv", parse_dates=['time'])
df = dd.from_pandas(df, npartitions=100)
df = df.set_index("time", sorted=True)
b = df.divisions

CPU times: user 11.3 s, sys: 534 ms, total: 11.8 s
Wall time: 10.4 s

Деления одинаковы

print(a==b)

True

Читать с dask

Здесь мы можем использовать infer_division и использоватьtime как индекс, пока мы читаем из parquet.

%%time
df = dd.read_parquet("df.parq", index="time", infer_divisions=True)
df = df.repartition(npartitions=100)
c = df.divisions

CPU times: user 9.54 ms, sys: 22 µs, total: 9.56 ms
Wall time: 8.9 ms

В этом случае деление не совпадает

print(c==a)

False

Но это не должно бытьбольшое дело

print(c[:2])

(Timestamp('2019-01-01 00:00:00'),
Timestamp('2019-01-02 03:46:39.990000128'))

Выводы

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

!ls -lh df.*

-rw-rw-r-- 1 username username 378M Jun  5 14:59 df.csv
-rw-rw-r-- 1 username username 164M Jun  5 14:59 df.parq
...