Ускорение функции «между» с помощью dask эквивалента - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь найти быстрый способ добавления нового столбца в кадре данных DASK, в котором добавляемые значения основаны на условиях. Мне был рекомендован подход с использованием numpy, но он сравнительно медленный.

В настоящее время я загружаю CSV-строку длиной 11 м, добавляя несколько новых столбцов, каждый из которых имеет формульные вычисления, и печатающую головку и хвост - менее чем за 10 секунд.

Код, который в настоящее время используется длямедленная / хлопотная функция ниже. Хотелось бы узнать, есть ли эквивалентный подход, родной для dask , или же можно улучшить структуру простого запроса для повышения производительности.

Это код, о котором идет речь Время выполнения этого составляет 60 секунд + - по умолчанию я получаю ошибки = 0, поэтому я не уверен, каково общее время выполнения. Я надеюсь, что время выполнения может быть уменьшено до нескольких секунд.

import dask.dataframe as dd
import dask.multiprocessing
import dask.threaded
import pandas as pd
import numpy as np #I'd like to not use this if possible

# Dataframes implement the Pandas API
import dask.dataframe as dd

ddf["AndHeathSolRadFact"] = np.select(
    [
    (ddf[ddf['Month'].between(8, 12)]),
    (ddf[ddf['Month'].between(1, 2) & ddf['CloudCover']<30])
    ],  #list of conditions
    [1, 1],     #list of results
    default=0)      #default if no match

И наоборот (в качестве примера) , время выполнения которого составляет 8 секунд . Преобразование даты, число Дата-время в месяц и приличная формула .:

import dask.dataframe as dd
import dask.multiprocessing
import dask.threaded
import pandas as pd

# Dataframes implement the Pandas API
import dask.dataframe as dd

from timeit import default_timer as timer
start = timer()
ddf = dd.read_csv(r'C:\Users\i5-Desktop\Downloads\Weathergrids.csv')

ddf['DateTime'] = dd.to_datetime(ddf['Date'], format='%Y-%d-%m %H:%M')
ddf['Month'] = ddf['DateTime'].dt.month

ddf['Grass_FMC'] = (97.7+4.06*ddf['RH'])/(ddf['Temperature']+6)-0.00854*ddf['RH']+3000/ddf['Curing']-30
print(ddf.head())
end = timer()

Я надеюсь значительно улучшить производительность первого данного блока кода, где я оцениваю, что такое месяц, а такжепроверка облачного покрова.

1 Ответ

0 голосов
/ 06 октября 2019

Правильный ответ ниже. Оказывается, я передавал фрейм данных вместо логического массива.

ddf["AndHeathSolRadFact"] = np.select(
    [
    (ddf['Month'].between(8,12)),
    (ddf['Month'].between(1,2) & ddf['CloudCover']>30)
    ],  #list of conditions
    [1, 1],     #list of results
    default=0)    #default if no match
...