自定义For Loop函数仅返回1个元素而非预期371个浮点数问题求助
代码问题排查与修复方案
你的代码存在以下4个核心问题,直接导致返回列表长度不符合预期:
- 列表初始化位置错误:
y = []现在定义在月份循环的else分支内部,每进入一次else分支就会清空重置列表,最终只会保留最后一次循环的计算值。需要将y = []移动到函数最开头、所有循环逻辑的外部。 - return语句位置错误:当前return语句写在年份循环的内部,跑完第一个年份(1990年)的所有月份循环后就直接返回结果,不会执行1991到2020年的计算逻辑。需要将return移动到所有循环的最外层,函数末尾的位置。
- 入参被意外覆盖:函数入参名为port,循环中执行
port = a[a['Portfolio'] == port]直接修改了入参的值,下一轮循环判断时port已经不是初始传入的值,会导致后续所有筛选逻辑错误。需要将该局部变量重命名,避免和入参重名。 - 排序操作无效:
port.sort_values("Volatility")没有设置inplace=True也没有赋值给新变量,排序操作不会生效,虽不影响返回列表长度,但会导致计算结果不符合预期。
修复后的代码如下:
import pandas as pd df['date'] = pd.to_datetime(df['date'], format = '%Y-%m-%d') def function(port): # 结果列表初始化移到最外层 y = [] for year in range(1990,2021,1): for month in range(1,13,1): if year == 1990 and month == 1: pass else: a = df.set_index('date') a = a[(a.index.year == year) & (a.index.month == month - 1)] a.loc['Volatility'] = a.std() a = a.T a['Portfolio'] = pd.qcut(a['Volatility'], q=[0, .2, .4, .6, .8, 1], labels=['1','2','3','4','5']).astype(int) # 局部变量改名,避免覆盖入参 selected_port = a[a['Portfolio'] == port] # 排序操作赋值生效 selected_port = selected_port.sort_values("Volatility") b = selected_port.index c = df.set_index('date') c = c[(c.index.year == year) & (c.index.month == month)] c = c[b] c = c.T c += 1 c["returns"] = (c.product(axis=1) - 1) C_r = c['returns'].sum() y.append(C_r) # return移到所有循环外侧 return y p = function(1)
运行修复后的代码即可得到长度为371的预期结果。
内容的提问来源于stack exchange,提问作者Willie Wong
相关产品推荐
相关产品推荐

