> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Cookbook do Pandas

> Padrões comuns do pandas e seus equivalentes no DataStore

Padrões comuns do pandas e seus equivalentes no DataStore. A maior parte do código funciona sem alterações!

<div id="loading">
  ## Carregamento de dados
</div>

<div id="read-csv">
  ### Ler CSV
</div>

```python theme={null}
# Pandas
import pandas as pd
df = pd.read_csv("data.csv")

# DataStore - igual!
from chdb import datastore as pd
df = pd.read_csv("data.csv")
```

<div id="read-multiple-files">
  ### Ler vários arquivos
</div>

```python theme={null}
# Pandas
import glob
dfs = [pd.read_csv(f) for f in glob.glob("data/*.csv")]
df = pd.concat(dfs)

# DataStore - mais eficiente ao usar padrão glob
df = pd.read_csv("data/*.csv")
```

***

<div id="filtering">
  ## Filtragem
</div>

<div id="single-condition">
  ### Uma única condição
</div>

```python theme={null}
# Pandas e DataStore — idênticos
df[df['age'] > 25]
df[df['city'] == 'NYC']
df[df['name'].str.contains('John')]
```

<div id="multiple-conditions">
  ### Múltiplas condições
</div>

```python theme={null}
# E
df[(df['age'] > 25) & (df['city'] == 'NYC')]

# OU
df[(df['age'] < 18) | (df['age'] > 65)]

# NÃO
df[~(df['status'] == 'inactive')]
```

<div id="using-query">
  ### Usando query()
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df.query('age > 25 and city == "NYC"')
df.query('salary > 50000')
```

<div id="isin">
  ### isin()
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df[df['city'].isin(['NYC', 'LA', 'SF'])]
```

<div id="between">
  ### between()
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df[df['age'].between(18, 65)]
```

***

<div id="selecting">
  ## Selecionando colunas
</div>

<div id="single-column-select">
  ### Uma coluna
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df['name']
df.name  # acesso por atributo
```

<div id="multiple-columns-select">
  ### Várias colunas
</div>

```python theme={null}
# Pandas e DataStore - iguais
df[['name', 'age', 'city']]
```

<div id="select-and-filter">
  ### Selecionar e filtrar
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df[df['age'] > 25][['name', 'salary']]

# DataStore também suporta estilo SQL
df.filter(df['age'] > 25).select('name', 'salary')
```

***

<div id="sorting">
  ## Ordenação
</div>

<div id="single-column-select">
  ### Uma coluna
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df.sort_values('salary')
df.sort_values('salary', ascending=False)
```

<div id="multiple-columns-sort">
  ### Múltiplas colunas
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df.sort_values(['city', 'salary'], ascending=[True, False])
```

<div id="get-top-bottom-n">
  ### Obter os N maiores e menores
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df.nlargest(10, 'salary')
df.nsmallest(5, 'age')
```

***

<div id="groupby">
  ## GroupBy e agregação
</div>

<div id="simple-groupby">
  ### GroupBy simples
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df.groupby('city')['salary'].mean()
df.groupby('city')['salary'].sum()
df.groupby('city').size()  # contagem
```

<div id="multiple-aggregations">
  ### Agregações múltiplas
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df.groupby('city')['salary'].agg(['sum', 'mean', 'count'])

df.groupby('city').agg({
    'salary': ['sum', 'mean'],
    'age': ['min', 'max']
})
```

<div id="named-aggregations">
  ### Agregações nomeadas
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df.groupby('city').agg(
    total_salary=('salary', 'sum'),
    avg_salary=('salary', 'mean'),
    employee_count=('id', 'count')
)
```

<div id="multiple-groupby-keys">
  ### Múltiplas chaves de GroupBy
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df.groupby(['city', 'department'])['salary'].mean()
```

***

<div id="joining">
  ## Junção de dados
</div>

<div id="inner-join">
  ### Inner junção
</div>

```python theme={null}
# Pandas
pd.merge(df1, df2, on='id')

# DataStore - mesma API
pd.merge(df1, df2, on='id')

# DataStore também suporta
df1.join(df2, on='id')
```

<div id="left-join">
  ### Left junção
</div>

```python theme={null}
# Pandas e DataStore - idênticos
pd.merge(df1, df2, on='id', how='left')
```

<div id="join-on-different-columns">
  ### Junção por colunas diferentes
</div>

```python theme={null}
# Pandas e DataStore - idênticos
pd.merge(df1, df2, left_on='emp_id', right_on='id')
```

<div id="concat">
  ### Concat
</div>

```python theme={null}
# Pandas e DataStore - idênticos
pd.concat([df1, df2, df3])
pd.concat([df1, df2], axis=1)
```

***

<div id="string">
  ## Operações com String
</div>

<div id="case-conversion">
  ### Conversão entre maiúsculas e minúsculas
</div>

```python theme={null}
# Pandas e DataStore — idênticos
df['name'].str.upper()
df['name'].str.lower()
df['name'].str.title()
```

<div id="substring">
  ### Substring
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df['name'].str[:3]        # Primeiros 3 caracteres
df['name'].str.slice(0, 3)
```

<div id="search">
  ### Busca
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df['name'].str.contains('John')
df['name'].str.startswith('A')
df['name'].str.endswith('son')
```

