def generate_graph(fname, ttype, utype): """ Make Daily Graph :param fname: :param ttype: :param utype: :return: """ # Basic Setting sns.set(style='darkgrid') myfont = fm.FontProperties(fname='C:/Windows/Fonts/msyh.ttc') path = "../Data/Graph/Statistic_Graph/Day/" + fname[6:-2] if not os.path.isdir(path): os.mkdir(path) color_array = ['Blue', 'Red', 'Green'] label_array = ['Borrow', 'Return', 'Total'] # Load data and plot borrow_data, return_data = LoadData.load_station_count(fname, ttype, utype) # print('borrow_data\n', borrow_data.head()) # print('return_data\n', return_data.head()) # x=input() header = list(borrow_data.columns) x_data = np.array(borrow_data.index) print('x_data', x_data) x_data = np.array([i for i in range(24)]) for col in header: fig, ax = plt.subplots(figsize=(8, 6), dpi=100) y1_data = borrow_data[col].values.T y2_data = return_data[col].values.T y3_data = y1_data + y2_data ax.plot(x_data, y1_data, color=color_array[0], label=label_array[0]) ax.plot(x_data, y2_data, color=color_array[1], label=label_array[1]) ax.plot(x_data, y3_data, color=color_array[2], label=label_array[2]) plt.title(col, fontproperties=myfont) plt.xlabel('Time') plt.ylabel('Count') plt.xticks(np.arange(24), borrow_data.index, rotation=45) if np.sum(y3_data) == 0: plt.ylim(ymin=0) else: plt.ylim(ymin=0, ymax=np.max(y3_data)) # Put a nicer background color on the legend. legend = ax.legend(loc='upper right') legend.get_frame().set_facecolor('C0') try: photo_path = path + '/' + col + '.png' plt.savefig(photo_path) except FileNotFoundError: col = col.replace('/', '-') photo_path = path + '/' + col + '.png' plt.savefig(photo_path) plt.ion() plt.pause(1) plt.close()
def week_time_series(fname, ttype, utype): """ 以一周 7天去統計每一小時區間的使用次數 開始天數往後推 7天, 第一天 2015-01-01 是禮拜四 以 day_time_series 計算完的 csv 檔去產生新的 csv """ header = ['Thu', 'Fri', 'Sat', 'Sun', 'Mon', 'Tue', 'Wed'] idx = [] pd_borrow_data, pd_return_data = (pd.DataFrame() for _ in range(2)) for file, days in zip(fname, header): borrow_data, return_data = LoadData.load_station_count( file, ttype, utype) idx += [(days, ) + make_tuple(x) for x in borrow_data.index] pd_borrow_data = pd.concat((pd_borrow_data, borrow_data), axis=0, ignore_index=True) pd_return_data = pd.concat((pd_return_data, return_data), axis=0, ignore_index=True) pd_borrow_data.index = idx pd_return_data.index = idx # print('pd_borrow_data\n', pd_borrow_data.head()) # print('pd_return_data\n', pd_return_data.head()) name = fname[0][6:16] + '~' + fname[-1][6:16] Export.week_station_count(pd_borrow_data, name, utype[0]) Export.week_station_count(pd_return_data, name, utype[1])
def month_time_series(fname, ttype, utype): """ 以一月的天數去統計每天的使用次數 第一個月是 2015-01 ~ 2017-05 以 day_time_series 計算完的 csv 檔去產生新的 csv """ target_timestamp = np.array([]) start_date = datetime.datetime(2015, 1, 1) end_date = datetime.datetime(2017, 5, 31) for dt in rrule(MONTHLY, dtstart=start_date, until=end_date): target_timestamp = np.append(target_timestamp, dt.strftime("%Y-%m")) # print('target_timestamp\n', target_timestamp) for timestamp in target_timestamp: element = [x for x in fname if x.find(timestamp) != -1] np_borrow, np_return = (np.array([]) for _ in range(2)) idx = np.array([]) columns = np.array([]) for field in element: idx = np.append(idx, field[6:16]) borrow_data, return_data = LoadData.load_station_count( field, ttype, utype) if columns.size == 0: columns = borrow_data.columns # np_data1-> sum of the borrow_data # np_data2-> sum of the return_data np_data1 = np.sum(borrow_data.values, axis=0).reshape(1, -1) np_data2 = np.sum(return_data.values, axis=0).reshape(1, -1) if np_borrow.size == 0: np_borrow = np_data1 else: np_borrow = np.concatenate((np_borrow, np_data1), axis=0) if np_return.size == 0: np_return = np_data2 else: np_return = np.concatenate((np_return, np_data2), axis=0) # print('np_borrow\n', np_borrow, np_borrow.shape) # print('np_return\n', np_return, np_return.shape) pd_borrow = pd.DataFrame(np_borrow, columns=columns, index=idx) pd_return = pd.DataFrame(np_return, columns=columns, index=idx) Export.month_station_count(pd_borrow, timestamp, utype[0]) Export.month_station_count(pd_return, timestamp, utype[1])
def graph_by_hour(fname, ttype, utype): """ Month Graph(Build One Month -> 24 hours on each day) Ubike-DataMining\\Data\\NewUbike\\UbikeStatistic\\Day\\ """ # Basic Setting header = [x[14:16] for x in fname] sns.set(style='darkgrid') myfont = fm.FontProperties(fname='C:/Windows/Fonts/msyh.ttc') color_array = ['Blue', 'Red', 'Green'] label_array = ['Borrow', 'Return', 'Total'] line_size = 0.7 # Open or Create a folder name = fname[0][6:13] path = "../Data/Graph/Statistic_Graph/Month(hour)/" + name if not os.path.isdir(path): os.mkdir(path) # Load data and plot # x_data = np.array([i for i in range(24 * len(header))]) pd_borrow_data, pd_return_data = (pd.DataFrame() for _ in range(2)) for file in fname: borrow_data, return_data = LoadData.load_station_count( file, ttype, utype) pd_borrow_data = pd.concat((pd_borrow_data, borrow_data), axis=0) pd_return_data = pd.concat((pd_return_data, return_data), axis=0) for col in pd_borrow_data.columns: y1_data = pd_borrow_data[col].values y2_data = pd_return_data[col].values y3_data = y1_data + y2_data f, axarr = plt.subplots(3, 1, sharex='all', figsize=(16, 8), dpi=100) axarr[0].plot(y1_data, color=color_array[0], label=label_array[0], linewidth=line_size) axarr[1].plot(y2_data, color=color_array[1], label=label_array[1], linewidth=line_size) axarr[2].plot(y3_data, color=color_array[2], label=label_array[2], linewidth=line_size) # Graph Setting # plt.tight_layout() axarr[0].set_title(col + '(' + name + ')', fontproperties=myfont) plt.xticks(np.arange(0, 24 * len(header), 24), header, rotation=0, fontsize=12) for sub_plot in axarr: sub_plot.legend(loc='upper right') sub_plot.set_ylim( ymin=0) if np.sum(y3_data) == 0 else sub_plot.set_ylim( ymin=0, ymax=np.max(y3_data)) sub_plot.set_ylabel('次數', fontproperties=myfont) try: photo_path = path + '/' + col + '.png' plt.savefig(photo_path) except FileNotFoundError: col = col.replace('/', '-') photo_path = path + '/' + col + '.png' plt.savefig(photo_path) # plt.ion() # plt.pause(1) plt.close()
start = time.time() # 小波分解的層數 layer = 15 # 起始年和到哪年為止 syear = 2015 eyear = 2016 timeseries = generate_target_timeseries(syear, eyear) # 讀檔,將每個csv檔案的資料取出 for series, target_timestamp in timeseries.items(): total_borrow_data = pd.DataFrame() total_return_data = pd.DataFrame() for target in target_timestamp: borrow_data, return_data = LoadData.load_station_count( target, 'Day', ['BorrowStation', 'ReturnStation']) total_borrow_data = pd.concat((total_borrow_data, borrow_data), axis=0) total_return_data = pd.concat((total_return_data, return_data), axis=0) # print(total_borrow_data.shape) print(total_return_data.shape) # 進行小波分解(0 ~ N 層) # 並做出相對應的小波分解後的視覺化圖 algorithm = pywt.Wavelet('db2') wavelet = WaveletTransform(total_borrow_data, total_return_data, int(layer), algorithm, interval=series[0]) wavelet.fit_transform()
def generate_graph(fname, ttype, utype): """ Week Graph(Monday~Sunday) 如果要畫一周圖的話,可以每次都先讀入 7份csv檔案來作圖 :param fname: file name :param ttype: Week :param utype: Borrow, Return :return: """ # Basic Setting header = ['Thu', 'Fri', 'Sat', 'Sun', 'Mon', 'Tue', 'Wed'] sns.set(style='darkgrid') myfont = fm.FontProperties(fname='C:/Windows/Fonts/msyh.ttc') path = "../Data/Graph/Statistic_Graph/Week/" + fname[0][ 6:16] + '~' + fname[-1][6:16] if not os.path.isdir(path): os.mkdir(path) color_array = ['Blue', 'Red', 'Green'] label_array = ['Borrow', 'Return', 'Total'] # Load data and plot x_data = np.array([i for i in range(24 * len(header))]) pd_borrow_data, pd_return_data = (pd.DataFrame() for _ in range(2)) for file in fname: borrow_data, return_data = LoadData.load_station_count( file, ttype, utype) pd_borrow_data = pd.concat((pd_borrow_data, borrow_data), axis=0) pd_return_data = pd.concat((pd_return_data, return_data), axis=0) for col in pd_borrow_data.columns: fig, ax = plt.subplots(figsize=(16, 8), dpi=100) y1_data = pd_borrow_data[col].values y2_data = pd_return_data[col].values y3_data = y1_data + y2_data ax.plot(x_data, y1_data, color=color_array[0], label=label_array[0]) ax.plot(x_data, y2_data, color=color_array[1], label=label_array[1]) ax.plot(x_data, y3_data, color=color_array[2], label=label_array[2]) plt.title(col + '(' + fname[0][6:16] + '~' + fname[-1][6:16] + ')', fontproperties=myfont) plt.xlabel('時間軸', fontproperties=myfont) plt.ylabel('租借次數', fontproperties=myfont) plt.xticks(np.arange(0, 24 * len(header), 24), header, rotation=45, fontsize=12) # plt.xticks(range(len(header)), rotation=45) if np.sum(y3_data) == 0: plt.ylim(ymin=0) else: plt.ylim(ymin=0, ymax=np.max(y3_data)) # Put a nicer background color on the legend. legend = ax.legend(loc='upper right') legend.get_frame().set_facecolor('C0') # manager = plt.get_current_fig_manager() # manager.window.showMaximized() try: photo_path = path + '/' + col + '.png' plt.savefig(photo_path) except FileNotFoundError: col = col.replace('/', '-') photo_path = path + '/' + col + '.png' plt.savefig(photo_path) # plt.ion() # plt.pause(1) plt.close()