def文を用いて共通の処理を関数化する
以下の2つの記事の応用編です。 今回のポイントは以下の2つです。 ・気温の処理を関数化・Matplotlibで複数のグラフを出力 コードはGitHubリポジトリにあげています。 コード 出力結果 以下の様な気温と降水確率 […]
Filter by Category
以下の2つの記事の応用編です。 今回のポイントは以下の2つです。 ・気温の処理を関数化・Matplotlibで複数のグラフを出力 コードはGitHubリポジトリにあげています。 コード 出力結果 以下の様な気温と降水確率 […]
前回作った気象庁のサイトからBeautifulSoup4を使ってスクレイピングするプログラムの応用編として、今回はiOSアプリのPythonistaを使って最高気温と最低気温をグラフ化します。グラフ化にはMatplotl […]
気象庁の天気予報をBeautifulSoup4でスクレイピングします。サンプルとして群馬県の週間天気予報(場所、日付、曜日、最高気温、最低気温)を取得します。 コードはGitHubリポジトリにあげています。 週間天気予報 […]
DjangoでSQLログを出力して確認する方法です。SQLログをリアルタイムで出力して、どういうクエリがどのタイミングで実行されているのか確認できます。設定方法は簡単で、DEBUG = Trueになっている状態でsett […]
Dockerで動いているPostgreSQLにデータをリストアする方法です。書き出したPostgreSQLのdumpファイル(リストア用データ)はデスクトップに置いてあるという前提で進めます。 ディレクトリ構造 Dock […]
Djangoで開発中のWebアプリで特定のURLにアクセスした時だけ、502 Bad Gatewayが頻発する様になりました。NginxとuWSGIのログを見たらuWSGIのworkerが死んで復活してを繰り返しているこ […]
DjangoでデータベースにPostgreSQLを使ってる際に以下のエラーが出た時の対処方法です。 サーバーのPostgreSQLのディレクトリに移動します。VERSIONの部分はインストールされているバージョンを入力し […]
前回からの続きです。 チャンネルレイヤーを有効化 チャンネルレイヤーを使用するためにバックエンドにRedisを使用します。Redisを使用するためにDockerを起動します。 以下のコマンドを実行してRedisを起動しま […]
前回からの続きです。 ルームビューを作成 chat > templates > chat > room.htmlを作成します。 ルームビューを表示するためのviewを作成します。 ルームビューへのurl […]
こちらのチュートリアルと同じ内容です。https://channels.readthedocs.io/en/latest/tutorial/index.html 環境 Python 3.7.0Django 2.2.2ch […]
Beautiful Soupで以下のようなHTMLのoptionタグのvalueを取得する方法です。 optionタグのvalueの値を取得する方法 soup = soup.find_all('option')optio […]
Dockerを使ってシンプルなDjangoとPostgreSQLの開発環境を構築する方法です。GitHubリポジトリをクローンして以下のコマンドを入力します。 1. Dockerイメージを作成 2. Djangoプロジェ […]
以下のような、attachmentをつけて即ダウンロードが始まるシステムで、文字コードをShift-JISにする為にto_csv()の引数にencodingをShift-JISに設定しても、ダウンロードするとUTF-8で […]
Djangoでrunserverコマンドを使って開発用サーバーを起動した時にError: That port is already in use.が表示された時の対処法です。 Error: That port is al […]
Pillowを使って画像を合成する方法です。GitHubリポジトリ 上の2つの画像を合成して、下の画像を生成します。 Pillowのインストール バージョン確認 ディレクトリ構造 画像をリサイズ base_image = […]
Pillowを使って画像をリサイズする方法です。GitHubリポジトリ Pillowのインストール バージョン確認 ディレクトリ構造 画像をリサイズ files = glob.glob('./images/*')imag […]
Pillowを使って画像をクロッピングする方法です。ソースコードはGitHubにあげています。 Pillowのインストール バージョン確認 ディレクトリ構造 画像をクロッピング files = glob.glob('./ […]
Djangoで開発をする際にvenvを使って仮想環境を構築する方法です。pyenvがインストールされていてバージョンを切り替えできる状態を前提に進めます。 仮想環境について Pythonで開発していると開発環境では最新の […]
Pythonistaには多くのモジュールがプリインストールされていて、スクレイピングに必要なBeautifulSoupも初めから使える様になっています。そこで、今回はiOSアプリのPythonistaを使ってiPhone […]
DjangoのWEBプリケーションでCSVをpandasで読み込んでforで一行ずつループ処理をしたところ、毎回決まったところで決まったエラーが出たのでPyCharmのデバッグ機能を使って原因を調べた内容です。 プログラ […]
以下の2つの記事の応用編です。 今回のポイントは以下の2つです。
・気温の処理を関数化
・Matplotlibで複数のグラフを出力
コードはGitHubリポジトリにあげています。
import datetime
import re
import urllib.request
import matplotlib.pyplot as plt
from bs4 import BeautifulSoup
def temp_generate(temps):
temp_list = []
for temp in temps:
temp = temp.text
if '最低' not in temp and '最高' not in temp:
temp = temp.replace('\n|\t', '').replace('(', '{').replace(')', '}')
temp = re.sub('{.*?}', '', temp)
if '/' in temp:
temp = None
else:
temp = int(temp)
temp_list.append(temp)
return temp_list
url = urllib.request.urlopen('https://www.jma.go.jp/jp/week/315.html')
soup = BeautifulSoup(url, 'lxml')
days = soup.find("table", {"id": "infotablefont"}).find_all("tr")[0].find_all("th")
rainy = soup.find("table", {"id": "infotablefont"}).find_all("tr")[2].find_all("td")
max_temp = soup.find("table", {"id": "infotablefont"}).find_all("tr")[4].find_all("td")
min_temp = soup.find("table", {"id": "infotablefont"}).find_all("tr")[5].find_all("td")
day_list = []
for day in days:
day = day.text
if '日付' not in day:
day_list.append(day[:-1])
hour = datetime.datetime.now().hour
rainy_list = []
for rain in rainy:
rain = rain.text
if '降水確率' not in rain:
if '/' in rain:
if 0 <= hour < 6:
rain = rain.split('/')[0]
elif 6 <= hour < 12:
rain = rain.split('/')[1]
elif 12 <= hour < 18:
rain = rain.split('/')[2]
elif 18 <= hour < 24:
rain = rain.split('/')[3]
else:
pass
rainy_list.append(int(rain))
maxtemp_list = temp_generate(max_temp)
mintemp_list = temp_generate(min_temp)
x = day_list
plt.subplot(2, 1, 1)
plt.plot(x, maxtemp_list, label='Max', color="red", marker="o")
plt.plot(x, mintemp_list, label='Min', color="blue", marker="o")
plt.title("Weekly weather")
plt.xlabel("Day")
plt.ylabel("Temp")
plt.legend()
plt.subplot(2, 1, 2)
plt.plot(x, rainy_list, marker="o")
plt.title("Rainy percent")
plt.ylabel("Percent")
plt.show()
以下の様な気温と降水確率のグラフが表示されます。
def temp_generate(temps):
temp_list = []
for temp in temps:
temp = temp.text
if '最低' not in temp and '最高' not in temp:
temp = temp.replace('\n|\t', '').replace('(', '{').replace(')', '}')
temp = re.sub('{.*?}', '', temp)
if '/' in temp:
temp = None
else:
temp = int(temp)
temp_list.append(temp)
return temp_list
最高気温と最低気温の処理を関数化した部分です。最高気温と最低気温はどちらも同じ処理なので関数化します。今回の気温を抜き出す様な処理は関数化することで、一度の記述で済むので記述量を減らせます。
Pythonの関数は以下の様に関数を定義します。
def 関数名():
処理
def temp_generate(temps):
temp_generateという関数を作り、引数にはtempsを指定します。return temp_list
temp_generate関数は作成した気温のリストを返します。
maxtemp_list = temp_generate(max_temp)
mintemp_list = temp_generate(min_temp)
取得した気温情報をtemp_generate関数に渡し、関数内で作成したリストを受け取ります。
hour = datetime.datetime.now().hour
rainy_list = []
for rain in rainy:
rain = rain.text
if '降水確率' not in rain:
if '/' in rain:
if 0 <= hour < 6:
rain = rain.split('/')[0]
elif 6 <= hour < 12:
rain = rain.split('/')[1]
elif 12 <= hour < 18:
rain = rain.split('/')[2]
elif 18 <= hour < 24:
rain = rain.split('/')[3]
else:
pass
rainy_list.append(int(rain))
直近の降水確率は時間帯毎に表示されているので、現在時刻から適切な降水確率を抜き出します。
hour = datetime.datetime.now().hour
現在の時間(時のみ)を取得します
rain = rain.split('/')[0]
表示されている数値は/で区切られているので、/の前後の位置を指定して取得します。
x = day_list
plt.subplot(2, 1, 1)
plt.plot(x, maxtemp_list, label='Max', color="red", marker="o")
plt.plot(x, mintemp_list, label='Min', color="blue", marker="o")
plt.title("Weekly weather")
plt.xlabel("Day")
plt.ylabel("Temp")
plt.legend()
plt.subplot(2, 1, 2)
plt.plot(x, rainy_list, marker="o")
plt.title("Rainy percent")
plt.ylabel("Percent")
plt.show()
plt.subplot(2, 1, 1)
plt.subplot(2, 1, 2)
2つのグラフを縦に並べて出力します。
群馬県でPythonを使ったAIやソフトウェアを開発している株式会社ファントムが運営しています。
メーリングリストに登録するとファントムの最新情報をお届けします
お客様のメールアドレスを共有することはありません
Comments