self_define_api.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from fastapi import FastAPI, HTTPException, Body
  2. from pydantic import BaseModel
  3. import numpy as np
  4. import pandas as pd
  5. import json
  6. import uvicorn
  7. from typing import Optional, List
  8. app = FastAPI()
  9. class DataRequest(BaseModel):
  10. data: List
  11. start_index: Optional[int] = None
  12. end_index: Optional[int] = None
  13. def load_and_calculate_features(json_data):
  14. # 定义计算统计指标的函数
  15. def _calculate_stats(data):
  16. # 确保数据是数值类型
  17. data = pd.to_numeric(data, errors='coerce')
  18. mean_value = np.mean(data)
  19. max_value = np.max(data)
  20. min_value = np.min(data)
  21. Xrms = np.sqrt(np.mean(data ** 2)) # 加速度均方根值(有效值)
  22. Xp = (max_value - min_value) / 2 # 峰值(单峰最大值)
  23. Xpp = max_value - min_value # 峰峰值
  24. Cf = Xp / Xrms # 峰值指标
  25. Sk = np.mean((data - mean_value) ** 3) / Xrms ** 3 # 歪度指标
  26. Sf = Xrms / mean_value # 波形指标
  27. If = Xp / np.mean(np.abs(data)) # 脉冲指标
  28. Xr = np.mean(np.sqrt(np.abs(data))) ** 2 # 方根幅值
  29. Ce = Xp / Xr # 裕度指标
  30. return {
  31. 'Xrms': Xrms,
  32. 'Mean': mean_value,
  33. 'Max': max_value,
  34. 'Min': min_value,
  35. 'Xp': Xp,
  36. 'Xpp': Xpp,
  37. 'Cf': Cf,
  38. 'Sk': Sk,
  39. 'Ce': Ce,
  40. 'If': If,
  41. 'Sf': Sf,
  42. }
  43. if json_data['start_index'] is not None and json_data['end_index'] is not None:
  44. df = pd.DataFrame(json_data['data'])
  45. start_index = json_data['start_index']
  46. end_index = json_data['end_index']
  47. selected_data = df[(df['index'] >= start_index) & (df['index'] <= end_index)]
  48. stats = _calculate_stats(selected_data['value'])
  49. for feature, value in stats.items():
  50. df[feature] = np.where((df['index'] >= start_index) & (df['index'] <= end_index), value, 0)
  51. json_output = df.to_json(date_format='iso', orient='records', force_ascii=False)
  52. else:
  53. df = pd.DataFrame(json_data['data'])
  54. stats = _calculate_stats(df['value'])
  55. for feature, value in stats.items():
  56. df[feature] = value
  57. json_output = df.to_json(date_format='iso', orient='records', force_ascii=False)
  58. return json_output
  59. @app.post("/CalculateFeatures/")
  60. async def calculate_features(request: DataRequest = Body(...)):
  61. try:
  62. json_data = request.model_dump()
  63. result = load_and_calculate_features(json_data)
  64. return result
  65. except Exception as e:
  66. raise HTTPException(status_code=400, detail=str(e))
  67. if __name__ == '__main__':
  68. uvicorn.run(app, host="0.0.0.0", port=8666)