{"id":31538566,"url":"https://github.com/kishyassin/goframe","last_synced_at":"2025-10-04T08:51:50.458Z","repository":{"id":314600497,"uuid":"1056125554","full_name":"kishyassin/goframe","owner":"kishyassin","description":"goframe is a Go package inspired by Python's pandas, designed for data manipulation and analysis.","archived":false,"fork":false,"pushed_at":"2025-10-01T16:03:21.000Z","size":75,"stargazers_count":11,"open_issues_count":3,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-01T18:07:04.233Z","etag":null,"topics":["data","dataframe","go","goframe","golang","good-first-issue","package"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kishyassin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-13T12:48:52.000Z","updated_at":"2025-10-01T16:14:04.000Z","dependencies_parsed_at":"2025-09-13T14:54:01.046Z","dependency_job_id":"d648007a-a886-433c-b343-be7222d14e21","html_url":"https://github.com/kishyassin/goframe","commit_stats":null,"previous_names":["kishyassin/goframe"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/kishyassin/goframe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kishyassin%2Fgoframe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kishyassin%2Fgoframe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kishyassin%2Fgoframe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kishyassin%2Fgoframe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kishyassin","download_url":"https://codeload.github.com/kishyassin/goframe/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kishyassin%2Fgoframe/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278289494,"owners_count":25962353,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data","dataframe","go","goframe","golang","good-first-issue","package"],"created_at":"2025-10-04T08:51:36.881Z","updated_at":"2025-10-04T08:51:50.453Z","avatar_url":"https://github.com/kishyassin.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# goframe\n\ngoframe is a Go package inspired by Python's pandas, designed for data manipulation and analysis. It provides a `DataFrame` structure and `Column` types for handling and processing structured data efficiently.\n\n[![Go Reference](https://pkg.go.dev/badge/github.com/kishyassin/goframe.svg)](https://pkg.go.dev/github.com/kishyassin/goframe)\n\n## Features\n\n- Typed columns with support for `int`, `float64`, `string`, and `bool`.\n- DataFrame operations such as adding/removing columns, filtering rows, and selecting subsets.\n- Auto-detection of column types during CSV import.\n- Statistical aggregations like `Mean`, `Sum`, `Min`, and `Max`.\n- **Join operations**: Perform `inner`, `left`, `right`, and `outer` joins between DataFrames.\n- **Row operations**: Access rows (`Row`), retrieve subsets (`Head`, `Tail`), append rows (`AppendRow`), and remove rows (`DropRow`).\n- **Column renaming**: Rename columns using the `RenameColumn` method.\n- **CSV export**: Save DataFrames to CSV files using `ToCSV` and `ToCSVWriter`.\n- **Time Series Support**: Add datetime indexing, resampling, and shifting for time series data.\n- **Visualization**: Generate line and bar plots directly from DataFrames.\n\n## Installation\n\nTo install goframe, use:\n\n```bash\ngo get github.com/kishyassin/goframe\n```\n\n## Usage\n\n### Creating a DataFrame\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/kishyassin/goframe\"\n)\n\nfunc main() {\n\t// Create a new DataFrame\n\tdf := goframe.NewDataFrame()\n\n\t// Add columns to the DataFrame\n\tdf.AddColumn(goframe.ConvertToAnyColumn(goframe.NewColumn(\"name\", []string{\"Alice\", \"Bob\", \"Charlie\"})))\n\tdf.AddColumn(goframe.ConvertToAnyColumn(goframe.NewColumn(\"age\", []int{25, 30, 35}))\n\n\t// Print the DataFrame\n\tfmt.Println(df)\n}\n```\n\n### Importing from CSV\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"strings\"\n\n\t\"github.com/kishyassin/goframe\"\n)\n\nfunc main() {\n\treader := strings.NewReader(`name,age,salary\nAlice,25,50000\nBob,30,60000\nCharlie,35,70000`)\n\tdf, err := goframe.FromCSVReader(reader)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println(df)\n}\n```\n\n### Joining DataFrames\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\n\t\"github.com/kishyassin/goframe\"\n)\n\nfunc main() {\n\tdf1 := goframe.NewDataFrame()\n\tdf1.AddColumn(goframe.ConvertToAnyColumn(goframe.NewColumn(\"id\", []int{1, 2, 3})))\n\tdf1.AddColumn(goframe.ConvertToAnyColumn(goframe.NewColumn(\"value1\", []string{\"A\", \"B\", \"C\"})))\n\n\tdf2 := goframe.NewDataFrame()\n\tdf2.AddColumn(goframe.ConvertToAnyColumn(goframe.NewColumn(\"id\", []int{2, 3, 4})))\n\tdf2.AddColumn(goframe.ConvertToAnyColumn(goframe.NewColumn(\"value2\", []string{\"X\", \"Y\", \"Z\"})))\n\n\t// Perform an inner join\n\tjoined, err := df1.InnerJoin(df2, \"id\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tfmt.Println(joined)\n}\n```\n\n### Row Operations\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/kishyassin/goframe\"\n)\n\nfunc main() {\n\tdf := goframe.NewDataFrame()\n\tdf.AddColumn(goframe.ConvertToAnyColumn(goframe.NewColumn(\"name\", []string{\"Alice\", \"Bob\", \"Charlie\"})))\n\tdf.AddColumn(goframe.ConvertToAnyColumn(goframe.NewColumn(\"age\", []int{25, 30, 35}))\n\n\t// Access a row\n\trow, _ := df.Row(1)\n\tfmt.Println(\"Row 1:\", row)\n\n\t// Get the first two rows\n\thead := df.Head(2)\n\tfmt.Println(\"Head:\", head)\n\n\t// Append a new row\n\tdf.AppendRow(map[string]any{\"name\": \"Diana\", \"age\": 40})\n\tfmt.Println(\"After appending a row:\", df)\n\n\t// Drop a row\n\tdf.DropRow(1)\n\tfmt.Println(\"After dropping a row:\", df)\n}\n```\n\n### Renaming Columns\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\n\t\"github.com/kishyassin/goframe\"\n)\n\nfunc main() {\n\tdf := goframe.NewDataFrame()\n\tdf.AddColumn(goframe.ConvertToAnyColumn(goframe.NewColumn(\"name\", []string{\"Alice\", \"Bob\", \"Charlie\"})))\n\tdf.AddColumn(goframe.ConvertToAnyColumn(goframe.NewColumn(\"age\", []int{25, 30, 35}))\n\n\terr := df.RenameColumn(\"name\", \"full_name\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println(\"Renamed column:\", df)\n}\n```\n\n### Exporting to CSV\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\n\t\"github.com/kishyassin/goframe\"\n)\n\nfunc main() {\n\tdf := goframe.NewDataFrame()\n\tdf.AddColumn(goframe.ConvertToAnyColumn(goframe.NewColumn(\"name\", []string{\"Alice\", \"Bob\", \"Charlie\"})))\n\tdf.AddColumn(goframe.ConvertToAnyColumn(goframe.NewColumn(\"age\", []int{25, 30, 35})))\n\n\terr := df.ToCSV(\"output.csv\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println(\"DataFrame exported to output.csv\")\n}\n```\n\n### Advanced Features\n\n#### Time Series\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\t\"github.com/kishyassin/goframe\"\n)\n\nfunc main() {\n\tdf := goframe.NewDataFrame()\n\tdf.AddColumn(goframe.ConvertToAnyColumn(goframe.NewColumn(\"date\", []string{\"2025-09-14\", \"2025-09-15\", \"2025-09-16\"})))\n\tdf.AddColumn(goframe.ConvertToAnyColumn(goframe.NewColumn(\"value\", []float64{10.5, 20.3, 30.7})))\n\n\t// Convert the \"date\" column from string to time.Time\n\tdateCol, _ := df.Select(\"date\")\n\tvar dateTimes []time.Time\n\tfor _, dateStr := range dateCol.Data {\n\t\tparsedDate, err := time.Parse(\"2006-01-02\", dateStr.(string))\n\t\tif err != nil {\n\t\t\tfmt.Println(\"Error parsing date:\", err)\n\t\t\treturn\n\t\t}\n\t\tdateTimes = append(dateTimes, parsedDate)\n\t}\n\tdf.Columns[\"date\"] = goframe.ConvertToAnyColumn(goframe.NewColumn(\"date\", dateTimes))\n\n\t// Resample data to daily frequency\n\tresampled, err := df.Resample(\"date\", \"D\", func(values []any) any {\n\t\t// Example aggregation function: calculate the sum\n\t\tsum := 0.0\n\t\tfor _, v := range values {\n\t\t\tif num, ok := v.(float64); ok {\n\t\t\t\tsum += num\n\t\t\t}\n\t\t}\n\t\treturn sum\n\t})\n\tif err != nil {\n\t\tfmt.Println(\"Error during resampling:\", err)\n\t\treturn\n\t}\n\n\tfmt.Println(\"Resampled DataFrame:\", resampled)\n}\n```\n\n#### Visualization\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/kishyassin/goframe\"\n)\n\nfunc main() {\n\tdf := goframe.NewDataFrame()\n\tdf.AddColumn(goframe.ConvertToAnyColumn(goframe.NewColumn(\"x\", []float64{1, 2, 3})))\n\tdf.AddColumn(goframe.ConvertToAnyColumn(goframe.NewColumn(\"y\", []float64{2.5, 3.5, 4.5})))\n\n\t// Generate a line plot\n\terr := df.LinePlot(\"x\", \"y\", \"line_plot.png\")\n\tif err != nil {\n\t\tfmt.Println(\"Error generating line plot:\", err)\n\t\treturn\n\t}\n\n\tfmt.Println(\"Line plot saved as 'line_plot.png'\")\n}\n```\n\n### API Reference\n\n#### DataFrame Methods\n\n- `NewDataFrame()`: Create a new DataFrame.\n- `AddColumn(column *Column[any])`: Add a column to the DataFrame.\n- `Row(index int)`: Retrieve a row by index.\n- `InnerJoin(other *DataFrame, key string)`: Perform inner join operation.\n- `OuterJoin(other *DataFrame, key string)`: Perform outer join operation.\n- `LeftJoin(other *DataFrame, key string)`: Perform left join operation.\n- `RightJoin(other *DataFrame, key string)`: Perform right join operation.\n- `Resample(column string, frequency string)`: Resample time series data.\n- `LinePlot(xCol, yCol, outputFile string)`: Generate a line plot.\n\n#### Column Methods\n\n- `NewColumn(name string, data []T)`: Create a new column.\n- `At(index int)`: Retrieve a value by index.\n\n## Contributing\n\nWe welcome contributions from the community! If you'd like to contribute:\n\n1. Fork the repository.\n2. Create a new branch for your feature or bug fix.\n3. Submit a pull request with a clear description of your changes.\n\nPlease ensure your code adheres to the project's coding standards and includes tests for any new functionality.\n\n## Contributors\n\n💖 Thanks to all the contributors who made **GoFrame** possible 💖\n\n\u003ca href=\"https://github.com/kishyassin/goframe/graphs/contributors\"\u003e\n  \u003cimg src=\"https://contrib.rocks/image?repo=kishyassin/goframe\" /\u003e\n\u003c/a\u003e\n\n\n\n## License\n\nThis project is licensed under the MIT License. See the LICENSE file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkishyassin%2Fgoframe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkishyassin%2Fgoframe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkishyassin%2Fgoframe/lists"}