問題分析
從錯誤日志中可以看到,代碼在 report_services.py
的 gnss_monthly_report
函數中出現了 ValueError
,具體錯誤信息是:
ValueError: either both or neither of x and y should be given
這個錯誤發生在以下代碼行:
report_data["V(ΔXY)"] = np.where(report_data['ΔXY'].diff().fillna(0) / 1, 0)
問題出在 np.where
的使用上。np.where
的語法是:
np.where(condition, x, y)
condition
:條件表達式。x
:當條件為True
時的返回值。y
:當條件為False
時的返回值。
在您的代碼中,np.where
只提供了一個參數(report_data['ΔXY'].diff().fillna(0) / 1
),缺少了 x
和 y
參數,因此拋出了 ValueError
。
解決方案
修復 np.where
的使用,確保提供完整的參數。以下是修改后的代碼:
# 修改前
report_data["V(ΔXY)"] = np.where(report_data['ΔXY'].diff().fillna(0) / 1, 0)# 修改后
report_data["V(ΔXY)"] = np.where(report_data['ΔXY'].diff().fillna(0) / 1 != 0, # 條件report_data['ΔXY'].diff().fillna(0) / 1, # 條件為 True 時的值0 # 條件為 False 時的值
)
shift
和 diff
函數的區別
1. shift
函數
-
功能:將數據沿著指定的軸移動指定的步長。
-
參數:
periods
:移動的步長,默認為1
。正數表示向下移動,負數表示向上移動。fill_value
:用于填充移動后產生的缺失值。
-
示例:
import pandas as pddata = pd.Series([1, 2, 3, 4, 5]) shifted_data = data.shift(1) print(shifted_data)
輸出:
0 NaN 1 1.0 2 2.0 3 3.0 4 4.0 dtype: float64
-
應用場景:
- 計算滯后值(如上一行的值)。
- 計算滑動窗口統計量(如滑動平均值)。
2. diff
函數
-
功能:計算當前行與前一行的差值。
-
參數:
periods
:差分的步長,默認為1
。正數表示與前面的行計算差值,負數表示與后面的行計算差值。
-
示例:
import pandas as pddata = pd.Series([1, 2, 3, 4, 5]) diff_data = data.diff() print(diff_data)
輸出:
0 NaN 1 1.0 2 1.0 3 1.0 4 1.0dtype: float64
-
應用場景:
- 計算時間序列數據的變化量。
- 計算數據的一階差分(如速度、加速度)。
shift
和 diff
的區別
特性 | shift | diff |
---|---|---|
功能 | 移動數據,不改變數據本身的值 | 計算當前行與前一行的差值 |
返回值 | 移動后的數據,可能包含 NaN | 差值數據,第一行通常為 NaN |
參數 | periods (步長)、fill_value (填充值) | periods (步長) |
應用場景 | 滯后值計算、滑動窗口統計 | 變化量計算、一階差分 |
修復后的完整代碼示例
以下是修復后的完整代碼片段:
# 計算 ΔXY 變化速率 (V(ΔXY))
delta_xy_diff = report_data['ΔXY'].diff().fillna(0) # 計算 ΔXY 的變化量
delta_xy_shift = report_data['ΔXY'].shift(1).fillna(0) # 獲取前一行的 ΔXY 值
report_data["V(ΔXY)"] = np.where(delta_xy_shift != 0, # 條件:前一行的 ΔXY 不為 0delta_xy_diff / delta_xy_shift, # 條件為 True 時的值:變化速率0 # 條件為 False 時的值:設置為 0
)# 計算 ΔXY 累計變化量 (∑(ΔXY))
report_data["∑(ΔXY)"] = report_data["ΔXY"].cumsum()# 將 NaN 替換為 0
report_data = report_data.fillna(0)# 將數據保留小數點后兩位
report_data = report_data.round(2)# 將 DataFrame 轉換為列表
data_list = report_data.values.tolist()# 將第一列(索引 0)設置為 0
for row in data_list:row[0] = 0 # 將每一行的第一列設置為 0# 將處理后的列表賦值給 sensor_report["data"]
sensor_report["data"] = data_listlogger.info(f"該臺 gnss 設備 {query_para.device_type + '.' + query_para.measurement_id} 的報表數值是: {sensor_report}")return sensor_report
總結
- 修復了
np.where
的錯誤:確保np.where
的參數完整。 - 解釋了
shift
和diff
的區別:shift
用于移動數據。diff
用于計算差值。
- 提供了修復后的完整代碼:確保代碼邏輯正確,并能正確處理數據。
應用: