> ## 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.

# Como consultar um servidor ClickHouse remoto

> Neste guia, aprenderemos como consultar um servidor ClickHouse remoto com o chDB.

Neste guia, vamos aprender como consultar um servidor ClickHouse remoto com o chDB.

<div id="setup">
  ## Configuração
</div>

Primeiro, vamos criar um ambiente virtual:

```bash theme={null}
python -m venv .venv
source .venv/bin/activate
```

E agora vamos instalar o chDB.
Certifique-se de que você tenha a versão 2.0.2 ou superior:

```bash theme={null}
pip install "chdb>=2.0.2"
```

Agora vamos instalar pandas e ipython:

```bash theme={null}
pip install pandas ipython
```

Vamos usar `ipython` para executar os comandos no restante do guia, que você pode iniciar executando:

```bash theme={null}
ipython
```

Você também pode usar o código em um script em Python ou no seu notebook favorito.

<div id="an-intro-to-clickpy">
  ## Uma introdução ao ClickPy
</div>

O servidor remoto do ClickHouse que vamos consultar é o [ClickPy](https://clickpy.clickhouse.com).
O ClickPy rastreia todos os downloads de pacotes do PyPI e permite explorar as estatísticas dos pacotes por meio de uma UI.
O banco de dados subjacente pode ser consultado usando o usuário `play`.

Você pode saber mais sobre o ClickPy em [seu repositório no GitHub](https://github.com/ClickHouse/clickpy).

<div id="querying-the-clickpy-clickhouse-service">
  ## Consultando o serviço ClickHouse do ClickPy
</div>

Vamos importar chDB:

```python theme={null}
import chdb
```

Vamos consultar o ClickPy usando a função `remoteSecure`.
Essa função recebe, no mínimo, o nome do host, o nome da tabela e o nome de usuário.

Podemos escrever a seguinte consulta para retornar o número de downloads por dia do pacote [`openai`](https://clickpy.clickhouse.com/dashboard/openai) como um DataFrame do pandas:

```python theme={null}
query = """
SELECT
    toStartOfDay(date)::Date32 AS x,
    sum(count) AS y
FROM remoteSecure(
  'clickpy-clickhouse.clickhouse.com', 
  'pypi.pypi_downloads_per_day', 
  'play'
)
WHERE project = 'openai'
GROUP BY x
ORDER BY x ASC
"""

openai_df = chdb.query(query, "DataFrame")
openai_df.sort_values(by=["x"], ascending=False).head(n=10)
```

```text theme={null}
               x        y
2392  2024-10-02  1793502
2391  2024-10-01  1924901
2390  2024-09-30  1749045
2389  2024-09-29  1177131
2388  2024-09-28  1157323
2387  2024-09-27  1688094
2386  2024-09-26  1862712
2385  2024-09-25  2032923
2384  2024-09-24  1901965
2383  2024-09-23  1777554
```

Agora, vamos fazer o mesmo para obter os downloads de [`scikit-learn`](https://clickpy.clickhouse.com/dashboard/scikit-learn):

```python theme={null}
query = """
SELECT
    toStartOfDay(date)::Date32 AS x,
    sum(count) AS y
FROM remoteSecure(
  'clickpy-clickhouse.clickhouse.com', 
  'pypi.pypi_downloads_per_day', 
  'play'
)
WHERE project = 'scikit-learn'
GROUP BY x
ORDER BY x ASC
"""

sklearn_df = chdb.query(query, "DataFrame")
sklearn_df.sort_values(by=["x"], ascending=False).head(n=10)
```

```text theme={null}
               x        y
2392  2024-10-02  1793502
2391  2024-10-01  1924901
2390  2024-09-30  1749045
2389  2024-09-29  1177131
2388  2024-09-28  1157323
2387  2024-09-27  1688094
2386  2024-09-26  1862712
2385  2024-09-25  2032923
2384  2024-09-24  1901965
2383  2024-09-23  1777554
```

<div id="merging-pandas-dataframes">
  ## Mesclando DataFrames do Pandas
</div>

Agora temos dois DataFrames, que podemos combinar com base na data (que é a coluna `x`), desta forma:

```python theme={null}
df = openai_df.merge(
  sklearn_df, 
  on="x", 
  suffixes=("_openai", "_sklearn")
)
df.head(n=5)
```

```text theme={null}
            x  y_openai  y_sklearn
0  2018-02-26        83      33971
1  2018-02-27        31      25211
2  2018-02-28         8      26023
3  2018-03-01         8      20912
4  2018-03-02         5      23842
```

Podemos então calcular a razão entre os downloads do Open AI e os do `scikit-learn` desta forma:

```python theme={null}
df['ratio'] = df['y_openai'] / df['y_sklearn']
df.head(n=5)
```

```text theme={null}
            x  y_openai  y_sklearn     ratio
0  2018-02-26        83      33971  0.002443
1  2018-02-27        31      25211  0.001230
2  2018-02-28         8      26023  0.000307
3  2018-03-01         8      20912  0.000383
4  2018-03-02         5      23842  0.000210
```

<div id="querying-pandas-dataframes">
  ## Consultando DataFrames do pandas
</div>

Em seguida, digamos que queremos encontrar as datas com a melhor e a pior razão.
Podemos voltar ao chDB e calcular esses valores:

```python theme={null}
chdb.query("""
SELECT max(ratio) AS bestRatio,
       argMax(x, ratio) AS bestDate,
       min(ratio) AS worstRatio,
       argMin(x, ratio) AS worstDate
FROM Python(df)
""", "DataFrame")
```

```text theme={null}
   bestRatio    bestDate  worstRatio   worstDate
0   0.693855  2024-09-19    0.000003  2020-02-09
```

Se quiser saber mais sobre como consultar DataFrames do pandas, consulte o [guia do desenvolvedor sobre como consultar DataFrames do pandas](/docs/pt-BR/chdb/guides/querying-pandas).
