質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.45%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

443閲覧

PythonにてAPIの結果をDataframeに入れて、csvファイルとMergeして列を追加したいが、できない

msy47

総合スコア26

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2023/02/17 08:27

編集2023/02/18 23:03

実現したいこと

/dataservice/deviceで返る「deviceId」をもとに

  • /dataservice/device/ip/nat/translationを実行し返ったJsonの[data]数をカウント結果の列を追加している
  • 更に、「device-model」をもとにdevice_info.csvの「device-model 」とMergeして「NatSessionMax」の列を付与したい、
  • 更に、datatimeも付与している。

/dataservice/device結果

API_result

1deviceId, system-ip, host-name, device-model, ・・・ 210.11.11.11 10.11.11.11 ABC-host ABC-device ・・・ 310.12.12.12 10.12.12.12 DEF-host DEF-device ・・・ 410.12.12.12 10.13.13.13 GHI-host GHI-device ・・・

device_info.csvの中身
(device-modelに対する、NatSessionMax値の一覧)

device_info.csv

1device-model ,NatSessionMax 2ABC-device 11111 3DEF-device 22222 4GHI-device 33333

現在の出力結果
※NatSessionが出力されていない

Result_failed

1deviceId, system-ip, host-name, device-model, ・・・, dt, ,NatCount 210.11.11.11 10.11.11.11 ABC-host ABC-device ・・・ 2023/1/1 01:01:01 123 310.12.12.12 10.12.12.12 DEF-host DEF-device ・・・ 2023/1/1 01:01:01 456 410.12.12.12 10.13.13.13 GHI-host GHI-device ・・・ 2023/1/1 01:01:01 789

想定・出力したい結果
datetime(dt)、NatCount、NatSessionMax列が追加されている

Result_failed

1deviceId, system-ip, host-name, device-model, ・・・, dt, ,NatCount ,NatSessionMax 210.11.11.11 10.11.11.11 ABC-host ABC-device ・・・ 2023/1/1 01:01:01 123 11111 310.12.12.12 10.12.12.12 DEF-host DEF-device ・・・ 2023/1/1 01:01:01 456 22222 410.12.12.12 10.13.13.13 GHI-host GHI-device ・・・ 2023/1/1 01:01:01 789 33333

発生している問題・

ここに質問の内容を詳しく書いてください。
/dataservice/device/ip/nat/translationを実行し返ったJsonの[data]数をカウント結果の列と
datetime(dt)列を追加できているが、更に次の列を追加したい、ロジックは入っているが

  • 「deviceId」をもとにdevice_info.csvの「device-model 」とMergeして「NatSessionMax」の列も付与したい、

「NatSessionMax」が追加されていない、追加箇所も問題なのかロジックの問題なのかご指摘・支援をお願いしたく。

該当のソースコード

Python

