From 0c2f582e750db483ee2a44c7ddd10a8b92abab6d Mon Sep 17 00:00:00 2001 From: Manos Date: Sat, 9 Oct 2021 04:00:36 +0200 Subject: [PATCH] code: Update --- code/expt/hue-sel.py | 4 +- code/expt/hue.py | 4 +- code/lib/lmdk_bgt.py | 4 +- code/parse_t-drive.py | 132 ++++++++++++++++++++++++++++++++ rslt/bgt_cmp/Copenhagen-sel.pdf | Bin 14646 -> 14646 bytes rslt/bgt_cmp/Copenhagen.pdf | Bin 14622 -> 14645 bytes rslt/bgt_cmp/HUE-sel.pdf | Bin 16607 -> 16603 bytes rslt/bgt_cmp/HUE.pdf | Bin 16610 -> 16603 bytes 8 files changed, 138 insertions(+), 6 deletions(-) create mode 100644 code/parse_t-drive.py diff --git a/code/expt/hue-sel.py b/code/expt/hue-sel.py index 38bbb1c..22083f4 100644 --- a/code/expt/hue-sel.py +++ b/code/expt/hue-sel.py @@ -27,7 +27,7 @@ def main(args): # Landmarks' thresholds lmdks_th = [0, .54, .68, .88, 1.12, 10] # The privacy budget - epsilon = 10.0 + epsilon = 1.0 # Number of methods n = 3 @@ -48,7 +48,7 @@ def main(args): # The y axis plt.ylabel('Mean absolute error (kWh)') # Set y axis label. plt.yscale('log') - plt.ylim(.01, 1000) + plt.ylim(.1, 10000) # Bar offset x_offset = -(bar_width/2)*(n - 1) diff --git a/code/expt/hue.py b/code/expt/hue.py index 3c2e053..cb4cb2e 100644 --- a/code/expt/hue.py +++ b/code/expt/hue.py @@ -25,7 +25,7 @@ def main(args): # Landmarks' thresholds lmdks_th = [0, .54, .68, .88, 1.12, 10] # The privacy budget - epsilon = 10.0 + epsilon = 1.0 # Number of methods n = 3 @@ -46,7 +46,7 @@ def main(args): # The y axis plt.ylabel('Mean absolute error (kWh)') # Set y axis label. plt.yscale('log') - plt.ylim(.01, 1000) + plt.ylim(.1, 10000) # Bar offset x_offset = -(bar_width/2)*(n - 1) diff --git a/code/lib/lmdk_bgt.py b/code/lib/lmdk_bgt.py index b4b8518..f3e668f 100644 --- a/code/lib/lmdk_bgt.py +++ b/code/lib/lmdk_bgt.py @@ -477,7 +477,7 @@ def adaptive_cons(seq, lmdks, epsilon, inc_rt, dec_rt): skipped = 0 for i, p in enumerate(seq): # Check if current point is a landmark - is_landmark = any((lmdks[:]==p).all(1)) + is_landmark = any(np.equal(lmdks, p).all(1)) if is_landmark: lmdk_cur += 1 if lmdk_lib.should_sample(samp_rt) or i == 0: @@ -584,7 +584,7 @@ def skip_cons(seq, lmdks, epsilon): rls_data = [None]*len(seq) for i, p in enumerate(seq): # Check if current point is a landmark - is_landmark = any((lmdks[:]==p).all(1)) + is_landmark = any(np.equal(lmdks, p).all(1)) # Add noise o = [p[0], lmdk_lib.add_laplace_noise(p[1], 1, bgts[i])] if is_landmark: diff --git a/code/parse_t-drive.py b/code/parse_t-drive.py new file mode 100644 index 0000000..2172067 --- /dev/null +++ b/code/parse_t-drive.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 + +import argparse +import csv +from datetime import datetime +from geopy.distance import distance +import io +import lmdk_lib +import numpy as np +import os +import matplotlib.pyplot as plt +import sys +import time +import zipfile + + +''' +############ Stats ########### + +Trajectories: 10357 + Length + Total : 17662984 + Minimum : + Maximum : + +Landmarks : 212816 + Length + Total : 6851102 (27.54%) + Minimum : 1 + Maximum : 6896 + +############################## +''' + + +# https://cloud.delkappa.com/s/2Rs2wjS8zmt5bAE +# T-drive data format +# User ID +uid = 0 +# Coordinates +lat, lng = 3, 2 +# Timestamp +tim = 1 +# Timestamp format +tim_fmt = "%Y-%m-%d %H:%M:%S" + + +def main(args): + # Get users' landmarks from previous parsing + usrs_lmdks = lmdk_lib.load_data(args, 'usrs_lmdks') + if usrs_lmdks.size == 0: + # Get users' data from previous parsing + usrs_data = lmdk_lib.load_data(args, 'usrs_data') + if usrs_data.size == 0: + usrs_data = np.empty((0,4), np.float32) + # Parse users' data + try: + print('Extracting %s... ' %(os.path.abspath(args.arc)), end='', flush=True) + with zipfile.ZipFile(args.arc, 'r') as arc: + print('[OK]') + # Get the list of users + print('Getting users... ', end='', flush=True) + # List of users + usrs = list(info.filename.split('/')[2].split('.')[0] for info in arc.infolist() if '.txt' in info.filename) + # Sort users numerically + usrs.sort(key=int) + print('[OK]') + for usr in usrs: + points = [] + traj_file = 'release/taxi_log_2008_by_id/' + usr + '.txt' + print('[%d%% (%s/%d)] Loading data from %s... ' %((int(usr)/len(usrs))*100, usr, len(usrs), traj_file), end='', flush=True) + with io.TextIOWrapper(arc.open(traj_file), newline='\n') as dat: + try: + # df = pd.read_csv(dat, sep=',', index_col=None, names=data_cols) + traj = csv.reader(dat, delimiter=',') + for p in traj: + points += [[p[uid], p[lat], p[lng], datetime.strptime(p[tim], tim_fmt).timestamp()]] + print('[OK]') + except Exception as e: + print('[Error: %s]' %(e)) + if points: + usrs_data = np.append(usrs_data, np.asarray(points, dtype=np.float32), axis=0) + # Save to results + lmdk_lib.save_data(args, usrs_data, 'usrs_data') + except Exception as e: + print('[Error: %s]' %(e)) + # Find users' landmarks + usrs_lmdks = lmdk_lib.find_lmdks(usrs_data, args) + # Save to results + lmdk_lib.save_data(args, usrs_lmdks, 'usrs_lmdks') + # Landmarks' stats + lmdk_lib.lmdks_stats(args, usrs_lmdks) + + +''' + Parse arguments. + + Optional: + arc - The archive file. + dist - The coordinates distance threshold in meters. + per - The timestaps period threshold in mimutes. + res - The results zip file. +''' +def parse_args(): + # Create argument parser. + parser = argparse.ArgumentParser() + + # Mandatory arguments. + + # Optional arguments. + parser.add_argument('-a', '--arc', help='The data archive file.', type=str, default='/home/manos/Cloud/Data/T-drive/Data.zip') + parser.add_argument('-l', '--dist', help='The coordinates distance threshold in meters.', type=int, default=200) + parser.add_argument('-p', '--per', help='The timestaps period threshold in mimutes.', type=int, default=30) + parser.add_argument('-r', '--res', help='The results archive file.', type=str, default='/home/manos/Cloud/Data/T-drive/Results.zip') + + # Parse arguments. + args = parser.parse_args() + + return args + + +if __name__ == '__main__': + try: + start_time = time.time() + main(parse_args()) + end_time = time.time() + print('##############################') + print('Time : %.4fs' % (end_time - start_time)) + print('##############################') + except KeyboardInterrupt: + print('Interrupted by user.') + exit() diff --git a/rslt/bgt_cmp/Copenhagen-sel.pdf b/rslt/bgt_cmp/Copenhagen-sel.pdf index dd6cb5d876ddc622da6d6627aba6d69aeac140bd..5db4b5b839e8d333c718fb33645f0b91fdee187b 100644 GIT binary patch delta 1520 zcmVImI+NYCHdl9728j3@PuN0awcRH_2mm1S3uMk6A1N50W0h$3iv#sj`pM=gjgD( z601?!Q*pUqtOJo%CRGz8>qq_|@RVW)bx*|w6f_2rRVIJv&?N6|Z2Upe38fCJo}}hr ze96MJm{d^(F~h(fB%V<0ugX_Z2c}a>9aKG)7QHW>O~SI6PrQZKP9l|lU>gfF1(}g%UIt1=@h-a*JLvIPX-imSCMWKcb z+uf#yjmGWK>B&*6soSDiQf=uRLD!dFDX5i?N%lTW@+$mHz&<`BN8Q9SJ`L1A)ED~K z>NkIu9s*Ef1efY46GExKo!_b1sXqD@G8NB!~|h=410BqcBpe?!-ec;FLiOG&SQTxA%bjRn6NsAy*fra)Om2^4s=!AM_nGN z3l>Z&K~^0TR>zRbu1CAnWg0}cL)@<{z%~Nq5$XKNFRc^}(0=TU^xN6}#ogKB)1&_Q z>ZgydWz+*Lc5Sa8>QSIDR$p{4rYEd$qj?EeU3=5oS*u5lg5=nMf9N)YrI=d4F@7He2-OG|6K7N?fsnGRA@WoQXKI4dG?pnxVrZOw|uHVSujQB6sHw zUov?mQ!DP<kgC^O+?~Amg2{h#_1YiW8|0cDlspd9Cr`wgZ3r)u*9_g3JXdR* z;vDc|oHlt+TwM1}T_2{;97marW6QkBfy2v=H=(=3W)tia?}^ddx(0YtLs5Gb%F;(H znWm$b1b0RHeSUVY&;EIQxc&BZuIG!z!(#m27Agb1#(c;rX`pp_x}gKL{yTpjF#kTk z|N3MwB!^FlZt>3N9l^dm&KEM)`p;j>&Og=fa=Z09T6_I|r?#kZePmbcRxU4NEI9DEIEH#N0`WqMM&2YNqVCi8Zgf$pX@N+KD}q|wbvbGWF0ep=pb@QMflR>L zGTMiN>&%9d&{_9RO(7K`>fn+{CS=g`+#s}8LQ{3HG}{(jr#5&(vFM^s2@;FN5Ol~! zym=;=vUbUv6bgT?QyV;?SW6oiz&jRe9q5cUu~;UUivXZM1=pz!o>DA5$GU7-tb?e* zN5^8BSg_ioL&PGsPHpgnVqK)?Boy`KGHRPa)E5&7PMeqttMiyWPo_=AW&|H{BU9pT zRPm==?g zLX%B~(AYzRrxZJ=db$VzXvkR<7?YwZdn&fj*h7P#CpJJ11(t@=0vW+B+kRiwRmF@3#?fU=adOD0W!+1(t^2rOV(S`;HFQ}y42GP_0#nvJuevW@wRBx%%xml`|x0aLc=;!(O>+|^^ zCo^^a$jwM8`H(H$?_?Xp^tS8X|34MNGqFdz3V8s z9U7xkFtXoa!txkad5m_+OOehK`pcr>(&U>j# zBX!<@j@iqqW5Vhfa@ke1OI@NtF$dhQEWk7Z?d<;I?ribt zQGI;%)5q5`>VX!!w$~43D^M7tF8X8X2`k)aUcyz^-n4es;!&d@DKudDDmK`u89sk% z^dbV#WsOFZL)?Y5zd22tEjl-KG}xYqD|S%EI8e=*h%?&|UgoVCI^4ok{ZJAHXv-aP zckb{dlb7kjH4rC{5=#lDB3DC65Eu?_*kd`F@A)z`k^yeKObZwt?i0{p;Yl zYtnb7o4zX_{u;{b<=x2AKK0OFv#4{S-8#az5>s1X*O+5Sx>T^*h|q7utERJ{{?!bh zu|0S1KV5&8xf^`{XEyb+&H7RtUH+UKt&efDK2KNJHRc$S9S`G^zySN%4vR diff --git a/rslt/bgt_cmp/Copenhagen.pdf b/rslt/bgt_cmp/Copenhagen.pdf index f83f3ad46c87c76e587cc594eaba15d5155ba8dc..b6788c5923931b6a0ae9c6a66061eac6d00fc884 100644 GIT binary patch delta 2424 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 delta 3234 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 GT;dNf{tg=e diff --git a/rslt/bgt_cmp/HUE.pdf b/rslt/bgt_cmp/HUE.pdf index 361abf980cf9962b4df949f084ef5d32a16d27e8..cc1dc1bd4dc0fab88084bbcd98f39374845ca846 100644 GIT binary patch delta 3193 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 RA3Q1rqNH_oEo_cR{|C<98^izr delta 3263 zcmZuwc_5VOAE&ae&?Z+D3Dw4U-*;|=C2g+UM573mBg;%Rj(Ag;$wV=XGgfWZ5h`LZ zj>)g0!B&hTD(57M${LH(Z>p``o!R%V=lMS0&+|E+?>iVLJ{l)}qf;E_5Y@5Di3=Y# zG+Jjg0vDD80^Oks8+&DIRECv_Y_h#^jV?Y_-DUAakQ>zgI$u^6;g#-A7NrjsRYqtZ@Q+h-bl(K zAq?AnaZY*_qTS!am1U4K>EilUp39!IklnIaF(Yna;>k4ibfLqY(7}S-_LBB6%H;3} z*Ne)cjl~w`>kkcA-9$&Jg;F2&@TxATxOuSRhNNgXF@ga1$Vib;0u4VFsy}0k0l3@~G=uC*IXR)l_3Q09+yv8`m$Z7|^ZyS0gC~W?OcxC#ktT2SC>H%(R@zQtnGS}@-Ss_yM{^FHAtEjc^ ziX{p8^SpKm8Oy^NmY-E`G*8}pH(k~BJls!X zWBe>{Hl43$bLj~U?y|pFm>1QgapNs-Q`~dPIs8-sho;61qVZUedIBqn=E#1cmMH6;?(N0z@^2Hk)~x=7fj679IH*ZomSA2Mg1OFiQT|+ z8^(3MY~AQHEf-p5h-x#-Y~ZTy$- zpD&Iszignryf1AO{tlBhKi!vr~=n{L&fqZBG-)vBFZfmJuk=vNmy z9kax*-goL z)t<5YkIidU_h>S9K&+yc#N95zh8nVEXLWlwcUq1T-Phc!(r!_f;}Ht%&gg9gjw9oEiI*H8PI&v>%K+aWdo; zv2U>+$M-3_p`kNFw{Y0%Lk1O#e1k~G310^U6%T}i0eTFpc5Gogf>q5pghd!(sP!RJAk#9js-KjBM z+a;-ZAY<&3Gky%mth!)%E{2qJT7&<<@1FP;KMm?lyjWHEFvk1*tNig~2fqFsJO65H zOyU@=^Li`g9aVl?TT`o=A4#l8UZrMUeqn&^#4XT$`+M4mxce1GX}`j3`cEftKk_$q zsphT*;FHW7<>ZLTyW8(p`Tyx@v;3(1eQUk?_sh@p?(A_XsjPdMUy&F^e-)|RXYT!U zA$U2F4dZ!}46p2Tot*oZcPL*o=-pNIIzatb3F$5@vhc&mam z+Y*E%j+pzplxCBhTnIef3X}pOZ^18q9tk1>;WSQTo7<7`J7a0&3_r@R#p61~H%2RT zvtm;&#{FpR60O3sx(;ovZN|3O7L<%|k@03Mv^6C;GYT1oUyBS$Un;B1-=a^>)~mH0GG;z8VY1mZ)zqPY zoN=NdF+;7c(-pV!Rz+-8auon>tsf!mUZ|U1{>%X+K(f;$5R;5 zk{-FKgJ!zJ+V%u?tuyOS9-nA`Q|Ae?Q$TdI72<3AvYx#vsT{*L|l4l8Z4Q<^JpcX73L)kbxi0Jk9{5|-ZC8L>D1BWXh&2X%74 z|1&n1_q6b4fl9$V{pv->e;HV@OZ zxt^7fKp&}ymxQ~g-gRxC&n)HmMo>L0LSo5cn&gz}iN@(C3-^1-_kHp*u?iBsp0%tf zX1+#R4#S>wMP7U)TnkD3;ZJUd%nVAk~U@&aS2iRK;c!0}RQ z3RtB{G&oMYEDC@MnnFZ;C;?`XRom+_# zgJ#%Nxv?kb)c5?ctj-_poR}?m4i6-et-GH~*obw=1cdsNP7nipkAGVId^ku3gtP#y zPYVbFp{fKKH&7A>;*m%Yq>mV1hmlAv;M1oSswMMz0ippUUbKb*4+jIawp5SVaM08$X75HWxPM3MqfNR)^e6b|^e5m*ok8bpf_qfvMfFdB;& zP7A<57!fg;|G;9ffCvW$kHx~mPOu;#;us5|Fd}^@P