{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Detect Sleep States DataPrepare\n\n### his notebook is inspired by the following [werus23's](https://www.kaggle.com/werus23) amazing notebooks.\n### see also them.\n\nFinding Critical Points using RNNs\n\n - [Data Prep notebook](https://www.kaggle.com/code/werus23/sleep-critical-point-prepare-data)\n - [Training notebook](https://www.kaggle.com/werus23/sleep-critical-point-train)\n - [Inference Notebook](https://www.kaggle.com/code/werus23/sleep-critical-point-infer)\n\nCredits:\n - dataloader: https://www.kaggle.com/code/henriupton/efficient-loading-memory-usage-visualizations-cmi","metadata":{}},{"cell_type":"markdown","source":"### セル1\n\n下記のコードはPythonでよく使用されるライブラリやモジュールをインポートしています。\n\n- pandas as pd\n\n  Pandasはデータの操作と解析に使用されるライブラリで、DataFrameやSeriesなどのデータ構造を提供します。\n\n- numpy as np\n\n  NumPyはPythonで数値計算を行うためのライブラリで、配列や数学演算のサポートを提供します。\n\n- gc\n\n  gcモジュールはPythonのガベージコレクターで、メモリ管理に使用されます。\n\n- time\n\n  timeモジュールはさまざまな時間関連の関数を提供し、コードの実行時間を測定するために使用されます。\n\n- json\n\n  jsonモジュールはJSONデータを扱うために使用され、JSONファイルの解析などに使用されます。\n\n- datetime\n\n  datetimeモジュールは日付と時刻のデータを扱うために使用されます。\n\n- matplotlib.pyplot as plt\n\n  Matplotlibはデータの可視化とグラフの作成に使用される人気のあるライブラリです。\n\n- os\n\n  osモジュールは、ファイルやディレクトリの操作など、オペレーティングシステムとの対話に使用されます。\n\n- joblib\n\n  JoblibはPythonオブジェクトの効率的な保存と読み込みに使用されるライブラリで、特にNumPy配列などのデータを効率的に保存できます。\n\n- random\n\n  randomモジュールはランダムな数値やランダムな選択を生成するための関数を提供します。\n\n- math\n\n  mathモジュールは数学関数と定数を提供します。\n\n- tqdm\n\n  TQDMは進行状況バーを作成するためのライブラリで、反復プロセスの進捗を監視するためによく使用されます。\n\n- scipy.interpolate.interp1d\n\n  SciPyのinterp1d関数は1次元の補間に使用されます。\n\n- sklearn, sklearn.model_selection\n\n  Scikit-learnは機械学習のための人気のあるライブラリで、モデルの選択やハイパーパラメータの調整に使用されます。\n\n- torch\n\n  PyTorchはニューラルネットワークの構築とトレーニングに使用されるディープラーニングフレームワークです。\n\n- torch.nn, torch.Tensor\n\n  PyTorchのニューラルネットワークモジュールとテンソルデータ型です。\n\n\n- torch.nn.functional as F\n\n  PyTorchの機能モジュールで、ニューラルネットワーク内でさまざまな操作によく使用されます。\n\n- torch.utils.data\n\n  PyTorchのデータ処理ユーティリティで、データローダーとデータセットの作成に使用されます。\n\n- sklearn.metrics.average_precision_score\n\n  scikit-learnからの関数で、分類タスクでよく使用される平均適合率スコアを計算するのに使用されます。\n\n- timm.scheduler.CosineLRScheduler\n\n  Timmライブラリからのコサイン学習率スケジューラで、トレーニング中に学習率を調整するために使用されます。\n\n- pyarrow.parquet.ParquetFile, pyarrow as pa\n\n  PyArrowはカラム形式のデータフォーマットを扱うためのライブラリで、Parquetはそのようなフォーマットの一つです。\n\n- ctypes\n\n  PythonとCライブラリを連携させるために使用される外部関数インターフェース（FFI）ライブラリです。","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport gc\nimport time\nimport json\nfrom datetime import datetime\nimport matplotlib.pyplot as plt\nimport os\nimport joblib\nimport random\nimport math\nfrom tqdm.auto import tqdm \n\nfrom scipy.interpolate import interp1d\n\nfrom math import pi, sqrt, exp\nimport sklearn,sklearn.model_selection\nimport torch\nfrom torch import nn,Tensor\nimport torch.nn.functional as F\nfrom torch.utils.data import DataLoader, Dataset, SubsetRandomSampler\nfrom sklearn.metrics import average_precision_score\nfrom timm.scheduler import CosineLRScheduler\nplt.style.use(\"ggplot\")\n\nfrom pyarrow.parquet import ParquetFile\nimport pyarrow as pa \nimport ctypes","metadata":{"execution":{"iopub.status.busy":"2023-10-22T05:09:26.950407Z","iopub.execute_input":"2023-10-22T05:09:26.950922Z","iopub.status.idle":"2023-10-22T05:09:34.740822Z","shell.execute_reply.started":"2023-10-22T05:09:26.950879Z","shell.execute_reply":"2023-10-22T05:09:34.739869Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### セル2\nファイルパスをクラス変数として定義するクラス PATHS を示しています。これらのファイルパスは、特定のディレクトリ内にあるさまざまなファイルにアクセスするために使用されるものです。各ファイルパスの用途は次の通りです。\n\n- MAIN_DIR\n\n    メインディレクトリのパスが定義されています。このディレクトリ内に他のファイルやサブディレクトリが存在すると想定されます。\n\n- SUBMISSION\n  \n    サンプルの提出用CSVファイルへのパスです。これは提出フォーマットに関連するファイルでしょう。\n\n- TRAIN_EVENTS\n\n    訓練用のイベントデータが含まれるCSVファイルへのパスです。おそらく、トレーニングデータのイベント情報が含まれています。\n\n- TRAIN_SERIES\n\n    訓練用のシリーズデータが含まれるParquetファイルへのパスです。Parquetは効率的なデータフォーマットで、訓練データのシリーズ情報が含まれていると思われます。\n\n- TEST_SERIES\n\n    テスト用のシリーズデータが含まれるParquetファイルへのパスです。テストデータのシリーズ情報が含まれていると考えられます。\n\nこのクラスを使用することで、ファイルパスを簡単に参照でき、コードの可読性を向上させることができます。ファイルのパスが変更された場合、このクラス内のパスを変更するだけでコード全体での変更を容易に行うことができます。","metadata":{}},{"cell_type":"code","source":"class PATHS:\n    MAIN_DIR = \"/kaggle/input/child-mind-institute-detect-sleep-states/\"\n    # CSV FILES : \n    SUBMISSION = MAIN_DIR + \"sample_submission.csv\"\n    TRAIN_EVENTS = MAIN_DIR + \"train_events.csv\"\n    # PARQUET FILES:\n    TRAIN_SERIES = MAIN_DIR + \"train_series.parquet\"\n    TEST_SERIES = MAIN_DIR + \"test_series.parquet\"","metadata":{"execution":{"iopub.status.busy":"2023-10-22T05:09:34.742537Z","iopub.execute_input":"2023-10-22T05:09:34.742871Z","iopub.status.idle":"2023-10-22T05:09:34.748492Z","shell.execute_reply.started":"2023-10-22T05:09:34.742843Z","shell.execute_reply":"2023-10-22T05:09:34.746856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### セル3\n\n\nこのコードは、指定されたディレクトリ（train_csvs）を作成するためのPythonコードです。\n\n- out_dir = 'train_csvs': 'train_csvs' というディレクトリ名を変数 out_dir に代入します。これは新しいディレクトリを作成する際のディレクトリ名です。\n\n- os.makedirs(out_dir, exist_ok=True): os.makedirs() 関数を使用して、指定されたディレクトリを作成します。out_dir で指定されたディレクトリが存在しない場合、このコードは新しいディレクトリを作成します。exist_ok=True パラメータを設定することで、既にディレクトリが存在する場合にエラーを発生させずに処理を続行します。\n\nしたがって、このコードは、カレントディレクトリ内に train_csvs という名前のディレクトリを作成し、ディレクトリが既に存在する場合には何も行いません。\n新しいディレクトリを作成してファイルを保存する場合など、ディレクトリの事前作成が必要な場面でよく使用されます。","metadata":{}},{"cell_type":"code","source":"out_dir = 'train_csvs'\nos.makedirs(out_dir, exist_ok=True)","metadata":{"execution":{"iopub.status.busy":"2023-10-22T05:09:34.749585Z","iopub.execute_input":"2023-10-22T05:09:34.750185Z","iopub.status.idle":"2023-10-22T05:09:34.763645Z","shell.execute_reply.started":"2023-10-22T05:09:34.750157Z","shell.execute_reply":"2023-10-22T05:09:34.762578Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### セル4\n\nこのコードは、データを読み込んで前処理するためのPythonクラス data_reader を定義しています。このクラスは、データの読み込み、前処理、メモリ効率の向上を行うためのメソッドを提供します。\n\n- __init__(self, demo_mode): クラスの初期化メソッドです。demo_mode パラメータはデモモードの有無を指定します。\n\n- self.names_mapping: データセット名とそのプロパティ（ファイルのパス、ファイル形式、タイムスタンプの有無）のマッピングを保持します。\n\n- self.valid_names: 有効なデータセット名のリストを保持します。\n\n- verify(self, data_name): データセット名が有効かどうかを確認するためのメソッドです。\n\n- cleaning(self, data): データの前処理を行うメソッドで、欠損値（NaN）を削除します。\n\n- reduce_memory_usage(data): データフレームの各列のデータ型を適切に変更してメモリ使用量を最適化するメソッドです。\n\n- load_data(self, data_name): データを読み込むためのメソッドで、指定されたデータセット名に基づいてデータを読み込みます。デモモードが有効な場合、データの一部を制限して読み込むことができます。\n\nこのクラスを使用することで、異なるデータセットを効果的に読み込み、前処理することができます。また、データのメモリ使用量を最適化するための方法も提供されています。データサイエンスプロジェクトでのデータ準備に役立つクラスの一部です。\n","metadata":{}},{"cell_type":"code","source":"class data_reader:\n    def __init__(self, demo_mode):\n        super().__init__()\n        # MAPPING FOR DATA LOADING :\n        self.names_mapping = {\n            \"submission\" : {\"path\" : PATHS.SUBMISSION, \"is_parquet\" : False, \"has_timestamp\" : False}, \n            \"train_events\" : {\"path\" : PATHS.TRAIN_EVENTS, \"is_parquet\" : False, \"has_timestamp\" : True},\n            \"train_series\" : {\"path\" : PATHS.TRAIN_SERIES, \"is_parquet\" : True, \"has_timestamp\" : True},\n            \"test_series\" : {\"path\" : PATHS.TEST_SERIES, \"is_parquet\" : True, \"has_timestamp\" : True}\n        }\n        self.valid_names = [\"submission\", \"train_events\", \"train_series\", \"test_series\"]\n        self.demo_mode = demo_mode\n    \n    def verify(self, data_name):\n        \"function for data name verification\"\n        if data_name not in self.valid_names:\n            print(\"PLEASE ENTER A VALID DATASET NAME, VALID NAMES ARE : \", valid_names)\n        return\n    \n    def cleaning(self, data):\n        \"cleaning function : drop na values\"\n        before_cleaning = len(data)\n        print(\"Number of missing timestamps : \", len(data[data[\"timestamp\"].isna()]))\n        data = data.dropna(subset=[\"timestamp\"])\n        after_cleaning = len(data)\n        print(\"Percentage of removed steps : {:.1f}%\".format(100 * (before_cleaning - after_cleaning) / before_cleaning) )\n#         print(data.isna().any())\n#         data = data.bfill()\n        return data\n    \n    @staticmethod\n    def reduce_memory_usage(data):\n        \"iterate through all the columns of a dataframe and modify the data type to reduce memory usage.\"\n        start_mem = data.memory_usage().sum() / 1024**2\n        print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))\n        for col in data.columns:\n            col_type = data[col].dtype    \n            if col_type != object:\n                c_min = data[col].min()\n                c_max = data[col].max()\n                if str(col_type)[:3] == 'int':\n                    if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:\n                        data[col] = data[col].astype(np.int8)\n                    elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:\n                        data[col] = data[col].astype(np.int16)\n                    elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:\n                        data[col] = data[col].astype(np.int32)\n                    elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:\n                        data[col] = data[col].astype(np.int64)  \n                else:\n                    if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:\n                        data[col] = data[col].astype(np.float16)\n                    elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:\n                        data[col] = data[col].astype(np.float32)\n                    else:\n                        data[col] = data[col].astype(np.float64)\n            else:\n                data[col] = data[col].astype('category')\n\n        end_mem = data.memory_usage().sum() / 1024**2\n        print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))\n        print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))\n        return data\n    \n    def load_data(self, data_name):\n        \"function for data loading\"\n        self.verify(data_name)\n        data_props = self.names_mapping[data_name]\n        if data_props[\"is_parquet\"]:\n            if self.demo_mode:\n                pf = ParquetFile(data_props[\"path\"]) \n                demo_steps = next(pf.iter_batches(batch_size=20_000)) \n                data = pa.Table.from_batches([demo_steps]).to_pandas()\n            else:\n                data = pd.read_parquet(data_props[\"path\"])\n        else:\n            if self.demo_mode:\n                data = pd.read_csv(data_props[\"path\"], nsteps=20_000)\n            else:\n                data = pd.read_csv(data_props[\"path\"])\n                \n        gc.collect()\n        if data_props[\"has_timestamp\"]:\n            print('cleaning')\n            data = self.cleaning(data)\n            gc.collect()\n        #data = self.reduce_memory_usage(data)\n        return data","metadata":{"execution":{"iopub.status.busy":"2023-10-22T05:09:34.766197Z","iopub.execute_input":"2023-10-22T05:09:34.766777Z","iopub.status.idle":"2023-10-22T05:09:34.792679Z","shell.execute_reply.started":"2023-10-22T05:09:34.766745Z","shell.execute_reply":"2023-10-22T05:09:34.791336Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### セル5\n\ndata_reader クラスを使用してデータを読み込むコードの一部です。\n\n- data_reader(demo_mode=False): demo_mode を False に設定して、data_reader クラスのインスタンスを作成します。demo_mode はデモモードの有無を指定します。\n\n- series = reader.load_data(data_name=\"train_series\"): data_reader インスタンスで load_data メソッドを呼び出し、data_name パラメータに \"train_series\" を指定して、訓練用のシリーズデータを読み込みます。このデータは Parquet ファイルとして保存されていると想定されています。\n\n- events = reader.load_data(data_name=\"train_events\"): 同様に、data_reader インスタンスで load_data メソッドを呼び出し、data_name パラメータに \"train_events\" を指定して、訓練用のイベントデータを読み込みます。このデータは CSV ファイルとして保存されていると想定されています。\n\nこれにより、訓練用のシリーズデータとイベントデータが変数 series と events に読み込まれ、後続のデータ処理や分析に使用できるようになります。デモモードが無効になっている場合、データは完全な形で読み込まれます。データ読み込みおよび前処理のステップを実行する際に data_reader クラスが役立ちます。","metadata":{}},{"cell_type":"code","source":"reader = data_reader(demo_mode=False)\nseries = reader.load_data(data_name=\"train_series\")\nevents = reader.load_data(data_name=\"train_events\")","metadata":{"execution":{"iopub.status.busy":"2023-10-22T05:09:34.794181Z","iopub.execute_input":"2023-10-22T05:09:34.794537Z","iopub.status.idle":"2023-10-22T05:11:03.558786Z","shell.execute_reply.started":"2023-10-22T05:09:34.794505Z","shell.execute_reply":"2023-10-22T05:11:03.557701Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### セル6\nガウス分布（正規分布）を生成するための関数を定義しています。具体的には、ガウス分布の離散バージョンを計算しています。\n\n- SIGMA = 720: SIGMA はガウス分布の標準偏差を設定する定数です。この場合、720と設定されています。標準偏差は分布の広がりを制御するパラメータで、大きな値ほど分布は広がります。\n\n- def gauss(n=SIGMA, sigma=SIGMA*0.15): gauss 関数が定義されています。この関数は、ガウス分布を計算します。n パラメータは分布のサンプル数を指定し、sigma パラメータは標準偏差を指定します。デフォルト値として、n は SIGMA に設定され、sigma は SIGMA の 0.15 倍に設定されています。\n\n- r = range(-int(n/2), int(n/2)+1): r は離散化された範囲を表します。この範囲は -int(n/2) から int(n/2) までの整数値を含みます。\n\n- return [...]: リスト内包表記を使用して、ガウス分布の各サンプルを計算し、リストとして返します。各サンプルはガウス分布の確率密度関数の値を表します。\n\nこの関数を呼び出すことで、指定されたパラメータ（標準偏差やサンプル数）に基づいたガウス分布を取得できます。ガウス分布は確率分布として広く使用され、データのノイズモデリングや平滑化などの用途で役立ちます。\n","metadata":{}},{"cell_type":"code","source":"SIGMA = 720 # 12 * 60\ndef gauss(n=SIGMA,sigma=SIGMA*0.15):\n    # guassian distribution function\n    r = range(-int(n/2),int(n/2)+1)\n    return [1 / (sigma * sqrt(2*pi)) * exp(-float(x)**2/(2*sigma**2)) for x in r]","metadata":{"execution":{"iopub.status.busy":"2023-10-22T05:11:03.56003Z","iopub.execute_input":"2023-10-22T05:11:03.560349Z","iopub.status.idle":"2023-10-22T05:11:03.567035Z","shell.execute_reply.started":"2023-10-22T05:11:03.560322Z","shell.execute_reply":"2023-10-22T05:11:03.565859Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### セル7\n\nこのコードは、データ処理および変換の一部を実行するループです。以下はこのコードの主要な要点です：\n\n- ids = series.series_id.unique(): series データフレームから一意の series_id を取得し、それらを ids として保持します。これにより、異なるシリーズの処理を行うためのループが可能になります。\n\n- メインのループ\n\n    ①: ループは series の各 series_id に対して実行されます。\n\n    ②: 各 series_id に対して、対応するイベントデータ viz_events とシリーズデータ viz_series が取得されます。\n\n    ③: viz_series には timestamp カラムがあり、これを日時の形式に変換し、さらに hour カラムを追加して時間を取得します。\n\n    ④: viz_events データから \"onset\" イベントと \"wakeup\" イベントの組み合わせを見つけ、それらの時間範囲を viz_targets に追加します。\n\n    ⑤: ガウス分布を使用して、各 viz_targets の時間範囲に対するガウス分布を計算し、target_guassian に格納します。\n\n    ⑥: ガウス分布の値を正規化し、viz_series データに \"onset\" と \"wakeup\" カラムとして追加します。\n\n    ⑦: 新しいデータフレーム new_df に必要な列を抽出し、CSVファイルとして保存します。\n\n    ⑧: 最終的に、enmo_dfs に new_df を追加します。\n\nこのループを通じて、異なる series_id に対してイベントデータとシリーズデータを結合し、データの変換と前処理を行います。そして、各 series_id のデータを独自のCSVファイルに保存します。このプロセスを複数の series_id に対して繰り返し実行します。","metadata":{}},{"cell_type":"code","source":"targets = []\ndata = []\nids = series.series_id.unique()\n\nenmo_dfs = pd.DataFrame()\n\nfor j, viz_id in tqdm(enumerate(ids), total=len(ids)):\n    viz_targets = []\n    viz_events = events[events.series_id == viz_id]\n    viz_series = series.loc[(series.series_id==viz_id)].copy().reset_index()\n    viz_series['dt'] = pd.to_datetime(viz_series.timestamp,format = '%Y-%m-%dT%H:%M:%S%z').astype(\"datetime64[ns, UTC-04:00]\")\n    viz_series['hour'] = viz_series['dt'].dt.hour\n\n    check = 0\n    for i in range(len(viz_events)-1):\n        if viz_events.iloc[i].event =='onset' and viz_events.iloc[i+1].event =='wakeup' and viz_events.iloc[i].night==viz_events.iloc[i+1].night:\n            start,end = viz_events.timestamp.iloc[i],viz_events.timestamp.iloc[i+1]\n\n            start_id = viz_series.loc[viz_series.timestamp ==start].index.values[0]\n            end_id = viz_series.loc[viz_series.timestamp ==end].index.values[0]\n            viz_targets.append((start_id,end_id))\n            check+=1\n\n    target_guassian = np.zeros((len(viz_series),2))\n\n    for s,e in viz_targets:\n        st1,st2 = max(0,s-SIGMA//2),s+SIGMA//2+1\n        ed1,ed2 = e-SIGMA//2,min(len(viz_series),e+SIGMA//2+1)\n        target_guassian[st1:st2,0] = gauss()[st1-(s-SIGMA//2):]\n        target_guassian[ed1:ed2,1] = gauss()[:SIGMA+1-((e+SIGMA//2+1)-ed2)]\n\n    target_guassian /= np.max(target_guassian + 1e-12)\n\n    viz_series['onset'] = target_guassian[:,0]\n    viz_series['wakeup'] = target_guassian[:,1]\n\n    new_df = viz_series[['step', 'anglez', 'enmo', 'hour', 'onset', 'wakeup']]\n    new_df.to_csv(f'{out_dir}/{viz_id}.csv', index=False)\n\n    enmo_dfs = pd.concat([enmo_dfs, new_df] ,axis=0)","metadata":{"execution":{"iopub.status.busy":"2023-10-22T05:11:03.568424Z","iopub.execute_input":"2023-10-22T05:11:03.568818Z","iopub.status.idle":"2023-10-22T05:13:44.269989Z","shell.execute_reply.started":"2023-10-22T05:11:03.568789Z","shell.execute_reply":"2023-10-22T05:13:44.268182Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### セル8\n\nこのコードは、enmo_dfs データフレームをリセットして、新しいインデックスを追加した後、最初の数行を表示する処理です。\n\n- enmo_dfs = enmo_dfs.reset_index(): reset_index() メソッドは、データフレームのインデックスをリセットし、新しいデフォルトの整数インデックスを追加します。これにより、元のデータフレームに存在していたカスタムインデックスが削除されます。\n\n- enmo_dfs.head(): head() メソッドはデータフレームの最初のいくつかの行を表示します。これにより、データの先頭部分が確認できます。\n\nしたがって、enmo_dfs データフレームは新しいデフォルトの整数インデックスを持つようにリセットされ、その最初の行が表示されます。データフレームの状態や内容を確認できます。","metadata":{}},{"cell_type":"code","source":"enmo_dfs = enmo_dfs.reset_index()\nenmo_dfs.head()","metadata":{"execution":{"iopub.status.busy":"2023-10-22T05:13:46.68415Z","iopub.execute_input":"2023-10-22T05:13:46.68456Z","iopub.status.idle":"2023-10-22T05:13:46.747233Z","shell.execute_reply.started":"2023-10-22T05:13:46.684527Z","shell.execute_reply":"2023-10-22T05:13:46.746222Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### セル9\n\nこのコードは、enmo_dfs データフレームの enmo カラムの平均値と標準偏差を計算し、それらの値を NumPy の np.save() 関数を使用してファイルに保存し、その後、平均値と標準偏差を表示します。以下は各行動の詳細です：\n\n- enmo_mean = enmo_dfs['enmo'].mean(): enmo_dfs データフレームから enmo カラムを選択し、その平均値を計算し、enmo_mean に代入します。これにより、enmo カラムの平均値が取得されます。\n\n- np.save('enmo_mean.npy', enmo_mean): enmo_mean の値を NumPy の np.save() 関数を使用してファイルに保存します。これにより、'enmo_mean.npy' という名前のファイルに平均値が保存されます。\n\n- enmo_std = enmo_dfs['enmo'].std(): enmo_dfs データフレームから enmo カラムを選択し、その標準偏差を計算し、enmo_std に代入します。これにより、enmo カラムの標準偏差が取得されます。\n\n- np.save('enmo_std.npy', enmo_std): enmo_std の値を NumPy の np.save() 関数を使用してファイルに保存します。これにより、'enmo_std.npy' という名前のファイルに標準偏差が保存されます。\n\n- print(f'mean:{enmo_mean:.6f}, std:{enmo_std:.6f}'): 平均値と標準偏差が表示されます。f-string を使用して、小数点以下6桁までの精度で表示されます。\n\nこのコードは、データの統計的特性である平均値と標準偏差を計算し、ファイルに保存するために使用されています。","metadata":{}},{"cell_type":"code","source":"enmo_mean = enmo_dfs['enmo'].mean()\nnp.save('enmo_mean.npy', enmo_mean)\nenmo_std = enmo_dfs['enmo'].std()\nnp.save('enmo_std.npy', enmo_std)\nprint(f'mean:{enmo_mean:.6f}, std:{enmo_std:.6f}')","metadata":{"execution":{"iopub.status.busy":"2023-10-22T05:13:46.851794Z","iopub.execute_input":"2023-10-22T05:13:46.852177Z","iopub.status.idle":"2023-10-22T05:13:46.877577Z","shell.execute_reply.started":"2023-10-22T05:13:46.852148Z","shell.execute_reply":"2023-10-22T05:13:46.876794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}