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)+최댓값제한')
마지막 수정 일자