假設我的資料如下:
我想要取出
y=-10 -20 -30(target)的x座標
該如何做?
請注意y=-30時
會遇到sidelobes
直接取跟target最接近index
將會誤抓到sidelobes的x座標
從-30開始講
folder=r”C:\Python”
fname = “serMean.xlsx”
import os
import pandas as pd
fpath = os.path.join(folder,fname)
dfMean = pd.read_excel(fpath)
serMean = dfMean [dfMean.columns[1]]
serMean.index= dfMean [dfMean.columns[0]]
target_value = -30
targetIdx = (serMean-target_value).abs().nsmallest(10).index.tolist()
#[129, -87, -21, 28, -83, -86, 121, 164, 54, -22]
#絕對值超過50的index鐵定是 sidelobes 對應的x座標
#想要的index不出-21 -22 28
idxmax = serMean.idxmax() #4
targetIdx_L = [i for i in targetIdx if i-idxmax < 0]
#[-87, -21, -83, -86, -22]
targetIdx_R = [i for i in targetIdx if i-idxmax >= 0]
#[129, 28, 121, 164, 54]
targetIdx_L.sort() #[-87, -86, -83, -22, -21]
targetIdx_R.sort() #[28, 54, 121, 129, 164]
targetIdx=[ targetIdx_L[-1],targetIdx_R[0] ]
#[-21, 28]
推薦hahow線上學習python: https://igrape.net/30afN
後續要找target = -20的index
直接取兩個誤差絕對值最小的2個index
怕會取到同一邊的index
所以依據target = -30的index
當成threshold,先切掉sidelobes
再將資料切片為
左半邊跟右半邊處理
threshold=targetIdx
target_value = -20
threL = threshold[0] #-21
threR = threshold[1] #28
serMeanSlice2 = serMean.loc[threL:threR]
#不要漏了.loc 使用標籤索引
# 沒有 .loc 或 .iloc 使用位置索引
#index=-180~180(角度)跟0,1,2,3…(位置索引)
#同為數字時,特別容易混淆
#怕直接取最小值的話,取到同一邊的index
#以下拆分為L R
serMeanSceL = serMeanSlice2.loc[threL:idxmax]
serMeanSceR = serMeanSlice2.loc[idxmax:threR]
#要由小到大,不然會切到空Series
#使用 loc,則右邊的範圍是包含 threR 的
# iloc則不包含最後一個
lisL = (serMeanSceL-target_value).abs().nsmallest(1).index.tolist() #[-13]
lisR = (serMeanSceR-target_value).abs().nsmallest(1).index.tolist() #[20]
“””
excel資料:
-13 -20.27074
-12 -19.37326
20 -19.54602
21 -20.77232
“””
targetIdx = [lisL[0],lisR[0]]
#[-13, 20]
取最接近idxmax的那一個idx,存在邏輯上的bug
正確邏輯應該是取最接近idxmax的那一”群”idx
從這一群中,再做一次誤差絕對值最小的那一個idx
片段程式碼如下:
推薦hahow線上學習python: https://igrape.net/30afN