python - 使用循环的前一个值来获取前一个位置 (n-1),而不是每个位置都给出 Key Error
问题描述
在 Python 中,我使用了一个循环,并在所附代码的末尾第 6 行( Portfolio_1_4 = Portfolio_1_4 * SP1500DailyReturns.loc[n_short, 'S&P 1500 SUPER COMPOSITE - PRICE INDEX'] / SP1500DailyReturns.loc[str(Portfolio_1_4_Date_sell_short), ' S&P 1500 SUPER COMPOSITE - PRICE INDEX']) 我收到一个关键错误。由于 SP1500DailyReturns 中不存在某些日期信息,因此出现此错误,因此代码无法获取它进行计算。
怎么可能修改我的算法,以便当这条线面临关键错误时,它会从循环中的前一个位置(n-1)获取日期?
例如,日期“n_short”不存在,然后算法从日期“n_short - 1”获取数据,而不是日期“Portfolio_1_4_Date_sell_short”的数据不存在,然后算法获取日期“Portfolio_1_4_Date_sell_short”的数据-1”。
谢谢!
for n in dates:
n_short = n[:10]
Date_Buy = pd.Timestamp(n)
Date_sell = Date_Buy + pd.Timedelta("30 days")
Date_buy_SP1500 = Date_sell
Date_sell_SP1500 = Date_Buy
if (Test_set.loc[n, '4_signals'] == 1):
if (Portfolio_1_4_Date_sell < pd.Timestamp(Test_set.loc[n, 'feedTimestamp'])):
Portfolio_1_4 = Portfolio_1_4 * Test_set.loc[n, 'Cumulative stock Returns over the 30 days after transaction (22 working days)'] # For 5 days i will have to change to 5 days column later
Test_set.loc[n, 'Portfolio_1_4'] = Portfolio_1_4
Portfolio_1_4_Date_sell = Date_Buy + pd.Timedelta("30 days")
Portfolio_1_4_Date_sell_short = Portfolio_1_4_Date_sell.strftime("%Y-%m-%d")
Portfolio_2_4 = Portfolio_2_4
Test_set.loc[n, 'Portfolio_2_4'] = Portfolio_2_4
Portfolio_3_4 = Portfolio_3_4
Test_set.loc[n, 'Portfolio_3_4'] = Portfolio_3_4
else:
Portfolio_1_4 = Portfolio_1_4 * SP1500DailyReturns.loc[n_short, 'S&P 1500 SUPER COMPOSITE - PRICE INDEX'] / SP1500DailyReturns.loc[Portfolio_1_4_Date_sell_short, 'S&P 1500 SUPER COMPOSITE - PRICE INDEX']
Test_set.loc[n, 'Portfolio_1_4'] = Portfolio_1_4
Portfolio_2_4 = Portfolio_2_4
Test_set.loc[n, 'Portfolio_2_4'] = Portfolio_2_4
Portfolio_3_4 = Portfolio_3_4
Test_set.loc[n, 'Portfolio_3_4'] = Portfolio_3_4
解决方案
首先,看看如何生成一个最小的可重现示例。
您可以通过两种方法做到这一点。您可以存储前一个变量以供在下一个循环中参考。或者您可以使用enumerate()
捕获索引并使用它来调用上一个条目。两者的例子如下
# Storing previous loop
n_old = None # Initialising
for n in dates:
try:
data = n[0]
except KeyError:
data = n_old[0]
n_old = n
# Using enumerate
for ii, n in enumerate(dates):
try:
data = n[0]
except KeyError:
if ii == 0:
data = None
else:
data = dates[ii-1][0]
推荐阅读
- kotlinpoet - 如何将函数参数强制到新行上?
- python - “ascii”编解码器无法解码位置 3 中的字节 0xe5:序数不在范围内(128)
- windows - Windows;Powershell - 确定服务控制管理器何时从重新启动启动
- reactjs - 收到错误为“无效的传播不可迭代实例的尝试”-状态未更新
- ios - IOS 应用程序在与蓝牙设备连接后未收到来自蓝牙设备的火灾事件
- javascript - 使用 JavaScript 或 Jquery 库或插件从 HTML 页面生成 PDF
- typescript - 无法使用 Visual Studio Code 从 Typescript 访问 C# 控制器
- node.js - 无法提取地理位置的地理键
- unix - 如何忽略“无法获取属性:访问被拒绝”
- linux - 在 Elasticsearch 中获取,状态为 503