数据可视化中的动态数据转换

Dynamic data transform in data visualization

我对 java 中的数据可视化有疑问。 我在营销团队工作,我需要为他们制作报告。

我的模特:

class AdReportEntity {
    String date;
    String clientName;
    AdInfoEntity adInfo;
    int cost;
    int impression;
    int click;
    ...

}

AdInfoEntity:

class AdInfoEntity{

String campaignName;
String adgroupName;
String adname;
...

}

客户端有 2 个主要组件:

  1. 条形图显示每日费用(所有客户的总和)。
  2. table 显示详细信息:
    日期 |客户名称 | campaignName |adgroupName|广告名称|费用|印象|点击

问题:
要求是比较动态的图表和table。 有时用户希望按客户、AdName、campaignName 显示图表,或者可能只是按 campaignName 的前 3 个字符等分组。
如何实现服务器更动态?

我的解决方案是根据参数用户请求求和,例如:

 String groupColumn=request.getParameter("column");
    switch(groupColumn){
    case "clientName":
        doSumByClientName();
    case "adName":
        doSumByAdName();
    case "spec1":
        doSumBySubStringAdName():
        ....
    }

我在排序和过滤方面遇到了同样的问题。
我也为我的实体尝试了列基础,但很难处理像 ctr=click/impression.

这样的依赖属性

您可以看看 Tablesaw,(https://github.com/lwhite1/tablesaw),不确定它是否能满足您的所有需求,但它肯定会在 Java 中进行排序和过滤。这是一些代码。

Table tornados = Table.createFromCsv("data/tornadoes_1950-2014.csv");
tornadoes.setName("tornadoes");

tornados.structure().print();
output:
    Structure of tornadoes_1950-2014.csv
    Index Column Name Column Type 
    0     Date        LOCAL_DATE  
    1     Time        LOCAL_TIME  
    2     State       CATEGORY    
    3     Scale       SHORT_INT   
    4     Injuries    SHORT_INT   
    5     Fatalities  SHORT_INT   
    6     Start Lat   FLOAT       
    7     Start Lon   FLOAT       
    8     Length      FLOAT       
    9     Width       FLOAT    

tornados.shape()
output:
    59945 rows X 10 cols

// gets the month from every date, and counts by month
CategoryColumn month = tornadoes.dateColumn("Date").month();
month.summary();
output:

    Column: Date month
    Category  Count 
    JANUARY   1417  
    MARCH     3935  
    JULY      6305  
    MAY       13072 
    SEPTEMBER 3142  
    OCTOBER   2332  
    DECEMBER  1355  
    NOVEMBER  2364  
    FEBRUARY  1672  
    APRIL     8533  
    AUGUST    4066  
    JUNE      11633 


Table injuriesByScale = tornados.median("Injuries").by("Scale");
output:
    Median injuries by Tornado Scale
    Scale Median [Injuries] 
    -9    0.0               
    0     0.0               
    1     0.0               
    2     0.0               
    3     2.0               
    4     14.0              
    5     141.0             

// query:
Table fatal =  
     tornados.selectWhere(column("Fatalities").isGreaterThan(0));
// sort
Table sorted = tornados.sortOn("State");

它也做很多其他的事情,包括一些统计数据、简单的图表等。

完全公开,我是 Tablesaw 的主要作者,它的边缘仍然有点粗糙。