【问题标题】:circular reference in class in pythonpython类中的循环引用
【发布时间】:2016-06-04 22:36:53
【问题描述】:

我对以下设计有疑问。我正在寻找以下循环参考问题的矢量化解决方案。 Value(由 func1 计算)使用来自number(由 func2 计算)的内容,number 之后增加了Value,所有内容都将通过 build() 在数据框中生成。

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 

所以最后数据框应该是这样的:

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

我的问题是:如何在不迭代的情况下使用 valuenumber 的类和单独的方法创建它?问题是value 依赖于number,反之亦然(循环引用)。 编辑:虽然这里没有以这种方式建模,但该数字可能是一个现金账户,并根据账户规模对可以购买的一定数量的股票进行估值。然后,帐户大小会根据股票发生的情况增加/减少。主要困难如何定义用于number(帐户)的公式。您有一个起始值,但随后需要根据未来增加。但如果你这样写:

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

它在第一行不起作用,因为self.value 尚不存在。因此我使用了循环引用这个术语。

【问题讨论】:

  • 试着描述你想做什么,而不描述你是怎么做的。我并没有完全按照你在最后一段中的描述尝试做的事情。

标签: python class pandas methods


【解决方案1】:

根据您的描述,我认为您正在尝试实现某种“动态”构造列表的类。虽然我认为最好将任务分成两个:一个是形成DataFrame;另一个是DataFrame。第二个是update它。

下面是我基于Bool 数组和值形成DataFrame 的类的实现。

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

仅供参考,当你定义属性时,你不应该使用bool,因为它是 python 反向命名空间,会导致解释器以及阅读你代码的人混淆。

【讨论】:

  • 如何从列“sum”创建值 _v?
  • @Al_Iskander,您能详细说明一下吗?我不太明白
  • 我的主要问题是“值”取决于“数字”,而下一行“数字”取决于“值”。我试图归结为没有太多输入的简单计算。实际上,它是一个帐户(数字),您可以根据帐户大小计算可能的共享数量(值)。并在出售股票账户增加/减少后。没有循环,我自己没有找到解决方案。
  • 你看到我的问题@mathmax 了吗?我的问题是如何生成“值”列中的值。在您的示例中,您按照给定的方式介绍它们。但实际上 tHey 是与 sum 列相关的公式的结果,例如 sum / 2。我怎样才能在给定的框架中完成这个并且可能没有迭代?
  • 我试图在 (stackoverflow.com/questions/37653822/…) 中让整个问题更加清晰
猜你喜欢
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 2021-06-08
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多