data_cleaning.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # time: 2023/10/11 11:00
  4. # file: data_cleaning.py
  5. # author: David
  6. # company: shenyang JY
  7. import numpy as np
  8. def cleaning(df, name, cols=None, dup=True):
  9. print("开始清洗:{}……".format(name))
  10. data = df.copy()
  11. if len(data) > 0:
  12. data = data_column_cleaning(data)
  13. if dup:
  14. data = rm_duplicated(data)
  15. if cols is not None:
  16. data = key_field_row_cleaning(data, cols)
  17. else:
  18. data = interpolation(data)
  19. return data
  20. def data_column_cleaning(data, clean_value=[-9999.0, -99, -99.0]):
  21. """
  22. 列的清洗
  23. :param data:
  24. :param clean_value:
  25. :return:
  26. """
  27. cols_pre = data.columns.to_list()
  28. for val in clean_value:
  29. data = data.replace(val, np.nan)
  30. # nan 列超过80% 删除
  31. data = data.dropna(axis=1, thresh=len(data) * 0.8)
  32. # 删除取值全部相同的列
  33. data = data.loc[:, (data != data.iloc[0]).any()]
  34. cols_late = data.columns.tolist()
  35. if len(cols_pre) > len(cols_late):
  36. print("清洗的列有:{}".format(set(cols_pre) - set(cols_late)))
  37. return data
  38. def interpolation(data):
  39. # 剩下的nan进行线性插值
  40. data = data.bfill()
  41. return data
  42. def key_field_row_cleaning(data, cols):
  43. """
  44. 行的重要字段清洗: 过滤含有- 99的数字,过滤空值
  45. :param data:
  46. :param cols: 指定的字段列表
  47. :return:
  48. """
  49. rows_pre = len(data)
  50. for col in cols:
  51. if col in data.columns.tolist():
  52. data = data[~((data.loc[:, col] < 0) & (data.loc[:, col].astype(str).str.contains('99')))]
  53. data = data[~data.loc[:, col].isnull()]
  54. rows_late = len(data)
  55. if rows_pre - rows_late > 0:
  56. print("清洗的行数有:", rows_pre-rows_late)
  57. return data
  58. def rm_duplicated(data):
  59. """
  60. 按照时间去重
  61. :param data:
  62. :return:
  63. """
  64. # 按照时间去重
  65. rows_pre = len(data)
  66. data = data.groupby(by='C_TIME').mean()
  67. data.reset_index(inplace=True)
  68. rows_late = len(data)
  69. if rows_pre - rows_late > 0:
  70. print("时间去重的行数有:", rows_pre - rows_late)
  71. return data