1import json 2import boto3 3import csv 4import numpy as np 5import pandas as pd 6import requests 7import os 8import urllib3 9import pandas as pd 10from io import StringIO 11from datetime import datetime 12 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 19 vmanage_info = "tmp/vmanage_info.csv" 20 bucket.download_file(os.environ.get(`CSV_VMANAGE_INFO`), vmanage_info) 21 vmanage_info_df = pd.read.csv(vmanage_info) 22 23 device_info = "/tmp/device_info.csv" 24 bucket.download_file(os.environ.get(`CSV_DEVICE_INFO`), device_info) 25 device_info_df = pd.read.csv(device_info) 26 27 ipsec_tunnel_df = get_request(vmanage_info_df) 28 29 merge_key = ['device-model'] 30 df = pd.merge(ipsec_tunnel_df, device_info_df, how='right', on=merge_key) 31 32 tmp_csv = "/tmp/NatSession.csv" 33 ipsec_tunnel_df.to_csv(tmp_csv, encoding='utf-8', index=False) 34 35 s3 = boto3.resource('s3') 36 s3.meta.client.upload_file(tmp_csv 'utlink-vmanage-bucket', 'csv/NatSession.csv') 37 38 39def get_request(vmanage_info_df): 40 api_datalist = [] 41 for row in vmanage_info_df.itertuples(): 42 vmanage_host = row[1] 43 vmanage_port = row[2] 44 vmanage_username = row[3] 45 vmanage_password = row[4] 46 47 base_url = `https://%s:%s`%(vmanage_host, vmanage_port) 48 49 login_action = `/j_security_check` 50 51 login_data = {`j_username` : vmanage_username, `j_password` : vmanage_password} 52 53 login_url = base_url + login_action 54 55 session = requests.session() 56 57 login_response = session.post(url=login_url, data=login_data, verify=False) 58 if b`<html>` in login_response.content: 59 print("Login token Failed") 60 exit(1) 61 62 xsrf_token_url = base_url + '/dataservice/client/token' 63 64 login_token = session.get(url=xsrf_token_url, verify=False) 65 if login_token.status_code = 200: 66 if b`<html>` in login_token.content: 67 print("Login token Failed") 68 exit(1) 69 70 session.headers[`X-XSRF-TOKEN`] = login_token.content 71 72 73 device_url = base_url + `/dataservice/device` 74 75 device_list = session.get(url=device_url, verify=False) 76 if device_list.status_code = 200: 77 json_data = vdevice_list.json() 78 else: 79 print (device_list.status_code) 80 81 df = pd.json_normalize(json_data["data"] 82 df = df[(df["device-type"] == "vedge") & (df["reachability"] == "reachable")] 83 84 df = df[["deviceId", "system-ip", "host-name", "device-model"]] 85 86 #時刻列の追加 87 df['df'] = datetime.now(),strftime('%Y%m%d% %H:%M:%S') 88 c = df.pop('dt') 89 df.insert(df.shape[1], c.name, c) 90 91 #nat/translationのdataをカウントし、列の追加 92 lens = [] 93 for data in df.intretuples(): 94 deviceid = data[1] 95 nat_translation_url = base_url + '/dataservice/device/ip/nat/translation?deviceId=' + deviceid 96 nat_translation_list = session.get(url=nat_translation_url, verify=False) 97 if nat_translation_list.status_code == 200: 98 json_data = nat_translation_list.json() 99 else: 100 print (nat_translation_list.status_code) 101 102 df_len = pd.json_normalize(json_data["data"]) 103 104 len_df = len(df_len) 105 lens.append(len_df) 106 107 df['Tunnel_Count'] = lens 108 print(df) 109 110 return df

試したこと

merge_keyの位置を変更したりしていますが
結果は変わらず(「NatSessionMax」列が表示さない)
別途、1からソースを書き直すかどうかも並行して検討中。

merge_key = ['device-model'] df = pd.merge(ipsec_tunnel_df, device_info_df, how='right', on=merge_key)

補足情報(FW/ツールのバージョンなど)

Python3.9

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bashi

2023/02/18 17:10

lambda_handler内でmergeした結果はdfに入れてますが出力しているのはipsec_tunnel_dfです NatSessionがないというのはdfをどこかで出力してみたということですか?
msy47

2023/02/19 00:52

bashiさん コメントありがとうございます。 >lambda_handler内でmergeした結果はdfに入れてますが出力しているのはipsec_tunnel_dfです 39 def get_request(vmanage_info_df): dfはこちらのget_requestにすべて入るという理解です。 >NatSessionがないというのはdfをどこかで出力してみたということですか? 110 print(df) こちらの結果、およびNatSession.csvの結果になります。
bashi

2023/02/19 06:02

27行目でリクエスト結果を取得して、device_infoとのマージ処理は30行目なので get_request内の108のprint(df)の時点ではまだmergeされてないから出ないのでは NatSession.csvの方はマージした結果でなく、マージ前のipsec_tunnel_dfを出力してる(33行目)ので ipsec_tunnel_dfでなく、dfを出力したらいいんじゃないでしょうか?
msy47

2023/02/19 20:52

33> ipsec_tunnel_df.to_csv(tmp_csv, encoding='utf-8', index=False) 修正以下 ipsec_tunnel_df.to_csvをdf.to_csvへ変更 33> #ipsec_tunnel_df.to_csv(tmp_csv, encoding='utf-8', index=False) 34> df.to_csv(tmp_csv, encoding='utf-8', index=False) bashiさんありがとうございます!解決できました!
guest

回答1

0

自己解決

33> ipsec_tunnel_df.to_csv(tmp_csv, encoding='utf-8', index=False)

修正以下
ipsec_tunnel_df.to_csvをdf.to_csvへ変更
33> #ipsec_tunnel_df.to_csv(tmp_csv, encoding='utf-8', index=False)
34> df.to_csv(tmp_csv, encoding='utf-8', index=False)

bashiさんありがとうございます!

投稿2023/02/19 20:53

msy47

総合スコア26

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.45%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問