前提
LambdaにてPythonを使用しvmanageへAPIを利用して
結果を取得し、取得したデータの加工を想定しています。
その際、APIで受信した結果をカウントし、再度データ構造化し
csvに変換しようと考えております。
その際結果がjsonが返ってくるため
内部の要素をカウントしたのち、最初のAPI結果と
リストとカウントを一覧化したいと考えております。
その際カウントとリストをどのように一覧化するか
どのようにコードを書いてよいかわからず。
ご助言をいただきたくおもいます。
実現したいこと
ここに実現したいことを箇条書きで書いてください。
- 最初に実行したAPIリストと、pd.json_normalizeでカウントした結果を一覧化したい
ソース
#df①
print(df)
deviceId system-ip bfdSessionsUP bfdSessions
10.0.0.1 10.1.0.1 7.0 7
10.0.0.2 10.2.0.2 8.0 8
#df②
print(df)
inside-local-addr vrf-name ・・・ application-type inside-global-addr
10.9.0.1 -gloal- ・・・ 0 10.10.0.1
10.9.0.2 -gloal- ・・・ 0 10.10.0.2
[1 row x 17 columns]
2 ←#df③: print(len(df))
inside-local-addr vrf-name ・・・ application-type inside-global-addr
10.10.0.1 -gloal- ・・・ 0 10.11.0.1
10.10.0.2 -gloal- ・・・ 0 10.11.0.2
10.10.0.3 -gloal- ・・・ 0 10.11.0.3
[1 row x 17 columns]
3 ←#df③: print(len(df))
出力予定
deviceId system-ip bfdSessionsUP bfdSessions TunnnelCount(※df③の結果)
10.0.0.1 10.1.0.1 7.0 7 2
10.0.0.2 10.2.0.2 8.0 8 3
発生している問題・エラーメッセージ
melianさんの指摘により、カラムがないことが原因
"errorMessage" : "/None of [Index(["system-ip", "host-name", "device-model"], dtype = object`)] are in the [columns]/""
該当のソースコード
Lambda(Python)
1 2 3import json 4import boto3 5import csv 6import numpy as np 7import pandas as pd 8 9import requests 10import os 11import urllib3 12from datetime import datetime 13urllib3.disable_warnings(urlib3.exceptions.InsecureRequests.InsecureRequestWarning) 14 15def lambda_handler(event, context): 16 s3 = boto3.resource(`s3`) 17 bucket_name _ os.environ.get(`S3_BUCKET`) 18 vmange_info_df = pd.read_csv(vnamage_info) 19 20 device_info = "tmp/device_info.csv" 21 bucket.download_file(os.environ.get(`CSV_DEVICE_INFO`), device_info) 22 device_info_df = pd.read.csv(device_info) 23 24 ipsec_tunnel_df = get_request(vmanage_info_df) 25 26 def get_request(vmanage_info_df): 27 api_datalist = [] 28 for row in vmanage_info_df.itertuples(): 29 vmanage_host = row[1] 30 vmanage_port = row[2] 31 vmanage_username = row[3] 32 vmanage_password = row[4] 33 34 base_url = `https://%s:%s`%(vmanage_host, vmanage_port) 35 36 login_action = `/j_security_check` 37 38 login_data = {`j_username` : vmanage_username, `j_password` : vmanage_password} 39 40 login_url = base_url + login_action 41 42 session = requests.session() 43 44 login_response = session.post(url=login_url, data=login_data, verify=False) 45 if login_token.status_code = 200: 46 if b`<html>` in login_token.content: 47 print("Login token Failed") 48 exit(1) 49 50 session.headers[`X-XSRF-TOKEN`] = login_token.content 51 52 53 device_url = base_url + `/dataservice/device` 54 55 df = pd.json_normalize(json_data["data"]) 56 df = df[(df["device-type"] == "vedge") & (df["reachability"] == "reachable")] 57 58#df① 59print(df) 60 61 for data in df.itertuples() 62 deviceid = data[1] 63 nat_translation_url = base_url + `/dataservice/devie/ip/nat/translation?deviceId=` + deviceid 64 nat_translation_list = sessin.get(url=nat_translation_url, verify=False) 65 if nat_translation_list.status_code == 200: 66 json_data = nat_translation_list.json = () 67 else: 68 print(nat_translation_list.status_code) 69 70 df = pd.json_normalize(json_data["data"] 71 #df② 72 print(df) 73 74 #df③ 75 print(len(df)) 76 77 #一時的にコメントアウト:indexは存在しない 78 #df = df[["system-ip", "host-name", "device-model"]] 79 #df[Tunnel Count] = len(df) 80 #c = df.pop(Tunnel Count) 81 #df.insert(df.shape[1], c.name, c)
試したこと
1回目のAPI結果一覧と、2回目の結果をカウントした結果を一覧化しようと試みた
指摘によろ「print(df.columns)」を確認indexの項目がないことが原因
df = df[["system-ip", "host-name", "device-model"]]
df[Tunnel Count] = len(df)
c = df.pop(Tunnel Count)
df.insert(df.shape[1], c.name, c)
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー