-
本 web アプリは,本研究のアルゴリズムや推定処理を誰でも利用できるようにするとともに,結果を AI を用いてフィードバックできるようにするものである.また,ローカルで解析を行うこともできる.
-
本リポジトリでは,アプリの目に見えない処理の部分を実装しており,基本的には全て AWS 上で動作するようになっている.環境変数さえ用意すればローカルでも動かすことができる.関数単位で細かく処理を分けているため,研究ソースコードよりかなりわかりやすい.
- macOS Sequoia 15.0
- AWS Lmabda,AWS EC2
環境構築について記載しています.本番環境でも基本的には同じです.
環境構築
-
Git と Docker Desktop をインストールしてください.
-
任意のディレクトリで
git clone https://github.com/273Do/Thor.git
を実行してください. -
ルートディレクトリと
thor-web-app-beディレクトリ
に.env
ファイルを作成し,環境変数を設定してください.(内容については開発者に問い合わせください.) -
作成されたプロジェクトの
Dockerfile
が存在するディレクトリで,docker compose build
でイメージを作成してください. -
引き続き,
docker compose up -d
でコンテナを起動してください. -
docker exec -it thor_web_app_be /bin/bash
を実行してコンテナの中に入ってください. -
aws configure
で aws cli の設定をしてください. -
以降はコンテナ内で python3 コマンドを実行していただけます.必要なライブラリは requirements.txt に記載されているものが自動でインストールされますが,必要なライブラリが無いとエラーが吐かれた場合は
pip3
で手動でインストールしてください. -
コンテナから抜ける場合は
exit
を実行,コンテナを終了させる場合はdocker compose down
を実行してください.
API の利用手順について記載しています.本番では
http://localhost:5000
ではなく正しいエンドポイントを使用してください.
ローカル環境でのアプリの実行
-
REST API のテストができるようなツールを導入してください.
VSCode の拡張機能版 Postman,Thunder Client などを入れるといいです. -
アプリのリクエスト順序通りに API を叩いていきます.
API 利用手順
項目 | 内容 |
---|---|
Method | POST |
URL | http://localhost:5000/get_presigned_url |
Header | Content-Type: application/json |
Body | [json]`{"file_name": "書き出したデータ.zip"} |
- UUID とアップロード用の URL が返されます.
項目 | 内容 |
---|---|
Method | PUT |
URL | 先ほど取得した URL |
Header | Content-Type: application/zip |
Body | [binary]ZIP ファイル |
- アップロードが成功すれば,
200
ステータスが返されます.
項目 | 内容 |
---|---|
Method | POST |
URL | http://localhost:5000/analysis |
Header | Content-Type: application/json |
Body | [json] |
`{ | |
"UUID": "先ほど取得した UUID", | |
"file_name": "書き出したデータ.zip", | |
"habit": "x", | |
"bed_answer": "y", | |
"wake_answer": "z" | |
}` |
※リクエスト内容
habit
: 夜更かししたかどうか (x:0
or1
)bed_answer
: アンケート回答 (y:0〜4
)wake_answer
: アンケート回答 (z:0〜2
)
- 解析結果が返されます.
develop
:以下のソースコードまとめてがアップロードされています.
feature/#12_only_lambda_functions
:AWS Lambda に搭載するソースコード(署名付き URL の取得)がアップロードされています.
feature/#13_only_ec2_functions
:AWS EC2 に搭載するソースコード(解析処理やフィードバック処理)がアップロードされています.
実装した関数の解説を記載しています.
App.py
API関連の関数をまとめたもの.
関数 | get_presigned_ur() |
---|---|
役割 | HTTP リクエストを受け取り,署名付き url を取得してレスポンスを返す. |
引数 | なし |
返り値 | [JSON]:ステータスメッセージ,署名付き URL,UUID |
関数 | analyze() |
---|---|
役割 | HTTP リクエストを受け取り,解析処理を実行してレスポンスを返す. |
引数 | なし |
返り値 | [JSON]:ステータスメッセージ,睡眠推定結果,歩数クラスタデータ,フィードバック |
applehealthdata.py
applehealthdataを一部改変したもの.
役割 | export.xml から必要なデータを抽出するためのクラス.一部改変している. |
---|---|
ソース元 | applehealthdata |
extractor = HealthDataExtractor(export_xml)
extractor.extract()
dfs = extractor.get_dataframes()
extract_data.py
applehealthdataを用いてデータを抽出,加工する処理.
関数 | extract_data(export_xml) |
---|---|
役割 | export.xml から必要なデータを抽出して DataFrame にする. |
第1引数 | [Binary]:export.xml のバイナリデータ |
返り値 | [Bool,String,DataFrame,DataFrame]:処理が成功したかどうか,エラー文,歩数データ,正解睡眠データ |
open_api_functions.py
フィードバック生成関連の関数をまとめたもの.
関数 | generate_feedback(estimate_sleep_df, cluster_stats) |
---|---|
役割 | 推定結果から OpenAI API を使用してフィードバックを返す. |
第1引数 | [JSON]:睡眠推定データ |
第2引数 | [JSON]:歩数クラスタデータ |
返り値 | [Bool,String,String]:処理が成功したかどうか,エラー文,フィードバック |
関数 | get_prompt() |
---|---|
役割 | Google Docs からプロンプトを取得する. |
引数 | なし |
返り値 | [Bool,String,List(String)]:処理が成功したかどうか,エラー文,各プロンプト |
s3_functions.py
S3関連の関数をまとめたもの.
関数 | issue_presigned_url(tmp_file) |
---|---|
役割 | S3 の署名付き url を発行する. |
第1引数 | [String]:UUID と zip ファイル名を組み合わせたもの.S3 に保存されるディレクトリ. |
返り値 | [Bool,String,String]:処理が成功したかどうか,エラー文,S3 の署名付き url |
関数 | get_fromS3(file_dir) |
---|---|
役割 | S3 にアップロードされた zip ファイルを取得する. |
第1引数 | [String]:S3 に保存されるている zip ファイルのパス |
返り値 | [Bool,String,Binary]:処理が成功したかどうか,エラー文,zip ファイルのバイナリデータ |
関数 | delete_fromS3(dir) |
---|---|
役割 | S3 にアップロードされた zip ファイルをディレクトリごと削除する. |
第1引数 | [String]:S3 に保存されるている zip ファイルのディレクトリ(UUID) |
返り値 | [Bool,String]:処理が成功したかどうか,エラー文 |
unzip.py
zipファイルを解凍する処理.
関数 | unzip(zip_file) |
---|---|
役割 | zip ファイルをメモリ上に解凍する. |
第1引数 | [Binary]:zip ファイルのバイナリデータ |
返り値 | [Bool,String,Binary]:処理が成功したかどうか,エラー文,export.xml のバイナリデータ |
auxiliary_functions.py
補助関数をまとめたもの.
関数 | narrow_the_data_month(df, months) |
---|---|
役割 | データを最後のレコードから直近の n ヶ月前に絞る. |
第1引数 | [DataFrame]:DataFrame |
第2引数 | [Int]:何ヶ月前まで抽出するか指定 |
返り値 | [DataFrame]:絞ったデータ |
関数 | narrow_the_data_week(df, weeks) |
---|---|
役割 | データを最後のレコードから直近の n 週間前に絞る. |
第1引数 | [DataFrame]:DataFrame |
第2引数 | [Int]:何週間前まで抽出するか指定 |
返り値 | [DataFrame]:絞ったデータ |
関数 | filter_data(df, target) |
---|---|
役割 | 歩数か正解睡眠データを指定してフィルタリングする. |
第1引数 | [DataFrame]:DataFrame |
第2引数 | [String("step" or "sleep")]:どのモードかを指定 |
返り値 | [DataFrame]:抽出したデータ |
関数 | filter_data(df, target) |
---|---|
役割 | 歩数か正解睡眠データを指定してフィルタリングする. |
第1引数 | [DataFrame]:DataFrame |
第2引数 | [String("step" or "sleep")]:どのモードかを指定 |
返り値 | [DataFrame]:抽出したデータ |
関数 | custom_converter(obj) |
---|---|
役割 | 時間型のデータを json に変換する.使用していない. |
第1引数 | [JSON]:JSON |
返り値 | [JSON]:変換したデータ |
関数 | convert_timedelta_to_time(s) |
---|---|
役割 | timedelta を datetime.time に変換する. |
第1引数 | [timedelta]:秒数 |
返り値 | [datetime.time]:変換したデータ |
関数 | get_correction_value(bed_answer, wake_answer) |
---|---|
役割 | 回答から補正値を取得する. |
第1引数 | [Int]:就寝に関するアンケート回答番号 |
第2引数 | [Int]:起床に関するアンケート回答番号 |
返り値 | [List(Int)]:就寝時刻,起床時刻の補正値 |
main.py
推定処理を行うメインの処理.
関数 | data_analyze(step_count_df, sleep_analysis_df, answer) |
---|---|
役割 | データ解析用のメイン関数. |
第1引数 | [DataFrame]:歩数データ |
第2引数 | [DataFrame]:正解睡眠データ |
第3引数 | [List(Int)]:アンケートの回答 |
返り値 | [Bool,String,JSON,JSON]:処理が成功したかどうか,エラー文,睡眠推定結果,歩数クラスタデータ |
set_ref_time.py
統計データから,睡眠行為率が i%~j%である時間範囲を取得する処理.
関数 | setReferenceTime(weekday_probability, holiday_probability) |
---|---|
役割 | 統計データから,睡眠行為率が i%~j%である時間範囲を取得する. |
第1引数 | [List(Int)]:平日の i と j |
第2引数 | [List(Int)]:休日の i と j |
返り値 | [List(List)]:平日と休日の睡眠行為率が i%~j%である時間範囲 |
estimate.py
歩数から睡眠を推定するメイン処理
関数 | estimate(step_count_df, answer) |
---|---|
役割 | 歩数から睡眠を推定する処理をまとめたもの. |
第1引数 | [DataFrame]:歩数データ |
第2引数 | [List(Int)]:アンケートの回答 |
返り値 | [JSON]:睡眠推定データ |
est_sleep_from_step.py
推定処理を行う関数をまとめたもの.
関数 | estimate_sleep_from_step(df, staying_up_late_predictions_df, bed_answer, wake_answer) |
---|---|
役割 | 歩数から睡眠を推定する処理. |
第1引数 | [DataFrame]:歩数データ |
第2引数 | [DataFrame]:その日が夜更かしをしているかどうかをまとめたデータ |
第3引数 | [Int]:就寝に関するアンケート回答番号 |
第4引数 | [Int]:起床に関するアンケート回答番号 |
返り値 | [JSON]:睡眠推定結果 |
関数 | staying_up_late_sleep_estimation(df, time_range, cluster_id) |
---|---|
役割 | 夜更かししている場合の推定処理 |
第1引数 | [DataFrame]:日付ごとの歩数データ |
第2引数 | [List(Int)]:睡眠行為率が i%~j%である時間範囲 |
第3引数 | [Int]:外出と判定するクラスタ id |
返り値 | [JSON]:その日の睡眠推定結果 |
関数 | normal_sleep_estimation(df, time_range) |
---|---|
役割 | 夜更かししている場合の推定処理 |
第1引数 | [DataFrame]:日付ごとの歩数データ |
第2引数 | [List(Int)]:睡眠行為率が i%~j%である時間範囲 |
返り値 | [JSON]:その日の睡眠推定結果 |
clustering.py
歩数のクラスタリングを行う処理.
関数 | clustering(df) |
---|---|
役割 | 歩数データから自室,家の中,外出の3種類のクラスタリングを行う. |
第1引数 | [DataFrame]:歩数データ |
返り値 | [DataFrame,JSON]:クラスタ id カラムを追加した歩数データ,歩数クラスタデータ |
staying_up_late_model.py
機械学習(夜更かし検知)の処理に関する関数をまとめたもの.
関数 | create_feature_value(df, habit, time_range) |
---|---|
役割 | 歩数データから特徴量を作成する. |
第1引数 | [DataFrame]:クラスタ id カラムを追加した歩数データ |
第2引数 | [Int(0 or 1)]:普段深夜 3 時以降に就寝しているかどうかに関するアンケート |
第3引数 | [List(Int)]:特徴量となるデータの時間範囲 |
返り値 | [DataFrame]:歩数データから取得した特徴量をまとめたデータ |
関数 | staying_up_late_prediction(feature_value_df) |
---|---|
役割 | その日が夜更かしをしているかどうかを機械学習モデルから推定する |
第1引数 | [DataFrame]:歩数データから取得した特徴量をまとめたデータ |
返り値 | [DataFrame]:その日が夜更かしをしているかどうかをまとめたデータ |
models_functions.py
機械学習のモデルに関する関数をまとめたもの.使用していない.
関数 | list_models_in_s3() |
---|---|
役割 | S3 から機械学習モデルの一覧を取得する. |
引数 | なし |
返り値 | [List(String)]:S3 に保存している機械学習モデルのファイル名 |
関数 | load_model_from_s3(model_key) |
---|---|
役割 | S3 からモデルファイルを取得してロードする. |
第1引数 | [List(String)]:S3 に保存している機械学習モデルのファイル名 |
返り値 | [Binary]:機械学習モデルのバイナリデータ |
- 開発:273*
- This source code contains a partially modified version of applehealthdata .
- この作成物および同梱物を使用したことによって生じたすべての障害・損害・不具合等に関しては,私と私の関係者および私の所属するいかなる団体・組織とも,一切の責任を負いません.各自の責任においてご使用ください.