将pandas dataframes加载到QUESTDB
#教程 #python #pandas #questdb

通过使用QuestDB Python软件包来摄取Pandas DataFrames。

,了解如何提高时间序列分析功能

介绍

pandas是Python的开源数据分析和数据操纵库,已成为数据科学家和分析师的重要工具。它提供了一种操纵数据的简单和直观的方式,使其成为数据分析任务的流行选择。但是,尽管Pandas非常适合中小型数据集,但它可能与超过其运行机器可用内存的大型数据集斗争。这是QuestDB擅长在这种情况下专门为高性能操作而设计的Queacs的地方,使其成为要求数据分析任务的首选解决方案。通过将PANDAS数据范围加载到QuestDB中,我们可以利用数据库的powerful data processing capabilities,从而使您可以将分析和数据操作操作扩展到大型数据集。我们将学习如何将大型熊猫数据框加载到QUESTDB中。我们使用纽约市出租车和豪华轿车委员会发布的黄色和绿色出租车记录作为我们的数据来源。

在本教程中,我们将学习如何将大型熊猫数据框加载到QuestDB中。我们使用纽约市出租车和豪华轿车委员会发布的黄色和绿色出租车记录作为我们的数据来源。

先决条件

对于本教程,建议对Python和SQL有基本的了解。另外,您需要在计算机上安装以下内容:

  • docker

将数据摄取

在开始将数据加载到QuestDB之前,我们需要获取将要使用的数据。如上所述,我们将使用NYC TLC的黄色和绿色出租车旅行记录。让我们下载数据:

  1. 创建一个名为pandas-to-questdbdata目录的新目录。
  2. 编辑并在您的终端中执行以下命令以下载镶木木文件:
curl -L -o ./data/yellow_tripdata_2022-<MONTH>.parquet https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2022-<MONTH>.parquet

请确保您要下载的零装置替换<MONTH>(01至11之间,在写作时不可用第12个月)。

现在,我们有数据摄入。现在是时候尝试使用Pandas加载它了。

将记录加载到内存中

您可能已经注意到下载的文件以镶木格式为单位。 Parquet是一种通常用于大数据处理的柱状存储格式。与传统的基于行的存储格式(如CSV和JSON)相比

在能够加载任何数据之前,我们将设置模拟生产环境,在该环境中,如果Pandas无法将Parquet文件加载到内存中,我们可以轻松地测试发生的情况。在生产中,我们经常遇到必须应对内存约束的情况,并且这种环境可以反映这一点。

运行以下命令,以创建一个具有1GIB内存限制的新Docker容器。如果容器达到该限制,则Docker会杀死它,或者操作系统将杀死我们正在运行的过程。

docker run -it -m 1g -v "$(pwd)":/tutorial -w /tutorial --net host python:3.11.1-slim-bullseye /bin/bash

是的,我们有一个基于Ubuntu的Python 3.11 Docker容器。让我们安装我们的要求。创建一个带有以下内容的requirements.txt文件:

pandas>=1.5.3
psycopg[binary]>=3.1.8
pyarrow>=11.0.0
questdb>=1.1.0

现在,在容器中执行pip install -r requirements.txt。 PIP将安装Python要求。

在这一点上,我们有一个可以加载数据的测试环境。创建一个名为data_loader.py的新文件,具有以下内容:

# data_loader.py

import pandas as pd

df = pd.read_parquet("./data/yellow_tripdata_2022-01.parquet")
print(df.head())

现在,通过运行python data_loader.py在Docker容器中执行它。该程序成功运行,我们应该看到以下内容:

A screenshot of the result of running data_loader.py: an overview of the data loaded

我们刚刚在1月2022年加载了出租车旅行记录!让我们尝试加载更多数据。由以下代码替换data_loader.py的内容,以加载数据目录中的所有文件并再次执行程序:

# data_loader.py

import os
import glob
import pandas as pd

records = glob.glob(os.path.join("data", "*.parquet"))

df = pd.concat((pd.read_parquet(r) for r in records), ignore_index=True)

print(df.head())

执行data_loader.py时,您应该收到一个错误消息:杀死。您可能会认为,OOM杀手终止了该过程。我们无法加载数据集,因此我们无法处理。我们需要一种不同的方法。

摄入QuestDB

在新的终端窗口中,通过执行:
启动QUESTDB容器

docker run --rm -it -p 8812:8812 -p 9009:9009 --net host --name questdb questdb/questdb

数据库现在准备接收数据。使用QUESTDB软件包将data_loader.py更新到QUESTDB,该QUESTDB软件包在TCP上使用InfluxDB Line Protocol (ILP)进行最大的吞吐量。

要处理大型数据集,我们将一一读取文件并将其内容传输到QuestDB。然后,我们将使用QuestDB查询数据并将结果加载回PANDAS数据范围。基于上述重构数据加载器:

# data_loader.py

import os
import glob
import pandas as pd
from questdb.ingress import Sender

def main():
   files = glob.glob(os.path.join("data", "*.parquet"))

   with Sender("127.0.0.1", 9009) as sender:
       for file in files:
           df = pd.read_parquet(file)
           print(f"ingesting {len(df.index)} rows from {file}")
           sender.dataframe(df, table_name="trips", at="tpep_pickup_datetime")

if __name__ == "__main__":
   main()

让我们从头开始。您会注意到的第一个主要更改是,我们需要在脚本中指定主机名和端口号以运行它。

然后,我们迭代镶木quet文件,然后使用熊猫将它们加载到存储器中。之后,利用QuestDB的Python客户端,我们直接从Pandas DataFrames摄入QuestDB。

在Python容器中,运行python data_loader.py。该脚本一次会摄入一个镶木quet文件。

使用旅行数据

到目前为止,我们已经准备好数据集并将其加载到QUESTDB中。是时候执行一些查询并将结果加载到数据范围内了。使用整个数据集,我们想知道乘客分组的乘客支付的平均总金额是多少。

创建一个新文件,称为query_amount.py,具有以下内容:

# query_amount.py

import pandas as pd
import psycopg

QUERY = """
SELECT passenger_count, avg(total_amount)
   FROM 'trips'
   WHERE passenger_count > 0
   GROUP BY passenger_count
"""

if __name__ == "__main__":
   conn = psycopg.connect(
       dbname="questdb",
       host="127.0.0.1",
       user="admin",
       password="quest",
       port=8812,
   )

   df = pd.read_sql_query(QUERY, conn)

   print(df.head(10))

与数据加载程序脚本类似,此脚本也需要主机和端口。

在上面的脚本中,我们使用PostgreSQL Python客户端并使用该客户端连接到QUESTDB。在Python容器中,执行Python query_amount.py

A screenshot of the result of running query_amount.py: an overview of the query result

脚本完成后,您应该看到乘客的平均总金额。有趣的是,乘客数量6和7之间的平均值有很大的差异,7位乘客的平均值接近2.5倍,而6个。

通过进一步分析数据,可能会发现可能的根本原因增加了,但它可能与人性绑定:如果我们要进行更长的旅行,我们喜欢分享乘车成本。

概括

在本教程中,我们学习了如何使用pandas dataframes将大型数据集加载到QUESTDB中。通过将数据从熊猫传输到QuestDB,我们利用了数据库功能强大的数据处理功能,使我们能够扩展分析和数据操作操作以处理大型数据集。

本教程中概述的方法只是使用pandas和QuestDB使用大数据的一种方法。您可以自定义此方法以满足您的特定需求,并继续探索这些强大工具的可能性。最终目标是使数据分析和操纵更加容易,更高效,无论数据集的大小如何。