2016-10-19 16 views
1

我想要在函數中使用Python/pandas中的參數。 例如軋製數據幀的統計數據:函數中的參數方法

def rolling (df, prefix = 'r', window = 3, method = 'here I wanna choose a method'): 
    for name in df.columns: 
     df[prefix + name] = df[name].rolling(window).'here this method been called' 
    return df 

'的意思是()' 或 '之和()' 或任何... 像

df.rolling(2).sum() 

我的工作95%的時間在R,並在R很簡單(將函數作爲參數或返回任何函數)。但在蟒蛇我noob。所以我創建了一個包讓我更容易。像:

def head(x,k = 3): 
    return x.head(k) 

python中的哪些函數幫助我在函數中使用方法參數?

#some data 
import numpy as np 
import pandas as pd 
from pandas_datareader.data import DataReader 
from datetime import datetime 
ibm = DataReader('IBM', 'yahoo', datetime(2000,1,1), datetime(2016,1,1)) 

ibm2 = rolling(ibm,'rr', 5, 'sum') # something like this 

回答

1

我這樣做

def rolling (df, prefix='r', window=3, method='method_name'): 
    for name in df.columns: 
     df[prefix + name] = df[name].rolling(window).__getattribute__(method)() 
    return df 
3

您可以使用getattr以及方法的名稱str。這得到來自對象名稱的屬性(在這種情況下,一種方法)

def rolling (df, prefix='r', window=3, method='sum'): 
    for name in df.columns: 
     df[prefix + name] = getattr(df[name].rolling(window), method)() 
    return df 

或者你可以只通過該方法。調用它時,第一個參數將是self

def rolling (df, prefix='r', window=3, method=DataReader.sum): 
    for name in df.columns: 
     df[prefix + name] = method(df[name].rolling(window)) 
    return df 
0

的方法是像任何其他屬性(它只是發生在綁定到一個對象可以被調用),所以你可以使用getattr。 (中None默認值是廢話,當然,但我不想重新排列你的簽名,使method早期沒有默認值出現。)

def rolling (df, prefix='r', window=3, method=None): 
    for name in df.columns: 
     obj = df[name].rolling(window) 
     m = getattr(obj, method) 
     df[prefix + name] = m() 
    return df 
+0

好,None'的'默認值可能會是一個很好的方法來發現錯誤。 – Artyer

+0

正確;我將離開對不存在方法的錯誤處理的討論留給讀者自行決定。 – chepner