如何将数据帧传递给对象的方法?

时间:2017-04-20 18:01:14

标签: python class dataframe

为什么此代码会出现以下错误?

  

TypeError:simple_returns()需要1个位置参数但是2个被赋予

import datetime as dt
import math
from matplotlib import style
import numpy as np
import pandas as pd
import pandas_datareader.data as web

start = dt.datetime(2000, 1, 1)
end = dt.datetime(2016, 12, 31)

df = web.DataReader('TSLA', 'yahoo', start, end)


class CalcReturns:
    def simple_returns(self):
        simple_ret = self.pct_change()
        return simple_ret

    def log_returns(self):
        simple_ret = self.pct_change()
        log_ret = np.log(1 + simple_ret)
        return log_ret


myRet = CalcReturns()
c = df['Adj Close']
sim_ret = myRet.simple_returns(c)
print(sim_ret)

2 个答案:

答案 0 :(得分:0)

该行:

sim_ret = myRet.simple_returns(c)

调用CalcReturns.simple_returns()并且似​​乎只传递一个参数。但是python类的方法很特殊,因为python也传递了对象本身。它在第一个参数中执行此操作。这就是你看到模式的原因:

class MyClass():

    def my_method(self):
        """ a method with no parameters, but is passed the object itself """

self被命名为self作为约定来提醒我们它是对象。因此,如果要传递数据帧,则需要将方法签名更改为:

def simple_returns(self, a_df):

答案 1 :(得分:0)

只需在类的方法中添加一个参数即可接收pandas.Series,并确保在系列中应用pct_change()方法,而不是在 self 上应用类对象:< / p>

class CalcReturns:
    def simple_returns(self, ser):
        simple_ret = ser.pct_change()
        return simple_ret

    def log_returns(self, ser):
        simple_ret = ser.pct_change()
        log_ret = np.log(1 + simple_ret)
        return log_ret


myRet = CalcReturns()
c = df['Adj Close']
sim_ret = myRet.simple_returns(c)
print(sim_ret)

# Date
# 2010-06-29         NaN
# 2010-06-30   -0.002511
# 2010-07-01   -0.078473
# 2010-07-02   -0.125683
# 2010-07-06   -0.160937
# 2010-07-07   -0.019243
# 2010-07-08    0.105063
# 2010-07-09   -0.003436
# 2010-07-12   -0.020115