时间序列

  • 需求:将一组字符顺序添加到时间序列中
  • 实现:定义时间序列类TimeSeries,包含静态类Entry表示序列类中的各项,以及add,get,iterator,entry方法

TimeSeries.java

 1 import java.util.ArrayList;
2 import java.util.Iterator;
3 import java.util.Map;
4 import java.util.TreeMap;
5 import java.util.concurrent.TimeUnit;
6
7 public class TimeSeries<T> implements Iterable<TimeSeries.Entry> {
8 private final Map<Long,T> map = new TreeMap();
9
10 public void add(long time, T event) {
11 map.put(time, event);
12 try {
13 TimeUnit.MICROSECONDS.sleep(1); // 0.000001 sec delay
14 } catch(InterruptedException e) {
15 System.err.println(e);
16 }
17 }
18
19 public T get(long time) {
20 return map.get(time);
21 }
22
23 ArrayList getList() {
24 ArrayList<Entry> list = new ArrayList();
25 for (Entry entry : this) {
26 list.add(entry);
27 }
28 return list;
29 }
30
31 public int size() {
32 return map.size();
33 }
34
35 @Override
36 public Iterator iterator() {
37 return new Iterator() { // anonymous inner class
38 private final Iterator it = map.keySet().iterator();
39
40 @Override
41 public boolean hasNext() {
42 return it.hasNext();
43 }
44
45 @Override
46 public Entry<T> next() {
47 long time = (Long)it.next();
48 T event = map.get(time);
49 return new Entry(time, event);
50 }
51 };
52 }
53
54 public static class Entry<T> {
55 private final Long time;
56 private final T event;
57
58 public Entry(long time, T event) {
59 this.time = time;
60 this.event = event;
61 }
62
63 public long getTime() {
64 return time;
65 }
66
67 public T getEvent() {
68 return event;
69 }
70
71 @Override
72 public String toString() {
73 return String.format("(%d, %s)", time, event);
74 }
75 }
76 }

TimeSeriesTester.java

 1 import java.util.ArrayList;
2
3 public class TimeSeriesTester {
4 final static String[] EVENTS = {"It", "was", "the", "best", "of", "times"};
5
6 public static void main(String[] args) {
7 TimeSeries<String> series = new TimeSeries();
8 load(series);
9
10 for (TimeSeries.Entry<String> entry : series) {
11 long time = entry.getTime();
12 String event = entry.getEvent();
13 System.out.printf("%16d: %s%n", time, event);
14 }
15
16 ArrayList list = series.getList();
17 System.out.printf("list.get(3) = %s%n", list.get(3));
18 }
19
20 static void load(TimeSeries<String> series) {
21 for (String event : EVENTS) {
22 series.add(System.currentTimeMillis(), event);
23 }
24 }
25 }

移动平均

  • 需求:实现一个序列,其值是原始序列连续片段的平均值
  • 实现:定义移动平均类MovingAverage,继承TimeSeries,同时实现根据原始序列和片段长度生成新序列的构造方法,tmp每次计算保存一个片段,sum计算片段元素之和,最后把平均值添加到序列中
  • 注意
    • 如原始序列有8个元素,片段长度为3,则新序列长度为 8-8%3=6
    • 对于a=b=c,先执行b=c,再执行a=b
    • tmp不是每次全部更新,替换一个元素即可,求和后i自增

MovingAverage.java

 1 import java.util.Iterator;
