Closed victor-von-pooh closed 7 months ago
先に対応していただきたいことが出てきたので共有.
.gitignore
ファイルの作成参考1: .gitignore の書き方。ファイル/ディレクトリの除外 参考2: 【Xcode/Swift】Xcodeでの.gitignoreの設定方法、自分が使っている.gitignoreの内容を解説
こちらのコミットにより, tide/data/Moji_Tide_2011-2021/.DS_Store
というファイルが
追加されています.
ある意味仕方がないのですが, これは Mac で自動生成されてしまうフォルダやファイルに関するメタ情報が記載されているファイルです.
これ以外にも, GitHub にアップロードする際にリポジトリ内に追加したくないファイルが出てくると思います.
そんな時に役に立つのが, .gitignore
ファイルです.
tide/.gitignore
というファイルを作成し, そこの1行目に .DS_Store
と書くとそれ以降この名前のファイルが Git の差分として出てこなくなります.
上手くいかなかった場合はまたご連絡ください.
下の方の対応が完了しましたので,ご確認いただけたら幸いです.
また,PandasのDataFrameを用いて分析を行いたいと考えております. とりあえず, ステップ2と3を行ってみます.
確認しました. それでは2, 3からよろしくお願い致します.
まず,2を実行したファイル tide/data/Moji_Tide_2011-2021/csv/9010_2011-2021_edited.csv
をアップロードしました.
3を実行する過程で,pandasのto_datetimeを用いたいのですが,このままの書式では時刻が正しく認識されず,エラーとなりました. 上のファイルをさらに変形する必要があると考えたのですが,特に時刻(と午前/午後)に関して,具体的にどのように対処すれば良いか分からず,困っております.
よろしくお願いいたします.
お疲れ様です.
まず,2を実行したファイル
tide/data/Moji_Tide_2011-2021/csv/9010_2011-2021_edited.csv
をアップロードしました.
言い忘れていましたが, CSVやJSON, Text ファイルなどをプログラムを実行して作成した場合に, 作成したファイルのみのアップロードはやめましょう. 作成されたファイルがどのような手順で作られたのか, それが想定通りになっているのかがわかりません. また, あくまでプロジェクトの徹頭徹尾再現ができるように, 使ったプログラムは全て置きましょう.
VSCode で GitHub と連携しているのであれば簡単ですが, git commit ~~~
のようなターミナル上のコマンドで扱う場合は正しく動かしましょう. GitHub 上に直接のアップロードは NG です.
また, 今回アップロードしていただいたファイルですが, 作成は不要です. 理由としては, この後も編集する可能性がある(これ単体を使うことがあるかわからない)からです. 実際にモデル学習のフェーズに入る段階で, inputs の形式に合わせられるようにデータを整形して作成したファイルを置くのは良いと思いますが, 現段階ではそれも難しそうです.
まず, 対応いただくこととしては, データ分析に使っている Notebook ファイルをこまめに commit しましょう. 現在どのようなことを行っていて, どういう結果が得られているのかを常にフィードバックできるようにしましょう.
かしこまりました.
notebooks
というフォルダを作り,カラムへの集約を試みた際のNotebookファイルMoji_analysis.ipynb
をcommitしました.
ご確認及びレビューの程,よろしくお願いいたします.
お休み中のところ,恐れ入ります.
2015〜2016のデータをmatplotlibで分析してみました.
また,明日から26日(月)まで不在のため,修正等ができない状況です. よろしくお願いいたします.
お疲れ様です. 2月23日のコミットに対するフィードバックコメントになります.
2015~2016年の各時刻ごとの最大値の調査, 1日の中の変位の可視化, 2年間の潮位の変化の傾向分析, 非常に面白い分析ができていると思いました. 特に, 毎日約1時間ずつ波が遅れていくという事象が確認できたのは月の満ち欠けなどに起因すると考えて, 予測モデルの際の重要なファクターになりそうで, なるほどと思いました.
以降, 細かい粒度でのコメントになります.
セクションを分ける マークダウンを活用して, Notebook ファイル内のセクション分けをすると何をしている部分なのかがわかりやすくなると思います. 1個目のセルの上に「モジュール, データフレームの読み込み」というセクションが出来たまま, その後何も無いと不自然な気がします.
コーディングスタイルを統一する Matplotlib を使っているコードが, 15個目と18, 19個目のセルにありますが, それぞれ
15個目
fig, ax = plt.subplots(5,7)
plt.rcParams["figure.figsize"] = [15,10]
for i in range(5):
for j in range(7):
cnt = 7*i+j
ax[i, j].scatter(x=x, y=full_df.iloc[cnt,x])
ax[i, j].set_ylim(0,300)
ax[i, j].set_title(str(full_df["年月日"][cnt]))
18, 19個目
fig = plt.figure(figsize=(7,3))
plt.scatter(x=full_df["年月日"], y=full_max_df[max_index])
plt.title("Maximum Tide Level Change")
plt.xlabel("Date")
plt.ylabel("Daily Maximum Tide Level")
のように, 似たようなことが異なるスタイルで書かれています. もちろんどちらかにしかない機能を上手く活用できるように敢えて使い分けをするということはありますが, この場合は似たコードを使い回して統一できると思います.
import [内部ライブラリ] # アルファベット順
# 1行空ける
import [外部ライブラリ] # アルファベット順
# 1行空ける
import [自作ライブラリ or ファイル] # アルファベット順
9010(門司の観測値コード)
を消した df
を出力しているので必要ないですね.date_cols = ["20xx年", "xx月", "xx日"]
df["年月日"] = [
date(
2000 + int(df["20xx年"][i]),
int(df["xx月"][i]),
int(df["xx日"][i])
)for i in range(len(df))
]
df = df.drop(date_cols, axis=1)
df
7, 8個目のセルを結合して1つにしましょう
date_keys = []
for i in range(len(df)):
if df["年月日"][i] not in date_keys:
date_keys.append(df["年月日"][i])
am_cols = [f"{i}時の潮高値(cm)" for i in range(12)]
pm_cols = [f"{i}時の潮高値(cm)" for i in range(12,24)]
new_df_list = []
for i in range(len(date_keys)):
tmp = df[df["年月日"] == date_keys[i]].reset_index().drop("index", axis=1)
am_data = [item for item in tmp[tmp["1(午前)/2(午後)"] == 1][am_cols].values[0]]
pm_data = [item for item in tmp[tmp["1(午前)/2(午後)"] == 2][am_cols].values[0]]
new_df_list.append(am_data + pm_data)
time_cols = am_cols + pm_cols
df = pd.concat([pd.DataFrame(date_keys, columns=["年月日"]), pd.DataFrame(new_df_list, columns = time_cols)], axis=1)
df
11〜13個目のセルについて
start = new_df[new_df["年月日"] == date(2015, 1, 1)].index[0]
end = new_df[new_df["年月日"] == date(2017, 1, 1)].index[0]
の方が記述が簡単かもしれないです
全て結合して1つにしましょう
start = new_df[new_df["年月日"] == date(2015, 1, 1)].index[0]
end = new_df[new_df["年月日"] == date(2017, 1, 1)].index[0]
print(new_df["年月日"][start])
print(new_df["年月日"][end - 1])
full_df = new_df.iloc[start:end].reset_index().drop("index", axis=1)
full_df
x = list(range(2,25))
となっていますが, レンジが1から始まっていないのはなぜでしょうか? 1日あたり23点しかないのは何か意図があるのでしょうか?
ax[i, j].set_ylim(-50,300)
くらいの方が良さそうです.
ax[i, j].scatter(x=x, y=full_df.iloc[cnt,x])
とありますが, scatter
でも良いですが, plot
で描くと曲線が描けるのでそちらの方が良さそうな気はします.
冒頭35日分のデータを見ると、いずれの日においても極大値と極小値が1日に2回ずつ訪れていると予想できる。また、毎日約1時間ずつ、波が遅れていく。
16, 17個目のセルについて
次のようにしてセルを結合しましょう
full_df["最大値"] = full_df.drop("年月日", axis=1).max(axis=1)
full_df["最小値"] = full_df.drop("年月日", axis=1).min(axis=1)
full_df[["最大値", "最小値"]]
18, 19個目のセルについて
上記の変更を踏まえて
max_index = list(range(0,len(full_df)))
fig = plt.figure(figsize=(7,3))
plt.scatter(x=full_df["年月日"], y=full_df["最大値"])
plt.title("Maximum Tide Level Change")
plt.xlabel("Date")
plt.ylabel("Daily Maximum Tide Level")
plt.show()
などとしましょう
2015〜2016の2年間の、日毎の最大潮位の推移。どちらの年でも、潮位は8月から10月にかけて高く、2月から3月にかけて低くなっていることが分かる。最小値についてみても大体同じ.
上の直し等が確認出来次第, 次の分析に移りましょう. 方針が既に定まっているのであればそのまま続けてください. 手詰まりのようでしたら相談しましょう.
ありがとうございます.これから,直しに取り組みます. また,次の分析に関してはまだ方向性が定まっていない状態なので,相談させていただきたいです.
よろしくお願いいたします.
お疲れ様です.
ただいま,手直しが完了したのですが,notebooks/.ipynb_checkpoints/
が新たにアップロードされてしまいました.
gitignoreを使おうとしたものの,やり方がよく分からずにいます.
ご確認の程,よろしくお願いいたします.
@tottocoslowlifer お疲れ様です.
ただいま,手直しが完了したのですが,notebooks/.ipynb_checkpoints/が新たにアップロードされてしまいました. gitignoreを使おうとしたものの,やり方がよく分からずにいます.
秋田の知識不足でした. こちらの対応方法は次のようになるかと思われます(参考).
.gitignore
ファイルの2行目以降に
notebooks/.ipynb_checkpoints/
と書いておく.
なお, 既に出来ているアップロードされているフォルダについては, 手動で消す必要があると思われます.
まずはこれについて対応よろしくお願い致します. また, scripts/Moji_to-columns.py
の削除もしておきましょう.
よろしくお願い致します.
ありがとうございます. 対応が完了しましたので,ご確認お願いいたします.
1個目のセルは, matplotlib と pandas は外部ライブラリなので, 行間を空けずに
import datetime
import matplotlib.pyplot as plt
import pandas as pd
としましょう. こちらが直ったら次に行きましょう.
ご確認ありがとうございます. 対応が完了いたしました.
@tottocoslowlifer 確認が取れました. ありがとうございます.
まずは, セクション「全て欠損している日の削除」の最後に次の2つのセルを追加しましょう.
nan_index = []
for i in range(len(new_df)):
if new_df.loc[i].hasnans:
nan_index.append(i)
new_df.iloc[nan_index]
for index in nan_index:
print(new_df.iloc[index]["年月日"], ":")
print("\t", end="")
for col in time_cols:
if str(new_df.iloc[index][col]) == "nan":
print(col[:-8], end=' ')
print("\n")
1つ目のセルは, おそらく誤って消されてしまったセルになると思いますが, 以前の notebook における部分的な欠損が見られる日付を抽出した DataFrame を作るコードになります.
2つ目のセルは, 上記で出した DataFrame の各日の欠損している時間を print するコードになります.
これからは, 欠損値を補完する方法を考えていただくことになります.
第286話|知っておいて損のない時系列データの欠測値補完方法
ただし, どれも精度の良い補完が出来ているとは言い難い.
2015年1月1日〜2016年12月31日までの2年間のデータを用いて, 統計的に補完する方法を考えてみる.
例えば,
など.
月の満ち欠けや, 降水量などのデータを利用して重回帰分析などを試してみる.
ありがとうございます. 貼っていただいたリンクも確認させていただきました.
「メタ情報を考慮した補完」をやってみたいのですが,初めてのデータ分析には難しいでしょうか.その場合,「統計的情報を用いた補完」の1つ目の手段を試してみたいです.
@tottocoslowlifer ご確認ありがとうございます.
「メタ情報を考慮した補完」をやってみたいのですが,初めてのデータ分析には難しいでしょうか.
そんなことは無いと思われます. また, 「統計的情報を用いた補完」の方も試し, より良い方またはハイブリッド型を採用することを目標にするという意図でした. まずは統計的なアプローチをかけて, データの性質をより掴んでから「メタ情報を考慮した補完」に移れるようにしましょう.
わかりました.ご返信ありがとうございます. 今後の流れを理解したいのですが,明日2月28日(水)20:00-21:00ごろ,ミーティングに応じていただくことは可能でしょうか.
よろしくお願いいたします.
@tottocoslowlifer
今後の流れを理解したいのですが,明日2月28日(水)20:00-21:00ごろ,ミーティングに応じていただくことは可能でしょうか.
了解しました. それでは, Googleカレンダーの方にも予定を入れておいていただけますでしょうか?
よろしくお願い致します.
Zoom の URL はこちらになります.
トピック: 欠損値補完の方法検討についてのMTG 時刻: 2024年2月28日 08:00 PM 大阪、札幌、東京
参加 Zoom ミーティング https://tus-ac-jp.zoom.us/j/92156768099?pwd=VU1MOFdiNFVkdzhBZlNTVXRRWnVpUT09
ミーティング ID: 921 5676 8099 パスコード: 302739
ありがとうございます.確認いたしました.
データ分析: 欠損値補完についての終わりに伴い, 「統計的情報を用いた補完」はここまでにします.
続いて, 「メタ情報を考慮した補完」に移ろうと思いますが, そのための追加データの取得をしましょう.
こちらより,
の影響を受けているということだったので, 月齢カレンダーデータと気象庁の1時間ごとのデータを取得しましょう. どちらもどこでも使えるように, 潮位データの期間全てを取得しましょう.
気象データは,
は最低でも取得しましょう. その他のオプションは自己判断で追加しましょう.
ダウンロードした月齢データをVSCodeで開いたところ,日本語部分の文字化けが発生しました.
Shift JISのファイルが,VSCode標準のUTF-8でエンコーディングされてしまっているのが原因とみて,調べてみたのですが, 「エンコーディング付きで保存」の機能が反応せず,解決しません.
ご確認の程,お願いいたします.
ダウンロードした月齢データをVSCodeで開いたところ,日本語部分の文字化けが発生しました.
あるあるですね.
Shift JISのファイルが,VSCode標準のUTF-8でエンコーディングされてしまっているのが原因とみて,調べてみたのですが
良いですね, おそらく正しいと思われます◎
質問ですが, 月齢データの CSV ファイルを VSCode 上で確認したいということでしょうか?それとも, Python でコーディングする際に Pandas でエンコーディングができないということでしょうか?
前者であれば, ただ確認したいだけなら Google のスプレッドシートで開くのが良いかと思われます(VSCode 上ではセルのようなものはなく, 本当にただカンマ区切りになっているため). また二度手間ですが, スプレッドシートで開いたものをダウンロードすると UTF-8 に自動で変換された記憶があります.
後者であれば,
import pandas as pd
data = pd.read_csv("mooncal2000.csv", encoding="shift-jis")
data.to_csv("2000.csv")
とすれば, 2000.csv
という名前のファイルで UTF-8 のデータが取得できます.
おそらく後者の方が楽でしょう.
ありがとうございます. GitHub上で確認した際に,文字化けのために内容が確認できないということが気になっておりました.
ただいま,実験的にmooncal2011.csv
をGitHubからダウンロードしたところ,Excel等を使って内容の確認ができました.
その場合は気にしなくて大丈夫でしょうか.
GitHub上で確認した際に,文字化けのために内容が確認できないということが気になっておりました.
どうやら GitHub はUTF-8 の仕様にしか対応していないようですね. それなら生データではなく, UTF-8 にしたデータを置き直すのが良いかと思われます.
ありがとうございます.
Shift-JIS
のままで大丈夫でしょうか?
UTF-8 に直したデータを置き直してください.
かしこまりました.今から取り組みます. 加えて,降水量データ,気温データのアップロードを行い,月毎のデータを10年分まとめたファイルをそれぞれ作成しました. その際のコードはscriptsに載せてあります.
天気データのみ,取得に時間がかかっており,後ほど処理します.
加えて,降水量データ,気温データのアップロードを行い,月毎のデータを10年分まとめたファイルをそれぞれ作成しました. その際のコードはscriptsに載せてあります.
ありがとうございます. 降水量と気温, 天気は全て一括でデータ取得ができたと思いますが, 一つずつ分けたということでしょうか?
画像のように,ファイルサイズが大きすぎるため,一括で取得できませんでした.
また,先ほどの
UTF-8 に直したデータを置き直してください.
に関して,11:23現在,GitHub上で表示ができているかと思うのですが,この状態で大丈夫でしょうか. (特に何も手を加えていないのですが...)
画像のように,ファイルサイズが大きすぎるため,一括で取得できませんでした.
期間を短くして, 4ヶ月ごとのデータを取るなどはどうでしょうか?
確かに取得の面倒はありますが, データを後の処理で統合する際に, concatenate する必要がなくなります. どちらでも構いません.
11:23現在,GitHub上で表示ができているかと思うのですが,この状態で大丈夫でしょうか.
こちらで確認したところ, 文字化けは直っていないようです.
期間を短くして, 4ヶ月ごとのデータを取るなどはどうでしょうか?
データの取得時にミスをしそうなので,このままにしておきたいです.
こちらで確認したところ, 文字化けは直っていないようです.
下関のデータと勘違いしておりました.申し訳ありません.対応します.
対応が完了いたしました. ご確認の程,よろしくお願いいたします.
ご対応ありがとうございます.
以下コメントになります.
tide/scripts/Moon_convert.py
についてimport pandas as pd
cnt = 2011
for i in range(10):
dir = "../data/Moon_2011-2021"
data = pd.read_csv(dir + "/raw/mooncal" + str(cnt+i) + ".csv", encoding="shift-jis")
data.to_csv(dir + "/" + str(cnt+i) + ".csv")
まず, import pandas as pd
の下は2行空けましょう. また, dir = "../data/Moon_2011-2021"
は常に同じものを使っているので, for 文の外に出しましょう. あとは良いと思います.
tide/scripts/Shimonoseki_integrate.py
についてget_raw_dir()
関数と get_raw_data()
関数で行っていることが実質同じなように伺えます. 34行目は get_raw_dir()
関数を流用してできるのではないでしょうか? あとは良さそうですね.
ご確認ありがとうございます. ただいまコミットいたしました.
お疲れ様です. 以下コメントになります.
tide/data/Moon_2011-2021
についてこちら2021年のみありません. ご対応よろしくお願い致します.
また, 年ごとに分ける必要もないと思うので, 生データを tide/scripts/Moon_convert.py
で UTF-8 に直して置き換え, tide/data/Moon_2011-2021/20xx.csv
は全て削除し, 全データを統合した1つのファイルにまとめましょう.
それに伴い, tide/scripts/Moon_convert.py
も書き換えましょう.
tide/data/Shimonoseki_2011-2021
についてまず全体的に, 均質番号
の項は要らないと思われます. もちろんデータの性質上大事ではありますが, ほとんど使わない可能性の方が高い(使いづらい)ので削除しましょう. こちらも tide/scripts/Shimonoseki_integrate.py
を修正しましょう.
また, 天気のデータですが, すみません, こちらが確認不足でしたが欠損が多いのと判断が難しいため無しにしましょう. せっかく用意していただいたところ申し訳ございません. 削除対応をよろしくお願い致します.
お疲れ様です.
tide/scripts/Moon_convert.py
の編集をする過程で,生データをUTF-8に書き換えるコード(コメントアウトされている箇所)を加えたところ,エラーメッセージが出る.Mooncal_2011-2021.csv
にインデックスが表示されるようになってしまった.tide/scripts/Shimonoseki_integrate.py
で,均質番号
の削除に関するコードを追加しただけにも関わらず,以下のエラーが出るようになった.
dirnames.remove(".DS_Store")
ValueError: list.remove(x): x not in list
以上の3点で行き詰まっております. よろしくお願いいたします.
一旦コミットを元に戻しましょう. まず, こちらのリンクから元データをダウンロードし直して状態をリセットしましょう.
戻せたかと思います. ご確認の程よろしくお願いいたします.
ありがとうございます. ここは少し難しいので, 長めに時間を取れる(2時間程度かそれ以上を目安に)日時で一緒に進めましょう. またカレンダーの中で「空」の部分で都合がつくところに Zoom をセッティングしましょう.
ミーティング ID: 921 5676 8099 パスコード: 302739
ありがとうございます. 招待を送信させていただきました.
@tottocoslowlifer すみません, 次の issue に移る前に対応して頂きたいことがあります.
先ほどは気が付かなかったのですが, tide/data/Moon_2011-2021/raw/UTF-8_mooncal20xx.csv
ファイルについて, 月日
のカラムがありますが, このままだと data/Moon_2011-2021/Mooncal_2011-2021.csv
にまとめたときに何年かの情報が抜け落ちてしまうので, tide/scripts/Moon_convert.py
を再度書き直しましょう.
具体的には, まず1行目に import datetime
を追加し, get_raw_files()
関数
def get_raw_files(dir_path) -> list:
filenames = []
cnt = 2011
for i in range(11):
name = dir_path + "/raw/mooncal" + str(cnt+i) + ".csv"
save_name = dir_path + "/raw/UTF-8_mooncal" + str(cnt+i) + ".csv"
data = pd.read_csv(name, encoding="shift-jis")
data.to_csv(save_name, index=False)
filenames.append(save_name)
return filenames
を,
def get_raw_files(dir_path) -> list:
filenames = []
cnt = 2011
for i in range(11):
name = dir_path + "/raw/mooncal" + str(cnt+i) + ".csv"
save_name = dir_path + "/raw/UTF-8_mooncal" + str(cnt+i) + ".csv"
data = pd.read_csv(name, encoding="shift-jis")
cols = [col for col in data.columns if col != "月日"]
sorted_cols = ["年月日"] + cols
data["年月日"] = [
datetime.date(
cnt+i,
int(data["月日"][j].split("/")[0]),
int(data["月日"][j].split("/")[1]),
) for j in range(len(data))
]
data = data.drop("月日", axis=1).reindex(columns=sorted_cols)
data.to_csv(save_name, index=False)
filenames.append(save_name)
return filenames
のようにしましょう.
対応が完了いたしました. ご確認の程よろしくお願いいたします.
ご対応ありがとうございます.
次の issue を立てるのに少し時間が必要そうなので, 先に今までの中で各 README.md
ファイルに記載することが無いかを確認し, 対応をお願い致します.
また, 余裕があれば対応事項6の
tide ディレクトリ下に requirements.txt というファイルを作成し, 今回使ったライブラリの名称(pip3 install ~~~ の形で扱うライブラリ名)を1行ずつ追加する
こちらをお願い致します. 書き方の参考を置いておきます.
ありがとうございます.
README.md
ファイルの編集と,requirements.txt
の追加を行ったのですが,requirements.txt
にはnotebook内で使ったライブラリも記入するのでしょうか.
または,現在の状態のように,scripts
内のファイルでインポートしたものだけで良いでしょうか.
よろしくお願いいたします.
notebook も含め, 使った外部ライブラリ名を全て記載しましょう. 内部ライブラリは必要ありません.
かしこまりました. 対応が完了いたしました.
ご対応ありがとうございます. 以下コメントになります.
tide/requirements.txt
について1行目, matplotlib.pyplot
は matplotlib
にしましょう.
tide/README.md
についてスクリプトファイルが追加され, 実行が必要になっているのでこちらにその旨を記載しましょう.
対応事項
加工後のCSVデータを使ったデータ分析を行う.
requirements.txt
というファイルを作成し, 今回使ったライブラリの名称(pip3 install ~~~ の形で扱うライブラリ名)を1行ずつ追加する