问题描述
我正在与金融机器学习高级课程的实施合作,以获取Python中交叉验证的分数。我的代码是下一个代码:
computedModelMatrix(Cartesian3: any,attitude: any,length: any) {
//锥体距离卫星的高度
let oldLength = length / 2;
let centerCartesian3 = new Cesium.Cartesian3(Cartesian3.x,Cartesian3.y,Cartesian3.z);
let oldX = 0,oldY = 0,oldZ = -oldLength,newX = 0,newY = 0,newZ = 0;
let heading = attitude.heading;
//规定顺时针为正旋转,正东方向为0度
if (heading < 0) {
heading = heading + 360;
}
let roll = attitude.roll;
let pitch = attitude.pitch;
let headingradians = Cesium.Math.toradians(heading);
let pitchradians = Cesium.Math.toradians(pitch);
let rollradians = Cesium.Math.toradians(roll);
let hpr = new Cesium.headingPitchRoll(headingradians,pitchradians,rollradians);
let orientation = Cesium.Transforms.headingPitchRollQuaternion(centerCartesian3,hpr);
//旋转roll
newY = oldY + oldLength * Math.sin(rollradians);
newZ = oldZ + oldLength - oldLength * Math.cos(rollradians);
let pitchTouying = oldLength * Math.cos(rollradians);//进行pitch变化时在Y轴和Z轴组成的平面的投影
//旋转pitch
newX = oldX + pitchTouying * Math.sin(pitchradians);
newZ = newZ + (pitchTouying - pitchTouying * Math.cos(pitchradians));
if (heading != 0) {
let headingTouying = Math.sqrt(Math.pow(Math.abs(newX),2) + Math.pow(Math.abs(newY),2));//进行heading变化时在Y轴和X轴组成的平面的投影
//旋转heading
let Xdeg = Cesium.Math.todegrees(Math.acos(Math.abs(newX) / Math.abs(headingTouying)));//现有投影线与X轴的夹角
let newXdeg = 0;//旋转heading后与X轴的夹角
let newXradians = 0;//旋转heading后与X轴的夹角弧度
if (newX >= 0 && newY >= 0) {
newXdeg = heading - Xdeg;
} else if (newX > 0 && newY < 0) {
newXdeg = heading + Xdeg;
} else if (newX < 0 && newY > 0) {
newXdeg = heading + (180 + Xdeg);
} else {
newXdeg = heading + (180 - Xdeg)
}
if (newXdeg >= 360) {
newXdeg = 360 - newXdeg;
}
if (newXdeg >= 0 && newXdeg <= 90) {
newXradians = Cesium.Math.toradians(newXdeg);
newY = -headingTouying * Math.sin(newXradians);
newX = headingTouying * Math.cos(newXradians);
} else if (newXdeg > 90 && newXdeg <= 180) {
newXradians = Cesium.Math.toradians(180 - newXdeg);
newY = -headingTouying * Math.sin(newXradians);
newX = -headingTouying * Math.cos(newXradians)
} else if (newXdeg > 180 && newXdeg <= 270) {
newXradians = Cesium.Math.toradians(newXdeg - 180);
newY = headingTouying * Math.sin(newXradians);
newX = -(headingTouying * Math.cos(newXradians))
} else {
newXradians = Cesium.Math.toradians(360 - newXdeg);
newY = headingTouying * Math.sin(newXradians);
newX = headingTouying * Math.cos(newXradians)
}
}
let offset = new Cesium.Cartesian3(newX,newY,newZ);
let newPosition = this.computeOffset(centerCartesian3,offset);
return Cesium.Matrix4.fromTranslationQuaternionRotationScale(newPosition,orientation,new Cesium.Cartesian3(1,1,1))
}
computeOffset(Cartesian3: any,offset: any) {
let enuTransform = Cesium.Transforms.eastnorthUpToFixedFrame(Cartesian3);
Cesium.Matrix4.multiplyByPointAsvector(enuTransform,offset,offset);
return Cesium.Cartesian3.add(Cartesian3,new Cesium.Cartesian3());
}
cv = PurgedKFold(n_splits = 10,samples_info_sets = pd.Series(train['close_datetime'].values,index = train['opendatetime'].values),pct_embargo = 0.02)
scores = ml_cross_val_score(classifier = classifier,X = X,y = y,cv_gen = cv)
我的代码出了点问题,可能是我配置了X和y数据帧的格式错误,供交叉验证器检查。谁能帮助我理解为什么会出现该错误?
解决方法
经过一些试验,我找到了解决方案。由于“清除的K折”需要索引值唯一,因此会发生此错误。如果存在两个相等的索引(“ opendatetime”),则在分割数据的不同分区时会引发错误。
解决方案是检查是否存在具有相同索引的行。如果您将这些相等事件的索引值更改为彼此不同,那么它将起作用!