> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-detect-table-modification.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 如何查询远程 ClickHouse 服务器

> 在本指南中，我们将学习如何通过 chDB 查询远程 ClickHouse 服务器。

在本指南中，我们将学习如何通过 chDB 查询远程 ClickHouse 服务器。

<div id="setup">
  ## 环境准备
</div>

先创建一个虚拟环境：

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

现在我们来安装 chDB。
请确保版本为 2.0.2 或更高：

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

现在，我们来安装 pandas 和 ipython：

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

我们将使用 `ipython` 来运行本指南其余部分中的命令，你可以通过运行以下命令启动它：

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

你也可以在 Python 脚本中，或在你常用的 notebook 中使用这段代码。

<div id="an-intro-to-clickpy">
  ## ClickPy 简介
</div>

我们要查询的远程 ClickHouse 服务器是 [ClickPy](https://clickpy.clickhouse.com)。
ClickPy 会记录所有 PyPI 软件包的下载情况，并让你通过 UI 查看各软件包的统计数据。
其底层数据库可使用 `play` 用户进行查询。

你可以在 [其 GitHub 代码仓库](https://github.com/ClickHouse/clickpy) 中了解有关 ClickPy 的更多信息。

<div id="querying-the-clickpy-clickhouse-service">
  ## 查询 ClickPy ClickHouse 服务
</div>

先导入 chDB：

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

我们将使用 `remoteSecure` 函数查询 ClickPy。
该函数至少需要提供主机名、表名和用户名。

我们可以编写以下查询，将 [`openai` package](https://clickpy.clickhouse.com/dashboard/openai) 的每日下载次数作为 Pandas DataFrame 返回：

```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
```

现在我们用同样的方法来获取 [`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">
  ## 合并 Pandas DataFrame
</div>

现在我们有两个 DataFrame，可以像下面这样按日期 (即 `x` 列) 将它们合并：

```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
```

然后，我们可以像下面这样计算 Open AI 下载量与 `scikit-learn` 下载量之比：

```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">
  ## 查询 Pandas DataFrames
</div>

接下来，假设我们想找出比率最高和最低时对应的日期。
我们可以回到 chDB 来计算这些值：

```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
```

如果你想进一步了解如何查询 Pandas DataFrames，请参阅 [Pandas DataFrames 开发者指南](/zh/products/chdb/guides/querying-pandas)。
