2016-06-04 1 views
0

У меня проблема с дизайном ниже. Я ищу векторизованное решение для ниже круговой справочной проблемы. Value (рассчитано func1) использует контент от number (рассчитанный func2), number получает увеличенный на Value после этого, и все будет создано в dataframe через build().круговая ссылка в классе в python

class test(object): 
    def __init__(self, bool, start=100): 
     self.start = start 
     self.bool = bool 
     self.value = self.func1() 
     self.number = self.func2() 

    def func1(self): 
     if bool==True: 
      value = **`here value from func2`**/ 2 
     else: 
      value = 0 
     return value 

    def func2(self): 
     number = start + self.value 
     return number 

    def build(self): 
     df = pd.DataFrame() 

     df['bool'] = self.bool 
     df['value']= self.value 
     df['number'] = self.number 

так в конце концов dataframe должен выглядеть следующим образом:

bool = pd.Series([False, True, False, True, False,.....]) 

      bool  value  number 
Index 
    0  False  0   100 
    1  True  50   100 
    2  False  0   150 
    3  True  75   150 
    4  False  0   225 

мой вопрос: как я могу создать это с помощью классов и отдельных методов value и number без итерации? Проблема в том, что value зависит от number и наоборот (круговая ссылка). РЕДАКТИРОВАТЬ: хотя здесь не моделируется таким образом, число может быть денежным счетом и значить определенное количество акций, которое можно купить в зависимости от размера учетной записи. размер учетной записи увеличивается и уменьшается в зависимости от того, что произошло с акциями. Основная трудность в том, как определить формулу, используемую для number (учетная запись). у вас есть стартовая ценность, но затем нужно увеличиваться в зависимости от будущего. но если вы пишете как:

number = start + self.value ((which are the proceeds/results  of other columns)) 

Это не работает в первом ряду, потому что self.value еще не существует. поэтому я использовал термин круглый справки.

+1

Попробуйте описать, что вы хотите сделать, не описывая, как вы это делаете. Я не совсем понимаю, что вы пытаетесь сделать там с описанием в последнем абзаце. – LhasaDad

ответ

1

Основываясь на том, что вы описываете, я думаю, вы пытаетесь реализовать некоторые виды классов, которые строят список «динамически». Хотя я думаю, что лучше разделить задачу на две: одна из них составляет DataFrame; второй - update.

Ниже приведена моя реализация класса для формирования DataFrame на основе массива Bool и значений.

class test(object): 
    def __init__(self, _bool, v, start=100): 
     self._bool = _bool 
     self.v = v 
     self.df = pd.DataFrame() 
     self.vout = [] 
     self.start = start 
     self.contruct() 

    def contruct(self): 
     i=0 
     for b in self._bool: 
      if b: 
       self.vout.append(self.v[i]) 
       i += 1 
      else: 
       self.vout.append(0) 

    def build(self): 
     self.df['bool']=self._bool 
     self.df['value']= self.vout 
     self.df['sum'] = self.df['value'].cumsum() + self.start 
     return self.df 


_bool = pd.Series([False, True, False, True, False]) 
_v = [50, 75] 

a = test(_bool, _v) 
df= a.build() 

print df 

Out[48]: 
    bool value sum 
0 False  0 100 
1 True  50 150 
2 False  0 150 
3 True  75 225 
4 False  0 225 

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

+0

Как я могу создать значения _v из столбцов 'sum'? –

+0

@Al_Iskander, не могли бы вы больше продумать? Я не совсем понимаю – MaThMaX

+0

. Моя основная проблема заключается в том, что «значения» зависят от «чисел», а следующая строка «числа» зависит от «значений». Я попытался свести к простым вычислениям без многих входов. в действительности это учетная запись (числа), и вы вычисляете возможное количество акций (значений), которые зависят от размера учетной записи. и после того, как продажа/продажа акций увеличивается/уменьшается. без петли, я не нашел решения самостоятельно. –