<div id="replace">
  ### Replace
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df['text'].str.replace('old', 'new')
df['text'].str.replace(r'\d+', '', regex=True)  # Remove dígitos
```

<div id="split">
  ### Separar
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df['name'].str.split(' ')
df['name'].str.split(' ', expand=True)
```

<div id="length">
  ### Duração
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df['name'].str.len()
```

***

<div id="datetime">
  ## Operações com DateTime
</div>

<div id="extract-components">
  ### Extrair componentes
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df['date'].dt.year
df['date'].dt.month
df['date'].dt.day
df['date'].dt.dayofweek
df['date'].dt.hour
```

<div id="formatting">
  ### Formatação
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df['date'].dt.strftime('%Y-%m-%d')
```

***

<div id="missing">
  ## Dados ausentes
</div>

<div id="check-missing">
  ### Verificar valores ausentes
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df['col'].isna()
df['col'].notna()
df.isna().sum()
```

<div id="drop-missing">
  ### Remover valores ausentes
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df.dropna()
df.dropna(subset=['col1', 'col2'])
```

<div id="fill-missing">
  ### Preencher valores ausentes
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df.fillna(0)
df.fillna({'col1': 0, 'col2': 'Unknown'})
df.fillna(method='ffill')
```

***

<div id="new-columns">
  ## Criar novas colunas
</div>

<div id="simple-assignment">
  ### Atribuição simples
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df['total'] = df['price'] * df['quantity']
df['age_group'] = df['age'] // 10 * 10
```

<div id="using-assign">
  ### Usando assign()
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df = df.assign(
    total=df['price'] * df['quantity'],
    is_adult=df['age'] >= 18
)
```

<div id="conditional-where-mask">
  ### Condicional (where/mask)
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df['status'] = df['age'].where(df['age'] >= 18, 'minor')
```

<div id="apply-for-custom-logic">
  ### apply() para lógica personalizada
</div>

```python theme={null}
# Funciona, mas aciona a execução do pandas
df['category'] = df['amount'].apply(lambda x: 'high' if x > 1000 else 'low')

# Alternativa com DataStore (permanece lazy)
df['category'] = (
    df.when(df['amount'] > 1000, 'high')
      .otherwise('low')
)
```

***

<div id="reshaping">
  ## Reformatação
</div>

<div id="pivot-table">
  ### Tabela dinâmica
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df.pivot_table(
    values='amount',
    index='region',
    columns='product',
    aggfunc='sum'
)
```

<div id="melt-unpivot">
  ### Melt (Unpivot)
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df.melt(
    id_vars=['name'],
    value_vars=['score1', 'score2', 'score3'],
    var_name='test',
    value_name='score'
)
```

<div id="explode">
  ### Explode
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df.explode('tags')  # Expandir coluna de array
```

***

<div id="window">
  ## Funções de janela
</div>

<div id="rolling">
  ### Deslizante
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df['rolling_avg'] = df['price'].rolling(window=7).mean()
df['rolling_sum'] = df['amount'].rolling(window=30).sum()
```

<div id="expanding">
  ### Expansiva
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df['cumsum'] = df['amount'].expanding().sum()
df['cummax'] = df['amount'].expanding().max()
```

<div id="shift">
  ### Shift
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df['prev_value'] = df['value'].shift(1)   # Defasagem
df['next_value'] = df['value'].shift(-1)  # Adiantamento
```

<div id="diff">
  ### Diff
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df['change'] = df['value'].diff()
df['pct_change'] = df['value'].pct_change()
```

***

<div id="output">
  ## Saída
</div>

<div id="to-csv">
  ### Para CSV
</div>

```python theme={null}
# Pandas e DataStore - idênticos
df.to_csv("output.csv", index=False)
```

<div id="to-parquet">
  ### Em Parquet
</div>

```python theme={null}
# Pandas e DataStore - iguais
df.to_parquet("output.parquet")
```

<div id="to-pandas-dataframe">
  ### Para um DataFrame do pandas
</div>

```python theme={null}
# Específico do DataStore
pandas_df = ds.to_df()
pandas_df = ds.to_pandas()
```

***

<div id="extras">
  ## Recursos extras do DataStore
</div>

<div id="view-sql">
  ### Ver SQL
</div>

```python theme={null}
# Somente DataStore
print(ds.to_sql())
```

<div id="explain-plan">
  ### Plano de execução
</div>

```python theme={null}
# Apenas DataStore
ds.explain()
```

<div id="clickhouse-functions">
  ### Funções do ClickHouse
</div>

```python theme={null}
# Apenas no DataStore - acessores extras
df['domain'] = df['url'].url.domain()
df['json_value'] = df['data'].json.get_string('key')
df['ip_valid'] = df['ip'].ip.is_ipv4_string()
```

<div id="universal-uri">
  ### URI universal
</div>

```python theme={null}
# Apenas DataStore - leitura de qualquer lugar
ds = DataStore.uri("s3://bucket/data.parquet")
ds = DataStore.uri("mysql://user:pass@host/db/table")
```
