見出し画像

Python学習~アウトプット編②~


はじめに

アウトプット編では、Pythonを使って様々なプログラムを作成し、論理的思考力を養いながらコーディングに慣れていくことを目指します。本記事では、特に「API操作」に焦点を当てて学習します。APIについて理解の浅い方は以下の記事を読んで頂くと本学習がより理解しやすいかと思います。

成果物について

本記事では、「指定した地域の天気、風の強さ、波の高さ、最高気温、最低気温、時間別の降水確率の情報をExcelファイルとして出力する」というプログラムを作成します。天気予報の取得に「天気予報API」を使用します。

事前準備

天気予報APIのサイトからAPIの仕様について確認をしておきましょう。
今回の要件として取得するためのパラメータやなどを確認しましょう。
一応以下に今回使用するパラメータを記載しています。

  • 天気:「telop」

  • 風の強さ:「detail」「wind」

  • 波の高さ:「detail」「wave」

  • 最高気温:「temperature」「max」

  • 最低気温:「temperature」「min」

  • 降水確率(0~6時):「chanceOfRain」「T00_06」

  • 降水確率(6~12時):「chanceOfRain」「T06_12」

  • 降水確率(12~16時):「chanceOfRain」「T12_18」

  • 降水確率(18~24時):「chanceOfRain」「T18_24」

コーディング

ここからは実際にコーディングを行います。

コーディング①

まず、APIを使用し、特定の地域の天気情報を取得します。
今回は「東京都」の天気情報を取得します。
APIの仕様として、地域の情報を「id」として管理しているため、
東京都のidを確認しています。他の地域のidについては、「weather.tsukumijima.net/primary_area.xml」からご確認ください。
以下が東京都のidになります。

<pref title="東京都">
<warn title="警報・注意報" source="http://weather.livedoor.com/forecast/rss/warn/13.xml"/>
<city title="東京" id="130010" source="http://weather.livedoor.com/forecast/rss/area/130010.xml"/>
<city title="大島" id="130020" source="http://weather.livedoor.com/forecast/rss/area/130020.xml"/>
<city title="八丈島" id="130030" source="http://weather.livedoor.com/forecast/rss/area/130030.xml"/>
<city title="父島" id="130040" source="http://weather.livedoor.com/forecast/rss/area/130040.xml"/>
</pref>

まず、HTTPリクエストを行うための「requests」ライブラリをインポートします。このライブラリを使用する事で、HTTPプロトコルを使ってウェブサーバーと通信し、データの送受信を行うことができます。

requestsライブラリを一度も使用した事がない場合は、インストールを行ってください。

pip install requests

次に、リクエストを行うurlを作成していきます。
APIの仕様にも記載のある通り、「基本URL+地域のid」の形で作成を行います。

https://weather.tsukumijima.net/api/forecast?city=地域のid

# 東京のidを指定
https://weather.tsukumijima.net/api/forecast?city=130010

東京都のidを設定した、URLを使いデータを取得します。

import requests
url = 'https://weather.tsukumijima.net/api/forecast?city=130010'
data = requests.get(url).json()

取得したデータから天気に関するデータを取出します。

weather_data = data["forecasts"]

取出したデータはリストの中に辞書型でデータをもっているで、そこから必要なデータのみを抽出します。また、今回は「東京」のデータのみでよいのでリストは先頭のみを対象にします。

tokyo_weather_data = weather_data[0]
print(f"天気:{tokyo_weather_data['telop']}")
print(f"風の強さ:{tokyo_weather_data['detail']['wind']}")
print(f"波の高さ:{tokyo_weather_data['detail']['wave']}")
print(f"最高気温:{tokyo_weather_data['temperature']['max']['celsius']}")
print(f"最低気温:{tokyo_weather_data['temperature']['min']['celsius']}")
print(f"降水確率(0~6時):{tokyo_weather_data['chanceOfRain']['T00_06']}")
print(f"降水確率(6~12時):{tokyo_weather_data['chanceOfRain']['T06_12']}")
print(f"降水確率(12~16時):{tokyo_weather_data['chanceOfRain']['T12_18']}")
print(f"降水確率(18~24時):{tokyo_weather_data['chanceOfRain']['T18_24']}")

因みに「東京」以外も対象とする場合は以下のようにして抽出が可能です。

weather_data = data["forecasts"]
for value in weather_data:
    print(f"天気:{value['telop']}")
    print(f"風の強さ:{value['detail']['wind']}")
    print(f"波の高さ:{value['detail']['wave']}")
    print(f"最高気温:{value['temperature']['max']['celsius']}")
    print(f"最低気温:{value['temperature']['min']['celsius']}")
    print(f"降水確率(0~6時):{value['chanceOfRain']['T00_06']}")
    print(f"降水確率(6~12時):{value['chanceOfRain']['T06_12']}")
    print(f"降水確率(12~16時):{value['chanceOfRain']['T12_18']}")
    print(f"降水確率(18~24時):{value['chanceOfRain']['T18_24']}")

