
#补全1--平均值填充
from flask import Flask, request, jsonify
import numpy as np
import pandas as pd
import os
import requests
from sklearn.impute import KNNImputer

app = Flask(__name__)

@app.route('/ave_data', methods=['POST'])
def process_data1():
    try:
        # 检查请求体中是否包含文件地址
        data = request.json
        if 'file_url' not in data:
            return jsonify({'code': 400, 'msg': 'No file URL provided'})

        file_url = request.json.get('file_url')
        result_file_path = request.json.get('result_file_path')

        # 读取数据集
        df = pd.read_csv('{0}'.format(file_url))
        # 检查是否存在时间列
        if 'Time' in df.columns:
            # 提取时间列并转换为 datetime 类型
            df['Time'] = pd.to_datetime(df['Time'], errors='coerce')

            # 对时间列进行排序，确保时间顺序
            df.sort_values('Time', inplace=True)

            # 使用 interpolate 方法进行线性插值填充缺失的时间值
            df['Time'] = df['Time'].interpolate(method='time')

            # 如果时间列经过填充后，需要重新排序以保持原有的顺序（如果需要的话）
            # df.sort_index(inplace=True)

        # 分离数值型数据
        numerical_cols = df.select_dtypes(include=[np.number]).columns

        # 填充数值型数据的缺失值，使用均值填充
        for col in numerical_cols:
            df[col].fillna(df[col].mean(), inplace=True)

        # 分离分类型数据
        categorical_cols = df.select_dtypes(include=['object']).columns

        # 填充分类型数据的缺失值，使用众数填充
        for col in categorical_cols:
            df[col].fillna(df[col].mode()[0], inplace=True)

        # 将结果保存为CSV文件
        df.to_csv(result_file_path, index=False, header=False)

        # 构建返回数据，只返回文件路径
        return jsonify({
            'code': 200,
            'msg': '文件处理完成',
        })

    except Exception as e:
        return jsonify({
            'code': 500,
            'msg': str(e)
        })




# #补全2--中位数填充

@app.route('/upper_data', methods=['POST'])
def process_data2():
    try:
        # 检查请求体中是否包含文件地址
        data = request.json
        if 'file_url' not in data:
            return jsonify({'code': 400, 'msg': 'No file URL provided'})

        file_url = request.json.get('file_url')
        result_file_path = request.json.get('result_file_path')

        # 读取数据集
        df = pd.read_csv('{0}'.format(file_url))

        # 检查是否存在时间列
        if 'Time' in df.columns:
            # 提取时间列并转换为 datetime 类型
            df['Time'] = pd.to_datetime(df['Time'], errors='coerce')

            # 对时间列进行排序，确保时间顺序
            df.sort_values('Time', inplace=True)

            # 使用 interpolate 方法进行线性插值填充缺失的时间值
            df['Time'] = df['Time'].interpolate(method='time')

        # 分离数值型数据
        numerical_cols = df.select_dtypes(include=[np.number]).columns

        # 填充数值型数据的缺失值，使用中位数填充
        for col in numerical_cols:
            df[col].fillna(df[col].median(), inplace=True)

        # 分离分类型数据
        categorical_cols = df.select_dtypes(include=['object']).columns

        # 填充分类型数据的缺失值，使用众数填充
        for col in categorical_cols:
            df[col].fillna(df[col].mode()[0], inplace=True)

        # 将结果保存为CSV文件
        df.to_csv(result_file_path, index=False, header=False)

        # 构建返回数据，只返回文件路径
        return jsonify({
            'code': 200,
            'msg': '文件处理完成',
        })

    except Exception as e:
        return jsonify({
            'code': 500,
            'msg': str(e)
        })




# 补全3--众数填充