2
3 public class MovingAverage extends TimeSeries<Double> {
4 private final TimeSeries parent;
5 private final int length;
6
7 public MovingAverage(TimeSeries parent, int length) {
8 this.parent = parent;
9 this.length = length;
10 if (length > parent.size()) {
11 throw new IllegalArgumentException("That's too long.");
12 }
13
14 double[] tmp = new double[length]; // temp array to compute averages
15 double sum = 0;
16 int i=0;
17 Iterator it = parent.iterator();
18 for (int j = 0; j < length; j++) {
19 sum += tmp[i++] = nextValue(it);
20 }
21 this.add(System.currentTimeMillis(), sum/length);
22
23 while (it.hasNext()) {
24 sum -= tmp[i%length];
25 sum += tmp[i++%length] = nextValue(it);
26 this.add(System.currentTimeMillis(), sum/length);
27 }
28 }
29
30 /* Returns the double value in the Entry currently located by it.
31 */
32 private static double nextValue(Iterator it) {
33 TimeSeries.Entry<Double> entry = (TimeSeries.Entry)it.next();
34 return entry.getEvent();
35 }
36 }

MovingAverageTester.java

 1 public class MovingAverageTester {
2 static final double[] DATA = {20, 25, 21, 26, 28, 27, 29, 31};
3
4 public static void main(String[] args) {
5 TimeSeries<Double> series = new TimeSeries();
6 for (double x : DATA) {
7 series.add(System.currentTimeMillis(), x);
8 }
9 System.out.println(series.getList());
10
11 TimeSeries<Double> ma3 = new MovingAverage(series, 3);
12 System.out.println(ma3.getList());
13
14 TimeSeries<Double> ma5 = new MovingAverage(series, 5);
15 System.out.println(ma5.getList());
16 }
17 }

指数分布

  • 需求:模拟输出客服接电话的时间,两次电话之间的时间为指数分布,已知平均8小时接到120个电话
  • 实现:平均等待时间为4分钟,密度参数为0.25,生成随机数后代入指数分布公式,即得到时间

 1 import java.util.Random;
2
3 public class ArrivalTimesTester {
4 static final Random random = new Random();
5 static final double LAMBDA = 0.25;
6
7 static double time() {
8 double p = random.nextDouble();
9 return -Math.log(1 - p)/LAMBDA;
10 }
11
12 public static void main(String[] args) {
13 double sum=0;
14 for (int i = 0; i < 8; i++) {
15 System.out.println(time());
16 sum += time();
17 }
18 System.out.println("\n");
19 System.out.println(sum/8);
20 }
21 }

[Java]数据分析--数据可视化的更多相关文章

  1. 数据分析 | 数据可视化图表,BI工具构建逻辑

    本文源码:GitHub·点这里 || GitEE·点这里 一.数据可视化 1.基础概念 数据可视化,是关于数据视觉表现形式的科学技术研究.其中,这种数据的视觉表现形式被定义为,一种以某种概要形式抽取出 ...

  2. [Java] 数据分析--数据预处理

    数据结构 键-值对:HashMap 1 import java.io.File; 2 import java.io.FileNotFoundException; 3 import java.util. ...

  3. 超级好用的 Java 数据可视化库:Tablesaw

    本文适合刚学习完 Java 语言基础的人群,跟着本文可了解和使用 Tablesaw 项目.示例均在 Windows 操作系统下演示 本文作者:HelloGitHub-秦人 HelloGitHub 推出 ...

  4. 数据可视化工具zeppelin安装

    介绍 zeppelin主要有以下功能 数据提取 数据发现 数据分析 数据可视化 目前版本(0.5-0.6)之前支持的数据搜索引擎有如下 安装 环境 centOS 6.6 编译准备工作 sudo yum ...

  5. 【PyQt5-Qt Designer】PyQt5+pyecharts 实现GUI界面的数据可视化展示

    先用纯Python代码写一个简单的小案例: from PyQt5.QtCore import QUrl from PyQt5.QtWidgets import QApplication,QWidget ...

  6. 推荐几款顶级的数据可视化及大数据分析BI工具

    如今,有大量强大的可视化工具可用于表达想法.可视化数据.向客户和全球社区分享重要的分析结果.现在大大小小的企业都可以利用商业智能工具来理解复杂的大数据. 这些解决方案可以收集,分析这些数据并将其转换为 ...

  7. 2017 年 机器学习之数据挖据、数据分析,可视化,ML,DL,NLP等知识记录和总结

    今天是2017年12月30日,2017年的年尾,2018年马上就要到了,回顾2017过的确实很快,不知不觉就到年末了,再次开篇对2016.2017年的学习数据挖掘,机器学习方面的知识做一个总结,对自己 ...

  8. 动态可视化 数据可视化之魅D3,Processing,pandas数据分析,科学计算包Numpy,可视化包Matplotlib,Matlab语言可视化的工作,Matlab没有指针和引用是个大问题

    动态可视化 数据可视化之魅D3,Processing,pandas数据分析,科学计算包Numpy,可视化包Matplotlib,Matlab语言可视化的工作,Matlab没有指针和引用是个大问题 D3 ...

  9. (数据科学学习手札78)基于geopandas的空间数据分析——基础可视化

    本文对应代码和数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 通过前面的文章,我们已经对geopanda ...