コーディング②

次に取得したデータをExcelファイルとして出力していきましょう。
まず、Excelファイルとして出力するには、データが二次元配列でないといけないので、先ほどのコードを修正しましょう。

output_list = [["天気", "風の強さ", "波の高さ", "最高気温", "最低気温", "降水確率(0~6時)", "降水確率(6~12時)", "降水確率(12~16時)", "降水確率(18~24時)"]]
tokyo_weather_data = weather_data[0]
tmp_output_list = []
tmp_output_list.append(tokyo_weather_data['telop'])
tmp_output_list.append(tokyo_weather_data['detail']['wind'])
tmp_output_list.append(tokyo_weather_data['detail']['wave'])
tmp_output_list.append(tokyo_weather_data['temperature']['max']['celsius'])
tmp_output_list.append(tokyo_weather_data['temperature']['min']['celsius'])
tmp_output_list.append(tokyo_weather_data['chanceOfRain']['T00_06'])
tmp_output_list.append(tokyo_weather_data['chanceOfRain']['T06_12'])
tmp_output_list.append(tokyo_weather_data['chanceOfRain']['T12_18'])
tmp_output_list.append(tokyo_weather_data['chanceOfRain']['T18_24'])
output_list.append(tmp_output_list) 

まず、Excelファイルとして出力した際のヘッダ情報を格納した二次元配列の「output_list」を用意し、APIで取得したデータを一次元配列の「tmp_output_list」に格納します。そして、最後に「outpu_list」に「tmp_output_list」を格納します。

Excelファイルに出力するデータが用意できたので、ここからはファイルに出力する部分のコードを作成していきます。

まず、必要なライブラリをインポートします。

from openpyxl import Workbook

インストールしていない方はインストールして下さい。

pip install openpyxl

今回はExcelファイルを新規作成し、作成したExcelファイルをアクティブ状態に設定します。

# 新しいワークブックを作成
wb = Workbook()
ws = wb.active

次に先ほどアクティブにしたExcelファイルにデータを書き込んでいきます。

# データをシートに書き込む
for row in output_list:
    ws.append(row)

最後に、Excelファイルに名前を付けて保存します。
今回は「sample.xlsx」で保存しました。出力先を指定していない場合は、pyファイルと同じ階層に出力されます。

# Excelファイルに保存
excel_file_path = 'sample.xlsx'
wb.save(excel_file_path)

以下の様にExcelファイルに出力できていれば成功です。

出力イメージ

コーディング全量

先ほどのコーディング①~コーディング②をまとめコードを以下に記載しています。

import requests
from openpyxl import Workbook

url = 'https://weather.tsukumijima.net/api/forecast?city=130010'
data = requests.get(url).json()
weather_data = data["forecasts"]
output_list = [["天気", "風の強さ", "波の高さ", "最高気温", "最低気温", "降水確率(0~6時)", "降水確率(6~12時)", "降水確率(12~16時)", "降水確率(18~24時)"]]
tokyo_weather_data = weather_data[0]
tmp_output_list = []
tmp_output_list.append(tokyo_weather_data['telop'])
tmp_output_list.append(tokyo_weather_data['detail']['wind'])
tmp_output_list.append(tokyo_weather_data['detail']['wave'])
tmp_output_list.append(tokyo_weather_data['temperature']['max']['celsius'])
tmp_output_list.append(tokyo_weather_data['temperature']['min']['celsius'])
tmp_output_list.append(tokyo_weather_data['chanceOfRain']['T00_06'])
tmp_output_list.append(tokyo_weather_data['chanceOfRain']['T06_12'])
tmp_output_list.append(tokyo_weather_data['chanceOfRain']['T12_18'])
tmp_output_list.append(tokyo_weather_data['chanceOfRain']['T18_24'])
output_list.append(tmp_output_list) 

# 新しいワークブックを作成
wb = Workbook()
ws = wb.active

# データをシートに書き込む
for row in output_list:
    ws.append(row)

# Excelファイルに保存
excel_file_path = 'sample.xlsx'
wb.save(excel_file_path)

まとめ

本記事では、PythonでのAPI操作について学習しました。プログラミングにおいて、コードには様々な書き方があり、絶対的な正解はありません。(可読性や保守性は重要ですが。)ここでは、まず「要件からコーディングする」というプロセスに慣れていただければと思います。

この記事が気に入ったらサポートをしてみませんか?