我的python循环失控了。不知道怎么解决这个问题

2024-09-30 14:37:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有df.shape = (36, 17)的熊猫数据帧。数据框架包含了荷兰的17项经济和财政指标,这些指标是36年来测量的。你知道吗

我正试图复制一个基于规则的欧洲协议,该协议为欧洲成员国提供了一个确切的指示,即每年所需的财政调整应该有多大。这一必要的财政调整取决于政府债务水平和产出缺口(这是经济周期的一个经济指标)。具体说明见下表。你知道吗

SGP flexibility
(来源:voxeu.org

上表中的相关指标在我的数据框中有以下名称:

  • 债务=政府债务百分比(60%=60)
  • 输出差距=输出差距
  • 潜力与增长之间的差异=差异pg\u ag
  • 所需年度财政调整=reqsb

我现在尝试用Python代码复制这个表,以计算在我的数据框架中所有年份所需的年度财政调整。你知道吗

不幸的是,如果我运行下面的代码,我会得到len(reqsb) = 21456。但它应该等于36的年数。你知道吗

问:我找不到窃听器。有没有人能告诉我正确的长度?

很抱歉这么长的故事顺便说一句,但想提供足够的信息:-)

reqsb = []

for debt in df.gov_debt_perct_mev:
    if (debt <= 60.0):
        for og in df.output_gap_pf_sf:
            if (og < -4.0):
                reqsb.append(0)
            if (og >= -4.0) & (og < -3.0):
                reqsb.append(0)
            if (og >= -3.0) & (og < -1.5):
                for diff in df.diff_pg_ag:
                    if (diff > 0):
                        reqsb.append(0.25)
                    else:
                        reqsb.append(0)
            if (og >= -1.5) & (og < 1.5):
                reqsb.append(0.5)
            if (og >= 1.5):
                for diff in df.diff_pg_ag:
                    if (diff > 0):
                        reqsb.append(0.76)
                    else:
                        reqsb.append(0.51)
    else:
        for og in df.output_gap_pf_sf:
            if (og < -4.0) :
                reqsb.append(0)
            if (og >= -4.0) & (og < -3.0):
                reqsb.append(0.25)
            if (og >= -3.0) & (og < -1.5):
                for diff in df.diff_pg_ag:
                    if (diff > 0):
                        reqsb.append(0.5)
                    else:
                        reqsb.append(0.25)
            if (og >= -1.5) & (og < 1.5):
                reqsb.append(0.51)
            if (og >= 1.5):
                for diff in df.diff_pg_ag:
                    if (diff > 0):
                        reqsb.append(1.0)
                    else:
                        reqsb.append(0.76)

Tags: 数据indfforifdiff指标else
2条回答

好吧,看起来,每次你循环时,你评估36项,因为对于每个循环你没有选择数据帧的特定单元格,而是选择一整列。你知道吗

for debt in df.gov_debt_perct_mev: # loop 36 times
    # if (debt <= 60.0) is true
        for og in df.output_gap_pf_sf: # loop another 36 times
            # and so on for each loop you write.

由于要迭代数据帧中的每一行(转换为每年),并计算特定单元格中每个值的阈值,因此应在数据帧df上使用^{}方法:

for index, row in df.iterrows():
    if row.gov_debt_perct_mev <= 60: 
        if (row.output_gap_pf_sf < -4.0):
            reqsb.append(0)
        # rest of if cases...
        if (row.output_gap_pf_sf >= 1.5):
            if row.diff_pg_ag > 0: 
                # append again..
    else:
        # similarly replace for loops with if 
        # stamements.

这意味着您要对每个单元格进行特定年份的评估,以确定它应该具有什么值。你知道吗


这里需要注意的是,您可能把binary and ^{} operatorlogical and ^{}混淆了。你知道吗

在您的例子中,这实际上并不会破坏您的条件的结果,因为您正在比较True & False,作为数字,它的计算结果与您使用&and的结果相同。你知道吗

你的问题是:

for debt in df.gov_debt_perct_mev:
    if (debt <= 60.0):
        for og in df.output_gap_pf_sf:
....
else:
    for og in df.output_gap_pf_sf:

您向数组中添加了至少xa+xb个条目。 其中x是df.output\间隙\ pf\ sf,是中的条目数债务百分比60岁以下,b是(len(债务百分比)-a)。你知道吗

你不应该在另一个for循环中使用for。你知道吗

此外,您还有类似的问题:

if (og >= -3.0) & (og < -1.5):
    for diff in df.diff_pg_ag:
                if (diff > 0):
                    reqsb.append(0.25)
                else:
                    reqsb.append(0)

相关问题 更多 >