| Crates.io | axion-data |
| lib.rs | axion-data |
| version | 0.1.1 |
| created_at | 2025-06-06 06:38:36.302758+00 |
| updated_at | 2025-06-10 11:54:14.943079+00 |
| description | A high-performance data processing library written in Rust, providing DataFrame and Series functionality similar to pandas |
| homepage | https://github.com/StaRainorigin/axion |
| repository | https://github.com/StaRainorigin/axion |
| max_upload_size | |
| id | 1702634 |
| size | 384,526 |
一个高性能的 Rust 数据处理库,提供类似 Pandas 的数据操作体验,专为大规模数据分析和并行计算而设计。
AMD R9 5900HX (x86_64)Ubuntu 22.04 LTS (WSL2)rustc 1.88.0-nightlycargo 1.88.0-nightlyclippy 0.1.87GitVSCode 1.99.1rust-analyzer v0.3.2370CodeLLDB v1.11.4# 安装 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 重新加载环境变量
source ~/.bashrc
# 或者
source ~/.zshrc
# 验证安装
rustc --version
cargo --version
rustup-init.exe# 安装 nightly 工具链
rustup install nightly
# 设置为默认版本
rustup default nightly
# 验证版本
rustc --version
在 VSCode 中安装以下插件:
rust-analyzer (推荐)
扩展ID: rust-lang.rust-analyzer
功能: 代码补全、语法检查、重构等
CodeLLDB (调试支持)
扩展ID: vadimcn.vscode-lldb
功能: Rust 程序调试
Even Better TOML (可选)
扩展ID: tamasfe.even-better-toml
功能: Cargo.toml 文件支持
在项目根目录创建 .vscode/settings.json:
{
"rust-analyzer.cargo.features": "all",
"rust-analyzer.checkOnSave.command": "clippy",
"rust-analyzer.checkOnSave.extraArgs": ["--all-targets"],
"rust-analyzer.cargo.loadOutDirsFromCheck": true
}
# 安装代码格式化工具
rustup component add rustfmt
# 安装代码检查工具
rustup component add clippy
# 验证工具安装
cargo fmt --version
cargo clippy --version
# 创建新的 Rust 项目
cargo new my_data_project
cd my_data_project
在 Cargo.toml 文件中添加 Axion 依赖:
[dependencies]
axion-data = "0.1.0"
或使用命令行添加:
cargo add axion-data
在 src/main.rs 中:
use axion_data::*;
fn main() -> AxionResult<()> {
// 创建 DataFrame
let df = df![
"name" => &["Alice", "Bob", "Charlie"],
"age" => &[25, 30, 35],
"salary" => &[50000.0, 60000.0, 70000.0]
]?;
println!("DataFrame 形状: {:?}", df.shape());
println!("DataFrame 内容:\n{}", df);
// 数据过滤
let age_col: &Series<i32> = df.downcast_column("age")?;
let mask = age_col.gt(28)?;
let filtered = df.filter(&mask)?;
println!("年龄 > 28 的员工:\n{}", filtered);
Ok(())
}
# 编译并运行
cargo run
# 运行测试
cargo test
# 运行优化版本
cargo run --release
use axion_data::*;
fn analyze_sales_data() -> AxionResult<()> {
// 1. 读取数据
let df = read_csv("data/sales.csv", None)?;
// 2. 数据概览
println!("数据形状: {:?}", df.shape());
println!("前5行:\n{}", df.head(5));
// 3. 数据清洗
let sales_col: &Series<f64> = df.downcast_column("sales")?;
let cleaned_df = df.filter(&sales_col.not_null())?;
// 4. 分组分析
let grouped = cleaned_df.groupby(&["region"])?;
let summary = grouped.sum()?;
println!("按地区汇总:\n{}", summary);
// 5. 保存结果
summary.to_csv("output/sales_summary.csv", None)?;
Ok(())
}
use axion_data::*;
// 从向量创建 Series
let s1 = Series::new("numbers".to_string(), vec![1, 2, 3, 4, 5]);
// 从数组创建 Series
let s2 = Series::new("names".to_string(), vec!["Alice", "Bob", "Charlie"]);
// 包含空值的 Series
let s3 = Series::new_from_options("values".to_string(), vec![
Some(10), None, Some(20), Some(30)
]);
// 获取长度
println!("长度: {}", s1.len());
// 访问元素
if let Some(value) = s1.get(0) {
println!("第一个元素: {}", value);
}
// 迭代器
for value in s1.iter_valid() {
println!("值: {}", value);
}
// Series 间运算
let s1 = Series::new("a".to_string(), vec![1, 2, 3]);
let s2 = Series::new("b".to_string(), vec![4, 5, 6]);
let result = &s1 + &s2; // [5, 7, 9]
// 与标量运算
let scaled = &s1 * 2; // [2, 4, 6]
let s = Series::new("data".to_string(), vec![1, 2, 3, 4, 5]);
// 与标量比较
let mask = s.gt(3).unwrap(); // [false, false, false, true, true]
// 过滤数据
let filtered = s.filter(&mask);
let s = Series::new("values".to_string(), vec![1.0, 2.0, 3.0, 4.0, 5.0]);
println!("总和: {:?}", s.sum()); // Some(15.0)
println!("平均值: {:?}", s.mean()); // Some(3.0)
println!("最小值: {:?}", s.min()); // Some(1.0)
println!("最大值: {:?}", s.max()); // Some(5.0)
let s = Series::new_from_options("data".to_string(), vec![
Some(1), None, Some(3), None, Some(5)
]);
// 检查空值
let null_mask = s.is_null();
// 填充空值
let filled = s.fill_null(0);
// 只处理有效值
for value in s.iter_valid() {
println!("有效值: {}", value);
}
let s = Series::new("text".to_string(), vec![
"hello".to_string(),
"world".to_string(),
"rust".to_string()
]);
// 字符串访问器
let lengths = s.str().str_len()?; // 字符串长度
let upper = s.str().to_uppercase()?; // 转大写
let contains = s.str().contains("o")?; // 包含检查
let s = Series::new("numbers".to_string(), vec![1, 2, 3, 4, 5]);
// 映射操作
let doubled = s.apply(|opt_val| {
opt_val.map(|x| x * 2)
});
// 并行处理
let processed = s.par_apply(|opt_val| {
opt_val.map(|x| x.pow(2))
});
use axion_data::*;
// 使用宏创建 DataFrame
let df = df![
"name" => &["Alice", "Bob", "Charlie"],
"age" => &[25, 30, 35],
"salary" => &[50000.0, 60000.0, 70000.0]
]?;
// 选择列
let selected = df.select(&["name", "age"])?;
// 过滤行
let age_col: &Series<i32> = df.downcast_column("age")?;
let mask = age_col.gt(28)?;
let filtered = df.filter(&mask)?;
// 分组操作
let grouped = df.groupby(&["department"])?;
let summary = grouped.mean()?;
// 连接操作
let joined = df1.inner_join(&df2, "id", "id")?;
// 显示 DataFrame
println!("DataFrame:\n{}", df);
// 读取 CSV
let df = read_csv("data/sample.csv", None)?;
// 带选项读取
let options = ReadCsvOptions::builder()
.with_header(true)
.skip_rows(1)
.use_columns(vec!["name".to_string(), "age".to_string()])
.build();
let df = read_csv("data/sample.csv", Some(options))?;
// 写入 CSV
df.to_csv("output/result.csv", None)?;
let mut s = Series::new("data".to_string(), vec![3, 1, 4, 1, 5]);
s.sort(false); // 升序排序
println!("{:?}", s.data); // [Some(1), Some(1), Some(3), Some(4), Some(5)]
// DataFrame 排序
let sorted_df = df.sort(&["age", "salary"], &[false, true])?; // 年龄升序,工资降序
运行测试套件:
# 运行特定模块测试
cargo test series::
运行基准测试:
# 运行基准测试
cargo bench
欢迎贡献代码!请查看我们的贡献指南:
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)cargo clippy 检查代码质量本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。