Как я могу создать метод в классе, который можно преобразовать numpy матрицу в Pandas кадр? - PullRequest
1 голос
/ 20 марта 2020

Я пытаюсь определить метод, в котором я могу преобразовать матрицу numpy в Pandas DataFrame.

У меня есть следующее:

import pandas as pd
import numpy as np

class Analisis():
    def __init__(self, matriz = np.array([])):
          self.__matriz = matriz
          self.__filas = matriz.shape[0]
          self.__columnas = matriz.shape[1]
    @property
    def matriz(self):
         return self.__matriz
    @property
    def filas(self):
         return self.__filas
    @property
    def columnas(self):
         return self.__columnas
    def as_data_frame (self):
        dataset = pd.DataFrame({'Columna1': data[:, 0], 'Columna2': data[:, 1], 'Columna3': 
        data[:, 2]})
        return dataset

И я работаю с этим массивом:

data = Analisis(np.array([[5,78,34],[6,2,8],[36,9,60]]))
print(data.filas)
print(data.columnas)
print(data.matriz)
Analisis.as_data_frame

Но я попробовал несколько комбинаций с Analisis.as_data_frame, и они сделали не работа. Просто попытался найти документацию и кажется, что метод в порядке, но не работает. Есть идеи?

1 Ответ

3 голосов
/ 20 марта 2020

Так как вы определяете метод , вам нужно вызвать его для вашего объекта:

data.as_data_frame()

Но в вашем определении используется data, предположительно, глобальная переменная. Но вы должны использовать внутреннее состояние . Итак, по-видимому, вы хотите, чтобы self.__matriz.

в стороне:

Прекратите использовать двойные подчеркивания и ненужные свойства, все это является образцом, побеждающим всю цель property, чтобы начать с. В Python ваш класс должен выглядеть следующим образом:

class Analisis:
    def __init__(self, matriz=None): # watch out for mutable default arguments
        if matriz is None:
            self.matriz = matriz
        else:
            self.matriz = np.array([])
        self.filas = matriz.shape[0]
        self.columnas = matriz.shape[1]

И теперь, когда вы используете метод, вы хотите:

class Analisis:

    def __init__(self, matriz=None): # watch out for mutable default arguments
        if matriz is None:
            self.matriz = np.array([])
        else:
            self.matriz = matriz
        self.filas = matriz.shape[0]
        self.columnas = matriz.shape[1]

    def as_data_frame (self):
        dataset = pd.DataFrame(
            {
                'Columna1': self.matriz[:, 0], 
                'Columna2': self.matriz[:, 1], 
                'Columna3': self.matriz[:, 2]
            }
        )
        return dataset

, и вы, вероятно, могли бы упростить свой метод как просто:

    def as_data_frame (self):
        dataset = pd.DataFrame(
            self.matriz[:,:3],
            columns=['Columna1','Columna2','Columna3']
        )
        return dataset

Обратите внимание, что двумерный массив всегда можно преобразовать непосредственно в фрейм данных:

>>> arr = np.array([[5,78,34],[6,2,8],[36,9,60]])
>>> pd.DataFrame(arr, columns=['Columna1', 'Columna2', 'Columna3'])
   Columna1  Columna2  Columna3
0         5        78        34
1         6         2         8
2        36         9        60

Я подозреваю, что вам действительно нужно нечто более динамичное c, вот так:

    def as_data_frame (self):
        columns = [f'Columna{i}' for i in range(1, self.columnas+1)]
        dataset = pd.DataFrame(self.matriz, columns=columns)
        return dataset

в действии:

In [10]: class Analisis:
    ...:
    ...:     def __init__(self, matriz=None): # watch out for mutable default arguments
    ...:         if matriz is None:
    ...:             self.matriz = np.array([])
    ...:         else:
    ...:             self.matriz = matriz
    ...:         self.filas = matriz.shape[0]
    ...:         self.columnas = matriz.shape[1]
    ...:
    ...:     def as_data_frame (self):
    ...:         columns = [f'Columna{i}' for i in range(1, self.columnas+1)]
    ...:         dataset = pd.DataFrame(self.matriz, columns=columns)
    ...:         return dataset
    ...:
    ...:

In [11]: data = Analisis(np.array([[5,78,34],[6,2,8],[36,9,60]]))

In [12]: data.as_data_frame()
Out[12]:
   Columna1  Columna2  Columna3
0         5        78        34
1         6         2         8
2        36         9        60
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...