一个以 Python 数据为中心的框架,其目标是简化和加速 NGSI-LD 代理的开发
项目描述
平西尔德
概述
pyngsild是一个以 Python 数据为中心的框架,其目标是简化和加速NGSI-LD代理的开发。
通过提供一个干净简单的结构(将组件组织为 NGSI-LD 数据管道),该框架允许开发人员避免管道并专注于数据。
主要特征
- 依赖 pyngsild 框架的代理都有一个共同的结构
- 包括许多数据源
- 统计数据
- 监控(用于后台代理)
- 错误处理
- 日志记录
- 经过良好测试的组件
- 提供原语来构建符合 NGSI-LD 的实体(感谢ngsildclient库)
这个怎么运作
数据源
代理与其他代理的最大区别在于数据源。
不仅数据的性质不同,而且:
- 数据表示:文本,json,...
- 访问数据的方式:从文件中读取,通过网络接收,...
pyngsild提供了一个抽象级别,以便以相同的方式公开任何数据源,无论是:
- 代理使用数据源(即读取文件、请求 API)
- 代理由数据源触发(充当守护进程,监听数据源推送的传入数据)
由于数据源几乎没有共同点,框架做出的唯一假设是:pyngsild源是可迭代的。
出于说明目的,从 Source 访问的元素可以是 CSV 文件中的一行、JSON 数组中的一项或 Pandas 数据帧中的一行。
框架提供了许多通用源,并且很容易创建新源。
管道
NGSI-LD 代理通常:
- 从数据源收集数据
- 构建“规范化”的 NGSI-LD 实体(根据特定领域的 DataModel)
- 最终提供给 Context Broker
该框架允许通过提供Source、Sink和处理器功能来创建代理。
Source 从数据源收集数据。
当代理运行时,它会遍历源以收集行。
处理器函数获取一个Row并从中构建一个 NGSI-LD实体。
行是由两个属性组成的对象:记录和提供者
- 记录:任何=原始传入数据
- provider: str = 表示数据提供者的标签
最终,实体被发送到处于生产模式的Context Broker的Sink。
+-----------------------------------------------------------------------------------+
| |
| |
| +--------------+ +--------------+ |
| | | Row Entity | | |
| | Source |-------------> process() ------------->| Sink | |
| | | | | |
| +--------------+ +--------------+ |
| |
| |
+-----------------------------------------------------------------------------------+
Agent
在哪里得到它
源代码目前托管在 GitHub 上: https ://github.com/Orange-OpenSource/pyngsild
Python 包索引中提供了最新发布版本的二进制安装程序。
pip install pyngsild
安装
pyngsild需要 Python 3.10+。
应该使用虚拟环境。例如使用 pyenv。
mkdir myfiwareproject && cd myfiwareproject
pyenv virtualenv 3 .10.2 myfiwareproject
pyenv本地
pip install pyngsild
入门
创建源
例如,让我们创建一个 Source,通过 CoinGecko API 收集有关公司比特币持有量的数据。
import requests
from pyngsild import *
from ngsildclient import *
COINGECKO_BTC_CAP_ENDPOINT = "https://api.coingecko.com/api/v3/companies/public_treasury/bitcoin"
src = SourceApi(lambda: requests.get(COINGECKO_BTC_CAP_ENDPOINT), path="companies", provider="CoinGecko API")
在此处查看示例 API 结果。
提供处理器功能
您必须为框架提供一个处理器功能,该功能将用于将 Row 转换为符合 NGSI-LD 的实体。
def build_entity(row: Row) -> Entity:
record: dict = row.record
market, symbol = [x.strip() for x in record["symbol"].split(":")]
e = Entity("BitcoinCapitalization", f"{market}:{symbol}:{iso8601.utcnow()}")
e.obs()
e.prop("dataProvider", row.provider)
e.prop("companyName", record["name"])
e.prop("stockMarket", market)
e.prop("stockSymbol", symbol)
e.prop("country", record["country"])
e.prop("totalHoldings", record["total_holdings"], unitcode="BTC", observedat=Auto)
e.prop("totalValue", record["total_current_value_usd"], unitcode="USD", observedat=Auto)
return e
在此处查看使用此功能构建的示例 NGSI-LD 实体。
运行代理
让我们创建 Sink、Agent 并使所有部分协同工作。
sink = SinkNgsi() # replace by SinkStdout() if you don't have a Context Broker
agent = Agent(src, sink, process=build_entity)
agent.run()
print(agent.stats) # input=27, processed=27, output=27, filtered=0, error=0, side_entities=0
agent.close()
我们完成了!
上下文代理应该已经创建了一组实体(在撰写本文时为 27 个)。
执照
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。