All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.datastax.data.exploration.service.chart.impl.ScatterServiceImpl Maven / Gradle / Ivy

The newest version!
package com.datastax.data.exploration.service.chart.impl;

import com.alibaba.fastjson.JSONObject;
import com.datastax.data.exploration.biz.datatable.DataTable;
import com.datastax.data.exploration.biz.datatable.DataType;
import com.datastax.data.exploration.common.DataOperator;
import com.datastax.data.exploration.common.DataTypeHandler;
import com.datastax.data.exploration.common.File2DataTable;
import com.datastax.data.exploration.dto.dataChart.scatter.ScatterChartValue;
import com.datastax.data.exploration.service.chart.ScatterService;
import com.datastax.data.exploration.util.CommonUtil;
import com.datastax.data.exploration.util.Consts;
import org.javatuples.Pair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import static com.datastax.data.exploration.util.CommonUtil.columnIndex;
import static com.datastax.data.exploration.util.CommonUtil.getFormat;

/**
 * 散点图
 * @author songfu 2017/12/16
 */
@Service("scatterService")
public class ScatterServiceImpl implements ScatterService {

    private static final Logger logger = LoggerFactory.getLogger(ScatterServiceImpl.class);
    private static final String labelPreffix = "vector-";

    /**
     * 获取散点图初始化数据
     * @param id 数据集id
     * @return 返回的是散点初始化数据
     */
    @Override
    public JSONObject scatterInit(String id) {
        List axisX = DataTypeHandler.noText(File2DataTable.tableSchema(id));
        if (axisX.size() == 0) {
            axisX.add(Consts.NONE);
        }
        JSONObject json = new JSONObject();
        json.put("axisX",axisX);
        json.put("axisY",axisX);
        json.put("color",axisX);
        return json;
    }

    /**
     * 获取散点图展示的数据
     * @param id 数据集id
     * @param axisX 散点图x轴
     * @param axisY 散点图y轴
     * @param color 散点图color维度
     * @return 返回的是散点图展示的数据
     */
    @Override
    public JSONObject scatterSelect(String id, String axisX, String axisY, String color) {
        DataTable table = File2DataTable.exactTable(id);
        String[] type = {typeAndformat(table,axisX).getValue0()
                ,typeAndformat(table,axisY).getValue0()
                ,typeAndformat(table,color).getValue0()};
        String[] format = {typeAndformat(table,axisX).getValue1()
                ,typeAndformat(table,axisY).getValue1()
                ,typeAndformat(table,color).getValue1()};
        JSONObject json = new JSONObject();
        json.put("data",table.getRows().dataDimen3(axisX,axisY,color));
        json.put("type",type);
        json.put("format",format);
        return json;
    }

    private Pair typeAndformat(DataTable table,String column) {
        DataType dataType = table.getColumns().getColumn(column).getType();
        return new Pair<>(dataType.getName(),getFormat(dataType));
    }

    /**
     * 获取数据集中用于离群点散点图的属性列
     * @param id 数据集id
     * @return 符合条件的属性列
     */
    @Override
    public List getOutlierInitColumns(String id) {
        return DataTypeHandler.getNumericType(File2DataTable.tableSchema(id));
    }

/*
    */
/**
     * 通过k邻近距离检测离群点
     * @param id 数据集id
     * @param axisX x轴属性列
     * @param axisY y轴属性列
     * @param k 确定某对象与其第k个邻近对象的距离
     * @param n 离群点数量
     * @param distanceType 距离度量方法
     * @return 带有离群点标志的数据
     *//*

    @Override
    public ScatterChartValue distanceOutlier(String id, String axisX, String axisY, int k, int n, String distanceType) {
        OutlierObject[] outlierObjects = data2OutlierObjects(id, axisX, axisY);
        if(k > outlierObjects.length) {
            k = outlierObjects.length;
        }
        if(n > outlierObjects.length) {
            n = outlierObjects.length;
        }
        if(outlierObjects.length != 0) {
            OutlierDetection.distanceOutlier(outlierObjects, k, n, distanceType);
        }
        return outlierObject2ScatterChartValue(id, axisX, axisY, outlierObjects, 0);
    }

    */
/**
     * 通过比例检测离群点
     * @param id 数据集id
     * @param axisX x轴的属性列
     * @param axisY y轴的属性列
     * @param distance 距离
     * @param proportion 比例
     * @param distanceType 距离度量方法
     * @return 带有离群点标志的数据
     *//*

    @Override
    public ScatterChartValue densitiesOutlier(String id, String axisX, String axisY, double distance, double proportion, String distanceType) {
        OutlierObject[] outlierObjects = data2OutlierObjects(id, axisX, axisY);
        if(outlierObjects.length != 0) {
            OutlierDetection.densitiesOutlier(outlierObjects, distance, proportion, distanceType, outlierObjects.length);
        }
        return outlierObject2ScatterChartValue(id, axisX, axisY, outlierObjects, 0);
    }

    */
/**
     * 通过局部离群因子(LOF)检测离群点
     * @param id 数据里id
     * @param axisX x轴的属性列
     * @param axisY y轴的属性列
     * @param lower k下限
     * @param upper k上限
     * @param distanceType 距离度量方法
     * @return 带有离群点标志的数据
     *//*

    @Override
    public ScatterChartValue LOFOutlier(String id, String axisX, String axisY, int lower, int upper, String distanceType) {
        OutlierObject[] outlierObjects = data2OutlierObjects(id, axisX, axisY);
        if(lower > outlierObjects.length) {
            lower = outlierObjects.length;
            upper = outlierObjects.length;
        }
        if(upper > outlierObjects.length) {
            upper = outlierObjects.length;
        }
        if(outlierObjects.length != 0) {
            OutlierDetection.LOFOutlier(outlierObjects, lower, upper, distanceType);
        }
        return outlierObject2ScatterChartValue(id, axisX, axisY, outlierObjects, 1);
    }

    private OutlierObject[] data2OutlierObjects(String id, String axisX, String axisY) {
        List data = DataOperator.readExactData(id);
        String[] columns = DataOperator.readHeaders(id);
        int[] positions = CommonUtil.columnIndex(columns, new String[]{axisX, axisY});
        if(positions[0] == -1 || positions[1] == -1) {
            logger.info("离群点散点图的x轴的属性列或者y轴的属性列不存在");
            return new OutlierObject[]{};
        }
        OutlierObject[] outlierObjects = new OutlierObject[data.size()];
        for(int i=0; i list = new ArrayList<>(outlierObjects.length);
        for(OutlierObject outlierObject : outlierObjects) {
            Object[] objs = new Object[outlierObject.vector().length + 1];
            for(int i=0; i types = DataOperator.readType(id);
        return new ScatterChartValue(list, new String[]{}, new String[]{types.get(axisX), types.get(axisY)});
    }
*/


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy