tottocoslowlifer / tide

2024年のプロジェクト
0 stars 0 forks source link

2月11日 コメント #2

Closed victor-von-pooh closed 7 months ago

victor-von-pooh commented 7 months ago

対応事項

  1. データの取得先を tide/data/Moji_Tide_2011-2021/README.md に記載する
  2. tide/data/Moji_Tide_2011-2021 内のデータに2種類のフォルダを作成し, 生データと加工済みデータに分ける a. 加工済みデータは普通1つにまとめる b. 容量が大きすぎる場合のみ分割する
  3. 生データ $\rightarrow$ 加工データのスクリプトを tide 以下のフォルダに適切に入れる
  4. 一度加工データを削除し, 同じようにデータが格納できることの確認が取れたら tide/README.md ファイルに手順を記載する
tottocoslowlifer commented 7 months ago

1,2まで完了しました. 3に関してですが,スクリプトというファイルを作りました. csvファイルへの変換までは書けたのですが,その後のパスの通し方が分からず,困っております.

victor-von-pooh commented 7 months ago

コメント

1,2まで完了しました.

了解です, 確認済み.

3に関して

まず簡単な対応をお願いします.

次に, 相談です. tide/scripts/csv-convert.py はどこで実行しますか?

  1. tide フォルダ上で python3 scripts/csv-convert.py
  2. tide/scripts フォルダ上で python3 csv-convert.py

これは相対パスを扱う際に, 実行したディレクトリによってはエラーが起きるため必ず対応しなければいけないことになります. どちらでも構いませんが, どのようにファイルを実行するかは tide/README.md に必ず記載しましょう.

1 $\rightarrow$ フォルダ間の移動が無くてすむ, 他のファイルの実行の時の統一ができる(推奨) 2 $\rightarrow$ 実行時の間違いが少なくなる

tottocoslowlifer commented 7 months ago

夜分に失礼します. リネームが完了いたしました.

1の, tideフォルダ上の場合で実行したいです.よろしくお願いいたします.

victor-von-pooh commented 7 months ago

対応事項

以下のコメントの対応をよろしくお願いいたします.

  1. プログラムの構造を変える
  2. 生データを読み込むための関数を作成する
  3. txt_csv_converter() 関数の修正を行う
  4. メインの実行プログラムとして main() 関数を作成する

プログラムの構造を変える

csv-convert.py ファイルの構造を次のようにする.

import csv
import os
# 2行
# 空ける
def txt_csv_converter():
    ~~~
    ~~~
    return ***
# 2行
# 空ける
def get_raw_data():
    ~~~
    ~~~
    return ***
# 2行
# 空ける
def main():
     ~~~
     ~~~
    return ***
# 2行
# 空ける
if __name__ == '__main__':
    main()
# 1行空ける

get_raw_data() 関数の命名は暫定的なもの. if __name__ == '__main__': 以下は main() のみ.

生データを読み込むための関数を作成する

上記で get_raw_data() 関数に相当するものを作成する. import os をしているので os ライブラリが使える.

def get_raw_data(dir_path) -> list: # -> list とすると, この関数が list 型の返り値を持つことを示してくれる(アノテーション)
    filenames = sorted(os.listdir(dir_path)) # os.listdir(path) は path ディレクトリ下のファイル名(フォルダ名も含む)を list に str 型で全て格納する # sorted() でソートする
    return filenames # list 型で生データのファイル名を取得できる形にする

txt_csv_converter() 関数の修正を行う

現在の txt_csv_converter() 関数では第2,3引数が使われていない. また, 欠損値(9999)の対応もしたい.

def txt_csv_converter(filename, writer): # 引数は2つ
    with open(filename) as f:
        file = f.readlines()
        for row in file:
            read = []
            for i in range(12):
                if int(row[4 * i:4 * (i + 1)]) == 9999: # 9999を None へ
                    read.append(None)
                else:
                    read.append(int(row[4 * i:4 * (i + 1)])) # int 型で格納
            read += [
                int(row[69:73]),
                int(row[73:75]),
                int(row[75:77]),
                int(row[77:79]),
                int(row[79]),
            ]
            writer.writerow(read)

メインの実行プログラムとして main() 関数を作成する