@app.route('/mode_data', methods=['POST'])
def process_data3():
    try:
        # 检查请求体中是否包含文件地址
        data = request.json
        if 'file_url' not in data:
            return jsonify({'code': 400, 'msg': 'No file URL provided'})

        file_url = request.json.get('file_url')
        result_file_path = request.json.get('result_file_path')

        # 读取数据集
        df = pd.read_csv('{0}'.format(file_url))

        # 检查是否存在时间列
        if 'Time' in df.columns:
            # 提取时间列并转换为 datetime 类型
            df['Time'] = pd.to_datetime(df['Time'], errors='coerce')

            # 对时间列进行排序，确保时间顺序
            df.sort_values('Time', inplace=True)

            # 使用 interpolate 方法进行线性插值填充缺失的时间值
            df['Time'] = df['Time'].interpolate(method='time')

        # 分离数值型数据
        numerical_cols = df.select_dtypes(include=[np.number]).columns

        # 填充数值型数据的缺失值，使用众数填充
        for col in numerical_cols:
            df[col].fillna(df[col].mode()[0], inplace=True)

        # 分离分类型数据
        categorical_cols = df.select_dtypes(include=['object']).columns

        # 填充分类型数据的缺失值，使用众数填充
        for col in categorical_cols:
            df[col].fillna(df[col].mode()[0], inplace=True)

        # 将结果保存为CSV文件
        df.to_csv(result_file_path, index=False, header=False)

# 构建返回数据，只返回文件路径
        return jsonify({
            'code': 200,
            'msg': '文件处理完成',
        })

    except Exception as e:
        return jsonify({
            'code': 500,
            'msg': str(e)
        })




# #补全4--常数填充


@app.route('/constant_data', methods=['POST'])
def process_data4():
    try:
        # 检查请求体中是否包含文件地址
        data = request.json
        if 'file_url' not in data:
            return jsonify({'code': 400, 'msg': 'No file URL provided'})

        file_url = request.json.get('file_url')
        result_file_path = request.json.get('result_file_path')

        # 读取数据集
        df = pd.read_csv('{0}'.format(file_url))

        # 检查是否存在时间列
        if 'Time' in df.columns:
            # 提取时间列并转换为 datetime 类型
            df['Time'] = pd.to_datetime(df['Time'], errors='coerce')

            # 对时间列进行排序，确保时间顺序
            df.sort_values('Time', inplace=True)

            # 使用 interpolate 方法进行线性插值填充缺失的时间值
            df['Time'] = df['Time'].interpolate(method='time')

        # 分离数值型数据和分类型数据
        numerical_cols = df.select_dtypes(include=[np.number]).columns
        categorical_cols = df.select_dtypes(include=['object']).columns

        # 定义常数填充值，这里以0为例
        constant_value = 0

        # 填充数值型数据的缺失值，使用常数填充
        for col in numerical_cols:
            df[col].fillna(constant_value, inplace=True)

        # 填充分类型数据的缺失值，使用常数0填充
        constant_value_categorical = '0'  # 或者其他认为合适的值
        for col in categorical_cols:
            df[col].fillna(constant_value_categorical, inplace=True)

        # 将结果保存为CSV文件
        df.to_csv(result_file_path, index=False, header=False)

        # 构建返回数据，只返回文件路径
        return jsonify({
            'code': 200,
            'msg': '文件处理完成',
        })

    except Exception as e:
        return jsonify({
            'code': 500,
            'msg': str(e)
        })






# #补全5--K-最近邻填充

@app.route('/K_data', methods=['POST'])
def process_data5():
    try:
        # 检查请求体中是否包含文件地址
        data = request.json
        if 'file_url' not in data:
            return jsonify({'code': 400, 'msg': 'No file URL provided'})

        file_url = request.json.get('file_url')
        result_file_path = request.json.get('result_file_path')

        # 读取数据集
        df = pd.read_csv('{0}'.format(file_url))

        # 检查是否存在时间列并处理
        if 'Time' in df.columns:
            df['Time'] = pd.to_datetime(df['Time'], errors='coerce')
            df.sort_values('Time', inplace=True)
            df['Time'] = df['Time'].interpolate(method='time')

        # 分离数值型数据
        numerical_cols = df.select_dtypes(include=[np.number]).columns

        # 使用 KNN 填充数值型数据的缺失值
        imputer = KNNImputer(n_neighbors=2)
        df[numerical_cols] = imputer.fit_transform(df[numerical_cols])

        # 分离分类型数据
        categorical_cols = df.select_dtypes(include=['object']).columns

        # 填充分类型数据的缺失值，使用众数填充
        for col in categorical_cols:
            df[col].fillna(df[col].mode()[0], inplace=True)

        # 将结果保存为CSV文件
        df.to_csv(result_file_path, index=False, header=False)

        # 构建返回数据，只返回文件路径
        return jsonify({
            'code': 200,
            'msg': '文件处理完成',
        })

    except Exception as e:
        return jsonify({
            'code': 500,
            'msg': str(e)
        })

if __name__ == '__main__':
    app.run(debug=True, port=10000, host='0.0.0.0')



