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"を押すと地図にルートを表示する。
なお、ファイルを何も選択せずに押すとサンプルファイル(しまなみ海道)が表示される。 f:id:kurama_sk:20200831213059p:plain

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の例:
f:id:kurama_sk:20200831213059p:plain

GPXファイルをpythonで分析する2(速度計算)

df_gpxは前回説明した、GPXファイルを読み込んだpandas.DataFrame。
今回はdf_gpxから速度などを計算したdf_tを作成する。

  1. 緯度経度データから距離を計算
    GPSデータから距離を計算するにはいくつかの方法があり今回はVincenty法を用いる。
    gpxpyライブラリのdistance関数を用いる。
    distance関数は2地点の緯度と経度から距離を計算する。
    distance([緯度A、経度A],[緯度B、経度B])の形で利用する。
    配列に一気に適用できなそうだったので行ごとにapplyさせている。

  2. 距離と時間から速度を計算
    時間は累積経過時間(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化)

  1. GPXファイルを取り込む(# parse)
    gpxpyというライブラリを使うのが便利。gpxpy.parseでファイルをトラック、セグメント、ポイントといった構造化データとして扱える。
  2. 取り込んだデータをリスト化(# to list)
    parseしたデータ(gpx_p)は、track > segment > point と入れ子になっておりループ処理で取り出す。pointの中にlatitude, longitude, elevation, timeなどのデータが含まれている。
  3. 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カード)と搭乗情報(予約番号)を紐づければ良い。

こうすることで問題なくラウンジに入ることができた。