def main():
    raw_dir = "data/Moji_Tide_2011-2021/raw"

    if os.path.isdir(raw_dir): # 生データのフォルダの存在を確認
        raw_filenames = get_raw_data(raw_dir)

        csv_dir = "data/Moji_Tide_2011-2021/csv"
        if os.path.isdir(csv_dir): # csv データのフォルダの存在を確認
            pass
        else: # 無ければ作る
            os.mkdir(csv_dir)

        filename = csv_dir + "/9010_2011-2021.csv"
        with open(filename, mode="w", newline="") as fw:
            writer = csv.writer(fw)

            writer.writerow(["ダウンロードした時刻:2024/2/11 19:37"])
            writer.writerow(
                [
                    "0時の潮高値(cm)",
                    "1時の潮高値(cm)",
                    "2時の潮高値(cm)",
                    "3時の潮高値(cm)",
                    "4時の潮高値(cm)",
                    "5時の潮高値(cm)",
                    "6時の潮高値(cm)",
                    "7時の潮高値(cm)",
                    "8時の潮高値(cm)",
                    "9時の潮高値(cm)",
                    "10時の潮高値(cm)",
                    "11時の潮高値(cm)",
                    "9010(門司の観測値コード)",
                    "20xx年",
                    "xx月",
                    "xx日",
                    "1(午前)/2(午後)",
                ]
            )

            for file in raw_filenames:
                raw_filename = raw_dir + "/" + file
                txt_csv_converter(raw_filename, writer)

    else: # 生データのフォルダが無ければエラーを吐く
        print("Exceptional Error:")
        print(f"{raw_dir} is not found")
tottocoslowlifer commented 7 months ago

ありがとうございます.対応が完了しました. また,main関数について,コードレビューのようなものを書いてみたのですが,以下で合っていますでしょうか.

お忙しいところ恐縮ですが,そちらもご確認いただけたら幸いです. よろしくお願いいたします.

def main():
    raw_dir = "data/Moji_Tide_2011-2021/raw"

    if os.path.isdir(raw_dir): # 生データのフォルダがあるなら
        raw_filenames = get_raw_data(raw_dir) #ファイル名のlist

        csv_dir = "data/Moji_Tide_2011-2021/csv" 
        if os.path.isdir(csv_dir): # csv データのフォルダがあるなら
            pass # そのまま
        else: # 無ければ
            os.mkdir(csv_dir) #作る

        filename = csv_dir + "/9010_2011-2021.csv" #指定のディレクトリ下に新しいファイルを作る
        with open(filename, mode="w", newline="") as fw: #今作ったファイルを書き込み用でopen
            writer = csv.writer(fw)

            #書き込み開始
            writer.writerow(["ダウンロードした時刻:2024/2/11 19:37"])
            writer.writerow(
                [
                    "0時の潮高値(cm)",
                    "1時の潮高値(cm)",
                    "2時の潮高値(cm)",
                    "3時の潮高値(cm)",
                    "4時の潮高値(cm)",
                    "5時の潮高値(cm)",
                    "6時の潮高値(cm)",
                    "7時の潮高値(cm)",
                    "8時の潮高値(cm)",
                    "9時の潮高値(cm)",
                    "10時の潮高値(cm)",
                    "11時の潮高値(cm)",
                    "9010(門司の観測値コード)",
                    "20xx年",
                    "xx月",
                    "xx日",
                    "1(午前)/2(午後)",
                ]
            )

            for file in raw_filenames: #rawディレクトリ下のファイル名を探索
                raw_filename = raw_dir + "/" + file #該当ファイルをraw_filenameとして定義
                txt_csv_converter(raw_filename, writer) #各ファイルごとに書き込み

    else: # 生データのフォルダが無ければエラーを吐く
        print("Exceptional Error:")
        print(f"{raw_dir} is not found")
victor-von-pooh commented 7 months ago

OKです. 最後に

こちらを対応いただいたらこのissueはcloseにします.

tottocoslowlifer commented 7 months ago

ありがとうございます. 確認が取れたので,対応を行いました. よろしくお願いいたします.

victor-von-pooh commented 7 months ago

tide/README.md の通りに実行してみましたが, 上手く動作しないようです.

スクリーンショット 2024-02-14 0 27 19

スクリーンショット 2024-02-14 0 27 36

解決方法は以下の2種類.

README.md の記述を変える

tide ディレクトリ上で, 以下のコマンドを実行する.

python3 scripts/csv-convert.py

csv-convert.py ファイルを書き換える

csv-convert.py ファイルの31行目を以下のように書き換える.

raw_dir = "../data/Moji_Tide_2011-2021/raw"

また, 36行目を以下のように書き換える.

csv_dir = "../data/Moji_Tide_2011-2021/csv"

tottocoslowlifer commented 7 months ago

2つ目の解決策を試してみたのですが,いかがでしょうか. こちらの端末では動作の確認が取れました.

ご確認お願いいたします.

victor-von-pooh commented 7 months ago

確認しました. LGTMなのでcloseします.