streamlitをherokuで使う方法
参考
https://towardsdatascience.com/quickly-build-and-deploy-an-application-with-streamlit-988ca08c7e83
必要ファイル構成
app.py:プログラム本体
requirements.txt:必要なライブラリ
setup.sh:streamlitにおいて必要となるファイル
mkdir -p ~/.streamlit/ echo "\ [general]\n\ email = \"your-email@domain.com\"\n\ " > ~/.streamlit/credentials.toml echo "\ [server]\n\ headless = true\n\ enableCORS=false\n\ port = $PORT\n\ " > ~/.streamlit/config.toml
Procfile:setup.pyを読み込ませるために必要
web: sh setup.sh && streamlit run app.py
Pythonで配列内の月末日を抽出するコード
Python Pandasで時系列データを扱う際、月末ベースで分析したいことは多々ある。 asfreqやresampleを使うことが多いが、これらはカレンダーベースの月末日を返したり、集約関数だったりで配列内の月末最終日を直接取得できない。
適切にindexが設定されているPandasデータフレームに対し下記コードを用いれば、直接配列内の月末値を取得できる。
def getEndOfMonth(df): df=df.sort_index() return df[(pd.Series(df.index.month.values).diff(-1) != 0).values]
解説
df.index.month.values:データフレームの月の数値をもとに計算。diff(-1)で月の差分(通常-1 or 年跨ぎは11 or 最終行はNan)を取得。diffの引数が−1なのは、デフォルト値の0だと翌月初日に数値が入ってしまうため。-1, 11, Nanとなっている行は当データフレームにおいては月内最終日のため、0でない値の行は全てTrueとして抽出すると月末日のみ取り出せる。
Date | month | diff | flag |
---|---|---|---|
2020-12-29 | 12 | 0 | False |
2020-12-30 | 12 | 11 | True |
2021-01-04 | 1 | 0 | False |
2021-01-05 | 1 | 0 | False |
2021-01-06 | 1 | nan | True |
GPXファイルをpythonで可視化するライブラリとWebアプリ
これまでの記事をベースにした、GPXファイルを分析するpythonライブラリgpxdfを作成した。
pip3 install git+https://github.com/kurama8103/gpxdf
とターミナルに入力するとインストールできる。
該当Githubページはこちら
https://github.com/kurama8103/gpxdf
過去記事はこちら art-of-lives.hatenablog.com art-of-lives.hatenablog.com art-of-lives.hatenablog.com
また、GPXファイルを取り込みブラウザに経路を表示するアプリを作成した。
https://gpx-map.herokuapp.com/
ファイルを選択して"Create Map"を押すと地図にルートを表示する。
なお、ファイルを何も選択せずに押すとサンプルファイル(しまなみ海道)が表示される。
GPXファイルをpythonで分析する3(速度グラフと地図への表示)
dfは前々回のGPXファイルを読み込んだpandas.DataFrame。
df_tは前回の速度計算したpandas.DataFrame。
# 速度推移グラフ import matplotlib.pyplot as plt %matplotlib inline plt.plot(df_t.query('velocity!=inf')['velocity']) # 速度の分母が0だと無限大になるので除外 # 経路イメージ plt.plot(df.longitude, df.latitude) # 地図への表示 import folium df_p = df[['latitude', 'longitude']] map = folium.Map(location=(df_p.iloc[0]+df_p.iloc[-1])/2, zoom_start=6) folium.PolyLine(df_p).add_to(map) map.save('out.html')
out.htmlの例:
GPXファイルをpythonで分析する2(速度計算)
df_gpxは前回説明した、GPXファイルを読み込んだpandas.DataFrame。
今回はdf_gpxから速度などを計算したdf_tを作成する。
緯度経度データから距離を計算
GPSデータから距離を計算するにはいくつかの方法があり今回はVincenty法を用いる。
gpxpyライブラリのdistance関数を用いる。
distance関数は2地点の緯度と経度から距離を計算する。
distance([緯度A、経度A],[緯度B、経度B])の形で利用する。
配列に一気に適用できなそうだったので行ごとにapplyさせている。距離と時間から速度を計算
時間は累積経過時間(df_gpx.time)の差。
速度は距離/時間だが、時間はTimeDelta型なので数値型の秒に変換する必要がある。
そして秒速から時速に変換(×3600)している。
import pandas as pd from geopy.distance import distance df_t = pd.DataFrame() # time difference df_t['diff_time'] = df_gpx.time.diff() # distance df_d = pd.concat([df_gpx[['latitude', 'longitude']], df_gpx[['latitude', 'longitude']].shift()], axis=1) df_t['distance'] = df_d.dropna().apply(lambda x: distance( (x[0], x[1]), (x[2], x[3])).km, axis=1) # velocity df_t['velocity'] = df_t['distance'] / \ df_gpx.diff_time.apply(lambda x: x.seconds)*3600
GPXファイルをpythonで分析する1(取り込みとDataFrame化)
- GPXファイルを取り込む(# parse)
gpxpyというライブラリを使うのが便利。gpxpy.parseでファイルをトラック、セグメント、ポイントといった構造化データとして扱える。 - 取り込んだデータをリスト化(# to list)
parseしたデータ(gpx_p)は、track > segment > point と入れ子になっておりループ処理で取り出す。pointの中にlatitude, longitude, elevation, timeなどのデータが含まれている。 - pandas.DataFrameに変換(to pd.DataFrame)
速度計算やグラフ化など何かと扱いやすいため変換しておく。列名も付加。
import gpxpy import pandas as pd # parse gpx_file = open(filename, 'r') gpx_p = gpxpy.parse(gpx_file) # to list gpx_list = [] for track in gpx_p.tracks: for i, segment in enumerate(track.segments): for point in segment.points: gpx_list.append([point.latitude, point.longitude, point.elevation, point.time, track.name, i]) # to pd.DataFrame colname = ['latitude', 'longitude', 'elevation', 'time', 'trackname', 'segment_no'] df = pd.DataFrame(gpx_list, columns=colname)
パック旅行時のサクララウンジへの入り方
パック旅行時のサクララウンジへの入り方
JALは空港にサクララウンジを設置しており、所定の条件を満たすと利用できる。
条件を満たしていてもJALを使った旅程なら常に使えるというわけではない。
例えばじゃらんなどのパック旅行を使うときには注意が必要。
以下抜粋
ご予約時にお得意様番号をご登録いただき、当日ラウンジ受付に設置されているリーダーに搭乗媒体*1をタッチするとご入室いただけます。 CLUB ESTカードのご提示*2でご同行者1名様もご入室いただけます。
*1:搭乗券またはeチケットお客様控の2次元バーコード、ICカード、ICケータイなど。
*2:Apple Pay登録後にモバイル端末上で表示されるカード券面画像のご提示では対象となりません。必ずJALカード(プラスチックカード)をご提示ください。
ラウンジに入室するには予約時にマイレージ番号を登録しておかないといけない。
ちなみにESTの方にしかこの注意事項は見つけられなかったがESTは回数制限がある関係だろうか。
ただし予約時に登録していない時は、当日に空港で登録すればラウンジが利用できる。
そもそもマイレージ番号を予約時に登録するのはステータスと当日の搭乗情報を紐づけるため。
なので空港のチェックイン機でマイレージ番号(JALカード)と搭乗情報(予約番号)を紐づければ良い。
こうすることで問題なくラウンジに入ることができた。