Java代码实现:从股票交易数据统计各月波动范围、波动率及成交量
要解决这个问题,我们可以编写一个Java程序来读取CSV文件,处理数据,并输出结果。由于你提到可以在Hadoop环境中执行,我们可以使用Hadoop的MapReduce框架来处理大规模数据,但考虑到问题的规模和数据量,使用简单的Java代码读取CSV文件并处理数据可能更为直接和简单。 以下是一个简单的Java程序,使用OpenCSV库来读取CSV文件,并计算所需的统计信息。你还需要一个`pom.xml`文件来管理项目的依赖项。 Java代码 (StockStatistics.java) ```java import com.opencsv.CSVReader; import com.opencsv.exceptions.CsvValidationException; import java.io.FileReader; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; public class StockStatistics { public static void main(String[] args) { String filePath = "stocks.csv"; // 请确保CSV文件与此Java文件在同一目录下,或提供完整路径 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Map<String, StockData> monthlyData = new HashMap<>(); try (CSVReader reader = new CSVReader(new FileReader(filePath))) { String[] line; while ((line = reader.readNext()) != null) { String tradeDate = line[0]; double open = Double.parseDouble(line[1]); double high = Double.parseDouble(line[2]); double low = Double.parseDouble(line[3]); double close = Double.parseDouble(line[4]); long amount = Long.parseLong(line[5]); try { Date date = sdf.parse(tradeDate); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); String month = calendar.get(Calendar.YEAR) + "." + (calendar.get(Calendar.MONTH) + 1); // 月份从0开始,所以需要+1 StockData data = monthlyData.getOrDefault(month, new StockData()); data.addClosePrice(close); data.updateHighLow(high, low); data.addVolume(amount); monthlyData.put(month, data); } catch (ParseException e) { e.printStackTrace(); } } } catch (IOException | CsvValidationException e) { e.printStackTrace(); } for (Map.Entry<String, StockData> entry : monthlyData.entrySet()) { String month = entry.getKey(); StockData data = entry.getValue(); double high = data.getHigh(); double low = data.getLow(); double avgClose = data.getAverageClose(); long totalVolume = data.getTotalVolume(); double fluctuationRange = high - low; double fluctuationRate = (fluctuationRange / avgClose) * 100; System.out.printf("%.1f %.2f-%.2f %.2f%% %d%n", Double.parseDouble(month.split("\\.")[0]) + (Double.parseDouble(month.split("\\.")[1]) / 12), low, high, Math.round(fluctuationRate * 100.0) / 100.0, totalVolume); } } static class StockData { private double high; private double low; private long totalVolume; private double sumClose; private int closeCount; public StockData() { this.high = Double.NEGATIVE_INFINITY; this.low = Double.POSITIVE_INFINITY; this.totalVolume = 0; this.sumClose = 0; this.closeCount = 0; } public void addClosePrice(double close) { this.sumClose += close; this.closeCount++; } public void updateHighLow(double high, double low) { this.high = Math.max(this.high, high); this.low = Math.min(this.low, low); } public void addVolume(long amount) { this.totalVolume += amount; } public double getHigh() { return high; } public double getLow() { return low; } public long getTotalVolume() { return totalVolume; } public double getAverageClose() { return this.closeCount > 0 ? this.sumClose / this.closeCount : 0; } } } ``` pom.xml 文件 如果你使用Maven来管理项目依赖项,你可以创建一个`pom.xml`文件,并添加OpenCSV库的依赖项: ```xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>stock-statistics</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.opencsv</groupId> <artifactId>opencsv</artifactId> <version>5.5.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project> ``` 执行说明 1. 将上述Java代码保存为`StockStatistics.java`文件。 2. 将`pom.xml`文件保存在与`StockStatistics.java`相同的目录中。 3. 使用Maven命令`mvn compile`编译代码。 4. 使用`java -cp target/classes com.example.stock-statistics.StockStatistics`运行程序(假设你的Maven构建输出目录是`target/classes`)。 确保`stocks.csv`文件位于正确的路径,或者修改Java代码中的文件路径以匹配你的CSV文件位置。 注意:由于你提到在Hadoop环境中验证,上述代码是基于本地文件系统的。如果你需要在Hadoop环境中运行,你可能需要将数据上传到HDFS,并使用Hadoop的MapReduce或其他处理框架来编写和运行作业。对于小规模数据集,上述简单的Java程序应该足够了。 ######[AI写代码神器 | 1603点数解答 | 2024-11-13 12:24:18]
- Java 实现复制粘贴功能:打造简易文本复制粘贴程序(GPT | 1497点数解答 | 2024-08-25 09:40:33)438
- 解决数据库“dm.jdbc.driver.dmexception: 数据溢出”问题的全步骤指南(阿里通义 | 598点数解答 | 2024-10-15 15:48:38)337
- 达梦数据库数据溢出问题排查及多维度解决方法(阿里通义 | 403点数解答 | 2024-10-15 15:48:41)1232
- Java代码实现从JSON数据中提取ID,涉及“数据”与“项目 - 知识库”结构(字节豆包 | 603点数解答 | 2025-04-15 22:48:51)257
- C++ 实现:计算一排鹅与最高、最矮鹅的身高差及代码详解(字节豆包 | 549点数解答 | 2025-11-16 20:19:06)108
- 编程揭秘:计算 𝑛! 在 𝑃 进制下末尾零个数的方法与代码实现(DeepSeek | 549点数解答 | 2026-01-11 17:49:54)65
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)384
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)354
- "Java Code: Uncovering Stock Statistics through CSV File Reading"(字节豆包 | 66点数解答 | 2024-11-13 15:31:04)349
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)501
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)389
- 用 Pandas 深度剖析数据:从读取到统计分析全流程实战(GPT | 642点数解答 | 2024-06-30 15:39:49)382