数据批量过滤

本文介绍如何利用Python解决数据不全的问题,包括缺失月份、月度数据、年度数据以及季度数据的处理。通过创建空白文档、合并数据、平均值估算等方法,对抓取的历史统计数据进行批量过滤和填充,确保数据完整性,为后续数据分析做好准备。

从网上抓取历史统计数据后,由于时间跨度比较长,有些数据不全,用python批量过滤处理。

一、存在的问题

1、缺月份及数据。

date 2022年2月 2022年1月 2021年12月 2021年11月
wind
在 Java 中实现过滤重复数据批量保存,可通过不同场景和需求采用不同的方法,以下是几种常见的实现方式: ### 内存中过滤重复数据批量保存到数据库 在 Java 代码里先过滤重复数据,再批量保存到数据库。假定有一个 `User` 类,需要依据 `name` 属性过滤重复数据,然后批量保存到数据库。 ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } public class BatchSaveFilteredData { public static void main(String[] args) { List<User> users = new ArrayList<>(); users.add(new User("Alice", 25)); users.add(new User("Bob", 30)); users.add(new User("Alice", 25)); // 重复数据 // 过滤重复数据 Set<String> uniqueNames = new HashSet<>(); List<User> filteredUsers = new ArrayList<>(); for (User user : users) { if (uniqueNames.add(user.getName())) { filteredUsers.add(user); } } // 批量保存到数据库 try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb", "root", "password"); PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO users (name, age) VALUES (?, ?)")) { for (User user : filteredUsers) { preparedStatement.setString(1, user.getName()); preparedStatement.setInt(2, user.getAge()); preparedStatement.addBatch(); } preparedStatement.executeBatch(); } catch (SQLException e) { e.printStackTrace(); } } } ``` ### 利用数据库约束过滤重复数据批量插入 在数据库层面设置字段唯一性约束,插入数据时让数据库自动过滤重复数据。例如,在 MySQL 中设置 `name` 字段为唯一索引,然后使用 Java 批量插入数据。 ```sql -- 设置数据库中 name 字段为唯一索引 ALTER TABLE users ADD UNIQUE (name); ``` ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } public class BatchSaveWithDBConstraint { public static void main(String[] args) { List<User> users = new ArrayList<>(); users.add(new User("Alice", 25)); users.add(new User("Bob", 30)); users.add(new User("Alice", 25)); // 重复数据 try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb", "root", "password"); PreparedStatement preparedStatement = connection.prepareStatement("INSERT IGNORE INTO users (name, age) VALUES (?, ?)")) { for (User user : users) { preparedStatement.setString(1, user.getName()); preparedStatement.setInt(2, user.getAge()); preparedStatement.addBatch(); } preparedStatement.executeBatch(); } catch (SQLException e) { e.printStackTrace(); } } } ``` ### 多线程批量导入并过滤重复数据数据量庞大,可采用多线程技术提高导入效率。以下是一个简单示例: ```java import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.*; class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } class BatchSaveTask implements Callable<Integer> { private List<User> users; public BatchSaveTask(List<User> users) { this.users = users; } @Override public Integer call() throws Exception { Set<String> uniqueNames = new HashSet<>(); List<User> filteredUsers = new ArrayList<>(); for (User user : users) { if (uniqueNames.add(user.getName())) { filteredUsers.add(user); } } // 模拟批量保存到数据库 return filteredUsers.size(); } } public class MultiThreadBatchSave { public static void main(String[] args) { List<User> allUsers = new ArrayList<>(); // 添加大量用户数据 int batchSize = 100; List<List<User>> batches = new ArrayList<>(); for (int i = 0; i < allUsers.size(); i += batchSize) { batches.add(allUsers.subList(i, Math.min(i + batchSize, allUsers.size()))); } ExecutorService executorService = Executors.newFixedThreadPool(4); List<Future<Integer>> futures = new ArrayList<>(); for (List<User> batch : batches) { futures.add(executorService.submit(new BatchSaveTask(batch))); } int totalSaved = 0; for (Future<Integer> future : futures) { try { totalSaved += future.get(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } executorService.shutdown(); System.out.println("Total saved: " + totalSaved); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

firefox_yau

核心程序的复用性,彩票分析

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值