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
Beispiel #4
0
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 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 __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
Beispiel #13
0
# 特徴ベクトルと正解値をくっつけたファイルを作成する
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
Beispiel #17
0
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