Paw in Data
Paw in Data

Reputation: 1574

Why is `to_numpy()` recognized as an attribute rather than a method of dataframe?

import pandas as pd
import numpy as np

class CLF:
    Weights = 0
    
    def fit(DF_input, DF_output, eta=0.1, drop=1000):
        X, y = DF_input.to_numpy(copy=True), DF_output.to_numpy(copy=True)
        N,d = X.shape
        m = len(np.unique(y))   
        self.Weights = np.random.normal(0,1, size=(d,m))


INPUT = pd.read_csv(path_input)
OUTPUT = pd.read_csv(path_output)
clf = CLF()
clf.fit(INPUT, OUTPUT)

I defined a method .fit() for the class I wrote. The first step is convert two dataframes into numpy arrays. However, I got the following error when I tried to use the method, although INPUT.to_numpy(copy=True) and OUTPUT.to_numpy(copy=True) both work fine in their own right. Can somebody help me out here? Why was to_numpy recognized as an attribute rather than a method of dataframes?

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-22-a3d455104534> in <module>
      1 clf = CLF()
----> 2 clf.fit(INPUT, OUTPUT)

<ipython-input-16-57babd738b2d> in fit(DF_input, DF_output, eta, drop)
      4 
      5     def fit(DF_input, DF_output, eta=0.1,drop=1000):
----> 6         X, y = DF_input.to_numpy(copy=True), DF_output.to_numpy(copy=True)
      7         N,d = X.shape
      8         m = len(np.unique(y))   # number of classes

AttributeError: 'CLF' object has no attribute 'to_numpy'

Upvotes: 1

Views: 195

Answers (2)

Prune
Prune

Reputation: 77865

An instance method is a type of attribute; this is a more general error message that keys on the . (dot) operator, rather than parsing through to the left parenthesis to discriminate your usage.

The problem is that you defined an instance method fit, but named your instance as DF_input. I think you simply forgot the usual self naming for the implicit instance parameter.

Upvotes: 1

Quang Hoang
Quang Hoang

Reputation: 150785

Your problem is that the first input for object method is usually reserved for self. The correct syntax should be:

class CLF:
    Weights = 0
    
    # notice the `self`
    def fit(self, DF_input, DF_output, eta=0.1, drop=1000):
        X, y = DF_input.to_numpy(copy=True), DF_output.to_numpy(copy=True)
        N,d = X.shape
        m = len(np.unique(y))   
        self.Weights = np.random.normal(0,1, size=(d,m))


INPUT = pd.read_csv(path_input)
OUTPUT = pd.read_csv(path_output)
clf = CLF()
clf.fit(INPUT, OUTPUT)

Upvotes: 1

Related Questions