随机推荐

  1. 一文教你搞懂 Go 中栈操作

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/513 本文使用的go的源码15.7 知识点 LInux 进程在内存布 ...

  2. 阿里妈妈Java后端 社招5面(Offer已拿)

    最近由于个人原因, 由于前面两面的时间过去的有点久了,只能根据记忆大概写些记得问题.   阿里妈妈1面 40mins(2021-02-22) 1. 能简单介绍下自己和自己做的项目吗? 2. 关于项目的 ...

  3. Unity2D项目-平台、解谜、战斗! 1.1战斗底层组件CanFight-CanBeFighted

    各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 本文对该2D项目中战斗底层组件的开发及设计思路做一个总结,希望各路同行多多交流,各路大佬多多指点. 实例特征分析 首先对于各个 ...

  4. lustre文件系统环境搭建及测试

    目录 1.节点角色 2.硬件配置 3.软件版本 4.安装软件包 4.1.安装 e2fsprogs 相关包 4.2.安装 kernel 相关包 4.3.客户端安装 4.4.服务器端安装 4.5.配置 5 ...

  5. 【macOS】显示/隐藏 允许“任何来源”的应用

    问题产生 在macOS中安装某些版本软件时会提示: "xxx"已损坏,打不开.您应该将它移动到废纸篓. 某些情况下实际上并不是软件已损坏,而是因为macOS对于开发者的验证导致软件 ...

  6. 女娲造人引发思考之Java设计模式:工厂模式

    目录 工厂模式的几种形态 简单工厂模式 示例 结构 优缺点 女娲抟土造人 工厂方法模式 结构 女娲举绳造人 抽象工厂模式 结构 女娲造万物 工厂模式的几种形态 工厂模式专门负责将大量有共同接口的类实例 ...

  7. day10.闭包函数与装饰器

    一.闭包函数 1.闭函数:被封闭起来的函数==>定义在函数内部的函数,特点是只能在函数内调用 2.包函数:该函数引用了一个名字,该名字来自于E这一层 总结:闭包函数指的是定义在函数内部的函数引用 ...

  8. MySQL数据库干货分享!mysql每月自动创建表结构

    如果你刚好在学MySQL,博主推荐一套很详细的MySQL教程 主要详细讲解了MySQL的相关知识,包括MySQL概述,MySQL应用环境,MySQL系统特性,MySQL初学基础,MySQL管理工具,如 ...

  9. Dubbo学习笔记(一) 基础知识HelloWorld

    Dubbo是由阿里巴巴研发出的一款基于Java实现的RPC框架,现由Apache进行维护管理,笔记中使用zookeeper作为注册中心,dubbo+zookeeper环境安装教程:https://ww ...

  10. hdu1839 二分最短路

    题意:       给你n个城市,m条双向边,每条边有自己的长度和最大运输量,让你找到一条时间小于等于T的运输能力最大的那条路... 思路:       刚开始以为是费用流呢,后来发现根本不是,因为根 ...