def assign(filename, date, time_l, time_r, m, L, pb, pc, cr, cb): dat = order_filter.filter_time(filename, date, time_l, time_r) dest_dat = csvreader.csv_reader_no_headers('../data/destination.csv') departure_dat = csvreader.csv_reader_no_headers('../data/departure.csv') coordinates = [[float(departure_dat[0][0]), float(departure_dat[0][1])]] for line in dest_dat: coordinates.append([float(line[0]), float(line[1])]) for line in coordinates: line[0] *= lon_km line[1] *= lat_km k = len(coordinates) dest = [] for line in dat: departure_longitude = float(line[3]) * lon_km departure_latitude = float(line[4]) * lat_km dest_longitude = float(line[5]) * lon_km dest_latitude = float(line[6]) * lat_km if (departure_longitude - coordinates[0][0]) ** 2 + (departure_latitude - coordinates[0][1]) ** 2 > departure_radius ** 2: continue min_dis, pos = 1e20, 0 for j in range(1, k): cur_dis = (dest_longitude - coordinates[j][0]) ** 2 + (dest_latitude - coordinates[j][1]) ** 2 if cur_dis < min_dis: min_dis, pos = cur_dis, j dest.append(pos) n = len(dest) datahelper.dump_json('../data/order_data.json', n, m, k, L, dest, coordinates, pb, pc, cr, cb)
def filter_day(filename): dat = csvreader.csv_reader_no_headers(filename) out_dat = [] for line in dat: s = timestamp_datetime(int(line[1])) s = s[11:] if s2 <= s <= s1: out_dat.append(line) return out_dat
def filter_time(filename, date, sl, sr): dat = csvreader.csv_reader_no_headers(filename) out_dat = [] for line in dat: s = timestamp_datetime(int(line[1])) dat = s[:10] tm = s[11:] if sl <= tm <= sr and dat == date: out_dat.append(line) return out_dat
import csvreader import json import numpy as np import time from urllib.request import urlopen if __name__ == '__main__': dest_dat = csvreader.csv_reader_no_headers('../data/destination.csv') departure_dat = csvreader.csv_reader_no_headers('../data/departure.csv') ak = '??????????????????' # Please fill in your AK code coordinates = [[float(departure_dat[0][0]), float(departure_dat[0][1])]] for line in dest_dat: coordinates.append([float(line[0]), float(line[1])]) K = len(coordinates) new_coordinates = [] dist = np.zeros((K, K)) for i in range(K): for j in range(K): print(i, j) if i == j: dist[i][j] = 0 else: uri = 'http://api.map.baidu.com/routematrix/v2/driving?output=json&origins=' + str(coordinates[i][1]) + ',' + \
def selection(re): dest_cnt = {} hotel_cnt = {} dat = order_filter.filter_night( '../../CS214-CourseData/Projects/data/haikou_order/order_20171011_20171014.csv' ) departure_dat = csvreader.csv_reader_no_headers('../data/departure.csv') departure = [float(departure_dat[0][0]), float(departure_dat[0][1])] hotel_dat = csvreader.csv_reader_no_headers( '../data/hotel_address_lat_lng.csv') # Analyze order destination. for line in dat: dest_longitude = float(line[5]) dest_latitude = float(line[6]) dest_brick_lon = int(dest_longitude * 500) dest_brick_lat = int(dest_latitude * 500) index = str(dest_brick_lon) + '.' + str(dest_brick_lat) if dest_cnt.get(index) is None: dest_cnt[index] = 1 else: dest_cnt[index] += 1 # Analyze hotel data valid_cnt = 0 for line in hotel_dat: hotel_lat = float(line[0]) hotel_lon = float(line[1]) if hotel_lon < 109.4 or hotel_lon > 110.82 or hotel_lat < 19.6 or hotel_lat > 20.05: continue valid_cnt += 1 hotel_brick_lon = int(hotel_lon * 500) hotel_brick_lat = int(hotel_lat * 500) index = str(hotel_brick_lon) + '.' + str(hotel_brick_lat) if hotel_cnt.get(index) is None: hotel_cnt[index] = 1 else: hotel_cnt[index] += 1 # Combine cnt = {} for key in dest_cnt.keys(): res = dest_cnt[key] if res >= 50: res = 50 cnt[key] = beta_d * res / 50 for key in hotel_cnt.keys(): if cnt.get(key) is None: cnt[key] = beta_h / (1 + math.exp(-hotel_cnt[key])) else: cnt[key] += beta_h / (1 + math.exp(-hotel_cnt[key])) dest = [] for key in cnt.keys(): brick_lon, brick_lat = key.split('.') dest.append([cnt[key], int(brick_lon), int(brick_lat)]) dest.sort() pre_final_list = [] for item in dest: if re and (lon_km * (departure[0] - item[1] / 500.0))**2 + ( lat_km * (departure[1] - item[2] / 500.0))**2 <= departure_radius**2: continue if item[0] >= 0.6: pre_final_list.append([item[1], item[2]]) print('longitude =', item[1] / 500.0, 'latitude =', item[2] / 500.0, 'count =', item[0]) min_arg = [54700, 9800] max_arg = [55410, 10025] center, _ = kmeans.kmeans(K, 2, min_arg, max_arg, pre_final_list) dest_lon = [] dest_lat = [] with open('../data/destination.csv', 'w', newline='') as out: csv_write = csv.writer(out, dialect='excel') for item in center: print(item[0] / 500.0, item[1] / 500.0) dest_lon.append(item[0] / 500.0) dest_lat.append(item[1] / 500.0) csv_write.writerow([item[0] / 500.0, item[1] / 500.0]) print('total', len(dest_lon), 'possible destinations.') plt.plot(dest_lon, dest_lat, 'o', markersize=2) plt.savefig('../data/destination.pdf', dpi=300) plt.show()