Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/273do/thor-web-app-backend

本 web アプリは,本研究のアルゴリズムや推定処理を誰でも利用できるようにするとともに,結果を AI を用いてフィードバックできるようにするものである.FE:https://github.com/273Do/Thor-Web-App-Frontend
https://github.com/273do/thor-web-app-backend

aws-ec2 aws-lambda aws-s3 docker python serverless-framework

Last synced: about 1 month ago
JSON representation

本 web アプリは,本研究のアルゴリズムや推定処理を誰でも利用できるようにするとともに,結果を AI を用いてフィードバックできるようにするものである.FE:https://github.com/273Do/Thor-Web-App-Frontend

Awesome Lists containing this project

README

        



# Thor-Web-App-BE

- 本 web アプリは,本研究のアルゴリズムや推定処理を誰でも利用できるようにするとともに,結果を AI を用いてフィードバックできるようにするものである.また,ローカルで解析を行うこともできる.

- 本リポジトリでは,アプリの目に見えない処理の部分を実装しており,基本的には全て AWS 上で動作するようになっている.環境変数さえ用意すればローカルでも動かすことができる.関数単位で細かく処理を分けているため,研究ソースコードよりかなりわかりやすい.

- [フロントエンドリポジトリ](https://github.com/273Do/Thor-Web-App-Frontend)

## 🚚 開発環境・使用技術・ツール

BE

Python
Flask

環境,コード管理

Docker
GitHub
Git

外部サービス

Google Docs
OpenAI API

ストレージ,デプロイ

AWS S3
AWS Lambda
AWS EC2
Serverless

ロゴ

Blender
Adobe Photoshop

## 🚚 システム構成図

## 🚚 動作確認済み端末・OS

- macOS Sequoia 15.0
- AWS Lmabda,AWS EC2

## 🚚 アプリ構築・起動

> 環境構築について記載しています.本番環境でも基本的には同じです.

環境構築

### 環境構築

1. Git と Docker Desktop をインストールしてください.

2. 任意のディレクトリで`git clone https://github.com/273Do/Thor.git`を実行してください.

3. ルートディレクトリと`thor-web-app-beディレクトリ`に`.env`ファイルを作成し,環境変数を設定してください.(内容については開発者に問い合わせください.)
4. 作成されたプロジェクトの`Dockerfile`が存在するディレクトリで,`docker compose build`でイメージを作成してください.

5. 引き続き,`docker compose up -d`でコンテナを起動してください.

6. `docker exec -it thor_web_app_be /bin/bash`を実行してコンテナの中に入ってください.

7. `aws configure`で aws cli の設定をしてください.

8. 以降はコンテナ内で python3 コマンドを実行していただけます.必要なライブラリは requirements.txt に記載されているものが自動でインストールされますが,必要なライブラリが無いとエラーが吐かれた場合は`pip3`で手動でインストールしてください.

9. コンテナから抜ける場合は`exit`を実行,コンテナを終了させる場合は`docker compose down`を実行してください.

## 🚚 API 利用手順

> API の利用手順について記載しています.本番では`http://localhost:5000`ではなく正しいエンドポイントを使用してください.

ローカル環境でのアプリの実行

1. REST API のテストができるようなツールを導入してください.
VSCode の拡張機能版 Postman,Thunder Client などを入れるといいです.

2. アプリのリクエスト順序通りに API を叩いていきます.

API 利用手順

## 1. 署名付き URL を発行

### HTTP リクエスト

| 項目 | 内容 |
| ------ | -------------------------------------------- |
| Method | POST |
| URL | `http://localhost:5000/get_presigned_url` |
| Header | `Content-Type: application/json` |
| Body | [json]`{"file_name": "書き出したデータ.zip"} |

### レスポンス

- UUID とアップロード用の URL が返されます.

---

## 2. 署名付き URL を使用して ZIP を送信

### HTTP リクエスト

| 項目 | 内容 |
| ------ | ------------------------------- |
| Method | PUT |
| URL | 先ほど取得した URL |
| Header | `Content-Type: application/zip` |
| Body | [binary]ZIP ファイル |

### レスポンス

- アップロードが成功すれば,`200` ステータスが返されます.

---

## 3. 解析処理を要求する

### HTTP リクエスト

| 項目 | 内容 |
| ------ | ------------------------------------ |
| 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` or `1`)
- `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]:ステータスメッセージ,睡眠推定結果,歩数クラスタデータ,フィードバック |


### `./src`

`applehealthdata.py`

applehealthdataを一部改変したもの.

| 役割 | export.xml から必要なデータを抽出するためのクラス.一部改変している. |
| -------- | --------------------------------------------------------------------- |
| ソース元 | [**applehealthdata**](https://github.com/tdda/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`のバイナリデータ |


### `./src/analysis`

`auxiliary_functions.py`

補助関数をまとめたもの.

| 関数 | `narrow_the_data(df, months)` |
| -------- | ------------------------------------------------- |
| 役割 | データを最後のレコードから直近の n ヶ月前に絞る. |
| 第1引数 | [DataFrame]:DataFrame |
| 第2引数 | [Int]:何ヶ月前まで抽出するか指定 |
| 返り値 | [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%である時間範囲 |


### `./src/analysis/estimate/`

`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]:その日の睡眠推定結果 |


### `./src/analysis/ML`

`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**](https://github.com/tdda/applehealthdata) .
- この作成物および同梱物を使用したことによって生じたすべての障害・損害・不具合等に関しては,私と私の関係者および私の所属するいかなる団体・組織とも,一切の責任を負いません.各自の責任においてご使用ください.