From 6298c14f78fc36f935868054023ccab6e5610648 Mon Sep 17 00:00:00 2001 From: fly6516 Date: Fri, 14 Mar 2025 11:40:29 +0800 Subject: [PATCH] =?UTF-8?q?perf(code):=20=E6=B7=BB=E5=8A=A0=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E8=BF=90=E8=A1=8C=E6=97=B6=E9=97=B4=E8=AE=A1=E6=97=B6?= =?UTF-8?q?=E5=B9=B6=E6=9B=B4=E6=8D=A2=E6=95=B0=E6=8D=AE=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 Apriori 和 FP-Growth算法运行前后添加时间计时代码 - 将输入数据集从 menu_orders.xls 更改为 iris.csv - 更新数据读取方式以适应 CSV 文件格式 -保留算法结果并输出运行时间 --- code/5-6_cal_apriori.py | 12 +++- code/5-6_cal_fpgrowth.py | 10 ++- data/iris.csv | 151 +++++++++++++++++++++++++++++++++++++++ tmp/apriori_rules.xlsx | Bin 5159 -> 5591 bytes tmp/fpgrowth_rules.xlsx | Bin 5061 -> 5692 bytes 5 files changed, 167 insertions(+), 6 deletions(-) create mode 100644 data/iris.csv diff --git a/code/5-6_cal_apriori.py b/code/5-6_cal_apriori.py index 9c01607..56a569a 100644 --- a/code/5-6_cal_apriori.py +++ b/code/5-6_cal_apriori.py @@ -3,10 +3,11 @@ from __future__ import print_function import pandas as pd from apriori import * #导入自行编写的apriori函数 +import time # 导入time模块用于计时 -inputfile = '../data/menu_orders.xls' +inputfile = '../data/iris.csv' outputfile = '../tmp/apriori_rules.xlsx' #结果文件,保留 .xlsx 格式 -data = pd.read_excel(inputfile, header = None) +data = pd.read_csv(inputfile, header = None) print(u'\n转换原始数据至0-1矩阵...') ct = lambda x : pd.Series(1, index = x[pd.notnull(x)]) #转换0-1矩阵的过渡函数 @@ -21,4 +22,9 @@ ms = '---' #连接符,默认'--',用来区分不同元素,如A--B。需要 # 提醒用户需要安装 openpyxl 库以支持 .xlsx 格式 # 如果未安装,可以通过以下命令安装:pip install openpyxl -find_rule(data, support, confidence, ms).to_excel(outputfile, engine='openpyxl') #保存结果,指定 engine='openpyxl' \ No newline at end of file +start_time = time.time() # 记录开始时间 +result = find_rule(data, support, confidence, ms) +end_time = time.time() # 记录结束时间 +print(f'\nApriori算法运行时间: {end_time - start_time} 秒') + +result.to_excel(outputfile, engine='openpyxl') #保存结果,指定 engine='openpyxl' \ No newline at end of file diff --git a/code/5-6_cal_fpgrowth.py b/code/5-6_cal_fpgrowth.py index d7bb260..8869bc3 100644 --- a/code/5-6_cal_fpgrowth.py +++ b/code/5-6_cal_fpgrowth.py @@ -3,10 +3,11 @@ from __future__ import print_function import pandas as pd from fpgrowth import find_frequent_itemsets # 导入FP-Growth函数 +import time # 导入time模块用于计时 -inputfile = '../data/menu_orders.xls' +inputfile = '../data/iris.csv' outputfile = '../tmp/fpgrowth_rules.xlsx' # 结果文件,保留 .xlsx 格式 -data = pd.read_excel(inputfile, header=None) +data = pd.read_csv(inputfile, header=None) print(u'\n转换原始数据至0-1矩阵...') ct = lambda x: pd.Series(1, index=x[pd.notnull(x)]) # 转换0-1矩阵的过渡函数 @@ -24,7 +25,10 @@ min_support = 0.2 # 最小支持度 min_support_count = int(min_support * len(transactions)) # 转换为绝对支持度 # 使用FP-Growth算法挖掘频繁项集 +start_time = time.time() # 记录开始时间 frequent_itemsets = find_frequent_itemsets(transactions, min_support_count) +end_time = time.time() # 记录结束时间 +print(f'\nFP-Growth算法运行时间: {end_time - start_time} 秒') # 确保 frequent_itemsets 是一个列表,其中每个元素是一个列表 frequent_itemsets = [list(itemset) for itemset in frequent_itemsets] @@ -38,4 +42,4 @@ for itemset in frequent_itemsets: result = pd.DataFrame(result_data) result.to_excel(outputfile, engine='openpyxl') # 保存结果,指定 engine='openpyxl' -print(u'\nFP-Growth算法运行完毕,结果已保存至:', outputfile) +print(u'\nFP-Growth算法运行完毕,结果已保存至:', outputfile) \ No newline at end of file diff --git a/data/iris.csv b/data/iris.csv new file mode 100644 index 0000000..a7055de --- /dev/null +++ b/data/iris.csv @@ -0,0 +1,151 @@ +"","Sepal.Length","Sepal.Width","Petal.Length","Petal.Width","Species" +"1",5.1,3.5,1.4,0.2,"setosa" +"2",4.9,3,1.4,0.2,"setosa" +"3",4.7,3.2,1.3,0.2,"setosa" +"4",4.6,3.1,1.5,0.2,"setosa" +"5",5,3.6,1.4,0.2,"setosa" +"6",5.4,3.9,1.7,0.4,"setosa" +"7",4.6,3.4,1.4,0.3,"setosa" +"8",5,3.4,1.5,0.2,"setosa" +"9",4.4,2.9,1.4,0.2,"setosa" +"10",4.9,3.1,1.5,0.1,"setosa" +"11",5.4,3.7,1.5,0.2,"setosa" +"12",4.8,3.4,1.6,0.2,"setosa" +"13",4.8,3,1.4,0.1,"setosa" +"14",4.3,3,1.1,0.1,"setosa" +"15",5.8,4,1.2,0.2,"setosa" +"16",5.7,4.4,1.5,0.4,"setosa" +"17",5.4,3.9,1.3,0.4,"setosa" +"18",5.1,3.5,1.4,0.3,"setosa" +"19",5.7,3.8,1.7,0.3,"setosa" +"20",5.1,3.8,1.5,0.3,"setosa" +"21",5.4,3.4,1.7,0.2,"setosa" +"22",5.1,3.7,1.5,0.4,"setosa" +"23",4.6,3.6,1,0.2,"setosa" +"24",5.1,3.3,1.7,0.5,"setosa" +"25",4.8,3.4,1.9,0.2,"setosa" +"26",5,3,1.6,0.2,"setosa" +"27",5,3.4,1.6,0.4,"setosa" +"28",5.2,3.5,1.5,0.2,"setosa" +"29",5.2,3.4,1.4,0.2,"setosa" +"30",4.7,3.2,1.6,0.2,"setosa" +"31",4.8,3.1,1.6,0.2,"setosa" +"32",5.4,3.4,1.5,0.4,"setosa" +"33",5.2,4.1,1.5,0.1,"setosa" +"34",5.5,4.2,1.4,0.2,"setosa" +"35",4.9,3.1,1.5,0.2,"setosa" +"36",5,3.2,1.2,0.2,"setosa" +"37",5.5,3.5,1.3,0.2,"setosa" +"38",4.9,3.6,1.4,0.1,"setosa" +"39",4.4,3,1.3,0.2,"setosa" +"40",5.1,3.4,1.5,0.2,"setosa" +"41",5,3.5,1.3,0.3,"setosa" +"42",4.5,2.3,1.3,0.3,"setosa" +"43",4.4,3.2,1.3,0.2,"setosa" +"44",5,3.5,1.6,0.6,"setosa" +"45",5.1,3.8,1.9,0.4,"setosa" +"46",4.8,3,1.4,0.3,"setosa" +"47",5.1,3.8,1.6,0.2,"setosa" +"48",4.6,3.2,1.4,0.2,"setosa" +"49",5.3,3.7,1.5,0.2,"setosa" +"50",5,3.3,1.4,0.2,"setosa" +"51",7,3.2,4.7,1.4,"versicolor" +"52",6.4,3.2,4.5,1.5,"versicolor" +"53",6.9,3.1,4.9,1.5,"versicolor" +"54",5.5,2.3,4,1.3,"versicolor" +"55",6.5,2.8,4.6,1.5,"versicolor" +"56",5.7,2.8,4.5,1.3,"versicolor" +"57",6.3,3.3,4.7,1.6,"versicolor" +"58",4.9,2.4,3.3,1,"versicolor" +"59",6.6,2.9,4.6,1.3,"versicolor" +"60",5.2,2.7,3.9,1.4,"versicolor" +"61",5,2,3.5,1,"versicolor" +"62",5.9,3,4.2,1.5,"versicolor" +"63",6,2.2,4,1,"versicolor" +"64",6.1,2.9,4.7,1.4,"versicolor" +"65",5.6,2.9,3.6,1.3,"versicolor" +"66",6.7,3.1,4.4,1.4,"versicolor" +"67",5.6,3,4.5,1.5,"versicolor" +"68",5.8,2.7,4.1,1,"versicolor" +"69",6.2,2.2,4.5,1.5,"versicolor" +"70",5.6,2.5,3.9,1.1,"versicolor" +"71",5.9,3.2,4.8,1.8,"versicolor" +"72",6.1,2.8,4,1.3,"versicolor" +"73",6.3,2.5,4.9,1.5,"versicolor" +"74",6.1,2.8,4.7,1.2,"versicolor" +"75",6.4,2.9,4.3,1.3,"versicolor" +"76",6.6,3,4.4,1.4,"versicolor" +"77",6.8,2.8,4.8,1.4,"versicolor" +"78",6.7,3,5,1.7,"versicolor" +"79",6,2.9,4.5,1.5,"versicolor" +"80",5.7,2.6,3.5,1,"versicolor" +"81",5.5,2.4,3.8,1.1,"versicolor" +"82",5.5,2.4,3.7,1,"versicolor" +"83",5.8,2.7,3.9,1.2,"versicolor" +"84",6,2.7,5.1,1.6,"versicolor" +"85",5.4,3,4.5,1.5,"versicolor" +"86",6,3.4,4.5,1.6,"versicolor" +"87",6.7,3.1,4.7,1.5,"versicolor" +"88",6.3,2.3,4.4,1.3,"versicolor" +"89",5.6,3,4.1,1.3,"versicolor" +"90",5.5,2.5,4,1.3,"versicolor" +"91",5.5,2.6,4.4,1.2,"versicolor" +"92",6.1,3,4.6,1.4,"versicolor" +"93",5.8,2.6,4,1.2,"versicolor" +"94",5,2.3,3.3,1,"versicolor" +"95",5.6,2.7,4.2,1.3,"versicolor" +"96",5.7,3,4.2,1.2,"versicolor" +"97",5.7,2.9,4.2,1.3,"versicolor" +"98",6.2,2.9,4.3,1.3,"versicolor" +"99",5.1,2.5,3,1.1,"versicolor" +"100",5.7,2.8,4.1,1.3,"versicolor" +"101",6.3,3.3,6,2.5,"virginica" +"102",5.8,2.7,5.1,1.9,"virginica" +"103",7.1,3,5.9,2.1,"virginica" +"104",6.3,2.9,5.6,1.8,"virginica" +"105",6.5,3,5.8,2.2,"virginica" +"106",7.6,3,6.6,2.1,"virginica" +"107",4.9,2.5,4.5,1.7,"virginica" +"108",7.3,2.9,6.3,1.8,"virginica" +"109",6.7,2.5,5.8,1.8,"virginica" +"110",7.2,3.6,6.1,2.5,"virginica" +"111",6.5,3.2,5.1,2,"virginica" +"112",6.4,2.7,5.3,1.9,"virginica" +"113",6.8,3,5.5,2.1,"virginica" +"114",5.7,2.5,5,2,"virginica" +"115",5.8,2.8,5.1,2.4,"virginica" +"116",6.4,3.2,5.3,2.3,"virginica" +"117",6.5,3,5.5,1.8,"virginica" +"118",7.7,3.8,6.7,2.2,"virginica" +"119",7.7,2.6,6.9,2.3,"virginica" +"120",6,2.2,5,1.5,"virginica" +"121",6.9,3.2,5.7,2.3,"virginica" +"122",5.6,2.8,4.9,2,"virginica" +"123",7.7,2.8,6.7,2,"virginica" +"124",6.3,2.7,4.9,1.8,"virginica" +"125",6.7,3.3,5.7,2.1,"virginica" +"126",7.2,3.2,6,1.8,"virginica" +"127",6.2,2.8,4.8,1.8,"virginica" +"128",6.1,3,4.9,1.8,"virginica" +"129",6.4,2.8,5.6,2.1,"virginica" +"130",7.2,3,5.8,1.6,"virginica" +"131",7.4,2.8,6.1,1.9,"virginica" +"132",7.9,3.8,6.4,2,"virginica" +"133",6.4,2.8,5.6,2.2,"virginica" +"134",6.3,2.8,5.1,1.5,"virginica" +"135",6.1,2.6,5.6,1.4,"virginica" +"136",7.7,3,6.1,2.3,"virginica" +"137",6.3,3.4,5.6,2.4,"virginica" +"138",6.4,3.1,5.5,1.8,"virginica" +"139",6,3,4.8,1.8,"virginica" +"140",6.9,3.1,5.4,2.1,"virginica" +"141",6.7,3.1,5.6,2.4,"virginica" +"142",6.9,3.1,5.1,2.3,"virginica" +"143",5.8,2.7,5.1,1.9,"virginica" +"144",6.8,3.2,5.9,2.3,"virginica" +"145",6.7,3.3,5.7,2.5,"virginica" +"146",6.7,3,5.2,2.3,"virginica" +"147",6.3,2.5,5,1.9,"virginica" +"148",6.5,3,5.2,2,"virginica" +"149",6.2,3.4,5.4,2.3,"virginica" +"150",5.9,3,5.1,1.8,"virginica" diff --git a/tmp/apriori_rules.xlsx b/tmp/apriori_rules.xlsx index 5616c71bb6ae108211ca332132faf5342cb424e4..8e82f42b13518255930c27c86cbe86c83d329c53 100644 GIT binary patch delta 1639 zcmZXVdpOg39LIkfVQ#aFTsszNhH%^_nL0T_%B80k%cWeBTqee(W=W}@#@IwCm5y|A z2~j8a%gUvNgGr)=ikV9;!xqjs=kz>1=ljq5`M#g`=ly-2&mXUEfnJ}1f}691BoY7s z8GwB(JWZj9Di#9d`tBV(vDpp+0GL<KG z`hBCKdq%qwIyLpCT-5zo@1M^}jsOgsBsA|q-^`v{Myewyp8#BVC85`p}Snq)Dt$_s3bk&v! zt$9+~?&PA2MEmI6l_RLC{fKRMY{JT%XAcplV-~ZDe~-?&Zf#7A$;+rn?G=Vau8jRs zC+khjq0B)??C&an7h+c+KW(VI4`eF^U*FMGtTR|B0RV=|0H6vmYvAhC+a6)$JR7AI zgI{WoI;K9y@phhiUNKnfF)6}6E{)uLO)i*{ORa<8L%uZc$$-kdsWBrnOc3MYr@mEr z!5ax{MP=1|Pv=*h-Jw;tcC_ka21o}Z!#z9wZkWU$s~-6L64hF*U1X}UD}`9XFn=x_ zJN9y>8n#h<%XkTc)5T1(sV@Hn8}gkqB+4o< zU}R$0$2NJ+7pksYbqKeAgrZ~m)1~`%q_H*f>sV}7bdg*r=R2 z`?dYa!j>Z@&=T@g$72vzIK*Jc2Mf~Q_Ll`+#)r6UZgqIIokTU$_H{b@5$=k}n6KJ2 z_)In}tZo-VMFLjSmfO_rMe9vh{*XNzTj(2K*!S$Xcg`8ia2iget+>#v##R}>HENc} z&E-hy(lT0GTd(!)lNGq)a+p@p6Lt-@-R168P5mw!1`of+>7&o+lkeV5Q9oID($~D} zy!l9bQfaT#+G#3dzU$r52}=grS~@Z>;4O_8Vn%NHX_XS_dqeH`yEjxR>X z3DB4}(mpf7)g{^0XWOj{C?dC+>5$<9*17D0@=?d7D^j1xM#y=GM85kmUGAfBR&Ppu zd74!3`*Xo%yb5)noDMKv(N1#$$Bh|0+-#9-&ry18(?cbxzJ1*7)*Ym1fvQN#_DSSf znDej}7FOXsXHRE4dUYoXCMO&zrOTWXb=3N*6+7A*MZ={2g04V+fX#AmALnQbV()mF z&Q=M&ej3_iNd~``v*X8E@lZ%$CQClX4m~?FMGN5nNn<6b2;Y5cYFV^F9#^vgA6Hu3 zYbnyBMp`$l%7cB|jvJ@5>lE1+;_@@kDA?S0v<{d_j{iVRC;_4)mM9qw{#>~~Na!31 zS4-Dnzf=D=?g9vgU&H?+rqdqf~0xAobcoP3$SXBljy$5=_ zTH)Y!TPdQk)HN1&AvqO4pmv^agXQx(Oe(2e8k+Q;=^KY72PrVp+BespdK>{nC%AZH zpjY}TJAX5picOi&mc%c)>da@sgdb#Z;IU4!wkFCa#9b*#F*ezl)|qLlZtnq?*#7{s z)aLlQ0w#QQ>U(%{r~lQI^U`y9BUZKaQt1rQZCIS&rCjxU(;(}su}}y1F=-$4ES2Jh z)}nRN_m$5DT#A<()5kVDU#IJgHa=MOyA*Gcy=-Nf2z|q~GqWnhgA|vI(9I9yCQ<5m z1Kj&U0_)^w{iFq+-uVFpKan0fY%m`gB8B4YxyBX0%*f1fevpN=}ON3 z7{jn#kRRk_ZiicL#C+izpjPHNxVF~+i6h4Hzo#-mmRSu)+pcF81$0OO7y!cL06^it zfLJeptmOe9HqFe$hP&9B-|JjN_i*IWin6zaD~ zd}g2Jq%^T%lLYt9)aWC@Y&Xt(6t=8M`z&~LhRU+nDe2nJtV-0CCLQRKtPwvxlXbw$?2&{vTkK3RE&th&cK zSz}_=p{Kh|mikzDc!XaO{N#6J-n|3u04w9 zxZ1CFC6zg;#h~&az?+dtgaKZTOui^0%@o5s`JIR)*lsRSX(m^` z$?BrA3Lt}xUq9Zp7HH6KVDTb_V(=pV$$5e@lN&^N!20@u`q~91uMt&cy9_Fa7yz1h B>m~pI diff --git a/tmp/fpgrowth_rules.xlsx b/tmp/fpgrowth_rules.xlsx index 1f99d785e1f941f04d151b595846eb72ef9a08e6..48f7b4a4d7dd9ece474bfb949bf3cf32dcc95035 100644 GIT binary patch delta 1736 zcmY+FdpOg39LImZ&6duvnM~#~x7^wsT80$U?TlJRa%z!C9m+P5l?UgyJvlk&SfzfV z4#y=N$|?5|LWzz&T~3X-+$iE_x*g{-_Q5^`Q!C%v8pF)vUVZW z)&KyY4yXliFKOOVUlR7^)NNLm?%P5V#8#g)%+ERu#%{#PWJ6x@%SxY+Zuxk4`%B^5 zR)+<5NUVF_BUo?Lg)cOFmFj<%C&{<}vn9*LT96nwNgFbMdZAyO+&lSM&EP^nOou z;`%j7pTBFbkN26Jvc(tiF0W`&vMzISvf~nN|Rx zvow%15#Lt)4cemd%L6GnzAq$54FF>F0AMWuAH)-(^H*hDsWWb8P|HM2@HOf-sf{6$ zqu25&M0mZ0U!t4w%TJHf);qMxr6q$KiAOA{Z98ynmp@;^clLKG%EBSOGIesWZ(G8L z+l9(Z?~lpXrSj*wAC7g{7%A6RGvlnIAxW>U>;`j4KHrsVci1gxO;Y)$Jx*g&ydY^u z?VV02CT4e#)bljtoH`DX_R2ON@@}4s%|Anbh z-A$K0l2dV8RJdM9bn3^!`1XsoTljhp;ao>2=2W!vTzOsAUrAmCn>bUfoo^Q77}>so z*c~(b=4R@;Z3?x#4;j1bEzZp&6be~tpaSadUi7Q0Z_K*=2OL;S`8YOzD|Vi$;`$BR zF8I8Us^Dfk^mMJ{SM+MFA|*{nk13_a?6 z2>aWHn_l+c>3dZOM><*t+(;~7)NH^up z?>gzOozC&Z;%5$*U8oo-u>a7Hf+XwY_Xf7qiqz0wt2|`fOxmdO7$A`so({R$fA)Y$7K(czP(MUE=N_gw z`@ntwe4IJPUX?S7#Y3eNR<9hIKA&xMXDr+s$PS?OhZMa+1CFnyc?t2*5gt+uh8YMd z!TmJg^p9W!@=Wl2It^$?Ctv%{wp5cY1@bkU%E1~WSc;`9fqZP!q{p<<;2=6HPl)N6S!qaU*$~yAAC-uu_ z+6Ll95Tsz05laGcT+gTsz9k?f>P2bDH0`dVx^L8r&I_KYhv}Qv6l;Z=zr_?I!qwtA zffHWD46sU{^&7~c*2pe&2qYTT9fCCdCP!qsJ}Uz((C^xSterxJQgdiXFKW)wbHg9s z6>6UlRuWjpg=C80glh;T#37#np$1LSR%IZ=K#&hU+CZOBIxNqU zK@@zDf$5$!ARL*p5jcQWzujR5lN{$P+Ab32dX>LEN$Bo@2i@3EPiLUNSv1LU)+dTY zk!OoWQ4R{9JkmPF)2)ll;*>||pCy0~(S(hT{K2QCg*#qqr25{ar-%9XDXAVUn-ce4 zS~xB%gnKgo(!CQN#nl>aPOv?F!-zXl(nn(&d!HL0I$4-7<^DCKWx8-iB0e-&G*Y%F`>x@R}3b0V8z&g+x4#@(02WTb+}pEX{Ab~?WXlL+F(z-v&pjc ze-{AITteZ0O8{nTz`1yXm3$-K0C5rv_u%ydmouMYz?=3U0N5f)Jl+YrGn@$4E)cN>`10+rsblYIZ!HxomkuC)6|UBX1F(iLS4U%|X@ZUcA`=gL P;B?^<9UOXO8Pvc(#xm;? delta 1112 zcmdm^b5xx-z?+#xgn@y9gTcQsXCm)fK_C^yBes3!E1=+MMg|7K$$=sw6YulZPvT+; zoX*`L?BU_VRM;()-+gUMVA7R$Z!=F{YkY9b@SlDCwyC$=Qg^qUU)eq5L~7x1IkkGOT|8r(cZk5>-zoLHM`_ubo?JQJg%=hot|NN;n-+1OVrOR74 zpHefqqG}r}((fF6czaUqtiPcS+ojYstlVNY7k`SndpBQh#ot#+@_)pu*n3|K-AT$$H$cYnOJlzLMu`;?Dw=SVuMz1sO>iYmh-d*8dKZfFVa zuJ%d|b2|J)_WgoTZB}t!=Xz5ScP(p19eF-e)6(4A%XwEvX?M2mG@t15r=|4jq1g(b zu9*1zv2{56`$o~4(?_aHbqZ%J@Vv57xrX82n=6c_OWG!f^KRMnNLMi6$hGF;`hsK1 zho{Ahe)*)Pwrkdu&;GU*CzDTK^K|5u%wh|+Pp@d%bxmXHsq5xfcSU_YdHY9GeZ7>P z!_(gu;u zSIfUPI;{;m)qZkv!+PN@9&rLvoEpkqTAF)3jK6BkN!%s=thxH|mHfwZZV1};ySuI4 z{or)?kLbhq&;2;pvOo60a_LRWZb%-@TUMZ6-*vZ%DeT9*htZkh9Wzlw>$V;Z(#ak_mPuFEd{+j$h+%bPv+qH z=^o}McOR(wTPo$ZZ3ww5*>Z2eHSTj4c}k`m^Vz!AYmV1boF-VlNB!qyzHEH~Lo#2l=uM8u8{HKk2HAYuWQ`Yj?Islf$Kk;NsI zIjO~APoZzjK6po7~+dkbBgu#KqQ*R$@!wv zOpkdd_lU}ZEn5TRI`B_EDXO6Wa?b2Frxs~o!oSW8$rT7=RRtysim9>{3W9_HNvzP%