2014-02-03 4 views
1

Я пытаюсь запустить функцию корреляции np в столбце dataframe по столбцу, но корреляция, которую я хочу запустить, - это сама серия. Например, скажем, df - это наш dataframe, а ts - первый столбец df. Я хочу позвонить np.correlate(ts, ts, method="full").Как применить функцию, которая принимает вызывающего в качестве ее решения

df = pd.DataFrame([[1,1],[2,2],[3,3],[4,4],[5,5]], index=range(5), columns=list("ab")) 

def acf(R): 
    """ 
    Calcualte the auto correlation function of a series with lag 0 up to the length 
    of the series. 
    """ 
    y = R - R.mean() 
    result = y.apply(np.correlate, (y, "full")) 
    result = result[len(result)//2:] 
    result /= result[0] 
    return result 

acf(df) 

NameError: name 'y' is not defined 

Что мне делать для этого?

ответ

1

pandas.Series объекты, как правило, хорошо работают с numpy функции так определяя вашу функцию

def acf(R): 
    """ 
    Calcualte the auto correlation function of a series with lag 0 up to the length 
    of the series. 
    """ 
    y = R - R.mean() 
    result = np.correlate(y, y, 'full') 
    result = result[len(result)//2:] 
    result /= result[0] 
    return result 

А затем применить его к DataFrame с df.apply(acf) должны работать.

In [4]: import numpy as np 

In [5]: import pandas as pd 
    ...: def acf(R): 
    ...:  """ 
    ...:  Calcualte the auto correlation function of a series with lag 0 up to the length 
    ...:  of the series. 
    ...:  """ 
    ...:  y = R - R.mean() 
    ...:  result = np.correlate(y, y, 'full') 
    ...:  result = result[len(result)//2:] 
    ...:  result /= result[0] 
    ...:  return result 
    ...: df = pd.DataFrame([[1,1],[2,2],[3,3],[4,4],[5,5]], index=range(5), columns=list("ab")) 
    ...: 

In [6]: df.apply(acf) 
Out[6]: 
    a b 
0 1.0 1.0 
1 0.4 0.4 
2 -0.1 -0.1 
3 -0.4 -0.4 
4 -0.4 -0.4 
+0

Спасибо! Это на самом деле первый подход приходит мне на ум, но каким-то образом я получил ошибку, реализуя его. Он работает сейчас. благодаря – zsljulius

1

Как это:

def acf(R, ref_col='a'): 
    """ 
    Calcualte the auto correlation function of a series with lag 0 up to the length 
    of the series. 
    """ 
    y = R - R.mean() 
    result = pd.DataFrame([np.correlate(i, R[ref_col], "full") for _,i in R.iteritems()], index=R.columns).T 
    result = result[len(result)//2:] 
    result /= result.iloc[0,:] 
    return result 

acf(df) 
+0

Это замечательно, спасибо @dmvianna. Он напрямую решает мою проблему. – zsljulius

Смежные вопросы