def get_weather_dict(lines): """ 気象データの辞書を返す """ weather_dict = {} # 引数の検査 if len(lines) == 0: return {} # 要素数(エラーを排除するのに使う)を推定 sizes = [0] * 50 loop = 50 if len(lines) < loop: loop = len(lines) for i in range(loop): field = lines[i].split(",") if len(field) > len(sizes): print("--size over on read_weather_data()--") sizes[len(field)] += 1 # エラーが出て止まってくれたほうがいいと思う・・・ th = sizes.index(max(sizes)) - 1 # 最初のフィールドには時刻が入っているはずで、これはカウントしないので1を引く #print("th: ", th) # 観測値にバラす for line in lines: #print(line) line = line.rstrip() if "時" in line: continue field = line.split(",") t = field[0] t = timeKM.getTime(t) field = field[1:] new_field = [] for mem in field: #print(mem) fuga = mem.replace(".", "") fuga = fuga.replace(" )", "") # 観測上のおかしなデータにくっつく記号 if len(fuga) > 0: if "-" == fuga[0]: fuga = fuga[1:] fuga = fuga.replace("-", "") # -10, 10- みたいなパターン。数値の前のマイナス符号があれば負値。 if fuga.isdigit() == True: mem = mem.replace(" )", "") if "-" == mem[-1]: # 10- みたいなパターンへの対応 mem = mem[:-1] new_field.append(float(mem)) else: if mem == "": new_field.append(0.0) elif mem == "×" or mem == "///": # 恐らく、非観測項目にくっつく記号 new_field.append(None) else: new_field.append(mem) #exit() #print(new_field) if len(new_field) >= th: weather_dict[t] = new_field else: weather_dict[t] = None return weather_dict
def read_correct_and_create_features(feature_func, raw_data, terms, fname="unkai_date.csv"): """ 正解データを読み込んで、特徴ベクトルと共に返す raw_data: 気象データ """ # 観測結果を読み込む data = {} with open(fname, "r", encoding="utf-8-sig") as fr: lines = fr.readlines() for line in lines: line = line.rstrip() date, value, verify_flag = line.split("\t") if value == "x": continue date = timeKM.getTime(date + " 0:0:0") if check_date(terms, date): data[date] = [value, verify_flag] # 教師データを作る dates = sorted(data.keys()) for _date in dates: #print(_date) _feature = feature_func(_date, raw_data) # 特徴ベクトルを作る #print(_feature) if _feature != None: data[_date].append(_feature) return data
def read_correct_and_create_features(feature_generator, terms, fname="unkai_date.csv"): """ 正解データを読み込んで、特徴ベクトルと共に返す argvs: feature_generator: 特徴ベクトル生成器(日付を渡すと特徴ベクトルを作成するオブジェクト) terms: 対象期間 fname: 正解データの記述されたテキストファイル """ # 観測結果を読み込む data = {} with open(fname, "r", encoding="utf-8-sig") as fr: lines = fr.readlines() for line in lines: line = line.rstrip() date, value, verify_flag = line.split("\t") if value == "x": #continue value = 0 # あまりに欠損が多いので、Twitterを信じるなら出なかったものとして扱ってOKだと思う. date = timeKM.getTime(date + " 0:0:0") if check_date(terms, date): data[date] = [value, verify_flag] # 教師データを作る dates = sorted(data.keys()) for _date in dates: #print(_date) _feature = feature_generator.get_feature(_date) # 特徴ベクトルを作る #print(_feature) if not _feature is None: data[_date].append(_feature) return data
def getClockDict(txt): """ テキストデータの実験ログから、時刻をキーとした辞書を作成して返す """ ans = {} dataList = getHealthyDataList(txt) # 実験データからリストを作る for one in dataList: # リストを走査しながら時刻をキーとした辞書を作成 time = timeKM.getTime(one) # 時刻を取得 ans.update(dict({time: one})) return ans
def getClockDict(txt): """ テキストデータの実験ログから、時刻をキーとした辞書を作成して返す """ ans = {} dataList = getHealthyDataList(txt) # 実験データからリストを作る for one in dataList: # リストを走査しながら時刻をキーとした辞書を作成 time = timeKM.getTime(one) # 時刻を取得 ans.update(dict({time:one})) return ans
def __init__(self, feature_generator, terms, fname_observational_data="unkai_date.csv"): """ arg: terms: 対象期間 """ self._fg = feature_generator self._term = terms self._all_feature_set = {} self._good_date = [] self._bad_date = [] self._verify_good_date = [] self._verify_bad_date = [] # 雲海発生データを読み込む 未観測も含めて取得する lines = [] with open(fname_observational_data, "r", encoding="utf-8-sig") as fr: lines = fr.readlines() for line in lines: line = line.rstrip() date, value, verify_flag = line.split("\t") date = timeKM.getTime(date + " 0:0:0") if self._check_date(terms, date) == False: continue if value == "1": # 雲海が出た self._good_date.append(date) if verify_flag == "v": self._verify_good_date.append(date) elif value == "0": # 雲海が出てない(もしくは、出ていても良い景色ではない) self._bad_date.append(date) if verify_flag == "v": self._verify_bad_date.append(date) elif value == "x": # 雲海が出たか不明 self._bad_date.append( date) # あまりに欠損が多いので、Twitterを信じて出なかったものとして扱ってOKだと思う. #print(self._good_date) # 教師データを作る for date_start, date_end in terms: _date = date_start while _date <= date_end: _feature = self._fg.get_feature(_date) # 特徴ベクトルを作る if not _feature is None: point = get_unkai(_date, self._good_date) self._all_feature_set[_date] = (_date, _feature, point) _date += datetime.timedelta(days=1)
def getClockList(txt): """ テキストデータの実験ログから、時刻をリストに格納して返す return: None: 正常な実験データが得られなかった場合 """ ans = [] dataList = getHealthyDataList(txt) # 実験データからリストを作る if len(dataList) == 0: return None #print(dataList[0]) for one in dataList: # リストを走査しながら時刻をキーとした辞書を作成 #print(one) time = timeKM.getTime(one) # 時刻を取得 #print(time) ans.append(time) return ans
def getClockDict(txt): """ テキストデータの実験ログから、時刻をキーとした辞書を作成して返す return: None: 正常な実験データが得られなかった場合 """ ans = {} dataList = getHealthyDataList(txt) # 実験データからリストを作る if len(dataList) == 0: return None #print(dataList[0]) for one in dataList: # リストを走査しながら時刻をキーとした辞書を作成 #print(one) time = timeKM.getTime(one) # 時刻を取得 #print(time) ans.update(dict({time:one})) return ans
def getClockDict(txt): """ テキストデータの実験ログから、時刻をキーとした辞書を作成して返す return: None: 正常な実験データが得られなかった場合 """ ans = {} dataList = getHealthyDataList(txt) # 実験データからリストを作る if len(dataList) == 0: return None #print(dataList[0]) for one in dataList: # リストを走査しながら時刻をキーとした辞書を作成 #print(one) time = timeKM.getTime(one) # 時刻を取得 #print(time) ans.update(dict({time: one})) return ans
def __init__(self, feature_generator, terms, fname_observational_data="unkai_date.csv"): """ arg: terms: 対象期間 """ self._fg = feature_generator self._term = terms self._all_feature_set = {} self._good_date = [] self._bad_date = [] self._verify_good_date = [] self._verify_bad_date = [] # 雲海発生データを読み込む 未観測も含めて取得する lines = [] with open(fname_observational_data, "r", encoding="utf-8-sig") as fr: lines = fr.readlines() for line in lines: line = line.rstrip() date, value, verify_flag = line.split("\t") date = timeKM.getTime(date + " 0:0:0") if self._check_date(terms, date) == False: continue if value == "1": # 雲海が出た self._good_date.append(date) if verify_flag == "v": self._verify_good_date.append(date) elif value == "0": # 雲海が出てない(もしくは、出ていても良い景色ではない) self._bad_date.append(date) if verify_flag == "v": self._verify_bad_date.append(date) elif value == "x": # 雲海が出たか不明 self._bad_date.append(date) # あまりに欠損が多いので、Twitterを信じて出なかったものとして扱ってOKだと思う. #print(self._good_date) # 教師データを作る for date_start, date_end in terms: _date = date_start while _date <= date_end: _feature = self._fg.get_feature(_date) # 特徴ベクトルを作る if not _feature is None: point = get_unkai(_date, self._good_date) self._all_feature_set[_date] = (_date, _feature, point) _date += datetime.timedelta(days=1)
def main(): # 予想したい日の日付けを設定 target_date = None _day = dt.now() # まずはコマンドライン引数による指定がない場合を想定 if _day.hour >= 10: # この時刻を過ぎると、翌日の予想を実施する _day += td(days=1) target_date = dt(year=_day.year, month=_day.month, day=_day.day) argvs = sys.argv # コマンドライン引数を格納したリストの取得 argc = len(argvs) # 引数の個数 if argc >= 2: # 引数で計算対象の日を渡す arg = argvs[1] arg += " 0:0:0" # 時分秒を加える t = timeKM.getTime(arg) if t != None: target_date = t print(target_date) # 予測を実行する時刻を決定する(引数がなければスクリプト実行時の時刻が使われる) process_hour = dt.now().hour if argc >= 3: # 引数で予想実行時刻を渡す(その時刻に雲海が出るかを確認するものではない) arg = argvs[2] if arg.isdigit(): process_hour = int(arg) # 予報する対象の時刻 target_time = 23 if 23 > process_hour >= 16: target_time = 16 # アメダスの観測所オブジェクトを作成 amedas_nodes = amd.get_amedas_nodes() #print(amedas_nodes) # 特徴ベクトルを生成するオブジェクトの用意 features_dict = {} for block_no in ["47819", "1240", "0962", "47818"]: node = amedas_nodes[block_no] lines = get_amedas_data(node, target_date) weather_data = feature.get_weather_dict(lines) _keys = sorted(weather_data.keys()) # 確認のために表示 for a_key in _keys: print(block_no, weather_data[a_key]) if int(node.block_no) > 47000: features_dict[block_no] = [weather_data, feature.index_A] else: features_dict[block_no] = [weather_data, feature.index_B] fg_obj = feature.feature_generator(target_time, features_dict) # 機械学習オブジェクトを生成 clf = mc.load(os.path.abspath("./learned_machine/time" + str(target_time))) print(type(clf)) # 特徴ベクトルを生成 _feature = fg_obj.get_feature(target_date) _feature = np.array([_feature]) # TensorFlowはnumpy.arrayの2重の入れ子でないと動かない print(_feature) # 予測を実施 print("--predict--") print("target date: " + str(target_date)) print("process hur: " + str(process_hour)) results = [] #if _feature != None: #if not None in _feature: # Noneがあると計算出来ない test = clf.predict(_feature) results.append((target_date, test[0], _feature)) print(test) # 予測結果を保存 with open("result.csv", "w") as fw: for result in results: _date, predict_result, _feature = result str_feature = [str(x) for x in _feature] fw.write(str(dt.now())) fw.write(",") fw.write(str(_date)) fw.write(",") fw.write(str(predict_result)) fw.write(",") fw.write("$") fw.write(",") fw.write(",".join(str_feature)) fw.write("\n") return results
# 特徴ベクトルと正解値をくっつけたファイルを作成する import copy from datetime import timedelta as td from datetime import datetime as dt import timeKM data_store = {} with open("fusion_power.csv", "r", encoding="utf-8-sig") as fr: lines = fr.readlines() for line in lines: # 1行ずつ取り出す line = line.rstrip() # 改行コード削除 date, value = line.split(",") # 分割 date = timeKM.getTime(date) value = int(value) # 文字列を整数化 data_store[date] = value def get_season(_date): """ 日付けをシーズン化したもの 元旦から数えて第何週かを返す。 """ return int( (_date - dt(_date.year, 1, 1)).total_seconds() / (7 * 24 * 3600)) def get_data_aday(_date, data): _date = dt(_date.year, _date.month, _date.day) # 3日前の0時 ans = [] for i in range(24): # 24時間分の実績値を取得する
def main(): # 予想したい日の日付けを設定 target_date = None _day = dt.now() # まずはコマンドライン引数による指定がない場合を想定 if _day.hour >= 10: # この時刻を過ぎると、翌日の予想を実施する _day += td(days=1) target_date = dt(year=_day.year, month=_day.month, day=_day.day) argvs = sys.argv # コマンドライン引数を格納したリストの取得 argc = len(argvs) # 引数の個数 if argc >= 2: # 引数で計算対象の日を渡す arg = argvs[1] arg += " 0:0:0" # 時分秒を加える t = timeKM.getTime(arg) if t != None: target_date = t print(target_date) # 予測を実行する時刻を決定する(引数がなければスクリプト実行時の時刻が使われる) process_hour = dt.now().hour if argc >= 3: # 引数で予想実行時刻を渡す(その時刻に雲海が出るかを確認するものではない) arg = argvs[2] if arg.isdigit(): process_hour = int(arg) # アメダスの観測所オブジェクトを作成 amedas_nodes = amd.get_amedas_nodes() #print(amedas_nodes) # 観測データを読み出す #node_A = amedas_nodes["阿蘇山"] node_A = amedas_nodes["熊本"] # 2015-09の噴火で阿蘇山頂のデータが得られないので、熊本に差し替え lines_A = get_amedas_data(node_A, target_date) node_B = amedas_nodes["阿蘇乙姫"] lines_B = get_amedas_data(node_B, target_date) # 観測データを処理して、特徴量の生成に適したオブジェクトに変更 weather_data_A = feature.get_weather_dict(lines_A) weather_data_B = feature.get_weather_dict(lines_B) raw_data = [weather_data_A, weather_data_B] #print(weather_data_Aso) #print(weather_data_Otohime) # 機械学習オブジェクトを生成 clf = ml() if 23 > process_hour >= 16: with open('entry_16.pickle', 'rb') as f: clf = pickle.load(f) # オブジェクト復元 else: with open('entry_23.pickle', 'rb') as f: clf = pickle.load(f) # オブジェクト復元 # 特徴ベクトルを生成 _feature = None if 23 > process_hour >= 16: _feature = feature.create_feature16(target_date, raw_data) else: _feature = feature.create_feature23(target_date, raw_data) print(_feature) # 予測を実施 print("--predict--") print("target date: " + str(target_date)) print("process hur: " + str(process_hour)) done = False results = [] if _feature != None: if not None in _feature: # Noneがあると計算出来ない test = clf.predict(_feature) results.append((target_date, test[0], _feature)) print(test) done = True if done == False: results.append((target_date, "NA", _feature)) print("--can't predict. There is None data in feature-vector.--") # 予測結果を保存 with open("result.csv", "w") as fw: for result in results: _date, predict_result, _feature = result str_feature = [str(x) for x in _feature] fw.write(str(dt.now())) fw.write(",") fw.write(str(_date)) fw.write(",") fw.write(str(predict_result)) fw.write(",") fw.write("$") fw.write(",") fw.write(",".join(str_feature)) fw.write("\n") return results
def __init__(self, raw_data, feature_generation_func, terms, fname_observational_data="unkai_date.csv"): """ arg: raw_data: アメダスの観測データ terms: 対象期間 """ self._raw_data = raw_data self._feature_generation_func = feature_generation_func self._term = terms self._good_feature_set = {} self._bad_feature_set = {} self._all_feature_set = {} self._good_date = [] self._bad_date = [] self._unknown_date = [] self._verify_bad_date = [] self._verify_good_date = [] # 雲海発生データを読み込む 未観測も含めて取得する with open(fname_observational_data, "r", encoding="utf-8-sig") as fr: lines = fr.readlines() for line in lines: line = line.rstrip() date, value, verify_flag = line.split("\t") date = timeKM.getTime(date + " 0:0:0") if self._check_date(terms, date) == False: continue if value == "1": self._good_date.append(date) if verify_flag == "v": self._verify_good_date.append(date) elif value == "0": self._bad_date.append(date) if verify_flag == "v": self._verify_bad_date.append(date) elif value == "x": self._unknown_date.append(date) #print(self._good_date) # 教師データを作る #unkai_label = ["st0", "st1", "st2", "st3", "st4", "st5", "st6", "st7"] #unkai_label = ["st0", "st1"] unkai_label = [0, 1] for date_start, date_end in terms: _date = date_start while _date <= date_end: if _date in self._unknown_date: # 未観測とはっきりしている場合は特徴ベクトル生成の対象外 _date += datetime.timedelta(days=1) continue #print(_date) _feature = self._feature_generation_func(_date, raw_data) # 特徴ベクトルを作る #print(_feature) if _feature != None: unkai_point = get_unkai(_date, self._good_date)# + get_unkai_pre1(_date, unkai_date_list) + get_unkai_pre2(_date, unkai_date_list) label = unkai_label[unkai_point] if label == unkai_label[0]: self._bad_feature_set[_date] = (_date, _feature, label) # 時刻と一緒にタプルで保存 else: self._good_feature_set[_date] = (_date, _feature, label) self._all_feature_set[_date] = (_date, _feature, label) _date += datetime.timedelta(days=1)
# 特徴ベクトルと正解値をくっつけたファイルを作成する import copy from datetime import timedelta as td from datetime import datetime as dt import timeKM temperature_store = {} with open("amedas_47893kouchi.csv", "r", encoding="utf-8-sig") as fr: lines = fr.readlines() for line in lines: # 1行ずつ取り出す line = line.rstrip() # 改行コード削除 field = line.split(",") # 分割 date = timeKM.getTime(field[0]) value = 9999 if field[5].replace(".", "", 1).isdigit(): # 数値化可能か確認 value = float(field[5]) # 文字列を数値化 temperature_store[date] = value data_store = {} with open("fusion_power.csv", "r", encoding="utf-8-sig") as fr: lines = fr.readlines() for line in lines: # 1行ずつ取り出す line = line.rstrip() # 改行コード削除 date, value = line.split(",") # 分割 date = timeKM.getTime(date) value = int(value) # 文字列を整数化 data_store[date] = value
def get_weather_dict(lines): """ 気象データの辞書を返す """ weather_dict = {} # 引数の検査 if len(lines) == 0: return {} # 要素数(エラーを排除するのに使う)を推定 sizes = [0] * 50 loop = 50 if len(lines) < loop: loop = len(lines) for i in range(loop): field = lines[i].split(",") if len(field) > len(sizes): print("--size over on read_weather_data()--") sizes[len(field)] += 1 # エラーが出て止まってくれたほうがいいと思う・・・ th = sizes.index(max(sizes)) - 1 # 最初のフィールドには時刻が入っているはずで、これはカウントしないので1を引く #print("th: ", th) # 観測値にバラす for line in lines: #print(line) line = line.rstrip() if "時" in line: continue field = line.split(",") t = field[0] t = timeKM.getTime(t) field = field[1:] new_field = [] for mem in field: #print(mem) if "東" in mem or "西" in mem or "南" in mem or "北" in mem: mem = re.sub(" | |[)]", "", mem) fuga = mem.replace(".", "") fuga = fuga.replace(" )", "") # 観測上のおかしなデータにくっつく記号 #if len(fuga) > 0: # if "-" == fuga[0]: # fuga = fuga[1:] fuga = fuga.replace("-", "") # -10, 10- みたいなパターン。数値の前のマイナス符号があれば負値。 fuga = fuga.replace("+", "") # +10, 10+ みたいなパターン。 if fuga.isdigit() == True: mem = mem.replace(" )", "") if "-" == mem[-1] or "+" == mem[-1]: # 10-, 10+ みたいなパターンへの対応 mem = mem[:-1] new_field.append(float(mem)) else: if mem == "" or mem == "--": new_field.append(0.0) elif mem == "nan" or mem == "×" or mem == "///": # 恐らく、非観測項目にくっつく記号 new_field.append(None) else: new_field.append(mem) #exit() #print(new_field) if len(new_field) >= th: weather_dict[t] = new_field else: weather_dict[t] = None return weather_dict