挑选原则:某点与其之前相邻点的差值大于其前后一个月内相邻两点差值的绝对值均值,则该点为异常点。
练习目的:泛型/委托应用
第一步:找出选择点的所有符合要求的数据
List<WtLevelData> allDataLst = new List<WtLevelData>(); sql = String.Format(sql, fieldNm, wtSymol, sDate, eDate, stCondition); using (SqlDataReader myReader = SqlHelper.ExecuteReader(conn, CommandType.Text, sql)) { while (myReader.Read()) { WtLevelData lInfo = new WtLevelData(); lInfo.Stcd = myReader["stcd"].ToString().Trim(); lInfo.Tm = myReader["tm"].ToString(); lInfo.LevelData = myReader["levelData"] == System.DBNull.Value ? 0 : float.Parse(myReader["levelData"].ToString()); allDataLst.Add(lInfo); } }
第二步:挑选异常点
foreach (STINFOinfo stInfo in selectStLst) { List<WtLevelData> ExPLst = GetExPointByStcd(stInfo.STCD, allDataLst, sYear, month); if (ExPLst != null) levelDataLst.AddRange(ExPLst); _CurrentPercent += 1; }
GetExPointByStcd()
public List<WtLevelData> GetExPointByStcd(string stcd, List<WtLevelData> allDataLst, string sYear, string sMonth) { List<WtLevelData> selectLst = allDataLst.FindAll(delegate(WtLevelData lInfo) { bool isTime = String.Equals(sMonth, "不限") ? string.Equals(DateTime.Parse(lInfo.Tm).Year.ToString(), sYear) : String.Equals(DateTime.Parse(lInfo.Tm).Month.ToString(), sMonth); return String.Equals(lInfo.Stcd.Trim(), stcd) && isTime; }); if (selectLst == null) return null; List<WtLevelData> ExPLst = new List<WtLevelData>(); foreach (WtLevelData lInfo in selectLst) { if (isExPoint(lInfo, allDataLst)) ExPLst.Add(lInfo); } return ExPLst; }
isExPoint()
bool isExPoint(WtLevelData pickPoint, List<WtLevelData> allDataLst) { bool isExP = false; List<WtLevelData> regionMonthDLst = GetExLst(pickPoint, allDataLst); if (regionMonthDLst == null || regionMonthDLst.Count.Equals(1)) return isExP; int index = regionMonthDLst.IndexOf(pickPoint); if (index.Equals(0)) return isExP; float compareValue1 = pickPoint.LevelData - regionMonthDLst[index - 1].LevelData; float compareValue2 = GetSubAvgValue(index, regionMonthDLst); if (compareValue1 > compareValue2) { pickPoint.Tag = float.Parse(compareValue1.ToString("F3")); isExP = true; } return isExP; }
GetExLst():挑选前后一个月的数据
public virtual List<WtLevelData> GetExLst(WtLevelData pickPoint, List<WtLevelData> allDataLst) { List<WtLevelData> regionMonthDLst = allDataLst.FindAll(delegate(WtLevelData pInfo) { return String.Equals(pInfo.Stcd, pickPoint.Stcd) && DateTime.Parse(pInfo.Tm) >= DateTime.Parse(pickPoint.Tm).AddMonths(-1) && DateTime.Parse(pInfo.Tm) <= DateTime.Parse(pickPoint.Tm).AddMonths(1); }); return regionMonthDLst; }
GetSubAvgValue():获取前后一个月的均值
float GetSubAvgValue(int index, List<WtLevelData> regionMonthDLst) { float subValue = 0, sumValue = 0; int num = 0; for (int i = 0; i < regionMonthDLst.Count - 1; i++) { if (int.Equals(i, index - 1)) continue; subValue = Math.Abs(regionMonthDLst[i + 1].LevelData - regionMonthDLst[i].LevelData); sumValue += subValue; num += 1; } return sumValue / (float)num; }