2016-08-05 2 views
1

У меня есть функция, которая читает кучу необработанных данных с помощью некоторого ввода пользователя и скомпилирует его в серии Pandas. В приведенном ниже примере я называю это create_data, и он просто создает случайную серию длины n.Создание объекта класса из серии pandas и методов применения

>>> def create_data(n): 
...  return pd.Series(np.random.randint(1, 100, n)) 
... 
>>> 
>>> function_result=create_data(10) 
>>> function_result 
0 73 
1 91 
2 31 
3 44 
4 19 
5 30 
6 42 
7 56 
8 69 
9 70 
dtype: int32 

Тогда у меня есть набор функций, которые захотят применить к этой серии. В этом примере я создаю тот, который вычисляет корреляцию между серией и ее разницей первой степени.

>>> def temporal_corr(x): 
...  return pd.concat([x, x.shift()], 1).corr().iloc[0, 1] 
... 

я, очевидно, просто применить его к серии путем вызова функции ...

>>> temporal_corr(function_result) 
0.38714413906049816 

Но, допустим, у меня есть несколько различных функций, которые я хочу использовать в этой серии. Будет ли более целесообразным (или возможно) создание класса, который строит объект с помощью функции create_data, а затем имеет набор функций внутри класса, которые могут применяться как методы? Я создаю класс и определяю эту функцию ниже.

>>> class myobj: 
...  def __init__(self, myobj): 
...   self.myobj = myobj 
...  
...  def temporal_corr(self): 
...   return pd.concat([self.myobj, self.myobj.shift()], 1).corr().iloc[0, 1] 
... 
>>> a = myobj(function_result) 
>>> a.temporal_corr() 
0.38714413906049816 

Что такое лучший способ иметь myobj быть создан в результате функции create_data объект класса? Я хотел бы иметь возможность позвонить create_data и получить в результате объект, из которого я могу позвонить temporal_corr().

+0

Я не уверен, что понимаю этот вопрос. Если вы хотите, чтобы 'create_data' возвращал экземпляр' myobj', почему бы просто не сделать это: 'def create_data (n): return myobj (pd.Series (np.random.randint (1, 100, n)))' – Blckknght

+0

Зачем ты хочешь это сделать? Это делает код более сложным без каких-либо преимуществ. – BlackJack

ответ

0

Если я правильно понимаю ваш вопрос, я думаю, что вы хотите сделать следующее:

import pandas as pd 
import numpy as np 


class MyObjMaker(object): 

    def __init__(self, n): 
     self.myobj = pd.Series(np.random.randint(1, 100, n)) 

    def temporal_corr(self): 
     return pd.concat([self.myobj, self.myobj.shift()], 1).corr().iloc[0, 1] 


def create_data(n): 
    return MyObjMaker(n) 

Здесь функция create_data создает объект из класса, и имеет свою temporal_corr функцию. Например, я хотел бы использовать его следующим образом:

In [2]: a = create_data(10) # `a` is now an instance of MyObjMaker 

In [4]: type(a) # proof that `a` is now an instance of MyObjMaker 
Out[4]: __main__.MyObjMaker 

In [5]: a.temporal_corr() # `temporal_corr` works 
Out[5]: -0.18294239972101703 

решение Джима должно быть тоже хорошо, но подклассы прочь pd.Series - если вам не нужны все другие методы в pd.Series, то нет никакого смысла суб-классификация.

+0

Если у вас есть только '__init __()', инкапсулируйте одно значение и у вас есть один такой метод, у вас нет класса. Это просто функция, написанная сложным способом. Что такое конструкция так решает? 'create_data()' также не имеет смысла. Эффект этой функции является просто псевдонимом «MyObjMaker», который может быть проще написан как «create_data = MyObjMaker» или полностью исключен. – BlackJack

+0

@BlackJack, если вы внимательно прочитали Q/A, это то, что искатель искал. Это не мое место, чтобы задаться вопросом, почему они делают что-то определенным образом, поскольку этот вопрос был очень конкретным, а не Python и Pythonic. Кроме того, ваш 'create_data = MyObjMaker' неверен. Это сделало бы 'create_data'' классом'. Как у меня есть, он возвращает гарантированный экземпляр типа «MyObjMaker». – alichaudry

+0

Комментарий не имеет ничего общего с Python или стилем. Просто не имеет смысла одевать простую функцию как бесполезный класс, если язык не заставляет вас, как Java (возможно, раньше лямбда-выражения). Как мое более простое определение 'create_data' возвращает другой экземпляр? Возможно, когда 'MyObjMaker' реализует' __new __() ', но это повлияет на вашу функцию таким же образом. – BlackJack

1

По существу вы ищете объект, который действует как Series, но является более специализированным, так, просто создать класс, который наследуется от pd.Series:

import pandas as pd 
from numpy.random import randint 

class mySeries(pd.Series): 

    def __init__(self, n): 
     super().__init__(randint(0, 100, n)) # initialize series 

    # Add your custom methods: 
    def temporal_corr(self): 
     return pd.concat([self, self.shift()], 1).corr().iloc[0, 1] 

Затем create_data может быть ваша функция завод для специализированных Series объектов:

def create_data(n): 
    return mySeries(n) 

который можно расширить и добавить проверку в соответствии с вашими потребностями.

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