补全.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. #补全1--平均值填充
  2. from flask import Flask, request, jsonify
  3. import numpy as np
  4. import pandas as pd
  5. import os
  6. import requests
  7. from sklearn.impute import KNNImputer
  8. app = Flask(__name__)
  9. @app.route('/ave_data', methods=['POST'])
  10. def process_data1():
  11. try:
  12. # 检查请求体中是否包含文件地址
  13. data = request.json
  14. if 'file_url' not in data:
  15. return jsonify({'code': 400, 'msg': 'No file URL provided'})
  16. file_url = request.json.get('file_url')
  17. result_file_path = request.json.get('result_file_path')
  18. # 读取数据集
  19. df = pd.read_csv('{0}'.format(file_url))
  20. # 检查是否存在时间列
  21. if 'Time' in df.columns:
  22. # 提取时间列并转换为 datetime 类型
  23. df['Time'] = pd.to_datetime(df['Time'], errors='coerce')
  24. # 对时间列进行排序,确保时间顺序
  25. df.sort_values('Time', inplace=True)
  26. # 使用 interpolate 方法进行线性插值填充缺失的时间值
  27. df['Time'] = df['Time'].interpolate(method='time')
  28. # 如果时间列经过填充后,需要重新排序以保持原有的顺序(如果需要的话)
  29. # df.sort_index(inplace=True)
  30. # 分离数值型数据
  31. numerical_cols = df.select_dtypes(include=[np.number]).columns
  32. # 填充数值型数据的缺失值,使用均值填充
  33. for col in numerical_cols:
  34. df[col].fillna(df[col].mean(), inplace=True)
  35. # 分离分类型数据
  36. categorical_cols = df.select_dtypes(include=['object']).columns
  37. # 填充分类型数据的缺失值,使用众数填充
  38. for col in categorical_cols:
  39. df[col].fillna(df[col].mode()[0], inplace=True)
  40. # 将结果保存为CSV文件
  41. df.to_csv(result_file_path, index=False, header=False)
  42. # 构建返回数据,只返回文件路径
  43. return jsonify({
  44. 'code': 200,
  45. 'msg': '文件处理完成',
  46. })
  47. except Exception as e:
  48. return jsonify({
  49. 'code': 500,
  50. 'msg': str(e)
  51. })
  52. # #补全2--中位数填充
  53. @app.route('/upper_data', methods=['POST'])
  54. def process_data2():
  55. try:
  56. # 检查请求体中是否包含文件地址
  57. data = request.json
  58. if 'file_url' not in data:
  59. return jsonify({'code': 400, 'msg': 'No file URL provided'})
  60. file_url = request.json.get('file_url')
  61. result_file_path = request.json.get('result_file_path')
  62. # 读取数据集
  63. df = pd.read_csv('{0}'.format(file_url))
  64. # 检查是否存在时间列
  65. if 'Time' in df.columns:
  66. # 提取时间列并转换为 datetime 类型
  67. df['Time'] = pd.to_datetime(df['Time'], errors='coerce')
  68. # 对时间列进行排序,确保时间顺序
  69. df.sort_values('Time', inplace=True)
  70. # 使用 interpolate 方法进行线性插值填充缺失的时间值
  71. df['Time'] = df['Time'].interpolate(method='time')
  72. # 分离数值型数据
  73. numerical_cols = df.select_dtypes(include=[np.number]).columns
  74. # 填充数值型数据的缺失值,使用中位数填充
  75. for col in numerical_cols:
  76. df[col].fillna(df[col].median(), inplace=True)
  77. # 分离分类型数据
  78. categorical_cols = df.select_dtypes(include=['object']).columns
  79. # 填充分类型数据的缺失值,使用众数填充
  80. for col in categorical_cols:
  81. df[col].fillna(df[col].mode()[0], inplace=True)
  82. # 将结果保存为CSV文件
  83. df.to_csv(result_file_path, index=False, header=False)
  84. # 构建返回数据,只返回文件路径
  85. return jsonify({
  86. 'code': 200,
  87. 'msg': '文件处理完成',
  88. })
  89. except Exception as e:
  90. return jsonify({
  91. 'code': 500,
  92. 'msg': str(e)
  93. })
  94. # 补全3--众数填充
  95. @app.route('/mode_data', methods=['POST'])
  96. def process_data3():
  97. try:
  98. # 检查请求体中是否包含文件地址
  99. data = request.json
  100. if 'file_url' not in data:
  101. return jsonify({'code': 400, 'msg': 'No file URL provided'})
  102. file_url = request.json.get('file_url')
  103. result_file_path = request.json.get('result_file_path')
  104. # 读取数据集
  105. df = pd.read_csv('{0}'.format(file_url))
  106. # 检查是否存在时间列
  107. if 'Time' in df.columns:
  108. # 提取时间列并转换为 datetime 类型
  109. df['Time'] = pd.to_datetime(df['Time'], errors='coerce')
  110. # 对时间列进行排序,确保时间顺序
  111. df.sort_values('Time', inplace=True)
  112. # 使用 interpolate 方法进行线性插值填充缺失的时间值
  113. df['Time'] = df['Time'].interpolate(method='time')
  114. # 分离数值型数据
  115. numerical_cols = df.select_dtypes(include=[np.number]).columns
  116. # 填充数值型数据的缺失值,使用众数填充
  117. for col in numerical_cols:
  118. df[col].fillna(df[col].mode()[0], inplace=True)
  119. # 分离分类型数据
  120. categorical_cols = df.select_dtypes(include=['object']).columns
  121. # 填充分类型数据的缺失值,使用众数填充
  122. for col in categorical_cols:
  123. df[col].fillna(df[col].mode()[0], inplace=True)
  124. # 将结果保存为CSV文件
  125. df.to_csv(result_file_path, index=False, header=False)
  126. # 构建返回数据,只返回文件路径
  127. return jsonify({
  128. 'code': 200,
  129. 'msg': '文件处理完成',
  130. })
  131. except Exception as e:
  132. return jsonify({
  133. 'code': 500,
  134. 'msg': str(e)
  135. })
  136. # #补全4--常数填充
  137. @app.route('/constant_data', methods=['POST'])
  138. def process_data4():
  139. try:
  140. # 检查请求体中是否包含文件地址
  141. data = request.json
  142. if 'file_url' not in data:
  143. return jsonify({'code': 400, 'msg': 'No file URL provided'})
  144. file_url = request.json.get('file_url')
  145. result_file_path = request.json.get('result_file_path')
  146. # 读取数据集
  147. df = pd.read_csv('{0}'.format(file_url))
  148. # 检查是否存在时间列
  149. if 'Time' in df.columns:
  150. # 提取时间列并转换为 datetime 类型
  151. df['Time'] = pd.to_datetime(df['Time'], errors='coerce')
  152. # 对时间列进行排序,确保时间顺序
  153. df.sort_values('Time', inplace=True)
  154. # 使用 interpolate 方法进行线性插值填充缺失的时间值
  155. df['Time'] = df['Time'].interpolate(method='time')
  156. # 分离数值型数据和分类型数据
  157. numerical_cols = df.select_dtypes(include=[np.number]).columns
  158. categorical_cols = df.select_dtypes(include=['object']).columns
  159. # 定义常数填充值,这里以0为例
  160. constant_value = 0
  161. # 填充数值型数据的缺失值,使用常数填充
  162. for col in numerical_cols:
  163. df[col].fillna(constant_value, inplace=True)
  164. # 填充分类型数据的缺失值,使用常数0填充
  165. constant_value_categorical = '0' # 或者其他认为合适的值
  166. for col in categorical_cols:
  167. df[col].fillna(constant_value_categorical, inplace=True)
  168. # 将结果保存为CSV文件
  169. df.to_csv(result_file_path, index=False, header=False)
  170. # 构建返回数据,只返回文件路径
  171. return jsonify({
  172. 'code': 200,
  173. 'msg': '文件处理完成',
  174. })
  175. except Exception as e:
  176. return jsonify({
  177. 'code': 500,
  178. 'msg': str(e)
  179. })
  180. # #补全5--K-最近邻填充
  181. @app.route('/K_data', methods=['POST'])
  182. def process_data5():
  183. try:
  184. # 检查请求体中是否包含文件地址
  185. data = request.json
  186. if 'file_url' not in data:
  187. return jsonify({'code': 400, 'msg': 'No file URL provided'})
  188. file_url = request.json.get('file_url')
  189. result_file_path = request.json.get('result_file_path')
  190. # 读取数据集
  191. df = pd.read_csv('{0}'.format(file_url))
  192. # 检查是否存在时间列并处理
  193. if 'Time' in df.columns:
  194. df['Time'] = pd.to_datetime(df['Time'], errors='coerce')
  195. df.sort_values('Time', inplace=True)
  196. df['Time'] = df['Time'].interpolate(method='time')
  197. # 分离数值型数据
  198. numerical_cols = df.select_dtypes(include=[np.number]).columns
  199. # 使用 KNN 填充数值型数据的缺失值
  200. imputer = KNNImputer(n_neighbors=2)
  201. df[numerical_cols] = imputer.fit_transform(df[numerical_cols])
  202. # 分离分类型数据
  203. categorical_cols = df.select_dtypes(include=['object']).columns
  204. # 填充分类型数据的缺失值,使用众数填充
  205. for col in categorical_cols:
  206. df[col].fillna(df[col].mode()[0], inplace=True)
  207. # 将结果保存为CSV文件
  208. df.to_csv(result_file_path, index=False, header=False)
  209. # 构建返回数据,只返回文件路径
  210. return jsonify({
  211. 'code': 200,
  212. 'msg': '文件处理完成',
  213. })
  214. except Exception as e:
  215. return jsonify({
  216. 'code': 500,
  217. 'msg': str(e)
  218. })
  219. if __name__ == '__main__':
  220. app.run(debug=True, port=10000, host='0.0.0.0')