[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-rocketlaunchr--dataframe-go":3,"tool-rocketlaunchr--dataframe-go":61},[4,18,26,36,44,52],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",141543,2,"2026-04-06T11:32:54",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107888,"2026-04-06T11:32:50",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":10,"last_commit_at":50,"category_tags":51,"status":17},4487,"LLMs-from-scratch","rasbt\u002FLLMs-from-scratch","LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目，旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型（LLM）。它不仅是同名技术著作的官方代码库，更提供了一套完整的实践方案，涵盖模型开发、预训练及微调的全过程。\n\n该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型，却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码，用户能够透彻掌握 Transformer 架构、注意力机制等关键原理，从而真正理解大模型是如何“思考”的。此外，项目还包含了加载大型预训练权重进行微调的代码，帮助用户将理论知识延伸至实际应用。\n\nLLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API，而是渴望探究模型构建细节的技术人员而言，这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计：将复杂的系统工程拆解为清晰的步骤，配合详细的图表与示例，让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础，还是为未来研发更大规模的模型做准备",90106,"2026-04-06T11:19:32",[35,15,13,14],{"id":53,"name":54,"github_repo":55,"description_zh":56,"stars":57,"difficulty_score":10,"last_commit_at":58,"category_tags":59,"status":17},4292,"Deep-Live-Cam","hacksider\u002FDeep-Live-Cam","Deep-Live-Cam 是一款专注于实时换脸与视频生成的开源工具，用户仅需一张静态照片，即可通过“一键操作”实现摄像头画面的即时变脸或制作深度伪造视频。它有效解决了传统换脸技术流程繁琐、对硬件配置要求极高以及难以实时预览的痛点，让高质量的数字内容创作变得触手可及。\n\n这款工具不仅适合开发者和技术研究人员探索算法边界，更因其极简的操作逻辑（仅需三步：选脸、选摄像头、启动），广泛适用于普通用户、内容创作者、设计师及直播主播。无论是为了动画角色定制、服装展示模特替换，还是制作趣味短视频和直播互动，Deep-Live-Cam 都能提供流畅的支持。\n\n其核心技术亮点在于强大的实时处理能力，支持口型遮罩（Mouth Mask）以保留使用者原始的嘴部动作，确保表情自然精准；同时具备“人脸映射”功能，可同时对画面中的多个主体应用不同面孔。此外，项目内置了严格的内容安全过滤机制，自动拦截涉及裸露、暴力等不当素材，并倡导用户在获得授权及明确标注的前提下合规使用，体现了技术发展与伦理责任的平衡。",88924,"2026-04-06T03:28:53",[14,15,13,60],"视频",{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":67,"readme_en":68,"readme_zh":69,"quickstart_zh":70,"use_case_zh":71,"hero_image_url":72,"owner_login":73,"owner_name":73,"owner_avatar_url":74,"owner_bio":75,"owner_company":75,"owner_location":75,"owner_email":75,"owner_twitter":75,"owner_website":75,"owner_url":76,"languages":77,"stars":82,"forks":83,"last_commit_at":84,"license":85,"difficulty_score":86,"env_os":87,"env_gpu":88,"env_ram":88,"env_deps":89,"category_tags":97,"github_topics":99,"view_count":32,"oss_zip_url":75,"oss_zip_packed_at":75,"status":17,"created_at":110,"updated_at":111,"faqs":112,"releases":146},4541,"rocketlaunchr\u002Fdataframe-go","dataframe-go","DataFrames for Go: For statistics, machine-learning, and data manipulation\u002Fexploration","dataframe-go 是一款专为 Go 语言开发者打造的数据处理库，旨在提供类似 Excel 电子表格或 Python pandas 的核心功能。它主要解决了 Go 生态中缺乏轻量级、直观且高性能数据框（DataFrame）工具的痛点，让开发者能够轻松进行统计分析、机器学习预处理以及数据探索与清洗工作。\n\n该工具非常适合后端工程师、数据科学家以及需要在 Go 项目中处理结构化数据的研究人员使用。无论是从 CSV、JSON、Parquet 文件还是 MySQL、PostgreSQL 数据库中导入导出数据，dataframe-go 都能高效完成。其独特亮点在于极高的灵活性与性能：支持开发者自定义数据类型系列（Series），内置丰富的数学函数、缺失值插补算法（如线性、样条插值）及时间序列预测模型（如霍尔特 - 温特斯法）。此外，它还支持与 gonum 科学计算库无缝互操作，并提供跨平台绘图功能。\n\n值得注意的是，dataframe-go 目前虽已具备生产可用性，但 API 尚未完全稳定，官方计划在 Go 泛型成熟后重构核心架构以提供更通用的类型支持。对于希望在不离开 Go 环境的前提下","dataframe-go 是一款专为 Go 语言开发者打造的数据处理库，旨在提供类似 Excel 电子表格或 Python pandas 的核心功能。它主要解决了 Go 生态中缺乏轻量级、直观且高性能数据框（DataFrame）工具的痛点，让开发者能够轻松进行统计分析、机器学习预处理以及数据探索与清洗工作。\n\n该工具非常适合后端工程师、数据科学家以及需要在 Go 项目中处理结构化数据的研究人员使用。无论是从 CSV、JSON、Parquet 文件还是 MySQL、PostgreSQL 数据库中导入导出数据，dataframe-go 都能高效完成。其独特亮点在于极高的灵活性与性能：支持开发者自定义数据类型系列（Series），内置丰富的数学函数、缺失值插补算法（如线性、样条插值）及时间序列预测模型（如霍尔特 - 温特斯法）。此外，它还支持与 gonum 科学计算库无缝互操作，并提供跨平台绘图功能。\n\n值得注意的是，dataframe-go 目前虽已具备生产可用性，但 API 尚未完全稳定，官方计划在 Go 泛型成熟后重构核心架构以提供更通用的类型支持。对于希望在不离开 Go 环境的前提下完成复杂数据操作的用户来说，这是一个极具潜力的选择。","\u003Cp align=\"right\">\n  ⭐ &nbsp;&nbsp;\u003Cstrong>the project to show your appreciation.\u003C\u002Fstrong> :arrow_upper_right:\n\u003C\u002Fp>\n\n\u003Cp align=\"right\">\n  \u003Ca href=\"http:\u002F\u002Fgodoc.org\u002Fgithub.com\u002Frocketlaunchr\u002Fdataframe-go\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Frocketlaunchr_dataframe-go_readme_ff803135673c.png\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgoreportcard.com\u002Freport\u002Fgithub.com\u002Frocketlaunchr\u002Fdataframe-go\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Frocketlaunchr_dataframe-go_readme_2b4a70945b89.png\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgocover.io\u002Fgithub.com\u002Frocketlaunchr\u002Fdataframe-go\">\u003Cimg src=\"http:\u002F\u002Fgocover.io\u002F_badge\u002Fgithub.com\u002Frocketlaunchr\u002Fdataframe-go\" \u002F>\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Frocketlaunchr_dataframe-go_readme_5d2815d4e363.png\" alt=\"dataframe-go\" \u002F>\n\u003C\u002Fp>\n\nDataframes are used for statistics, machine-learning, and data manipulation\u002Fexploration. You can think of a Dataframe as an excel spreadsheet.\nThis package is designed to be light-weight and intuitive.\n\n⚠️ The package is production ready but the API is not stable yet. Once Go 1.18 (Generics) is introduced, the  **ENTIRE** package will be rewritten. For example, there will only be 1 generic Series type. After that, version `1.0.0` will be tagged.\n\nIt is recommended your package manager locks to a commit id instead of the master branch directly. ⚠️\n\n\n# Features\n\n1. Importing from CSV, JSONL, Parquet, MySQL & PostgreSQL\n2. Exporting to CSV, JSONL, Excel, Parquet, MySQL & PostgreSQL\n3. Developer Friendly\n4. Flexible - Create custom Series (custom data types)\n5. Performant\n6. Interoperability with [gonum package](https:\u002F\u002Fgodoc.org\u002Fgonum.org\u002Fv1\u002Fgonum).\n7. [pandas sub-package](https:\u002F\u002Fpandas.pydata.org\u002Fpandas-docs\u002Fstable\u002Freference\u002Fframe.html) ![Help Required](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fhelp-required-blueviolet)\n8. Fake data generation\n9. Interpolation (ForwardFill, BackwardFill, Linear, Spline, Lagrange)\n10. Time-series Forecasting (SES, Holt-Winters)\n11. Math functions\n12. Plotting (cross-platform)\n\nSee [Tutorial](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Fdataframe-go#tutorial) here.\n\n## Installation\n\n```\ngo get -u github.com\u002Frocketlaunchr\u002Fdataframe-go\n```\n\n```go\nimport dataframe \"github.com\u002Frocketlaunchr\u002Fdataframe-go\"\n```\n\n# DataFrames\n\n## Creating a DataFrame\n\n```go\n\ns1 := dataframe.NewSeriesInt64(\"day\", nil, 1, 2, 3, 4, 5, 6, 7, 8)\ns2 := dataframe.NewSeriesFloat64(\"sales\", nil, 50.3, 23.4, 56.2, nil, nil, 84.2, 72, 89)\ndf := dataframe.NewDataFrame(s1, s2)\n\nfmt.Print(df.Table())\n  \nOUTPUT:\n+-----+-------+---------+\n|     |  DAY  |  SALES  |\n+-----+-------+---------+\n| 0:  |   1   |  50.3   |\n| 1:  |   2   |  23.4   |\n| 2:  |   3   |  56.2   |\n| 3:  |   4   |   NaN   |\n| 4:  |   5   |   NaN   |\n| 5:  |   6   |  84.2   |\n| 6:  |   7   |   72    |\n| 7:  |   8   |   89    |\n+-----+-------+---------+\n| 8X2 | INT64 | FLOAT64 |\n+-----+-------+---------+\n\n```\n[![Go Playground](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGo-Playground-5593c7.svg?labelColor=41c3f3&style=for-the-badge)](https:\u002F\u002Fplay.golang.org\u002Fp\u002FeC5HYAEHjNI)\n\n## Insert and Remove Row\n\n```go\n\ndf.Append(nil, 9, 123.6)\n\ndf.Append(nil, map[string]interface{}{\n\t\"day\":   10,\n\t\"sales\": nil,\n})\n\ndf.Remove(0)\n\nOUTPUT:\n+-----+-------+---------+\n|     |  DAY  |  SALES  |\n+-----+-------+---------+\n| 0:  |   2   |  23.4   |\n| 1:  |   3   |  56.2   |\n| 2:  |   4   |   NaN   |\n| 3:  |   5   |   NaN   |\n| 4:  |   6   |  84.2   |\n| 5:  |   7   |   72    |\n| 6:  |   8   |   89    |\n| 7:  |   9   |  123.6  |\n| 8:  |  10   |   NaN   |\n+-----+-------+---------+\n| 9X2 | INT64 | FLOAT64 |\n+-----+-------+---------+\n```\n[![Go Playground](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGo-Playground-5593c7.svg?labelColor=41c3f3&style=for-the-badge)](https:\u002F\u002Fplay.golang.org\u002Fp\u002FxwW_410vQ2p)\n\n## Update Row\n\n```go\n\ndf.UpdateRow(0, nil, map[string]interface{}{\n\t\"day\":   3,\n\t\"sales\": 45,\n})\n\n```\n\n## Sorting\n\n```go\n\nsks := []dataframe.SortKey{\n\t{Key: \"sales\", Desc: true},\n\t{Key: \"day\", Desc: true},\n}\n\ndf.Sort(ctx, sks)\n\nOUTPUT:\n+-----+-------+---------+\n|     |  DAY  |  SALES  |\n+-----+-------+---------+\n| 0:  |   9   |  123.6  |\n| 1:  |   8   |   89    |\n| 2:  |   6   |  84.2   |\n| 3:  |   7   |   72    |\n| 4:  |   3   |  56.2   |\n| 5:  |   2   |  23.4   |\n| 6:  |  10   |   NaN   |\n| 7:  |   5   |   NaN   |\n| 8:  |   4   |   NaN   |\n+-----+-------+---------+\n| 9X2 | INT64 | FLOAT64 |\n+-----+-------+---------+\n```\n[![Go Playground](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGo-Playground-5593c7.svg?labelColor=41c3f3&style=for-the-badge)](https:\u002F\u002Fplay.golang.org\u002Fp\u002FlsJkKw3ZUJq)\n\n## Iterating\n\nYou can change the step and starting row. It may be wise to lock the DataFrame before iterating.\n\nThe returned value is a map containing the name of the series (`string`) and the index of the series (`int`) as keys.\n\n```go\n\niterator := df.ValuesIterator(dataframe.ValuesOptions{0, 1, true}) \u002F\u002F Don't apply read lock because we are write locking from outside.\n\ndf.Lock()\nfor {\n\trow, vals, _ := iterator()\n\tif row == nil {\n\t\tbreak\n\t}\n\tfmt.Println(*row, vals)\n}\ndf.Unlock()\n\nOUTPUT:\n0 map[day:1 0:1 sales:50.3 1:50.3]\n1 map[sales:23.4 1:23.4 day:2 0:2]\n2 map[day:3 0:3 sales:56.2 1:56.2]\n3 map[1:\u003Cnil> day:4 0:4 sales:\u003Cnil>]\n4 map[day:5 0:5 sales:\u003Cnil> 1:\u003Cnil>]\n5 map[sales:84.2 1:84.2 day:6 0:6]\n6 map[day:7 0:7 sales:72 1:72]\n7 map[day:8 0:8 sales:89 1:89]\n```\n[![Go Playground](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGo-Playground-5593c7.svg?labelColor=41c3f3&style=for-the-badge)](https:\u002F\u002Fplay.golang.org\u002Fp\u002Feqjvu-vO8sr)\n\n## Statistics\n\nYou can easily calculate statistics for a Series using the [gonum](https:\u002F\u002Fgodoc.org\u002Fgonum.org\u002Fv1\u002Fgonum\u002Fstat) or [montanaflynn\u002Fstats](https:\u002F\u002Fgodoc.org\u002Fgithub.com\u002Fmontanaflynn\u002Fstats) package.\n\n`SeriesFloat64` and `SeriesTime` provide access to the exported `Values` field to seamlessly interoperate with external math-based packages.\n\n### Example\n\nSome series provide easy conversion using the `ToSeriesFloat64` method.\n\n```go\nimport \"gonum.org\u002Fv1\u002Fgonum\u002Fstat\"\n\ns := dataframe.NewSeriesInt64(\"random\", nil, 1, 2, 3, 4, 5, 6, 7, 8)\nsf, _ := s.ToSeriesFloat64(ctx)\n```\n\n### Mean\n\n```go\nmean := stat.Mean(sf.Values, nil)\n```\n\n### Median\n\n```go\nimport \"github.com\u002Fmontanaflynn\u002Fstats\"\nmedian, _ := stats.Median(sf.Values)\n```\n\n### Standard Deviation\n\n```go\nstd := stat.StdDev(sf.Values, nil)\n```\n\n## Plotting (cross-platform)\n\n```go\nimport (\n\tchart \"github.com\u002Fwcharczuk\u002Fgo-chart\"\n\t\"github.com\u002Frocketlaunchr\u002Fdataframe-go\u002Fplot\"\n\twc \"github.com\u002Frocketlaunchr\u002Fdataframe-go\u002Fplot\u002Fwcharczuk\u002Fgo-chart\"\n)\n\nsales := dataframe.NewSeriesFloat64(\"sales\", nil, 50.3, nil, 23.4, 56.2, 89, 32, 84.2, 72, 89)\ncs, _ := wc.S(ctx, sales, nil, nil)\n\ngraph := chart.Chart{Series: []chart.Series{cs}}\n\nplt, _ := plot.Open(\"Monthly sales\", 450, 300)\ngraph.Render(chart.SVG, plt)\nplt.Display(plot.None)\n\u003C-plt.Closed\n\n```\n\nOutput:\n\n\u003Cp align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Frocketlaunchr_dataframe-go_readme_80931aa533a0.png\" alt=\"plot\" \u002F>\n\u003C\u002Fp>\n\n## Math Functions\n\n```go\nimport \"github.com\u002Frocketlaunchr\u002Fdataframe-go\u002Fmath\u002Ffuncs\"\n\nres := 24\nsx := dataframe.NewSeriesFloat64(\"x\", nil, utils.Float64Seq(1, float64(res), 1))\nsy := dataframe.NewSeriesFloat64(\"y\", &dataframe.SeriesInit{Size: res})\ndf := dataframe.NewDataFrame(sx, sy)\n\nfn := funcs.RegFunc(\"sin(2*𝜋*x\u002F24)\")\nfuncs.Evaluate(ctx, df, fn, 1)\n```\n[![Go Playground](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGo-Playground-5593c7.svg?labelColor=41c3f3&style=for-the-badge)](https:\u002F\u002Fplay.golang.org\u002Fp\u002Ff4GfS2rUjaM)\n\nOutput:\n\n\u003Cp align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Frocketlaunchr_dataframe-go_readme_f05ed19a6b38.png\" alt=\"sine wave\" \u002F>\n\u003C\u002Fp>\n\n## Importing Data\n\nThe `imports` sub-package has support for importing csv, jsonl, parquet, and directly from a SQL database. The `DictateDataType` option can be set to specify the true underlying data type. Alternatively, `InferDataTypes` option can be set.\n\n### CSV\n\n```go\ncsvStr := `\nCountry,Date,Age,Amount,Id\n\"United States\",2012-02-01,50,112.1,01234\n\"United States\",2012-02-01,32,321.31,54320\n\"United Kingdom\",2012-02-01,17,18.2,12345\n\"United States\",2012-02-01,32,321.31,54320\n\"United Kingdom\",2012-05-07,NA,18.2,12345\n\"United States\",2012-02-01,32,321.31,54320\n\"United States\",2012-02-01,32,321.31,54320\nSpain,2012-02-01,66,555.42,00241\n`\ndf, err := imports.LoadFromCSV(ctx, strings.NewReader(csvStr))\n\nOUTPUT:\n+-----+----------------+------------+-------+---------+-------+\n|     |    COUNTRY     |    DATE    |  AGE  | AMOUNT  |  ID   |\n+-----+----------------+------------+-------+---------+-------+\n| 0:  | United States  | 2012-02-01 |  50   |  112.1  | 1234  |\n| 1:  | United States  | 2012-02-01 |  32   | 321.31  | 54320 |\n| 2:  | United Kingdom | 2012-02-01 |  17   |  18.2   | 12345 |\n| 3:  | United States  | 2012-02-01 |  32   | 321.31  | 54320 |\n| 4:  | United Kingdom | 2015-05-07 |  NaN  |  18.2   | 12345 |\n| 5:  | United States  | 2012-02-01 |  32   | 321.31  | 54320 |\n| 6:  | United States  | 2012-02-01 |  32   | 321.31  | 54320 |\n| 7:  |     Spain      | 2012-02-01 |  66   | 555.42  |  241  |\n+-----+----------------+------------+-------+---------+-------+\n| 8X5 |     STRING     |    TIME    | INT64 | FLOAT64 | INT64 |\n+-----+----------------+------------+-------+---------+-------+\n```\n[![Go Playground](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGo-Playground-5593c7.svg?labelColor=41c3f3&style=for-the-badge)](https:\u002F\u002Fplay.golang.org\u002Fp\u002F7hyUXnRy1pR)\n\n## Exporting Data\n\nThe `exports` sub-package has support for exporting to csv, jsonl, parquet, Excel and directly to a SQL database.\n\n\n## Optimizations\n\n* If you know the number of rows in advance, you can set the capacity of the underlying slice of a series using `SeriesInit{}`. This will preallocate memory and provide speed improvements. \n\n# Generic Series\n\nOut of the box, there is support for `string`, `time.Time`, `float64` and `int64`. Automatic support exists for `float32` and all types of integers. There is a convenience function provided for dealing with `bool`. There is also support for `complex128` inside the `xseries` subpackage.\n\nThere may be times that you want to use your own custom data types. You can either implement your own `Series` type (more performant) or use the **Generic Series** (more convenient).\n\n## civil.Date\n\n```go\nimport \"time\"\nimport \"cloud.google.com\u002Fgo\u002Fcivil\"\n\nsg := dataframe.NewSeriesGeneric(\"date\", civil.Date{}, nil, civil.Date{2018, time.May, 01}, civil.Date{2018, time.May, 02}, civil.Date{2018, time.May, 03})\ns2 := dataframe.NewSeriesFloat64(\"sales\", nil, 50.3, 23.4, 56.2)\n\ndf := dataframe.NewDataFrame(sg, s2)\n\nOUTPUT:\n+-----+------------+---------+\n|     |    DATE    |  SALES  |\n+-----+------------+---------+\n| 0:  | 2018-05-01 |  50.3   |\n| 1:  | 2018-05-02 |  23.4   |\n| 2:  | 2018-05-03 |  56.2   |\n+-----+------------+---------+\n| 3X2 | CIVIL DATE | FLOAT64 |\n+-----+------------+---------+\n\n```\n\n# Tutorial\n\n## Create some fake data\n\nLet's create a list of 8 \"fake\" employees with a name, title and base hourly wage rate.\n\n```go\nimport \"golang.org\u002Fx\u002Fexp\u002Frand\"\nimport \"rocketlaunchr\u002Fdataframe-go\u002Futils\u002Ffaker\"\n\nsrc := rand.NewSource(uint64(time.Now().UTC().UnixNano()))\ndf := faker.NewDataFrame(8, src, faker.S(\"name\", 0, \"Name\"), faker.S(\"title\", 0.5, \"JobTitle\"), faker.S(\"base rate\", 0, \"Number\", 15, 50))\n```\n\n```go\n+-----+----------------+----------------+-----------+\n|     |      NAME      |     TITLE      | BASE RATE |\n+-----+----------------+----------------+-----------+\n| 0:  | Cordia Jacobi  |   Consultant   |    42     |\n| 1:  | Nickolas Emard |      NaN       |    22     |\n| 2:  | Hollis Dickens | Representative |    22     |\n| 3:  | Stacy Dietrich |      NaN       |    43     |\n| 4:  |  Aleen Legros  |    Officer     |    21     |\n| 5:  |  Adelia Metz   |   Architect    |    18     |\n| 6:  | Sunny Gerlach  |      NaN       |    28     |\n| 7:  | Austin Hackett |      NaN       |    39     |\n+-----+----------------+----------------+-----------+\n| 8X3 |     STRING     |     STRING     |   INT64   |\n+-----+----------------+----------------+-----------+\n```\n\n## Apply Function\n\nLet's give a promotion to everyone by doubling their salary.\n\n```go\ns := df.Series[2]\n\napplyFn := dataframe.ApplySeriesFn(func(val interface{}, row, nRows int) interface{} {\n\treturn 2 * val.(int64)\n})\n\ndataframe.Apply(ctx, s, applyFn, dataframe.FilterOptions{InPlace: true})\n```\n\n```go\n+-----+----------------+----------------+-----------+\n|     |      NAME      |     TITLE      | BASE RATE |\n+-----+----------------+----------------+-----------+\n| 0:  | Cordia Jacobi  |   Consultant   |    84     |\n| 1:  | Nickolas Emard |      NaN       |    44     |\n| 2:  | Hollis Dickens | Representative |    44     |\n| 3:  | Stacy Dietrich |      NaN       |    86     |\n| 4:  |  Aleen Legros  |    Officer     |    42     |\n| 5:  |  Adelia Metz   |   Architect    |    36     |\n| 6:  | Sunny Gerlach  |      NaN       |    56     |\n| 7:  | Austin Hackett |      NaN       |    78     |\n+-----+----------------+----------------+-----------+\n| 8X3 |     STRING     |     STRING     |   INT64   |\n+-----+----------------+----------------+-----------+\n```\n\n\n## Create a Time series\n\nLet's inform all employees separately on sequential days.\n\n```go\nimport \"rocketlaunchr\u002Fdataframe-go\u002Futils\u002Futime\"\n\nmts, _ := utime.NewSeriesTime(ctx, \"meeting time\", \"1D\", time.Now().UTC(), false, utime.NewSeriesTimeOptions{Size: &[]int{8}[0]})\ndf.AddSeries(mts, nil)\n```\n\n```go\n+-----+----------------+----------------+-----------+--------------------------------+\n|     |      NAME      |     TITLE      | BASE RATE |          MEETING TIME          |\n+-----+----------------+----------------+-----------+--------------------------------+\n| 0:  | Cordia Jacobi  |   Consultant   |    84     |   2020-02-02 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 1:  | Nickolas Emard |      NaN       |    44     |   2020-02-03 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 2:  | Hollis Dickens | Representative |    44     |   2020-02-04 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 3:  | Stacy Dietrich |      NaN       |    86     |   2020-02-05 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 4:  |  Aleen Legros  |    Officer     |    42     |   2020-02-06 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 5:  |  Adelia Metz   |   Architect    |    36     |   2020-02-07 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 6:  | Sunny Gerlach  |      NaN       |    56     |   2020-02-08 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 7:  | Austin Hackett |      NaN       |    78     |   2020-02-09 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n+-----+----------------+----------------+-----------+--------------------------------+\n| 8X4 |     STRING     |     STRING     |   INT64   |              TIME              |\n+-----+----------------+----------------+-----------+--------------------------------+\n```\n\n## Filtering\n\nLet's filter out our senior employees (they have titles) for no reason.\n\n```go\nfilterFn := dataframe.FilterDataFrameFn(func(vals map[interface{}]interface{}, row, nRows int) (dataframe.FilterAction, error) {\n\tif vals[\"title\"] == nil {\n\t\treturn dataframe.DROP, nil\n\t}\n\treturn dataframe.KEEP, nil\n})\n\nseniors, _ := dataframe.Filter(ctx, df, filterFn)\n```\n\n```go\n+-----+----------------+----------------+-----------+--------------------------------+\n|     |      NAME      |     TITLE      | BASE RATE |          MEETING TIME          |\n+-----+----------------+----------------+-----------+--------------------------------+\n| 0:  | Cordia Jacobi  |   Consultant   |    84     |   2020-02-02 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 1:  | Hollis Dickens | Representative |    44     |   2020-02-04 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 2:  |  Aleen Legros  |    Officer     |    42     |   2020-02-06 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 3:  |  Adelia Metz   |   Architect    |    36     |   2020-02-07 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n+-----+----------------+----------------+-----------+--------------------------------+\n| 4X4 |     STRING     |     STRING     |   INT64   |              TIME              |\n+-----+----------------+----------------+-----------+--------------------------------+\n```\n\n\n## Other useful packages\n\n- [awesome-svelte](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Fawesome-svelte) - Resources for killing react\n- [dbq](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Fdbq) - Zero boilerplate database operations for Go\n- [electron-alert](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Felectron-alert) - SweetAlert2 for Electron Applications\n- [google-search](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Fgoogle-search) - Scrape google search results\n- [igo](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Figo) - A Go transpiler with cool new syntax such as fordefer (defer for for-loops)\n- [mysql-go](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Fmysql-go) - Properly cancel slow MySQL queries\n- [react](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Freact) - Build front end applications using Go\n- [remember-go](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Fremember-go) - Cache slow database queries\n- [testing-go](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Ftesting-go) - Testing framework for unit testing\n\n#\n\n### Legal Information\n\nThe license is a modified MIT license. Refer to `LICENSE` file for more details.\n\n**© 2018-21 PJ Engineering and Business Solutions Pty. Ltd.**\n","\u003Cp align=\"right\">\n  ⭐ &nbsp;&nbsp;\u003Cstrong>请为该项目点赞以表示您的支持。\u003C\u002Fstrong> :arrow_upper_right:\n\u003C\u002Fp>\n\n\u003Cp align=\"right\">\n  \u003Ca href=\"http:\u002F\u002Fgodoc.org\u002Fgithub.com\u002Frocketlaunchr\u002Fdataframe-go\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Frocketlaunchr_dataframe-go_readme_ff803135673c.png\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgoreportcard.com\u002Freport\u002Fgithub.com\u002Frocketlaunchr\u002Fdataframe-go\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Frocketlaunchr_dataframe-go_readme_2b4a70945b89.png\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgocover.io\u002Fgithub.com\u002Frocketlaunchr\u002Fdataframe-go\">\u003Cimg src=\"http:\u002F\u002Fgocover.io\u002F_badge\u002Fgithub.com\u002Frocketlaunchr\u002Fdataframe-go\" \u002F>\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Frocketlaunchr_dataframe-go_readme_5d2815d4e363.png\" alt=\"dataframe-go\" \u002F>\n\u003C\u002Fp>\n\n数据框广泛应用于统计分析、机器学习以及数据处理与探索。你可以将数据框理解为一个 Excel 表格。本包设计轻量且直观易用。\n\n⚠️ 该包已可用于生产环境，但其 API 尚未稳定。一旦 Go 1.18（泛型）发布，**整个**包将会被重写。例如，届时将仅保留一种通用的 Series 类型。之后，我们将标记 `1.0.0` 版本。\n\n建议您在使用包管理工具时锁定到某个具体的提交 ID，而不是直接依赖主分支。⚠️\n\n\n# 功能特性\n\n1. 支持从 CSV、JSONL、Parquet、MySQL 和 PostgreSQL 导入数据\n2. 支持导出至 CSV、JSONL、Excel、Parquet、MySQL 和 PostgreSQL\n3. 开发者友好\n4. 灵活——可创建自定义 Series（自定义数据类型）\n5. 性能优越\n6. 可与 [gonum 包](https:\u002F\u002Fgodoc.org\u002Fgonum.org\u002Fv1\u002Fgonum) 无缝集成\n7. 兼容 [pandas 子包](https:\u002F\u002Fpandas.pydata.org\u002Fpandas-docs\u002Fstable\u002Freference\u002Fframe.html) ![需要帮助](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fhelp-required-blueviolet)\n8. 生成模拟数据\n9. 插值功能（前向填充、后向填充、线性插值、样条插值、拉格朗日插值）\n10. 时间序列预测（SES、霍尔特-温特斯法）\n11. 数学函数\n12. 跨平台绘图\n\n更多内容请参阅[教程](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Fdataframe-go#tutorial)。\n\n## 安装\n\n```\ngo get -u github.com\u002Frocketlaunchr\u002Fdataframe-go\n```\n\n```go\nimport dataframe \"github.com\u002Frocketlaunchr\u002Fdataframe-go\"\n```\n\n# 数据框\n\n## 创建数据框\n\n```go\n\ns1 := dataframe.NewSeriesInt64(\"day\", nil, 1, 2, 3, 4, 5, 6, 7, 8)\ns2 := dataframe.NewSeriesFloat64(\"sales\", nil, 50.3, 23.4, 56.2, nil, nil, 84.2, 72, 89)\ndf := dataframe.NewDataFrame(s1, s2)\n\nfmt.Print(df.Table())\n  \n输出：\n+-----+-------+---------+\n|     |  DAY  |  SALES  |\n+-----+-------+---------+\n| 0:  |   1   |  50.3   |\n| 1:  |   2   |  23.4   |\n| 2:  |   3   |  56.2   |\n| 3:  |   4   |   NaN   |\n| 4:  |   5   |   NaN   |\n| 5:  |   6   |  84.2   |\n| 6:  |   7   |   72    |\n| 7:  |   8   |   89    |\n+-----+-------+---------+\n| 8X2 | INT64 | FLOAT64 |\n+-----+-------+---------+\n\n```\n[![Go Playground](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGo-Playground-5593c7.svg?labelColor=41c3f3&style=for-the-badge)](https:\u002F\u002Fplay.golang.org\u002Fp\u002FeC5HYAEHjNI)\n\n## 插入和删除行\n\n```go\n\ndf.Append(nil, 9, 123.6)\n\ndf.Append(nil, map[string]interface{}{\n\t\"day\":   10,\n\t\"sales\": nil,\n})\n\ndf.Remove(0)\n\n输出：\n+-----+-------+---------+\n|     |  DAY  |  SALES  |\n+-----+-------+---------+\n| 0:  |   2   |  23.4   |\n| 1:  |   3   |  56.2   |\n| 2:  |   4   |   NaN   |\n| 3:  |   5   |   NaN   |\n| 4:  |   6   |  84.2   |\n| 5:  |   7   |   72    |\n| 6:  |   8   |   89    |\n| 7:  |   9   |  123.6  |\n| 8:  |  10   |   NaN   |\n+-----+-------+---------+\n| 9X2 | INT64 | FLOAT64 |\n+-----+-------+---------+\n```\n[![Go Playground](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGo-Playground-5593c7.svg?labelColor=41c3f3&style=for-the-badge)](https:\u002F\u002Fplay.golang.org\u002Fp\u002FxwW_410vQ2p)\n\n## 更新行\n\n```go\n\ndf.UpdateRow(0, nil, map[string]interface{}{\n\t\"day\":   3,\n\t\"sales\": 45,\n})\n\n```\n\n## 排序\n\n```go\n\nsks := []dataframe.SortKey{\n\t{Key: \"sales\", Desc: true},\n\t{Key: \"day\", Desc: true},\n}\n\ndf.Sort(ctx, sks)\n\n输出：\n+-----+-------+---------+\n|     |  DAY  |  SALES  |\n+-----+-------+---------+\n| 0:  |   9   |  123.6  |\n| 1:  |   8   |   89    |\n| 2:  |   6   |  84.2   |\n| 3:  |   7   |   72    |\n| 4:  |   3   |  56.2   |\n| 5:  |   2   |  23.4   |\n| 6:  |  10   |   NaN   |\n| 7:  |   5   |   NaN   |\n| 8:  |   4   |   NaN   |\n+-----+-------+---------+\n| 9X2 | INT64 | FLOAT64 |\n+-----+-------+---------+\n```\n[![Go Playground](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGo-Playground-5593c7.svg?labelColor=41c3f3&style=for-the-badge)](https:\u002F\u002Fplay.golang.org\u002Fp\u002FlsJkKw3ZUJq)\n\n## 遍历\n\n您可以调整步长和起始行。在遍历时，最好先锁定数据框。\n\n返回值是一个包含系列名称（字符串）和索引（整数）的映射。\n\n```go\n\niterator := df.ValuesIterator(dataframe.ValuesOptions{0, 1, true}) \u002F\u002F 不应用读锁，因为我们已在外部加了写锁。\n\ndf.Lock()\nfor {\n\trow, vals, _ := iterator()\n\tif row == nil {\n\t\tbreak\n\t}\n\tfmt.Println(*row, vals)\n}\ndf.Unlock()\n\n输出：\n0 map[day:1 0:1 sales:50.3 1:50.3]\n1 map[sales:23.4 1:23.4 day:2 0:2]\n2 map[day:3 0:3 sales:56.2 1:56.2]\n3 map[1:\u003Cnil> day:4 0:4 sales:\u003Cnil>]\n4 map[day:5 0:5 sales:\u003Cnil> 1:\u003Cnil>]\n5 map[sales:84.2 1:84.2 day:6 0:6]\n6 map[day:7 0:7 sales:72 1:72]\n7 map[day:8 0:8 sales:89 1:89]\n```\n[![Go Playground](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGo-Playground-5593c7.svg?labelColor=41c3f3&style=for-the-badge)](https:\u002F\u002Fplay.golang.org\u002Fp\u002Feqjvu-vO8sr)\n\n## 统计计算\n\n您可以使用 [gonum](https:\u002F\u002Fgodoc.org\u002Fgonum.org\u002Fv1\u002Fgonum\u002Fstat) 或 [montanaflynn\u002Fstats](https:\u002F\u002Fgodoc.org\u002Fgithub.com\u002Fmontanaflynn\u002Fstats) 包轻松对 Series 进行统计计算。\n\n`SeriesFloat64` 和 `SeriesTime` 提供了对 `Values` 字段的访问权限，以便与外部数学类库无缝对接。\n\n### 示例\n\n某些 Series 可通过 `ToSeriesFloat64` 方法轻松转换为浮点数类型。\n\n```go\nimport \"gonum.org\u002Fv1\u002Fgonum\u002Fstat\"\n\ns := dataframe.NewSeriesInt64(\"random\", nil, 1, 2, 3, 4, 5, 6, 7, 8)\nsf, _ := s.ToSeriesFloat64(ctx)\n```\n\n### 平均值\n\n```go\nmean := stat.Mean(sf.Values, nil)\n```\n\n### 中位数\n\n```go\nimport \"github.com\u002Fmontanaflynn\u002Fstats\"\nmedian, _ := stats.Median(sf.Values)\n```\n\n### 标准差\n\n```go\nstd := stat.StdDev(sf.Values, nil)\n```\n\n## 绘图（跨平台）\n\n```go\nimport (\n\tchart \"github.com\u002Fwcharczuk\u002Fgo-chart\"\n\t\"github.com\u002Frocketlaunchr\u002Fdataframe-go\u002Fplot\"\n\twc \"github.com\u002Frocketlaunchr\u002Fdataframe-go\u002Fplot\u002Fwcharczuk\u002Fgo-chart\"\n)\n\nsales := dataframe.NewSeriesFloat64(\"sales\", nil, 50.3, nil, 23.4, 56.2, 89, 32, 84.2, 72, 89)\ncs, _ := wc.S(ctx, sales, nil, nil)\n\ngraph := chart.Chart{Series: []chart.Series{cs}}\n\nplt, _ := plot.Open(\"Monthly sales\", 450, 300)\ngraph.Render(chart.SVG, plt)\nplt.Display(plot.None)\n\u003C-plt.Closed\n\n```\n\n输出：\n\n\u003Cp align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Frocketlaunchr_dataframe-go_readme_80931aa533a0.png\" alt=\"plot\" \u002F>\n\u003C\u002Fp>\n\n## 数学函数\n\n```go\nimport \"github.com\u002Frocketlaunchr\u002Fdataframe-go\u002Fmath\u002Ffuncs\"\n\nres := 24\nsx := dataframe.NewSeriesFloat64(\"x\", nil, utils.Float64Seq(1, float64(res), 1))\nsy := dataframe.NewSeriesFloat64(\"y\", &dataframe.SeriesInit{Size: res})\ndf := dataframe.NewDataFrame(sx, sy)\n\nfn := funcs.RegFunc(\"sin(2*𝜋*x\u002F24)\")\nfuncs.Evaluate(ctx, df, fn, 1)\n```\n[![Go Playground](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGo-Playground-5593c7.svg?labelColor=41c3f3&style=for-the-badge)](https:\u002F\u002Fplay.golang.org\u002Fp\u002Ff4GfS2rUjaM)\n\n输出：\n\n\u003Cp align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Frocketlaunchr_dataframe-go_readme_f05ed19a6b38.png\" alt=\"正弦波\" \u002F>\n\u003C\u002Fp>\n\n## 导入数据\n\n`imports` 子包支持导入 CSV、JSONL、Parquet 文件，以及直接从 SQL 数据库中导入数据。可以通过设置 `DictateDataType` 选项来指定真实的基础数据类型，或者使用 `InferDataTypes` 选项进行自动推断。\n\n### CSV\n\n```go\ncsvStr := `\nCountry,Date,Age,Amount,Id\n\"United States\",2012-02-01,50,112.1,01234\n\"United States\",2012-02-01,32,321.31,54320\n\"United Kingdom\",2012-02-01,17,18.2,12345\n\"United States\",2012-02-01,32,321.31,54320\n\"United Kingdom\",2012-05-07,NA,18.2,12345\n\"United States\",2012-02-01,32,321.31,54320\n\"United States\",2012-02-01,32,321.31,54320\nSpain,2012-02-01,66,555.42,00241\n`\ndf, err := imports.LoadFromCSV(ctx, strings.NewReader(csvStr))\n\n输出：\n+-----+----------------+------------+-------+---------+-------+\n|     |    COUNTRY     |    DATE    |  AGE  | AMOUNT  |  ID   |\n+-----+----------------+------------+-------+---------+-------+\n| 0:  | United States  | 2012-02-01 |  50   |  112.1  | 1234  |\n| 1:  | United States  | 2012-02-01 |  32   | 321.31  | 54320 |\n| 2:  | United Kingdom | 2012-02-01 |  17   |  18.2   | 12345 |\n| 3:  | United States  | 2012-02-01 |  32   | 321.31  | 54320 |\n| 4:  | United Kingdom | 2015-05-07 |  NaN  |  18.2   | 12345 |\n| 5:  | United States  | 2012-02-01 |  32   | 321.31  | 54320 |\n| 6:  | United States  | 2012-02-01 |  32   | 321.31  | 54320 |\n| 7:  |     Spain      | 2012-02-01 |  66   | 555.42  |  241  |\n+-----+----------------+------------+-------+---------+-------+\n| 8X5 |     STRING     |    TIME    | INT64 | FLOAT64 | INT64 |\n+-----+----------------+------------+-------+---------+-------+\n```\n[![Go Playground](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGo-Playground-5593c7.svg?labelColor=41c3f3&style=for-the-badge)](https:\u002F\u002Fplay.golang.org\u002Fp\u002F7hyUXnRy1pR)\n\n## 导出数据\n\n`exports` 子包支持导出为 CSV、JSONL、Parquet 文件、Excel 表格，以及直接导出到 SQL 数据库。\n\n## 优化\n\n* 如果您事先知道行数，可以使用 `SeriesInit{}` 设置序列底层切片的容量。这样可以预先分配内存，从而提高性能。\n\n# 泛型系列\n\n默认情况下，支持 `string`、`time.Time`、`float64` 和 `int64` 类型。同时自动支持 `float32` 及所有整数类型。还提供了一个便捷函数用于处理 `bool` 类型。此外，在 `xseries` 子包中也支持 `complex128` 类型。\n\n有时您可能希望使用自定义的数据类型。您可以实现自己的 `Series` 类型（性能更高），也可以使用 **泛型系列**（更方便）。\n\n## civil.Date\n\n```go\nimport \"time\"\nimport \"cloud.google.com\u002Fgo\u002Fcivil\"\n\nsg := dataframe.NewSeriesGeneric(\"date\", civil.Date{}, nil, civil.Date{2018, time.May, 01}, civil.Date{2018, time.May, 02}, civil.Date{2018, time.May, 03})\ns2 := dataframe.NewSeriesFloat64(\"sales\", nil, 50.3, 23.4, 56.2)\n\ndf := dataframe.NewDataFrame(sg, s2)\n\n输出：\n+-----+------------+---------+\n|     |    DATE    |  SALES  |\n+-----+------------+---------+\n| 0:  | 2018-05-01 |  50.3   |\n| 1:  | 2018-05-02 |  23.4   |\n| 2:  | 2018-05-03 |  56.2   |\n+-----+------------+---------+\n| 3X2 | CIVIL DATE | FLOAT64 |\n+-----+------------+---------+\n\n```\n\n# 教程\n\n## 创建一些假数据\n\n让我们创建一个包含 8 名“假”员工的列表，包括姓名、职位和基本 hourly 工资率。\n\n```go\nimport \"golang.org\u002Fx\u002Fexp\u002Frand\"\nimport \"rocketlaunchr\u002Fdataframe-go\u002Futils\u002Ffaker\"\n\nsrc := rand.NewSource(uint64(time.Now().UTC().UnixNano()))\ndf := faker.NewDataFrame(8, src, faker.S(\"name\", 0, \"Name\"), faker.S(\"title\", 0.5, \"JobTitle\"), faker.S(\"base rate\", 0, \"Number\", 15, 50))\n```\n\n```go\n+-----+----------------+----------------+-----------+\n|     |      NAME      |     TITLE      | BASE RATE |\n+-----+----------------+----------------+-----------+\n| 0:  | Cordia Jacobi  |   Consultant   |    42     |\n| 1:  | Nickolas Emard |      NaN       |    22     |\n| 2:  | Hollis Dickens | Representative |    22     |\n| 3:  | Stacy Dietrich |      NaN       |    43     |\n| 4:  |  Aleen Legros  |    Officer     |    21     |\n| 5:  |  Adelia Metz   |   Architect    |    18     |\n| 6:  | Sunny Gerlach  |      NaN       |    28     |\n| 7:  | Austin Hackett |      NaN       |    39     |\n+-----+----------------+----------------+-----------+\n| 8X3 |     STRING     |     STRING     |   INT64   |\n+-----+----------------+----------------+-----------+\n```\n\n## 应用函数\n\n让我们通过将每个人的工资翻倍来给他们升职。\n\n```go\ns := df.Series[2]\n\napplyFn := dataframe.ApplySeriesFn(func(val interface{}, row, nRows int) interface{} {\n\treturn 2 * val.(int64)\n})\n\ndataframe.Apply(ctx, s, applyFn, dataframe.FilterOptions{InPlace: true})\n```\n\n```go\n+-----+----------------+----------------+-----------+\n|     |      NAME      |     TITLE      | BASE RATE |\n+-----+----------------+----------------+-----------+\n| 0:  | Cordia Jacobi  |   Consultant   |    84     |\n| 1:  | Nickolas Emard |      NaN       |    44     |\n| 2:  | Hollis Dickens | Representative |    44     |\n| 3:  | Stacy Dietrich |      NaN       |    86     |\n| 4:  |  Aleen Legros  |    Officer     |    42     |\n| 5:  |  Adelia Metz   |   Architect    |    36     |\n| 6:  | Sunny Gerlach  |      NaN       |    56     |\n| 7:  | Austin Hackett |      NaN       |    78     |\n+-----+----------------+----------------+-----------+\n| 8X3 |     STRING     |     STRING     |   INT64   |\n+-----+----------------+----------------+-----------+\n```\n\n## 创建时间序列\n\n让我们在连续的几天里分别通知所有员工。\n\n```go\nimport \"rocketlaunchr\u002Fdataframe-go\u002Futils\u002Futime\"\n\nmts, _ := utime.NewSeriesTime(ctx, \"meeting time\", \"1D\", time.Now().UTC(), false, utime.NewSeriesTimeOptions{Size: &[]int{8}[0]})\ndf.AddSeries(mts, nil)\n```\n\n```go\n+-----+----------------+----------------+-----------+--------------------------------+\n|     |      NAME      |     TITLE      | BASE RATE |          MEETING TIME          |\n+-----+----------------+----------------+-----------+--------------------------------+\n| 0:  | Cordia Jacobi  |   Consultant   |    84     |   2020-02-02 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 1:  | Nickolas Emard |      NaN       |    44     |   2020-02-03 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 2:  | Hollis Dickens | Representative |    44     |   2020-02-04 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 3:  | Stacy Dietrich |      NaN       |    86     |   2020-02-05 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 4:  |  Aleen Legros  |    Officer     |    42     |   2020-02-06 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 5:  |  Adelia Metz   |   Architect    |    36     |   2020-02-07 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 6:  | Sunny Gerlach  |      NaN       |    56     |   2020-02-08 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 7:  | Austin Hackett |      NaN       |    78     |   2020-02-09 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n+-----+----------------+----------------+-----------+--------------------------------+\n| 8X4 |     STRING     |     STRING     |   INT64   |              TIME              |\n+-----+----------------+----------------+-----------+--------------------------------+\n```\n\n## 过滤\n\n让我们无故过滤掉我们的高级员工（他们有职位）。\n\n```go\nfilterFn := dataframe.FilterDataFrameFn(func(vals map[interface{}]interface{}, row, nRows int) (dataframe.FilterAction, error) {\n\tif vals[\"title\"] == nil {\n\t\treturn dataframe.DROP, nil\n\t}\n\treturn dataframe.KEEP, nil\n})\n\nseniors, _ := dataframe.Filter(ctx, df, filterFn)\n```\n\n```go\n+-----+----------------+----------------+-----------+--------------------------------+\n|     |      NAME      |     TITLE      | BASE RATE |          MEETING TIME          |\n+-----+----------------+----------------+-----------+--------------------------------+\n| 0:  | Cordia Jacobi  |   Consultant   |    84     |   2020-02-02 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 1:  | Hollis Dickens | Representative |    44     |   2020-02-04 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 2:  |  Aleen Legros  |    Officer     |    42     |   2020-02-06 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n| 3:  |  Adelia Metz   |   Architect    |    36     |   2020-02-07 23:13:53.015324   |\n|     |                |                |           |           +0000 UTC            |\n+-----+----------------+----------------+-----------+--------------------------------+\n| 4X4 |     STRING     |     STRING     |   INT64   |              TIME              |\n+-----+----------------+----------------+-----------+--------------------------------+\n```\n\n\n## 其他实用工具包\n\n- [awesome-svelte](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Fawesome-svelte) - 用于替代 React 的资源\n- [dbq](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Fdbq) - Go 语言中零样板代码的数据库操作\n- [electron-alert](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Felectron-alert) - Electron 应用中的 SweetAlert2\n- [google-search](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Fgoogle-search) - 抓取 Google 搜索结果\n- [igo](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Figo) - 带有新语法的 Go 转译器，例如 fordefer（为 for 循环延迟执行）\n- [mysql-go](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Fmysql-go) - 正确取消慢速 MySQL 查询\n- [react](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Freact) - 使用 Go 构建前端应用\n- [remember-go](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Fremember-go) - 缓存慢速数据库查询\n- [testing-go](https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Ftesting-go) - 用于单元测试的测试框架\n\n#\n\n### 法律信息\n\n本项目采用修改后的 MIT 许可证。更多详情请参阅 `LICENSE` 文件。\n\n**© 2018-21 PJ 工程与商业解决方案有限公司。**","# dataframe-go 快速上手指南\n\n`dataframe-go` 是一个轻量级且直观的 Go 语言数据处理库，专为统计分析、机器学习和数据探索设计。你可以将其理解为 Go 版本的 Excel 或 Python 的 Pandas。\n\n> **⚠️ 重要提示**：该包已可用于生产环境，但 API 尚未稳定（计划在 Go 泛型普及后重写并发布 v1.0.0）。建议在使用时通过 `go.mod` 锁定具体的 commit ID，而非直接引用 master 分支。\n\n## 1. 环境准备\n\n*   **操作系统**：跨平台支持 (Linux, macOS, Windows)\n*   **Go 版本**：建议使用较新的 Go 版本（虽然目前未全面使用泛型，但未来版本将依赖 Go 1.18+）\n*   **前置依赖**：无特殊系统级依赖，仅需标准的 Go 开发环境。\n\n## 2. 安装步骤\n\n使用 `go get` 命令安装最新版本的库：\n\n```bash\ngo get -u github.com\u002Frocketlaunchr\u002Fdataframe-go\n```\n\n在你的 Go 代码中引入包：\n\n```go\nimport dataframe \"github.com\u002Frocketlaunchr\u002Fdataframe-go\"\n```\n\n## 3. 基本使用\n\n### 创建 DataFrame\n\n通过创建系列（Series）来构建数据框。以下示例创建一个包含 \"day\" 和 \"sales\" 两列的表格：\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\tdataframe \"github.com\u002Frocketlaunchr\u002Fdataframe-go\"\n)\n\nfunc main() {\n\t\u002F\u002F 创建整数列\n\ts1 := dataframe.NewSeriesInt64(\"day\", nil, 1, 2, 3, 4, 5, 6, 7, 8)\n\t\n\t\u002F\u002F 创建浮点列 (支持 nil 表示缺失值)\n\ts2 := dataframe.NewSeriesFloat64(\"sales\", nil, 50.3, 23.4, 56.2, nil, nil, 84.2, 72, 89)\n\t\n\t\u002F\u002F 组合成 DataFrame\n\tdf := dataframe.NewDataFrame(s1, s2)\n\n\t\u002F\u002F 打印表格\n\tfmt.Print(df.Table())\n}\n```\n\n**输出示例：**\n```text\n+-----+-------+---------+\n|     |  DAY  |  SALES  |\n+-----+-------+---------+\n| 0:  |   1   |  50.3   |\n| 1:  |   2   |  23.4   |\n| 2:  |   3   |  56.2   |\n| 3:  |   4   |   NaN   |\n| 4:  |   5   |   NaN   |\n| 5:  |   6   |  84.2   |\n| 6:  |   7   |   72    |\n| 7:  |   8   |   89    |\n+-----+-------+---------+\n| 8X2 | INT64 | FLOAT64 |\n+-----+-------+---------+\n```\n\n### 数据操作示例\n\n**添加与删除行：**\n\n```go\n\u002F\u002F 追加一行 (位置设为 nil 表示末尾)\ndf.Append(nil, 9, 123.6)\n\n\u002F\u002F 使用 Map 追加一行\ndf.Append(nil, map[string]interface{}{\n\t\"day\":   10,\n\t\"sales\": nil,\n})\n\n\u002F\u002F 删除第一行 (索引 0)\ndf.Remove(0)\n```\n\n**排序数据：**\n\n```go\nimport \"context\"\n\nctx := context.Background()\n\n\u002F\u002F 定义排序规则：先按 sales 降序，再按 day 降序\nsks := []dataframe.SortKey{\n\t{Key: \"sales\", Desc: true},\n\t{Key: \"day\", Desc: true},\n}\n\n\u002F\u002F 执行排序\ndf.Sort(ctx, sks)\n```\n\n### 导入 CSV 数据\n\n`dataframe-go` 支持直接从 CSV 字符串或文件加载数据，并自动推断数据类型：\n\n```go\nimport (\n\t\"strings\"\n\t\"github.com\u002Frocketlaunchr\u002Fdataframe-go\u002Fimports\"\n)\n\ncsvStr := `\nCountry,Date,Age,Amount\n\"United States\",2012-02-01,50,112.1\n\"United Kingdom\",2012-02-01,17,18.2\n`\n\n\u002F\u002F 从 CSV 字符串加载\ndf, err := imports.LoadFromCSV(ctx, strings.NewReader(csvStr))\nif err != nil {\n\tpanic(err)\n}\n\nfmt.Print(df.Table())\n```\n\n### 统计计算\n\n利用 `gonum` 库进行高效的统计计算（需先将 Series 转换为 float64 切片）：\n\n```go\nimport \"gonum.org\u002Fv1\u002Fgonum\u002Fstat\"\n\n\u002F\u002F 获取系列\ns := df.Series[1] \u002F\u002F 假设获取 sales 列\n\n\u002F\u002F 转换为 Float64 Series\nsf, _ := s.ToSeriesFloat64(ctx)\n\n\u002F\u002F 计算平均值\nmean := stat.Mean(sf.Values, nil)\nfmt.Println(\"Mean:\", mean)\n\n\u002F\u002F 计算标准差\nstd := stat.StdDev(sf.Values, nil)\nfmt.Println(\"StdDev:\", std)\n```\n\n### 生成假数据 (用于测试)\n\n快速生成测试用的伪造数据：\n\n```go\nimport (\n\t\"golang.org\u002Fx\u002Fexp\u002Frand\"\n\t\"time\"\n\t\"github.com\u002Frocketlaunchr\u002Fdataframe-go\u002Futils\u002Ffaker\"\n)\n\nsrc := rand.NewSource(uint64(time.Now().UTC().UnixNano()))\n\n\u002F\u002F 生成 8 行数据：姓名 (字符串), 职位 (50% 概率为空), 底薪 (15-50 之间的数字)\ndf := faker.NewDataFrame(8, src, \n\tfaker.S(\"name\", 0, \"Name\"), \n\tfaker.S(\"title\", 0.5, \"JobTitle\"), \n\tfaker.S(\"base rate\", 0, \"Number\", 15, 50),\n)\n\nfmt.Print(df.Table())\n```","某电商后端团队需要在高并发的 Go 微服务中，实时处理来自 MySQL 的销售流水数据，进行缺失值填补、异常检测及趋势预测。\n\n### 没有 dataframe-go 时\n- **数据处理逻辑繁琐**：开发者需手动编写大量循环和条件判断来解析数据库结果集，代码冗长且难以维护。\n- **缺失值处理困难**：面对销售数据中的空值（NaN），缺乏内置的前向填充或线性插算方法，只能硬编码粗糙的默认值，影响分析精度。\n- **统计与预测功能缺失**：原生 Go 标准库不支持时间序列预测（如 Holt-Winters 算法），若要实现需引入重型外部依赖或自行复现复杂数学公式。\n- **调试效率低下**：缺乏类似 Excel 的表格化打印功能，排查数据异常时只能逐行查看日志，直观性差。\n\n### 使用 dataframe-go 后\n- **操作直观高效**：直接通过 `NewDataFrame` 构建内存表格，利用 `Append`、`Remove` 和 `UpdateRow` 像操作电子表格一样灵活增删改查。\n- **智能数据清洗**：调用内置的 `Interpolation` 功能，一键实现前向填充或样条插值，自动修复缺失的销售记录，保证数据连续性。\n- **内建高级分析能力**：直接使用包内的时间序列预测模块（SES、Holt-Winters）和数学函数，无需额外集成即可输出未来销量趋势。\n- **可视化调试便捷**：通过 `df.Table()` 直接在控制台输出格式整齐的表格，快速定位数据分布特征和异常点。\n\ndataframe-go 将 Go 语言从单纯的后端逻辑执行者升级为具备原地统计分析能力的轻量级数据科学平台，显著降低了实时数据处理的开发门槛。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Frocketlaunchr_dataframe-go_5d2815d4.png","rocketlaunchr","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Frocketlaunchr_beeebf10.png",null,"https:\u002F\u002Fgithub.com\u002Frocketlaunchr",[78],{"name":79,"color":80,"percentage":81},"Go","#00ADD8",100,1285,101,"2026-04-04T15:01:22","NOASSERTION",1,"Linux, macOS, Windows","未说明",{"notes":90,"python":91,"dependencies":92},"该工具是基于 Go 语言开发的 DataFrame 库，非 Python 工具。需要安装 Go 环境（推荐等待 Go 1.18+ 以支持泛型重构）。支持跨平台绘图，可通过 'go get' 命令安装。API 尚未稳定，建议锁定具体 commit ID 而非直接使用 master 分支。","不适用 (这是一个 Go 语言库)",[93,94,95,96],"gonum.org\u002Fv1\u002Fgonum","github.com\u002Fwcharczuk\u002Fgo-chart","cloud.google.com\u002Fgo\u002Fcivil","golang.org\u002Fx\u002Fexp\u002Frand",[98,16,14],"其他",[100,101,102,103,104,105,106,107,108,109],"golang","go","data-science","machine-learning","statistics","python","pandas","pandas-dataframe","dataframe","dataframes","2026-03-27T02:49:30.150509","2026-04-07T01:47:37.121402",[113,118,123,128,133,138,142],{"id":114,"question_zh":115,"answer_zh":116,"source_url":117},20666,"如何使用 CSVLoadOptions 在加载 CSV 时指定列的数据类型？","可以通过创建 `imports.CSVLoadOptions` 结构体，并在 `DictateDataType` 映射中指定列名及其对应的示例值（用于推断类型）来实现。例如，若要将 \"UserID\" 和 \"MovieID\" 加载为 float64 类型，代码如下：\n```go\nopts := imports.CSVLoadOptions{\n\tComma: ',',\n\tDictateDataType: map[string]interface{}{\n\t\t\"UserID\": float64(0),\n\t\t\"MovieID\": float64(0),\n\t},\n}\nratingDf, err := imports.LoadFromCSV(ctx, file, opts)\n```\n注意键名需与 CSV 表头完全匹配。","https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Fdataframe-go\u002Fissues\u002F16",{"id":119,"question_zh":120,"answer_zh":121,"source_url":122},20667,"为什么调用 dataframe.ApplySeriesFn 或 dataframe.Apply 时报错说方法未定义？","这些方法可能不在当前的稳定分支中，或者 API 已发生变更。维护者建议在 `add-schema-inference` 分支中查找相关功能。此外，进行数据过滤时应使用 `dataframe.FilterDataFrameFn`，示例如下：\n```go\nfilterFn := dataframe.FilterDataFrameFn(func(vals map[interface{}]interface{}, row, nRows int) (dataframe.FilterAction, error) {\n    if vals[\"is_even\"] != nil && vals[\"is_even\"].(int64) == 1 {\n        return dataframe.KEEP, nil\n    }\n    return dataframe.DROP, nil\n})\n```\n同时，建议使用 `NameToColumn` 或 `MustNameToColumn` 函数通过列名获取列索引，而不是硬编码索引。","https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Fdataframe-go\u002Fissues\u002F23",{"id":124,"question_zh":125,"answer_zh":126,"source_url":127},20668,"是否支持读取 Parquet 文件到 DataFrame？","是的，Parquet 导入功能现已支持（处于实验阶段）。该函数会返回一个 `*dataframe.DataFrame` 对象。具体用法可参考项目 README 中的示例。不过维护者也指出，目前的加载效率可能还有优化空间。","https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Fdataframe-go\u002Fissues\u002F46",{"id":129,"question_zh":130,"answer_zh":131,"source_url":132},20669,"如何通过列名获取列索引？NameToColumn 返回两个值导致无法内联使用怎么办？","`NameToColumn` 函数返回两个值（索引和错误），因此不能直接内联使用。如果确定列名存在且希望简化代码，可以使用 `MustNameToColumn` 函数，它会在列名不存在时直接 panic，从而允许内联调用。例如：\n```go\nidx := df.MustNameToColumn(\"foo\")\nvalues := df.Series[idx].Values\n```","https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Fdataframe-go\u002Fissues\u002F40",{"id":134,"question_zh":135,"answer_zh":136,"source_url":137},20670,"如何将 DataFrame 转换为 gonum 的 dense matrix 或浮点数组？","由于 Series 的内部字段（如 Values）是私有的，无法直接访问。你需要遍历每一行或每一个 Series，使用公共方法提取数据。例如，提取单行数据转换为 `[]float64` 的逻辑如下：\n```go\nfunc getRow(df *dataframe.DataFrame, row int) []float64 {\n    arr := make([]float64, 0)\n    for _, series := range df.Series {\n        \u002F\u002F 假设所有列都是数值型，实际使用时需做类型断言检查\n        val := series.Value(row)\n        if fVal, ok := val.(float64); ok {\n            arr = append(arr, fVal)\n        } else if iVal, ok := val.(int64); ok {\n            arr = append(arr, float64(iVal))\n        }\n    }\n    return arr\n}\n```\n对于整个 DataFrame 转矩阵，需逐行调用此类逻辑并填充到 gonum 矩阵中。","https:\u002F\u002Fgithub.com\u002Frocketlaunchr\u002Fdataframe-go\u002Fissues\u002F15",{"id":139,"question_zh":140,"answer_zh":141,"source_url":137},20671,"如何正确初始化 context.Context 用于 LoadFromCSV 等方法？","在大多数简单场景下，如果没有特定的取消或超时需求，可以使用 `context.TODO()` 或 `context.Background()` 作为参数传入。例如：\n```go\nctx := context.TODO()\ndf, err := imports.LoadFromCSV(ctx, strings.NewReader(csvStr))\n```\nContext 是 Go 语言的标准做法，主要用于控制操作的生命周期（如超时取消），它是许多函数的第一个参数。",{"id":143,"question_zh":144,"answer_zh":145,"source_url":132},20672,"文档中提到的 nil 参数是什么意思？","许多 `dataframe` 包的方法（如 `.Append()`）的第一个参数通常是可选的 `Options` 结构体指针。如果在调用时不需要特殊配置，直接传递 `nil` 即可，表示使用默认选项。例如：\n```go\ndf.Append(nil, newRowData)\n```",[]]