这个Debug的新代码,跑出来的数据和原来的不同

来源:3-6 Debug:解决CopyWarning问题

慕粉4090790

2021-04-30

我用这个Debug的代码跑出来数据,和原来视频中的代码跑出来不同。我不懂,老师为什么跑出来结果是一样的。我分析了两种代码跑出来的数据,如下。有精通pandas的可以解释下。

    '''
    原3-5视频中的代码,有报错信息,但是结果正确。
    先剔除没有交易的日期数据存入data(此时data中全部是有交易的日期数据);
    然后将当日收盘价data[close]减去上一个有交易的日期的收盘价data[close].shift(1);
    这里data中已经剔除了没有交易的日期,所以上一行的收盘价一定是有交易的数据。
    '''
    # data = data.loc[data['signal'] != 0]    # 筛选交易日
    # data['profit_pct'] = (data['close'] - data['close'].shift(1)) / data['close'].shift(1)

    '''
    3-6Debug视频中的代码,没有报错信息,但是结果似乎不正确。
    选出data['signal']不为零的行,将其中的close列数据减去上一行data['close'].shift(1);
    此处data['signal']=0的行并没有被删除,所以shift(1)的收盘价并不是交易的数据。
    '''
    # data.loc[data['signal'] != 0, 'profit_pct'] = \
    #     (data['close'] - data['close'].shift(1)) / data['close'].shift(1)

    '''
    网上查了下,下面代码,没有报错信息,结果与第一段代码相同。
    先剔除没有交易的日期数据,然后建立一个data的copy x,
    在x中添加profit_pct列,最后返回x。(试了下,return data也可以,搞不懂是什么机制)
    '''
    data = data[data['signal'] != 0]  # 筛选交易日
    x = pd.DataFrame(data)
    x.loc[:, 'profit_pct'] = (data['close'] - data['close'].shift(1)) / data['close'].shift(1)
    print(data)
    print(x)
    # data = data[data['signal'] == -1]
    return x
写回答

3回答

Frontend_清流

2021-07-13

确实是,老师只是看了profit 对比,但是cum_profit是有问题的

data = data[data['signal'] != 0]
data['profit_pct'] = (data['close'] - data['close'].shift(1)) / data['close'].shift(1)# data.loc[data['signal'] != 0, 'profit_pct'] = (data['close'] - data['close'].shift(1)) / data['close'].shift(1)`
0
0

一点萝卜先到

2021-06-14

我是这么想的,Try using .loc[row_indexer,col_indexer] = value instead中的row_indexer只是这个df的索引,所以可以用data.index,结果不一致的原因您这里也提到了,是因为没有将signal中不为零的剔除。所以我是这么写的

 data.loc[data.index, 'profit_pct'] = (data[data['signal'] != 0]['close'] - data[data['signal'] != 0]['close'].shift(1)) / data[data['signal'] != 0]['close'].shift(1)

这样的话结果是一致的,这样输出的data其实并没有进行signal!=0的剔除,只是再进行profit_pct计算的时候进行了剔除

copy的话相当于重新建立了一个副本

data = data[data['signal'] != 0].cppy()
# 这个data已经跟之前的data没有关系了,如果清晰一点,可以换个名字,比如data2 = data[data['signal'] != 0].copy()
data['profit_pct'] = (data['close'] - data['close'].shift(1)) / data['close'].shift(1)

半路出家,有错误欢迎指点

0
0

慕圣4159420

2021-04-30

我试了一下,确实如此。老师验证的有巧合:如将data['profit_pct2']=data2['profit_pct']改为data2['profit_pct2']=data['profit_pct'],print(data2)就会暴露问题。

0
0

程序员理财课 Python量化交易系统实战

打造一个自动交易平台,新手也能提升理财收益

2012 学习 · 405 问题

查看课程