RefuteJMSHistory.py
RefuteJMSHistory.py
from president import president
from functions import *
from datetime import datetime, timedelta
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import argrelextrema
from pprint import pprint
#=== for Mac OS X
# to use Korean text in matplotlib
from matplotlib import rc
rc('font', family='AppleGothic')
plt.rcParams['axes.unicode_minus'] = False
#===
verbose = False
def G20RegimeChange(data_dict, time_start, time_end, fileName=''):
#===data pre-process
#step2: truncate time series
s2_date_time_dict = TruncateTimeSeries(data_dict, time_start, time_end)
#step3: make each time series to have same length
s3_date_time_dict = Padding(s2_date_time_dict)
#step4: transpose
s4_date_time_dict = Transpose(s3_date_time_dict)
#===plot
fig, ax = plt.subplots()
labels = s3_date_time_dict.keys()
for i in range(0, len(s4_date_time_dict)):
time_diff_list = s4_date_time_dict[i]
ax.scatter(time_diff_list, list(labels), marker="|", s=130)
base_shift = (time_end-time_start)
ax.barh(range(len(labels)), [time_end+base_shift]*len(labels), left=-base_shift.days, fill=False, align='center')
if verbose:
pprint(s4_date_time_dict)
ax.set_xlabel('연도')
ax.set_title('G20 정권 교체 시점')
xticks = [datetime(year, 6, 1) for year in range(time_start.year, time_end.year, 5)]
xticks += [datetime(1978, 6, 1)] + [datetime(2012, 6, 1)]
xlabels = [ str(time.year) for time in xticks]
plt.xticks(xticks, xlabels)
plt.xticks(rotation=70)
plt.xlim([time_start,time_end-timedelta(10,0,0,0)])
#draw vertical line
plt.axvline(x=datetime(1978, 6, 1), color='k')
plt.axvline(x=datetime(2012, 6, 1), color='k')
plt.grid(True, alpha=0.5, axis='x')
fig.tight_layout()
#save or show image
if fileName=='':
fileName = 'G20RegimeChange_' + str(time_start.year) + 'to' + str(time_end.year) + '.png'
plt.savefig(fileName, dpi=800)
def G20RegimeTimeDiff(data_dict, time_start, time_end, fileName='', errFunctor=AE, label=''):
#===data pre-process
#step2: truncate time series
#s2_date_time_dict = TruncateTimeSeries(data_dict, time_start, time_end)
s2_date_time_dict = data_dict
#===iteration over time
time_step = timedelta(1,0,0,0) # 1 day
N_iter = int((time_end - time_start) / time_step)
iter_time = [ time_start + time_step * i for i in range(N_iter) ]
#find the closest date of regime change at given time (time is an element of 'iter_time')
closest_date_diff = ClosestTimeDiff(s2_date_time_dict, iter_time, errFunctor)
#estimate the error function across the cross section (cross sectional analysis <-> time series analysis)
errors_mean, errors_std = EstimateError(closest_date_diff)
#===plot
fig, ax = plt.subplots()
width = 2.5
#ax.bar(iter_time, errors_mean, align='center', width=width, color='b')
ax.plot(iter_time, errors_mean, color='b', label=label)
ax.legend()
#ax.errorbar(iter_time, errors_mean, errors_std, alpha=0.05, color='y')
ax.set_xlabel('연도')
ax.set_ylabel('통계량')
ax.set_title('G20 정권 교체 시점과 특정 시점의 평균 최소 간격')
xticks = [datetime(year, 6, 1) for year in range(time_start.year, time_end.year, 5)]
xticks += [datetime(1978, 6, 1)] + [datetime(2012, 6, 1)]
xlabels = [ str(time.year) for time in xticks]
plt.xticks(xticks, xlabels)
plt.xticks(rotation=70)
plt.xlim([time_start,time_end-timedelta(10,0,0,0)])
# for local minima
np_errors_mean = np.array(errors_mean)
np_iter_time = np.array(iter_time)
local_minima_idx = argrelextrema(np_errors_mean, np.less, order=int(365.*5./float(time_step.days)))
print('local minima: ')
print(np_errors_mean[local_minima_idx])
print(np_iter_time[local_minima_idx])
#draw vertical line
plt.axvline(x=datetime(1978, 6, 1), color='k')
plt.axvline(x=datetime(2012, 6, 1), color='k')
plt.grid(True, alpha=0.5, axis='y')
plt.grid(True, alpha=0.5, axis='x')
fig.tight_layout()
#save or show image
if fileName=='':
fileName = 'G20RegimeTimeDiff_' + str(time_start.year) + 'to' + str(time_end.year) + '.png'
plt.savefig(fileName, dpi=800)
if __name__ == '__main__':
#===data pre-process
#data senity check
CheckTimeOrder(president)
#step1: string to datatime
s1_date_time_dict = ToDateTime(president)
G20RegimeChange(s1_date_time_dict, datetime(1950, 1, 1), datetime(1989, 12, 31), 'G20RegimeChange_1950to1989.png')
G20RegimeChange(s1_date_time_dict, datetime(1990, 1, 1), datetime(2020, 12, 31), 'G20RegimeChange_1990to2020.png')
G20RegimeTimeDiff(s1_date_time_dict, datetime(1950, 1, 1), datetime(2020, 12, 31), 'G20RegimeTimeDiff_1950to2020_MAE.png', errFunctor=AE, label='평균절대오차(MAE)')
G20RegimeTimeDiff(s1_date_time_dict, datetime(1950, 1, 1), datetime(2020, 12, 31), 'G20RegimeTimeDiff_1950to2020_clipedMAE.png', errFunctor=clipedAE, label='평균절대오차(MAE)+최댓값제한')마지막 수정 일자