假設我們有一個資料框df:
date y_true y_pred1 y_pred2
0 2017-1-31 6.42 -2.35 15.57
1 2017-2-28 -2.35 15.57 6.64
2 2017-3-31 15.57 6.64 7.61
3 2017-4-30 6.64 7.61 10.28
4 2017-5-31 7.61 7.61 6.34
5 2017-6-30 10.28 6.34 4.88
6 2017-7-31 6.34 4.88 7.91
7 2017-8-31 6.34 7.91 6.26
8 2017-9-30 7.91 6.26 11.51
9 2017-10-31 6.26 11.51 10.73
10 2017-11-30 11.51 10.73 10.65
11 2017-12-31 10.73 10.65 32.05
我想計算兩列連續兩個月資料的向上、向下和相等一致性的比率,并將其作為時間序列預測結果的評估指標。本月與上月比率的方向:向上表示本月值減去上月值為正,同理向下,equal分別為負和0。
我使用以下函式和代碼計算了樣本資料的結果,請注意,我們在計算最終比率時不包括黃色行,因為y_true_dir這些行的值是nullor 0:

def cal_arrays_direction(value):
if value > 0:
return 1
elif value < 0:
return -1
elif value == 0:
return 0
else:
return np.NaN
df['y_true_diff'] = df['y_true'].diff(1).map(cal_arrays_direction)
df['y_pred1_diff'] = df['y_pred1'].diff(1).map(cal_arrays_direction)
df['y_pred2_diff'] = df['y_pred2'].diff(1).map(cal_arrays_direction)
df['y_true_y_pred1'] = np.where((df['y_true_diff'] == df['y_pred1_diff']), 1, 0)
df['y_true_y_pred2'] = np.where((df['y_true_diff'] == df['y_pred2_diff']), 1, 0)
dir_acc_y_true_pred1 = df['y_true_y_pred1'].value_counts()[1] / (df['y_true_diff'].value_counts()[-1]
df['y_true_diff'].value_counts()[1])
print(dir_acc_y_true_pred1)
dir_acc_y_true_pred2 = df['y_true_y_pred2'].value_counts()[1] / (df['y_true_diff'].value_counts()[-1]
df['y_true_diff'].value_counts()[1])
print(dir_acc_y_true_pred2)
出去:
0.2
0.4
但是我想知道如何將其轉換為函式(類似于MSE,RMSE等sklearn)以使其更易于使用,謝謝!
def direction_consistency_acc(y_true, y_pred):
...
return dir_acc_ratio
uj5u.com熱心網友回復:
您可以創建自定義函式,而不是使用自定義函式numpy.sign,而是.value_counts()[1]比較 by1和 count Trues by sum:
#y_true - Series, y_pred - DataFrame
def direction_consistency_acc(y_true, y_pred):
df['y_true_diff'] = np.sign(y_true.diff(1))
s = df['y_true_diff'].value_counts()
out = []
for col in y_pred.columns:
df[f'y_{col}_diff'] = np.sign(df[col].diff(1))
df[f'y_true_{col}'] = np.where((df['y_true_diff'] == df[f'y_{col}_diff']), 1, 0)
dir_acc_y_true_pred = df[f'y_true_{col}'].eq(1).sum() / (s[-1] s[1])
out.append(dir_acc_y_true_pred)
return out
out = direction_consistency_acc(df['y_true'], df[['y_pred1','y_pred2']])
print(out)
[0.2, 0.4]
沒有新列的替代方案:
#y_true - Series, y_pred - DataFrame
def direction_consistency_acc(y_true, y_pred):
y_true_diff = np.sign(y_true.diff(1))
s = y_true_diff.value_counts()
out = []
for col in y_pred.columns:
y_true = y_true_diff == np.sign(df[col].diff(1))
dir_acc_y_true_pred = y_true.eq(1).sum() / (s[-1] s[1])
out.append(dir_acc_y_true_pred)
return out
out = direction_consistency_acc(df['y_true'], df[['y_pred1','y_pred2']])
print(out)
[0.2, 0.4]
uj5u.com熱心網友回復:
我對這個問題的更新答案:
def cal_arrays_direction(value):
if value > 0:
return 1
elif value < 0:
return -1
elif value == 0:
return 0
else:
return np.NaN
def direction_consistency_acc(y_true, y_pred):
df['y_true_diff'] = y_true.diff(1).map(cal_arrays_direction)
df['y_pred_diff'] = y_pred.diff(1).map(cal_arrays_direction)
df['y_true_pred_consis'] = np.where((df['y_true_diff'] == df['y_pred_diff']), 1, 0)
dir_acc_ratio = df['y_true_pred_consis'].value_counts()[1] / (df['y_true_diff'].value_counts()[-1]
df['y_true_diff'].value_counts()[1])
return dir_acc_ratio
direction_consistency_acc(df['y_true'], df['y_pred1'])
出去:
0.2
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/519655.html
上一篇:如何將由mediaRecorder生成并使用websocket傳輸到python的音頻位元組轉換為numpy陣列
下一篇:獲取具有最小值的行
