Преобразование типов данных Dask и повторная выборка - PullRequest
0 голосов
/ 27 февраля 2019

Я здесь из чата и опубликую свой код

df['DateTime']=dd.to_datetime(df['DateTime'])
df['KWH/hh (per half hour) '].astype(float)
df=df['KWH/hh (per half hour) '].fillna(0)
df=df.set_index(df['DateTime'], npartitions='auto')
df=df.resample('D').sum()

, когда я запускаю код в прототипе. 20% моих исходных данных заняло около 1,8 минут, но для получения реальных данных (1,2gB) экспоненциальное увеличение времени (более 1 часа). Я пробовал ту же проблему с чанками и читал csv, это намного быстрее и лучше, чем генераторы.Мой вопрос заключается в том, как повысить производительность, поскольку я использую Pro с 8 ядрами.Dask должен дать мне лучшую производительность при параллельных вычислениях, верно?

отредактировал это мои генераторы:

start=time.time()
before= memory_footprint()
dataframes = (pd.read_csv(fname) for fname in filenames)
temp=(remove_unnessasey_data(df,l1) for df in dataframes)
help=(change_structure(t) for t in temp)
for i in(1,688):
    dd.append(next(help))
after= memory_footprint()
du=time.time()-start

1 Ответ

0 голосов
/ 27 февраля 2019

Вы упоминаете, что можете выполнять эту операцию "генератором" или "кусками".Это говорит о том, что ваш временной столбец уже отсортирован.Как указывает doc , вы должны сказать Dask об этом, чтобы он не сортировал ваши данные, что вполне может быть главной причиной медлительности здесь.

Еще одно предложение, вы начинаетес тремя строковыми операциями одна за другой.Вы можете вместо этого попробовать map_partitions, чтобы выполнить три шага за один шаг.

def preprocess(df):
    df['DateTime'] = pd.to_datetime(df['DateTime'])
    df['KWH/hh (per half hour) '] = df['KWH/hh (per half hour) '].astype(float)
    return df['KWH/hh (per half hour) '].fillna(0)

df = df.map_partitions(preprocess)
...