这个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)`
00 -
一点萝卜先到
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)
半路出家,有错误欢迎指点
00 -
慕圣4159420
2021-04-30
我试了一下,确实如此。老师验证的有巧合:如将data['profit_pct2']=data2['profit_pct']改为data2['profit_pct2']=data['profit_pct'],print(data2)就会暴露问题。
00
相似问题