译者|布加迪评论家|孙书娟本教程将展示如何使用Python从OpenWeatherMapAPI获取时间序列数据,并将其转换为PandasDataFrame。接下来,我们将使用InfluxDBPythonClient将数据写入时序数据平台InfluxDB。我们会将来自API调用的JSON响应转换为PandasDataFrame,因为这是将数据写入InfluxDB的最简单方法。由于InfluxDB是一个专门构建的数据库,我们写入InfluxDB以满足时间序列数据摄取的高要求。本教程要求在通过Homebrew安装Python3的macOS系统上完成。建议安装额外的工具,例如virtualenv、pyenv或conda-env,以简化Python和Client的安装。完整的要求在这里:txtinfluxdb-client=1.30.0pandas=1.4.3requests>=2.27.1本教程还假设您已经创建了一个免费层InfluxDB云帐户或正在使用InfluxDBOSS,您还:创建了一个存储桶。您可以将存储桶视为数据库或InfluxDB中最高级别的数据组织。创建令牌。最后,本教程要求您已经使用OpenWeatherMap创建了一个帐户并创建了一个令牌。请求天气数据首先,我们需要请求数据。我们将使用请求库通过OpenWeatherMapAPI从指定的纬度和经度返回每小时的天气数据。#从OpenWeatherMapAPI中获取时间序列数据.json()hourly=r['hourly']将数据转换为PandasDataFrame接下来,将JSON数据转换为PandasDataFrame。我们还将时间戳从具有秒精度的Unix时间戳转换为日期时间对象。完成此转换是因为InfluxDB写入方法要求时间戳为datetime对象格式。接下来,我们将使用该方法向InfluxDB写入数据。我们还删除了不想写入InfluxDB的列。python#将数据转换为PandasDataFrame并将时间戳转换为日期时间objectdf=pd.json_normalize(hourly)df=df.drop(columns=['weather','pop'])df['dt']=pd.to_datetime(df['dt'],unit='s')print(df.head)将PandasDataFrame写入InfluxDB现在创建一个InfluxDBPython客户端库实例并将DataFrame写入InfluxDB。我们指定测量名称。测量包含桶中的数据。您可以将其视为仅次于存储桶的InfluxDB数据组织中的第二高层次结构。您还可以使用data_frame__tag_columns参数指定将哪些列转换为标签。由于我们没有指定任何列作为标签,我们所有的列都将转换为InfluxDB中的字段。标签用于编写有关时间序列数据的元数据,可用于更有效地查询数据子集。字段是您在InfluxDB中存储实际时间序列数据的地方。本文档(https://docs.influxdata.com/influxdb/cloud/reference/key-concepts/?utm_source=vendor&utm_medium=referral&utm_campaign=2022-07_spnsr-ctn_obtaining-storing-ts-pything_tns)更详细地描述了这些数据概念.on#将数据写入InfluxDBwithInfluxDBClient(url=url,token=token,org=org)asclient:df=dfclient.write_api(write_options=SYNCHRONOUS).write(bucket=bucket,record=df,data_frame_measurement_name="weather",data_frame_timestamp_column="dt")要查看完整脚本,请查看完整脚本。我们采取以下步骤:1.导入库。2.收集以下内容:InfluxDBbucketInfluxDBorganizationInfluxDBtokenInfluxDBURLOpenWeatherMapURLOpenWeatherMaptoken3.创建请求。4.将JSON响应转换为PandasDataFrame。5.删除任何您不想写入InfluxDB的列。6.将时间戳列从Unix时间转换为Pandas日期时间对象。7.为InfluxDBPython客户端库创建一个实例。8.编写DataFrame,指定测量名称和时间戳列。pythonimportrequestsimportinfluxdb_clientimportpandasaspdfrominfluxdb_clientimportInfluxDBClientfrominfluxdb_client.client.write_apiimportSYNCHRONOUSbucket="OpenWeather"org=""#或者你用来创建免费层InfluxDBCloudaccounttoken="url=""#例如,https://us-west-2-1.aws.cloud2.influxdata.com/openWeatherMap_token=""openWeatherMap_lat="33.44"openWeatherMap_lon="-94.04"openWeather_url="https://api.openweathermap.org/data/2.5/onecall"#从OpenWeatherMapAPI中获取时间序列数据).json()hourly=r['hourly']#将数据转换为PandasDataFrame并将时间戳转换为日期时间对象df=pd.json_normalize(hourly)df=df.drop(columns=['weather','pop'])df['dt']=pd.to_datetime(df['dt'],unit='s')print(df.head)#写入数据到InfluxDBwithInfluxDBClient(url=url,token=token,org=org)作为客户端:df=dfclient.write_api(write_options=SYNCHRONOUS).write(bucket=bucket,record=df,data_frame_measurement_name="weather",data_frame_timestamp_column="dt")查询数据现在我们已经将数据写入InfluxDB,我们可以使用InfluxDBUI通过导航到DataExplorer(从左侧导航栏)来查询数据。使用查询生成器,选择要可视化的数据和要可视化的范围,然后单击提交。图1.天气数据的默认物化视图。InfluxDB自动聚合时间序列数据,因此新用户不会意外查询过多数据导致超时专业提示:当您使用查询构建器查询数据时,InfluxDB会自动对数据进行下采样。要查询原始数据,请导航到脚本编辑器以查看底层的Flux查询。Flux是InfluxDB的原生查询和脚本语言,可用于使用您的时间序列数据分析和创建预测。使用aggregateWindow()函数取消注释或删除行以查看原始数据。图2.导航到脚本编辑器并取消注释或删除aggregateWindow()函数以查看原始天气数据结论希望本文能帮助您充分利用InfluxDBPython客户端库来获取时间序列数据并将其存储在InfluxDB中。如果您想了解更多关于使用PythonClient库从InfluxDB查询数据的信息,我建议您看一下这篇文章(https://thenewstack.io/getting-started-with-python-and-influxdb/)。另外值得一提的是,您可以使用Flux从OpenWeatherMapAPI获取数据并将其存储到InfluxDB中。如果您使用InfluxDBCloud,这意味着Flux脚本将定期托管和执行,因此您可以获得可靠的天气数据流以输入您的实例。要了解有关如何使用Flux按用户定义的时间表获取天气数据的更多信息,请阅读本文(https://www.influxdata.com/blog/tldr-influxdb-tech-tips-handling-json-objects-mapping-arrays/?utm_source=vendor&utm_medium=referral&utm_campaign=2022-07_spnsr-ctn_obtaining-storing-ts-pything_tns)。
