利用poi实现对数据清洗
1.数据清洗
1.1.什么是数据清洗
数据清洗(Data cleaning)– 对数据进行重新审查和校验的过程,目的在于删除重复信息、纠正存在的错误,并提供数据一致性。
数据清洗从名字上也看的出就是把“脏”的“洗掉”,指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。因为数据仓库中的数据是面向某一主题的数据的集合,这些数据从多个业务系统中抽取而来而且包含历史数据,这样就避免不了有的数据是错误数据、有的数据相互之间有冲突,这些错误的或有冲突的数据显然是我们不想要的,称为“脏数据”。我们要按照一定的规则把“脏数据”“洗掉”,这就是数据清洗。而数据清洗的任务是过滤那些不符合要求的数据,将过滤的结果交给业务主管部门,确认是否过滤掉还是由业务单位修正之后再进行抽取。不符合要求的数据主要是有不完整的数据、错误的数据、重复的数据三大类。数据清洗是与问卷审核不同,录入后的数据清理一般是由计算机而不是人工完成
1.2.数据清洗的步骤
数据清洗的步骤相对较为简单与清晰,有两个阶段:
-
第一步:偏差检测(Discrepancy Detection):即检查导致偏差的因素,并识别离散值与噪声值,例如我们采取的数据是否具有代表性,数据量是否足够,偶然因素,其他因素等的影响,这些都是能够体现数学模型上的离散值和噪声值
-
第二步:数据清洗(Data Cleansing):即处理缺失值与噪声。
1.3.数据清洗的方法
- 缺失数据填补
填补缺失值的方法有如下3大类: - 直接删除:
可以删除带有缺失值的记录,也可直接删除有缺失值的属性。但在实际中不太有效,尤其是在缺失值变化多,跨多个自变量的情况下。 - 人工填写:
用人手工填写上确实的值,听上去就不实际且费时间。大数据的分析可以直接忽略这个方法。 - 自动填充:
这个方法是目前用的最为广泛的。顾名思义,用某些值自动填充缺失值。依照自动填充的值不同做出清洗
1.4.那么我们该怎么实现数据清洗呢?
备注:其实不需要我们干,因为这些往往都是有专门的岗位或者部门进行的,例如算法工程师出算法,大数据工程师进行实现,运用大数据的相关框架/知识进行清洗。
ps:那么我们该怎么实现数据清洗呢,我们的做法是对爬虫获取到的数据实现统计求和或者去重排序等
导读模块:我们本次的清洗就是将三个excel中的薪水,进行归类统计,对面议和其他等这些情况的薪水忽略不计
2.1.使用poi实现对excel的写入(2003版本的Excel)
package com.Li.poi;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import jxl.Workbook;
/**
* @Description: 使用 HSSFWorkbook poi jar 实现写入Excel
* @auther:Li Ya Hui
* @Time:2021年4月29日下午1:51:42
*/
public class Test {
public static void main(String[] args) throws IOException {
//1.使用 HSSFWorkbook poi jar创建一个workbook对象
HSSFWorkbook workbook = new HSSFWorkbook();
//2.创建sheet
HSSFSheet sheet = workbook.createSheet();
//3.创建第一行对象
HSSFRow row = sheet.createRow(0);
//4.写入表头
String[] biaotouStrings = {"编号","姓名"};
for (int i = 0; i < biaotouStrings.length; i++) {
//创建列 创建单元格
HSSFCell cell = row.createCell(i);
//写入值
cell.setCellValue(biaotouStrings[i]);
}
//5.向表头下写入20条数据
for (int i = 1; i < 20; i++) {
//创建行
HSSFRow row2 = sheet.createRow(i);
//创建每行的第一列
HSSFCell cell01 = row2.createCell(0);
//写入第一列的值
cell01.setCellValue(i);
//创建第二列
HSSFCell cell02 = row2.createCell(1);
//写入第二列的值
cell02.setCellValue("00_"+i);
}
//6.指定文件的路径
File file = new File("E://poi_Excell//poi_one.xls");
//7.初始化文件输出流对象
FileOutputStream fileOutputStream = new FileOutputStream(file);
//8.将数据写入文件
workbook.write(fileOutputStream);
//9.刷新 fileOutputStream 数据
fileOutputStream.flush();
//10.关闭相对应的流对象
fileOutputStream.close();
workbook.close();
}
}
2.2.poi实现读取excel中的数据(2003版本的Excel)
package com.Li.poi;
import java.io.FileInputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.xmlbeans.impl.xb.xsdschema.TotalDigitsDocument.TotalDigits;
/**
* @Description: 实现Poi的读取Excel中的数据
* @auther:Li Ya Hui
* @Time:2021年4月29日下午2:15:54
*/
public class Test02 {
public static void main(String[] args) throws Exception {
//1.文件的路径
String pathName = "E://poi_Excell//poi_one.xls";
//2.将需要解析的excel转为流进行输出
FileInputStream fileInputStream = new FileInputStream(pathName);
//3.实例化poi的核心类
HSSFWorkbook workbook = new HSSFWorkbook(fileInputStream);
//4.获取当前的Excel的第一个sheet 也就是第一个页
HSSFSheet sheet = workbook.getSheetAt(0);
//5.获取当前sheet有多少个行
int totalRows = sheet.getPhysicalNumberOfRows();
//6.循环读取每一行
for (int i = 0; i < totalRows; i++) {
//取出每一行
HSSFRow row = sheet.getRow(i);
//获取一共有多少列
int totalCellNums = row.getPhysicalNumberOfCells();
//循环每一行的每一列
for (int j = 0; j < totalCellNums; j++) {
//获取单元格
HSSFCell cell = row.getCell(j);
//获取值
//获取值的函数有缺陷 自己写一个函数
String CellValue = getValue(cell);
//输出值
System.out.print(CellValue+"\t");
}
System.out.println();
}
}
/**
* @desc 自定义函数 -- 格式化输出
* @param cell
* @return
*/
//获取各种类型的cell
public static String getValue(Cell cell)
{
//判断是否是数字类型 单元格的 值
if (cell.getCellType()==Cell.CELL_TYPE_NUMERIC)//数字单元格
{
//返回时将值使用valueof 传出去
return String.valueOf((int) cell.getNumericCellValue());
}
else if(cell.getCellType()==Cell.CELL_TYPE_BOOLEAN) //
{
return String.valueOf(cell.getBooleanCellValue());
}
//返回字符串类型的值
return cell.getStringCellValue();
}
}
2.3.poi操作excel2007+版本的解析 (2007+版本的Excel)
导读模块:随着Excel的版本更新,现在的市面上有一部分人是使用Excel2003当然也有一部分人是使用excel2007+,为此我们该怎么办呢?其实poi已经帮我们做好了,至于解析高版本的excel2007+与2003版本比较只是核心的类发生了更改,其步骤和思路都没变化
excel2007:XSSFWorkbook ---->XSSFSheet ---->XSSFRow—>XSSFCell
package com.Li.poi;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import jxl.Workbook;
/**
* @Description: 使用 poi 实现写入Excel (2007+版本的Excel)
* @auther:Li Ya Hui
* @Time:2021年4月29日下午1:51:42
*/
public class Test03 {
public static void main(String[] args) throws IOException {
//1.使用 HSSFWorkbook poi jar创建一个workbook对象
// HSSFWorkbook workbook = new HSSFWorkbook();
XSSFWorkbook workbook = new XSSFWorkbook();
//2.创建sheet
// HSSFSheet sheet = workbook.createSheet();
XSSFSheet sheet = workbook.createSheet();
//3.创建第一行对象
// HSSFRow row = sheet.createRow(0);
XSSFRow row = sheet.createRow(0);
//4.写入表头
String[] biaotouStrings = {"编号","姓名"};
for (int i = 0; i < biaotouStrings.length; i++) {
//创建列 创建单元格
// HSSFCell cell = row.createCell(i);
XSSFCell cell = row.createCell(i);
//写入值
cell.setCellValue(biaotouStrings[i]);
}
//5.向表头下写入20条数据
for (int i = 1; i < 20; i++) {
//创建行
// HSSFRow row2 = sheet.createRow(i);
XSSFRow row2 = sheet.createRow(i);
//创建每行的第一列
// HSSFCell cell01 = row2.createCell(0);
XSSFCell cell01 = row2.createCell(0);
//写入第一列的值
cell01.setCellValue(i);
//创建第二列
// HSSFCell cell02 = row2.createCell(1);
XSSFCell cell02 = row2.createCell(1);
//写入第二列的值
cell02.setCellValue("00_"+1);
}
//6.指定文件的路径
File file = new File("E://poi_Excell//poi_one.xlsx");
//7.初始化文件输出流对象
FileOutputStream fileOutputStream = new FileOutputStream(file);
//8.将数据写入文件
workbook.write(fileOutputStream);
//9.刷新 fileOutputStream 数据
fileOutputStream.flush();
//10.关闭相对应的流对象
fileOutputStream.close();
workbook.close();
}
}
2.4.利用poi实现同时 解析 2003 和 2007的excel
package com.Li.poi;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* @Description: 利用poi实现同时 解析 2003 和 2007的excel
* @auther:Li Ya Hui
* @Time:2021年4月29日下午3:47:09
*/
public class Test04 {
public static void main(String[] args) throws IOException {
//创建一个workbook接口对象
Workbook wb = null;
//创建一个sheet接口对象
Sheet sheet = null;
//创建一个Row接口对象
Row row = null;
//创建一个Cell接口对象
Cell cell = null;
String pathname = "E:\\poi_Excell\\poi_one.xlsx";
//将excel转变为file对象
File file = new File(pathname);
//2.将file对象转变为流对象
FileInputStream fileInputStream = new FileInputStream(file);
//3.判断
if(file.isFile()&&file.exists())
{
//3.1获取当前的excel的名字
String fileName = file.getName();
System.out.println(fileName);
//3.2获取文件的后缀
int st = fileName.lastIndexOf(".");
CharSequence suffix = fileName.subSequence(st+1, fileName.length());
//3.3通过文件的后缀实现多路判断
if(suffix.equals("xls"))
{
System.out.println("走2003解析");
//不同的核心类
wb = new HSSFWorkbook(fileInputStream);
}
else if(suffix.equals("xlsx"))
{
System.out.println("走2007解析");
//不同的核心类
wb = new XSSFWorkbook(fileInputStream);
}
else
{
System.out.println("当前文件不能解析,退出程序");
System.exit(0);
}
}
//4.获取当前的Excel的第一个sheet 也就是第一个页
sheet = wb.getSheetAt(0);
//5.获取当前sheet有多少个行
int totalRows = sheet.getPhysicalNumberOfRows();
//6.循环读取每一行
for (int i = 0; i < totalRows; i++) {
//取出每一行
row = sheet.getRow(i);
//获取一共有多少列
int totalCellNums = row.getPhysicalNumberOfCells();
//循环每一行的每一列
for (int j = 0; j < totalCellNums; j++) {
//获取单元格
cell = row.getCell(j);
//获取值
//获取值的函数有缺陷 自己写一个函数
String CellValue = getValue(cell);
//输出值
System.out.print(CellValue+"\t");
}
System.out.println();
}
}
/**
* @desc 自定义函数 -- 格式化输出
* @param cell
* @return
*/
//获取各种类型的cell
public static String getValue(Cell cell)
{
//判断是否是数字类型 单元格的 值
if (cell.getCellType()==Cell.CELL_TYPE_NUMERIC)//数字单元格
{
//返回时将值使用valueof 传出去
return String.valueOf((int) cell.getNumericCellValue());
}
else if(cell.getCellType()==Cell.CELL_TYPE_BOOLEAN) //
{
return String.valueOf(cell.getBooleanCellValue());
}
//返回字符串类型的值
return cell.getStringCellValue();
}
}
2.5.利用poi实现对数据的清洗
package com.Li.flushs;
/**
* @Description: 利用POI构建一个工具类
* @auther:Li Ya Hui
* @Time:2021年4月29日下午5:40:53
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class FileUtils {
//通过路径获取不同版本的excel
public Workbook getWorkbook(String pathname) throws IOException
{
//创建一个workbook接口对象
Workbook wb = null;
//创建一个sheet接口对象
Sheet sheet = null;
//创建一个Row接口对象
Row row = null;
//创建一个Cell接口对象
Cell cell = null;
//将excel转变为file对象
File file = new File(pathname);
//2.将file对象转变为流对象
FileInputStream fileInputStream = new FileInputStream(file);
//3.判断
if(file.isFile()&&file.exists())
{
//3.1获取当前的excel的名字
String fileName = file.getName();
System.out.println(fileName);
//3.2获取文件的后缀
int st = fileName.lastIndexOf(".");
CharSequence suffix = fileName.subSequence(st+1, fileName.length());
//3.3通过文件的后缀实现多路判断
if(suffix.equals("xls"))
{
System.out.println("走2003解析");
//不同的核心类 HSSFWorkbook
wb = new HSSFWorkbook(fileInputStream);
}
else if(suffix.equals("xlsx"))
{
System.out.println("走2007解析");
//不同的核心类 XSSFWorkbook
wb = new XSSFWorkbook(fileInputStream);
}
else
{
System.out.println("当前文件不能解析,退出程序");
System.exit(0);
}
}
return wb;
}
//2.读取每一个Excel中的薪水这列的值,然后存入到容器中
public List<String> getCellData(Workbook workbook , int sheetNum , int beginColumn , int endColumn)
{
Sheet sheet = null;
Row row = null;
Cell cell = null;
List<String> list = new ArrayList<String>();
//4.获取当前的Excel的第一个sheet 也就是第一个页
sheet = workbook.getSheetAt(0);
//5.获取当前sheet有多少个行
int totalRows = sheet.getPhysicalNumberOfRows();
//6.循环读取每一行
for (int i = 0; i < totalRows; i++) {//外循环获取到的excel中的行
//取出每一行
row = sheet.getRow(i);
//获取一共有多少列
int totalCellNums = row.getPhysicalNumberOfCells();
//循环每一行的每一列
for (int j = beginColumn; j <= endColumn; j++) {//外循环获取到的excel中的列
//获取单元格
cell = row.getCell(j);
//获取值
String CellValue = getValue(cell);
list.add(CellValue);
}
}
return list;
}
/**
* @desc 自定义函数 -- 格式化输出
* @param cell
* @return
*/
//获取各种类型的cell
public String getValue(Cell cell)
{
//判断是否是数字类型 单元格的 值
if (cell.getCellType()==Cell.CELL_TYPE_NUMERIC)//数字单元格
{
//返回时将值使用valueof 传出去
return String.valueOf((int) cell.getNumericCellValue());
}
else if(cell.getCellType()==Cell.CELL_TYPE_BOOLEAN) //
{
return String.valueOf(cell.getBooleanCellValue());
}
//返回字符串类型的值
return cell.getStringCellValue();
}
}
//测试类
package com.Li.flushs;
import java.io.IOException;
import java.util.List;
import org.apache.poi.ss.usermodel.Workbook;
/**
* @Description: 测试类 :测试利用poi获取excel中的数据,然后归类统计
* @auther:Li Ya Hui
* @Time:2021年4月29日下午7:40:53
*/
public class Test {
public static void main(String[] args) throws IOException {
String pathName = "E:\\招聘\\zhyc_java.xls";
FileUtils fileUtils = new FileUtils();
Workbook workbook = fileUtils.getWorkbook(pathName);
List<String> a = fileUtils.getCellData(workbook, 0, 2, 2);
for (String string : a) {
System.out.println(string);
}
}
}
2.6.利用poi实现对数据 薪水的清洗
package com.Li.flushs;
/**
* @Description: 利用POI构建一个工具类
* @auther:Li Ya Hui
* @Time:2021年4月29日下午5:40:53
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class FileUtils {
//通过路径获取不同版本的excel
public Workbook getWorkbook(String pathname) throws IOException
{
//创建一个workbook接口对象
Workbook wb = null;
//创建一个sheet接口对象
Sheet sheet = null;
//创建一个Row接口对象
Row row = null;
//创建一个Cell接口对象
Cell cell = null;
//将excel转变为file对象
File file = new File(pathname);
//2.将file对象转变为流对象
FileInputStream fileInputStream = new FileInputStream(file);
//3.判断
if(file.isFile()&&file.exists())
{
//3.1获取当前的excel的名字
String fileName = file.getName();
System.out.println(fileName);
//3.2获取文件的后缀
int st = fileName.lastIndexOf(".");
CharSequence suffix = fileName.subSequence(st+1, fileName.length());
//3.3通过文件的后缀实现多路判断
if(suffix.equals("xls"))
{
System.out.println("走2003解析");
//不同的核心类 HSSFWorkbook
wb = new HSSFWorkbook(fileInputStream);
}
else if(suffix.equals("xlsx"))
{
System.out.println("走2007解析");
//不同的核心类 XSSFWorkbook
wb = new XSSFWorkbook(fileInputStream);
}
else
{
System.out.println("当前文件不能解析,退出程序");
System.exit(0);
}
}
return wb;
}
//2.读取每一个Excel中的薪水这列的值,然后存入到容器中
public List<String> getCellData(Workbook workbook , int sheetNum , int beginColumn , int endColumn)
{
Sheet sheet = null;
Row row = null;
Cell cell = null;
List<String> list = new ArrayList<String>();
//4.获取当前的Excel的第一个sheet 也就是第一个页
sheet = workbook.getSheetAt(0);
//5.获取当前sheet有多少个行
int totalRows = sheet.getPhysicalNumberOfRows();
//6.循环读取每一行
for (int i = 0; i < totalRows; i++) {//外循环获取到的excel中的行
//取出每一行
row = sheet.getRow(i);
//获取一共有多少列
int totalCellNums = row.getPhysicalNumberOfCells();
//循环每一行的每一列
for (int j = beginColumn; j <= endColumn; j++) {//外循环获取到的excel中的列
//获取单元格
cell = row.getCell(j);
//获取值
String CellValue = getValue(cell);
list.add(CellValue);
}
}
return list;
}
/**
* @desc 自定义函数 -- 格式化输出
* @param cell
* @return
*/
//获取各种类型的cell
public String getValue(Cell cell)
{
//判断是否是数字类型 单元格的 值
if (cell.getCellType()==Cell.CELL_TYPE_NUMERIC)//数字单元格
{
//返回时将值使用valueof 传出去
return String.valueOf((int) cell.getNumericCellValue());
}
else if(cell.getCellType()==Cell.CELL_TYPE_BOOLEAN) //
{
return String.valueOf(cell.getBooleanCellValue());
}
//返回字符串类型的值
return cell.getStringCellValue();
}
}
//测试类
package com.Li.flushs;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.ss.usermodel.Workbook;
/**
* @Description: 测试类 :测试利用poi获取excel中的数据,然后归类统计
* @auther:Li Ya Hui
* @Time:2021年4月29日下午7:40:53
*/
public class Test {
public static void main(String[] args) throws IOException {
//创建一个List将执行后获取到的list存起来
List<List<String>> list = new ArrayList<List<String>>();
int h=0,m=0,w=0;
for (int i = 1; i <= 3; i++) {
String pathName = "E:\\招聘\\zhyc_java0_"+i+".xls";
FileUtils fileUtils = new FileUtils();
Workbook workbook = fileUtils.getWorkbook(pathName);
List<String> resultList = fileUtils.getCellData(workbook, 0, 2, 2);
list.add(resultList);//将获取到的三个excel中的薪水存入到list容器中
// System.out.println(resultList);
}
/**
*数据清洗的规则
* 1.只要不是数字的,都给舍弃
* 2.根据薪水高低划定三个层次即
* 12000以上:高收入,即h
* 8000-12000:中等收入即m
* 8000以下的:低等收入,即w
*
*
*/
for (int i = 0; i < list.size(); i++) {
List<String> everyResultList = list.get(i);//每一个excel中的薪水所在的容器
for (int j = 0; j < everyResultList.size(); j++) {
String everyResult = everyResultList.get(j);//每一个excel中的每一条的薪水
// System.out.println("everyResult:\t"+everyResult);
//根据清洗规则
if(!(everyResult.startsWith("其他")||everyResult.startsWith("薪")||everyResult.startsWith("面议")))
{
// System.out.println(everyResult);
//起始位置
int st = everyResult.lastIndexOf("-");//注意这个,建议要粘贴excel中的
//每一个具体薪水
String ft = (String) everyResult.subSequence(0, st);
int xinshui =Integer.parseInt(ft);
System.out.println(xinshui);
//判断
if(xinshui>=12000)
{
h++;
}else if(xinshui>=8000)
{
m++;
}else
{
w++;
}
}
}
}
System.out.println("12000以上的有"+h+"个");
System.out.println("8000-12000以上的有"+m+"个");
System.out.println("8000以下的有"+w+"个");
}
}
3.什么是数据可视化
-
数据可视化:
- 是关于数据视觉表现形式的科学技术研究。其中,这种数据的视觉表现形式被定义为,一种以某种概要形式抽提出来的信息,包括相应信息单位的各种属性和变量。
- 它是一个处于不断演变之中的概念,其边界在不断地扩大。主要指的是技术上较为高级的技术方法,而这些技术方法允许利用图形、图像处理、计算机视觉以及用户界面,通过表达、建模以及对立体、表面、属性以及动画的显示,对数据加以可视化解释。与立体建模之类的特殊技术方法相比,数据可视化所涵盖的技术方法要广泛得多
-
数据可视化的分类
-
广义上,可视化无处不在。网站是数据可视化, 背后是数据库密密麻麻的数据表, 到了浏览器就是浅显易懂的页面;淘宝是商品的可视化, 上面有价格、发货地种种过滤器;微信是实时数据的可视化, 围起了你的社交网络, 让你一眼看到最新的消息流。
-
狭义上的数据可视化, 更多是纯图形去代表数据
-
-
那么我们就是从狭义的角度去分析和实现数据可视化
- 我们都知道前几天我们通过爬虫获取到了一些数据,那么这些数据如果让我们逐条去看的话 我们会发现很多,很费劲,于是我就提出了从数据可视化的角度去分析和展示数据,那么到底该怎么展示呢?到底该怎么处理呢?
- 至于处理,我们采取的是数据清洗,那么这些数据清洗都包括什么呢?稍后我们可以看到相应的专题,那么数据该怎么展示呢?我么采取的是图表的形式(因为我么并没有学习到servlet等技术呢,所以先暂时只能这样了)
数据化导读
1.能够操作excel的第三方jar包:jxl,poi, Jxcell(收费)
2.但是这些基本上都不能直接操作excel实现可视化的图表,为此我们要转变一下思路,看看能不能间接的实现
3.经研究发现我们可以有以下几种方法:
1)java 调取 excel的宏(宏是什么,很难写,而且写的时候要该出权限才能写,然后是用Java代码调用)
2)使用Jxcell但是这个是收费的,且版本比较老旧,对JDK1.6之后支持不是很好
3)使用poi+JfreeChart这个能够很好实现操作excel实现可视化的图表,但是因为JfreeChart是比较老的产物,产生的图表比较丑
4)用poi+excel模板(其实就是实现定义好一个excel图表,但是建议使用2003之后的excel版本,不然可能效果出不来),可以参考F:/123.xlsx
3.1.两种赋值excel公式的方法
3.1.1获取单元格公式workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();
-
workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();
-
FileOutputStream out = new FileOutputStream(new File(“formula.xlsx”));
-
workbook.write(out);
3.1.2.获取单元格公式 页 sheet.setForceFormulaRecalculation(true);
- FileInputStream fileInputStream = new FileInputStream(“E:\poi_Excell\123.xlsx”);
- XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fileInputStream);
- XSSFSheet sheet = xssfWorkbook.getSheetAt(0);
- xssfWorkbook.setSheetName(0, “sheet0”);
- 存储当前表格的样式
- XSSFCellStyle cellStyle = xssfWorkbook.createCellStyle();
3.2案例展示
package com.Li.flushs;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* @Description: poi+excel模板实现数据可视化 之 excel的模板复制
* @auther:Li Ya Hui
* @Time:2021年4月30日下午1:11:58
*/
public class Test02 {
public static void main(String[] args) throws IOException {
//1.将模板文件转变为流对象
FileInputStream fileInputStream = new FileInputStream("E:\\poi_Excell\\123.xlsx");
//2.创建输出流对象
FileOutputStream fileOutputStream =new FileOutputStream("E:\\poi_Excell\\2021-04-30.xlsx");
//3.初始化poi核心类
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fileInputStream);
//3.1获取原模板即123.xlsx的第一页
XSSFSheet sheet = xssfWorkbook.getSheetAt(0);
//两种获取公式的方法
//3.2自动计算
// sheet.setForceFormulaRecalculation(true);
//3.3给指定的sheet命名
xssfWorkbook.setSheetName(0, "sheet0");
//4.存储当前表格的样式
XSSFCellStyle cellStyle = xssfWorkbook.createCellStyle();
//5.给excel模板中的四行数据第一列重新赋值
String [] mingcheng = {"java","php","python","C++"};//名称
//7.获取sheet四行数 赋值
for (int i = 0; i < mingcheng.length; i++) {
XSSFRow row = sheet.getRow(i);
XSSFCell cell = row.getCell(0);
cell.setCellValue(mingcheng[i]);
}
//8.给excel模板中的四行数数据的第二列重新赋值
int [] shuLiang = {800,500,260,100};//数量
for (int i = 0; i < shuLiang.length; i++) {
XSSFRow row = sheet.getRow(i);
XSSFCell cell = row.getCell(1);
cell.setCellValue(shuLiang[i]) ;
}
//两种获取公式的方法
xssfWorkbook.getCreationHelper().createFormulaEvaluator().evaluateAll();
//9.写入
xssfWorkbook.write(fileOutputStream);
//10.关闭流对象
fileOutputStream.close();
fileInputStream.close();
xssfWorkbook.close();
}
}
4.数据分析(了解)
导读模块:可能看到这个模块的时候有很多的同学会觉得有点重复,其实不然,当数据清洗之后,我们也可以能够可视化了,那么是不是能够做出决策了,这些还不够的,因为商业的投资是需要严谨和细心的,毕竟钱是很重要的
那么我们该怎么实现数据分析呢?
1.数据分析:是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。这一过程也是质量管理体系的支持过程。在实用中,数据分析可帮助人们作出判断,以便采取适当行动。
数据分析的数学基础在20世纪早期就已确立,但直到计算机的出现才使得实际操作成为可能,并使得数据分析得以推广。数据分析是数学与计算机科学相结合的产物
补充:数据分析是一门年轻且很有发展的学科
2.数据分析主要包含:
1)简单数学运算(Simple Math)
2) 统计(Statistics)
3)快速傅里叶变换(FFT)
4) 平滑和滤波(Smoothing and Filtering)
5)基线和峰值分析(Baseline and Peak Analysis)
3.听起来好难啊,我们该怎么学习啊,哈哈 ,这个不需要我们学习的,因为这个也是有专门的岗位或者部门的,毕竟现在的复杂的商业不是一个人能独立完成的,现在要讲究team合作
4.额外拓展补充,那么该怎么去学习呢?掌握Python、Matlab这个工具、R语言,然后是SPSS平台(软件)的使用
5.商业决策
-
决策的目的
军队中一直存在严格的工作优先顺序,所有决策均以此为基础。任务始终排在第一位,之后是符合团队利益的决定,最后才是与个人利益有关的决定。个人要放在最后,是因为在组织链中,个人永远是最小的环节。利己主义没有太大意义,在团队或组织中不应该考虑个人得失。 -
错误绝非永恒不变
用“绝非”这个词或许有些过头,但你应该能明白我的意思。我之前曾说过,失败只是取决于你何时选择停止,同样也取决于人们如何看待具体问题。例如,在某个级别的人看来有些棘手的问题,在另一个级别的人眼中却未必是亟需解决的问题。尽可能收集更多观点,更加深入地理解具体情况。 -
执行的时间线
内部和外部影响,会决定在给定的时间线内执行决策的可行性。内部影响是指你和团队在给定的时间内执行决策的能力,外部影响则是指影响最终期限的推动力,并且这些因素超出了你的控制范围,例如天气、经济或市场需求等。
- 你要问自己两个问题。第一个问题是,“现在是做出决定的正确时机吗?”如果答案是肯定的,再问第二个问题:“我能执行这项决策吗?”如果答案是否定的,要搞清“为什么?”
- 已知的未知和未知的未知
-
执行决策时,你会面临许多限制。
-
“已知的未知”是指你意识到一些无形限制的存在,但你无法进行具体量化,例如交通(如果你住在洛杉矶,你肯定知道我在说什么)。例如,你清楚洛杉矶的交通高峰时间从来都没有结束的时候,所以,你从A点到B点需要花的时间可能在20分钟到2个小时之间。关键在于,你清楚不确定性的存在,却不清楚这种不确定性的具体程度。
-
根据墨菲定律,“未知的未知”就是你根本没有计划到的意外事件,比如(继续以交通为例)交通事故或发动机故障。
-
尽量明确所有限制因素,这样你就知道如何让它们有利于实现决策目的。
- 资源的可用性
- 如果你最初没能成功,要不断尝试。每一次努力的结果很大程度上取决你执行计划所使用的资源,所以不仅要确定可用的主要资源,还要确定次要资源。每一项决策都应该制定一项应对 “未知的未知”和主要行动方案失败等情形的应急方案。
- 如果准备不充分,你会被决策过程击垮。回顾以上所说,或许会让你对自己的决策更有信心
- 所以啊,有一个好的软件系统始终是给企业助力的