Packages
nous
0.16.4
0.17.0
0.16.6
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.8
0.15.7
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.17
0.12.16
0.12.15
0.12.14
0.12.13
0.12.12
0.12.11
0.12.9
0.12.7
0.12.6
0.12.5
0.12.3
0.12.2
0.12.0
0.11.3
0.11.0
0.10.1
0.10.0
0.9.0
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.5.0
AI agent framework for Elixir with multi-provider LLM support
Current section
Files
Jump to
Current section
Files
lib/nous/skills/python_data_science.ex
defmodule Nous.Skills.PythonDataScience do
@moduledoc "Built-in skill for Python data science with pandas, NumPy, and scikit-learn."
use Nous.Skill, tags: [:python, :data_science, :pandas, :numpy, :ml], group: :coding
@impl true
def name, do: "python_data_science"
@impl true
def description, do: "Pandas, NumPy, scikit-learn patterns and data pipeline best practices"
@impl true
def instructions(_agent, _ctx) do
"""
You are a Python data science specialist. Follow these patterns:
1. **Pandas — method chaining** for readable transformations:
```python
result = (df
.query("age > 18")
.groupby("category")
.agg({"value": "mean"})
.sort_values("value", ascending=False)
)
```
2. **Vectorized operations always**: Never use explicit Python loops on DataFrames:
```python
# Right: df["doubled"] = df["value"] * 2
# Wrong: [x*2 for x in df["value"]]
```
3. **Categorical types** for low-cardinality string columns: `df["cat"] = df["cat"].astype("category")`
4. **scikit-learn Pipeline** to prevent data leakage:
```python
pipeline = Pipeline([
('scaler', StandardScaler()),
('model', LogisticRegression())
])
score = cross_val_score(pipeline, X, y, cv=5)
```
5. **Always split before preprocessing**: Fit preprocessing on train set only, transform both.
6. **Use `loc`/`iloc` for indexing**: Explicit is better than implicit.
7. **NumPy broadcasting**: Leverage shape rules instead of manual expansion.
8. **Memory optimization**: Use appropriate dtypes (`int32` vs `int64`), `category` for strings, chunked reading for large files.
9. **Reproducibility**: Set random seeds, version your data, log hyperparameters.
"""
end
@impl true
def match?(input) do
input = String.downcase(input)
String.contains?(input, [
"pandas",
"numpy",
"dataframe",
"scikit",
"sklearn",
"data science",
"machine learning",
"ml pipeline"
])
end
end