滑动窗口处理(rolling)使用apply函数的一个小坑

我们一般用rolling+apply(fun,par)来进行滑动窗口处理某类序列,例如做量化交易时间序列,标的序列等等; 但如果apply函数有参数的话就需要注意。 apply的函数和参数实际上类似于指针的内存地址传递,也就是说滚动执行中参数par实际上是会变化的,如果要在fun中保存这个参数值就需要注意,不能用“=”来赋值,例如
def rolling_buy(code):
code_local=code

            df_code=pd.DataFrame(df_tradePrice[int(code)])

            df_code.reset_index(level=0, inplace=True)
            df_code.set_index(['date'],inplace=True)
            
            buy_price=df_code.loc[buy_date,'close']
   
         ......
        .......
                     **trade=pd.Series({'code':code_local,'buy_date':buy_date,'sell_date':sell_date,'buy_price':buy_price,'sell_price':sell_price,'return':re},name=self.Number)**

                self.d_result=self.d_result.append(trade)

            return  self.Number

        **No=code_list.rolling(1).apply(rolling_buy,raw=True)**

上述函数对各个股票按code进行处理,然后汇总在d_result中,注意黑色部分code_local=code,“=”是内存赋值,所以结果表格d_result中,'code’就会出现乱数值。

因此这里要用值copy语句

code_local=code_local=copy.copy(code)

问题解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhyuli

您的鼓励是对我付出努力一种赞赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值