{"id":744,"library":"agate","title":"Agate Data Analysis Library","description":"Agate is a Python data analysis library that is optimized for humans instead of machines. It is presented as an alternative to numpy and pandas, designed to solve real-world problems with readable code. It is currently at version 1.14.2 and has a steady release cadence, actively maintained by the wireservice team.","status":"active","version":"1.14.2","language":"python","source_language":"en","source_url":"https://github.com/wireservice/agate","tags":["data analysis","data wrangling","csv","dataframes","human-readable"],"install":[{"cmd":"pip install agate","lang":"bash","label":"Standard installation"},{"cmd":"pip install agate[icu]","lang":"bash","label":"With PyICU for non-English locale support"}],"dependencies":[{"reason":"Internationalization and localization utilities.","package":"Babel"},{"reason":"ISO 8601 date/time/duration parser and formatter.","package":"isodate"},{"reason":"Pure-Python charting library used for generating simple charts.","package":"leather"},{"reason":"Natural language date/time parser.","package":"parsedatetime"},{"reason":"Generates clean, URL-safe slugs.","package":"python-slugify"},{"reason":"Time expression parser.","package":"pytimeparse"},{"reason":"IANA time zone database for Python.","package":"tzdata"},{"reason":"For non-English locale support, installed via `agate[icu]`.","package":"PyICU","optional":true}],"imports":[{"symbol":"agate","correct":"import agate"},{"note":"While `from agate import Table` works, the documentation commonly shows `agate.Table` after `import agate` to keep the namespace clean and explicit.","wrong":"from agate import Table # Often fine, but import agate is canonical for top-level access","symbol":"Table","correct":"import agate\ntable = agate.Table(...)"},{"symbol":"TypeTester","correct":"from agate import TypeTester"},{"symbol":"Sum","correct":"from agate.aggregations import Sum"}],"quickstart":{"code":"import agate\nimport csv\nimport io\n\n# Create a dummy CSV in memory for a runnable example\ncsv_data = \"\"\"name,age,city,salary\nAlice,30,New York,70000\nBob,24,London,50000\nCharlie,30,New York,75000\nDavid,35,London,90000\nEve,24,Paris,60000\n\"\"\"\n\n# Use io.StringIO to simulate a file for from_csv\nwith io.StringIO(csv_data) as f:\n    # agate automatically infers types with TypeTester by default\n    table = agate.Table.from_csv(f)\n\nprint(\"Original Table:\")\ntable.print_table()\n\n# Filter rows where age is less than 30\nfiltered_table = table.where(lambda row: row['age'] < 30)\nprint(\"\\nFiltered Table (age < 30):\")\nfiltered_table.print_table()\n\n# Group by city and calculate average salary\nfrom agate.aggregations import Sum, Mean\n\nby_city = table.group_by('city')\naverages = by_city.aggregate([\n    ('average_salary', Mean('salary')),\n    ('total_employees', Sum('age', cast=True)) # Using Sum on age as a proxy for count\n])\n\nprint(\"\\nAggregated by City (Average Salary & Total Employees):\")\naverages.print_table()\n\n# Order by average salary, descending\nordered_averages = averages.order_by('average_salary', reverse=True)\nprint(\"\\nOrdered by Average Salary (Descending):\")\nordered_averages.print_table()\n","lang":"python","description":"This quickstart demonstrates loading data from a CSV (simulated in-memory), filtering rows, grouping data, aggregating results (mean and sum), and ordering the final table. It highlights `agate`'s immutable operations, where methods like `where()` and `group_by()` return new table objects."},"warnings":[{"fix":"Upgrade your Python environment to Python 3.5+ (preferably a recent stable version like 3.9+). If migrating from very old projects, update `agate` accordingly.","message":"Agate has dropped official support for Python 2.x. Users must ensure they are running Python 3.5 or newer. PyPI listings indicate active testing and support for Python 3.10-3.14.","severity":"breaking","affected_versions":"<1.0 (for full removal), 1.0+ (requires Python 3)"},{"fix":"Always assign the result of table operations to a new variable (e.g., `new_table = original_table.where(...)`) or chain operations (e.g., `table.where(...).order_by(...)`).","message":"Agate's core design principle dictates that `Table` objects are immutable. Operations like `select()`, `where()`, or `order_by()` do not modify the original table in-place; instead, they return *new* `Table` instances.","severity":"gotcha","affected_versions":"All versions"},{"fix":"If type inference is wrong, manually specify column types when loading data using the `column_types` argument in `Table.from_csv` or by instantiating `TypeTester` with `force` overrides. Example: `tester = agate.TypeTester(force={'my_column': agate.Text()}); table = agate.Table.from_csv(..., column_types=tester)`.","message":"When loading data from sources like CSV, `agate` uses a `TypeTester` to automatically infer column data types. While generally effective, it can sometimes guess incorrectly, especially with ambiguous data.","severity":"gotcha","affected_versions":"All versions"},{"fix":"Always verify the correct library by its PyPI slug (`agate`) and maintainer (`wireservice`) to ensure you are installing the intended data analysis library. Check documentation links (e.g., `agate.rtfd.org`) to confirm.","message":"There are multiple Python libraries with 'Agate' in their name. This entry refers to `wireservice/agate`, a data analysis library (`pip install agate`). Another common one is `obiba-agate`, which is a client for an 'Agate server' and has different use cases and dependencies.","severity":"gotcha","affected_versions":"All versions"},{"fix":"Remove the `cast` argument from the `agate.aggregations.Sum` constructor. Ensure the column being aggregated is already of the appropriate numeric type for summation. If type conversion is necessary, apply it to the column using `table.compute()` or similar methods *before* performing the aggregation.","message":"The `agate.aggregations.Sum` aggregate function does not accept a `cast` keyword argument. Attempting to pass `cast=True` (or any value) to its constructor will result in a `TypeError`. This applies to most `agate` aggregate functions; type conversion should generally be handled before aggregation.","severity":"breaking","affected_versions":"All versions"},{"fix":"Remove the `cast` argument when initializing `agate.aggregations.Sum`. Ensure the column being aggregated is already of a numeric type. If explicit casting is required, perform it in a separate `Table.compute()` operation before applying the aggregation.","message":"The `agate.aggregations.Sum` class does not accept a `cast` keyword argument during initialization. Passing `cast` to `Sum()` will result in a `TypeError`.","severity":"gotcha","affected_versions":"All versions"}],"env_vars":null,"last_verified":"2026-05-12T18:30:37.089Z","next_check":"2026-06-27T00:00:00.000Z","problems":[{"fix":"Install the 'agate' library using pip: 'pip install agate'.","cause":"This error occurs when the 'agate' library is not installed in your Python environment.","error":"ModuleNotFoundError: No module named 'agate'"},{"fix":"Ensure 'agate' is installed and use the correct import statement: 'from agate import Table'.","cause":"This error occurs when attempting to import 'Table' from 'agate' without the library being installed or due to an incorrect import statement.","error":"ImportError: cannot import name 'Table' from 'agate'"},{"fix":"Verify that 'agate' is installed correctly and that there are no conflicting module names in your project.","cause":"This error occurs when the 'agate' module is not properly installed or there is a naming conflict with another module.","error":"AttributeError: module 'agate' has no attribute 'Table'"},{"fix":"Ensure that numerical values are formatted correctly, using commas as thousand separators or removing them entirely before processing with 'agate'.","cause":"This error occurs when 'agate' encounters a value formatted with periods as thousand separators, which it cannot parse as a decimal number.","error":"agate.exceptions.CastError: Can not parse value '200.000.000' as Decimal."},{"fix":"Ensure you are using a Python version that includes 'isawaitable' in the 'inspect' module, or update your Python interpreter to a compatible version.","cause":"This error occurs when attempting to import 'isawaitable' from the 'inspect' module in a Python version that does not support it.","error":"ImportError: cannot import name 'isawaitable' from 'inspect'"}],"ecosystem":"pypi","meta_description":null,"install_score":100,"install_tag":"verified","quickstart_score":0,"quickstart_tag":"stale","pypi_latest":"1.14.2","cli_name":null,"install_checks":{"last_tested":"2026-05-12","tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.43,"mem_mb":11.8,"disk_size":"53.1M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"icu","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.42,"mem_mb":11.8,"disk_size":"53.1M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.43,"mem_mb":11.8,"disk_size":"53.1M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"icu","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.43,"mem_mb":11.8,"disk_size":"53.1M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.4,"import_time_s":0.34,"mem_mb":11.8,"disk_size":"54M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"icu","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.5,"import_time_s":0.3,"mem_mb":11.8,"disk_size":"54M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.31,"mem_mb":11.8,"disk_size":"54M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"icu","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.32,"mem_mb":11.8,"disk_size":"54M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.59,"mem_mb":12.3,"disk_size":"55.3M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"icu","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.6,"mem_mb":12.3,"disk_size":"55.3M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.6,"mem_mb":12.3,"disk_size":"55.3M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"icu","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.6,"mem_mb":12.3,"disk_size":"55.3M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.5,"import_time_s":0.47,"mem_mb":12.3,"disk_size":"56M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"icu","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.4,"import_time_s":0.47,"mem_mb":12.3,"disk_size":"56M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.45,"mem_mb":12.3,"disk_size":"56M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"icu","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.49,"mem_mb":12.3,"disk_size":"56M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.52,"mem_mb":11.7,"disk_size":"47.1M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"icu","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.47,"mem_mb":11.7,"disk_size":"47.1M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.52,"mem_mb":11.7,"disk_size":"47.1M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"icu","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.51,"mem_mb":11.7,"disk_size":"47.1M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.3,"import_time_s":0.5,"mem_mb":11.7,"disk_size":"48M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"icu","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.2,"import_time_s":0.5,"mem_mb":11.7,"disk_size":"48M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.53,"mem_mb":11.7,"disk_size":"48M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"icu","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.53,"mem_mb":11.7,"disk_size":"48M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.47,"mem_mb":11.5,"disk_size":"46.8M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"icu","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.47,"mem_mb":11.5,"disk_size":"46.8M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.49,"mem_mb":11.5,"disk_size":"46.7M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"icu","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.5,"mem_mb":11.5,"disk_size":"46.7M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.4,"import_time_s":0.45,"mem_mb":11.5,"disk_size":"47M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"icu","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.3,"import_time_s":0.5,"mem_mb":11.5,"disk_size":"47M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.49,"mem_mb":11.5,"disk_size":"47M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"icu","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.49,"mem_mb":11.5,"disk_size":"47M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.34,"mem_mb":11.7,"disk_size":"52.6M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"icu","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.34,"mem_mb":11.7,"disk_size":"52.6M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.37,"mem_mb":11.7,"disk_size":"52.6M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"icu","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.38,"mem_mb":11.7,"disk_size":"52.6M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.6,"import_time_s":0.33,"mem_mb":11.7,"disk_size":"53M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"icu","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":2.8,"import_time_s":0.31,"mem_mb":11.7,"disk_size":"53M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.32,"mem_mb":11.7,"disk_size":"53M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"icu","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.31,"mem_mb":11.7,"disk_size":"53M"}]},"quickstart_checks":{"last_tested":"2026-04-24","tag":"stale","tag_description":"widespread failures or data too old to trust","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":1}]}}