Dask文档指出,Dask的set_index比Pandas(http://docs.dask.org/en/latest/dataframe-api.html#dask.dataframe.DataFrame.set_index)昂贵得多
请记住,以下哪一项是最佳做法(“时间”列中填充了日期时间对象)。
Dask中的set_index:
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)
我也欢迎任何建议来改进示例代码。
答案 0 :(得分:1)
我想知道为什么您需要一个将time
列复制到time_index
的示例?
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
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
这里,只要我们从time
中读取,就可以使用infer_division并将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