Векторизация кривой подгонки данных с пандами - PullRequest
2 голосов
/ 30 сентября 2019

Я хочу ускорить процесс в кадре данных, где каждая строка в кадре данных - это точки (красные точки на изображении), и я подгоняю каждую строку к многочлену (синие точки на изображении):

graphic

Мой фрейм данных выглядел бы так:

0   21.357071   21.357071   NaN     29.240519   20.909416   23.884323   NaN     NaN     21.533360   19.145000   NaN
1   29.373487   29.373487   NaN     32.593994   26.423960   29.623251   NaN     NaN     30.685534   29.297455   20.411913
2   19.116655   19.116655   NaN     27.120478   18.723265   19.857676   NaN     NaN     20.249647   18.867172   NaN

Я уже сделал это со следующим кодом:

for index,row in df.iterrows():
  dataR = row[:].dropna()

  x = np.array(dataR.index).astype(float) #x = column index
  y = dataR.values
  y = np.vstack(y).astype(np.float).T[0]  #y = value

  coefs = poly.polyfit(x, y, deg=4)
  ffit = poly.polyval(np.arange(0,maxColumns,1), coefs)
  df.loc[index,0:maxColumns] = ffit

Но мой фрейм данных оченьбольшой, так что это медленно. Интересно, смогу ли я векторизовать этот код?

1 Ответ

1 голос
/ 30 сентября 2019

Так как похоже, что вы обрабатываете каждую строку независимо и выполняете подгонку кривой, независимо от того, как выглядят другие строки, я думаю, вы можете просто распараллелить код, используя joblib , так что вы можете сделать

from joblib import Parallel, delayed

function fit_curve(row):
    dataR = row[:].dropna()
    x = np.array(dataR.index).astype(float)
    y = dataR.values
    y = np.vstack(y).astype(np.float).T[0]
    coefs = poly.polyfit(x, y, deg=4)
    ffit = poly.polyval(np.arange(0,maxColumns,1), coefs)
    return ffit

fitted_curves = Parallel(n_jobs=N)(delayed(fit_curve)(row) for index, row in df.iterrows())
df.loc[:,:] = fitted_curves

где N - количество рабочих, ака. ядра, которые вы хотите использовать для этого.

...