色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實戰(zhàn)洞察。

Pandas數(shù)據(jù)處理:異常值、抽樣與聚合避坑指南

Pandas數(shù)據(jù)處理:異常值、抽樣與聚合避坑指南 Pandas 數(shù)據(jù)處理指南異常值、抽樣和數(shù)據(jù)聚合前陣子幫一個做電商數(shù)據(jù)的朋友看報表他拿一份兩百多萬行的訂單明細(xì)跑groupby(channel).agg({amount:sum})出來的 GMV 跟業(yè)務(wù)方口徑差了將近三成。他一開始懷疑是 SQL 導(dǎo)出口徑不一致翻來覆去對了兩天最后定位到三個問題疊在一起幾條測試賬號的大額訂單沒剔掉一批amount為空的記錄被sum當(dāng) 0 算進(jìn)了分母還有一個渠道因為抽樣的關(guān)系樣本量只有幾十條卻被當(dāng)成正常渠道參與排名。這三個問題分別對應(yīng)數(shù)據(jù)處理的三個基本功——異常值處理、抽樣、聚合恰好也是絕大多數(shù)人覺得自己會用、真到業(yè)務(wù)里卻頻繁翻車的三個地方。這篇內(nèi)容想聊的就是這三件事。它適合已經(jīng)能寫df.groupby()、df.sample()但經(jīng)常在結(jié)果對不上、口徑說不清、跑得慢這幾件事上卡住的人。我會把每個環(huán)節(jié)里那些文檔上不寫、但實際項目里一定會遇到的東西講透包括檢測方法什么條件下會失效、抽樣參數(shù)背后代表什么、聚合結(jié)果怎么組織才能直接進(jìn)報表。文中用到的代碼都可以直接復(fù)制到 Notebook 里跑數(shù)據(jù)表結(jié)構(gòu)我盡量寫得通用換成你自己的字段名就能用。1. 異常值先分三類錯誤值、極端值、結(jié)構(gòu)性偏移處理方式完全不同很多人對異常值的處理方式是跑個 describe看到最大值離譜就刪掉這個做法在真實業(yè)務(wù)里十次有八次會出錯。異常值不是一個統(tǒng)計學(xué)概念它是統(tǒng)計概念和業(yè)務(wù)語義的交叉點同樣一個數(shù)值在不同的字段上有完全不同的含義。我習(xí)慣先把它分成三類因為這三類的處置邏輯是互斥的。第一類是錯誤值本質(zhì)是數(shù)據(jù)在采集、傳輸、錄入環(huán)節(jié)出了問題。典型表現(xiàn)是單位錯位金額字段里混進(jìn)了一條以分為單位的記錄、編碼錯誤缺失被填成-1、9999、0而不是NaN、類型錯位日期列里混進(jìn)了字符串。這類值不屬于偏大偏小它壓根就是錯的處理方式應(yīng)該是修正或者置空而不是簡單刪除。第二類是極端值數(shù)據(jù)本身是對的只是落在分布尾部。比如某個大客戶單筆下了五十萬的訂單這個值真實發(fā)生了刪掉它等于把真實業(yè)務(wù)抹掉。這類值要考慮的是它對我要算的指標(biāo)有沒有影響——算平均值它影響巨大算中位數(shù)幾乎沒影響。第三類是結(jié)構(gòu)性偏移指的不是單條記錄異常而是某個分組的整體分布和其他分組不在一個量級上。比如某個渠道的客單價整體是其他渠道的十倍這往往不是渠道用戶質(zhì)量高而是這個渠道的金額字段包含了運(yùn)費或者稅費采集口徑跟別人不一樣。這類問題用單變量檢測方法根本發(fā)現(xiàn)不了必須按分組切開看。1.1 用 describe 和 value_counts 做第一輪體檢動手之前先做體檢不要上來就寫過濾條件。我通常跑這么幾行import pandas as pd import numpy as np df.info() df.describe(includeall).T df[amount].value_counts().head(20) df[amount].value_counts().tail(20)describe看的是分布輪廓重點看三個數(shù)min是不是負(fù)數(shù)金額類字段出現(xiàn)負(fù)數(shù)通常意味著退款混進(jìn)來了、max是不是比75%分位大出好幾個數(shù)量級、mean和50%分位的差距有多大。均值遠(yuǎn)大于中位數(shù)說明右偏嚴(yán)重后面選檢測方法時就不能用基于正態(tài)假設(shè)的那套。value_counts的頭部和尾部是在找哨兵值。所謂哨兵值就是用特定數(shù)字表示特殊含義的約定-1表示未填寫、0表示未知、9999表示不適用。這類值在統(tǒng)計上看起來可能不離譜-1甚至不大但它會嚴(yán)重污染均值。我遇到過age字段大量填0的情況算出來平均年齡 26 歲實際主力用戶是 35 歲以上就是被這批 0 拉下去的。這一步的經(jīng)驗是先看value_counts的尾部再看describe。因為哨兵值往往在尾部出現(xiàn)得很突然比如正常金額都是幾十到幾千尾部突然出現(xiàn)一個-999一眼就能看出來。而describe只會告訴你最小值是 -999不會告訴你這個值出現(xiàn)了 800 次。1.2 IQR 的上下界怎么算什么時候它會騙你IQR 法是箱線圖的數(shù)學(xué)基礎(chǔ)計算很直接q1 df[amount].quantile(0.25) q3 df[amount].quantile(0.75) iqr q3 - q1 lower q1 - 1.5 * iqr upper q3 1.5 * iqr mask_normal df[amount].between(lower, upper) print(f下界 {lower:.2f} 上界 {upper:.2f} 異常占比 {(~mask_normal).mean():.2%})1.5這個系數(shù)不是拍腦袋的在正態(tài)分布下它對應(yīng)的區(qū)間大約覆蓋 99.3% 的數(shù)據(jù)所以正常數(shù)據(jù)被判為異常的比例應(yīng)該在 1% 以內(nèi)。這個數(shù)字很重要——如果你用 IQR 算出來的異常比例是 15%那不是數(shù)據(jù)有問題是方法用錯了說明數(shù)據(jù)分布嚴(yán)重偏離正態(tài)或者 Q1、Q3 本身就被污染了。IQR 最容易騙人的場景是右偏嚴(yán)重的數(shù)據(jù)比如訂單金額、用戶消費額、頁面停留時長。這類數(shù)據(jù) Q1 和 Q3 都擠在左側(cè)IQR 很小算出來的上界就會很低把大量正常的大額訂單判成異常。我實測過一份客單價數(shù)據(jù)Q1 是 38Q3 是 96上界算出來只有 183但實際上千的單子占了 8%這些全是真實的大客戶訂單。通用的補(bǔ)救辦法是先做對數(shù)變換再算 IQR或者直接用分位數(shù)縮尾比如把上下 1% 的值截斷到 1% 和 99% 分位的值上后者對業(yè)務(wù)解釋更友好因為它不改變數(shù)據(jù)的單調(diào)性lo, hi df[amount].quantile([0.01, 0.99]) df[amount_winsor] df[amount].clip(lowerlo, upperhi)1.3 刪除、縮尾、標(biāo)記、分箱四種處置各自適用什么場景檢測出來之后怎么處理這是最見功力的地方。我整理了一張對照表基本覆蓋了日常遇到的場景處置方式適用場景風(fēng)險點直接刪除確認(rèn)為錯誤值且占比低于 1%占比高時會造成樣本偏差縮尾clip極端值真實存在但要算均值類指標(biāo)會壓縮真實差異需在報告里注明打標(biāo)記不刪極端值本身是分析對象如大客戶識別下游所有計算都要帶上標(biāo)記過濾分箱處理用于建模特征或做分布對比分箱邊界選擇主觀性強(qiáng)單獨分組結(jié)構(gòu)性偏移如某渠道口徑不同需要額外解釋容易讓報表難讀刪除這條我想多說一句。很多教程寫刪除 3σ 之外的記錄但從來沒說刪完之后必須重新檢查分布。原因很簡單刪掉尾部會改變均值、方差、分位數(shù)如果下游還有別的過濾條件兩次過濾疊加可能把某個分組刪空。我的習(xí)慣是刪除前后各跑一次groupby.size()確認(rèn)每個分組的剩余量都還夠做結(jié)論經(jīng)驗閾值是單組不低于 30 條不夠就別刪改成標(biāo)記。還有一個更隱蔽的坑刪除操作會破壞索引連續(xù)性。如果后續(xù)用位置索引iloc或者把索引當(dāng)成 ID 用刪完就容易錯位。所以刪除之后一律加.reset_index(dropTrue)或者干脆養(yǎng)成習(xí)慣任何過濾之后都重置一次。2. 檢測手段的選型從 MAD 到孤立森林每種方法的失效條件是什么搞清楚異常值的分類之后接下來的問題是用什么方法找出來。這里有個很普遍的誤區(qū)方法越復(fù)雜越好。實際上孤立森林、LOF 這些算法在業(yè)務(wù)數(shù)據(jù)上的表現(xiàn)經(jīng)常不如一個老老實實的分位數(shù)閾值原因是它們對參數(shù)和數(shù)據(jù)尺度非常敏感而業(yè)務(wù)數(shù)據(jù)往往是臟的、混合分布的、量綱不統(tǒng)一的。我的選型邏輯是按數(shù)據(jù)形態(tài)走單變量近似對稱的用 Z-score單變量偏態(tài)的用 MAD多變量相關(guān)的用馬氏距離或孤立森林時間序列用滾動統(tǒng)計量。下面逐個說清楚它們的前提和失效邊界。2.1 Z-score 的前提是近似正態(tài)偏態(tài)數(shù)據(jù)上它會誤傷Z-score 就是標(biāo)準(zhǔn)分(x - mean) / std閾值一般取 3z (df[amount] - df[amount].mean()) / df[amount].std() outliers df[z.abs() 3]寫法簡單到?jīng)]什么可說問題在于它的兩個隱含假設(shè)均值能代表中心標(biāo)準(zhǔn)差能代表離散程度。這兩個假設(shè)只有在分布近似對稱時才成立。右偏數(shù)據(jù)里尾部的大值會把均值往上拉同時把標(biāo)準(zhǔn)差撐大結(jié)果是真正的異常反而算不出高分。這個現(xiàn)象叫掩蔽效應(yīng)是 Z-score 在業(yè)務(wù)數(shù)據(jù)上最致命的問題。還有一個技術(shù)細(xì)節(jié)容易被忽略std()默認(rèn)是樣本標(biāo)準(zhǔn)差ddof1如果跟別的系統(tǒng)比對結(jié)果時對方用的是總體標(biāo)準(zhǔn)差閾值會有一點差異。數(shù)據(jù)量大的時候影響可以忽略數(shù)據(jù)量小的時候比如幾百條值得注意。2.2 修正 Z-score 用中位數(shù)和 MAD抗噪但要注意 MAD 為 0修正 Z-score 把均值和標(biāo)準(zhǔn)差換成中位數(shù)和絕對中位差MAD這兩個統(tǒng)計量的崩潰點高得多少量極端值影響不了它們med df[amount].median() mad (df[amount] - med).abs().median() modified_z 0.6745 * (df[amount] - med) / mad outliers df[modified_z.abs() 3.5]0.6745這個常數(shù)是為了讓 MAD 在正態(tài)分布下和標(biāo)準(zhǔn)差可比等價于1 / 1.4826。閾值3.5是文獻(xiàn)里通用的經(jīng)驗值對應(yīng)正態(tài)分布下大約 0.02% 的比例。這個方法有一個必須處理的邊界情況MAD 等于 0。當(dāng)超過一半的數(shù)據(jù)取值完全相同時就會發(fā)生典型場景是大量用戶的下單次數(shù)都是 1此時(x - med)對大多數(shù)記錄是 0MAD 就是 0除零之后全是inf或nan。處理方式是加一個極小值保護(hù)或者在這種場景下?lián)Q成基于計數(shù)的異常定義mad max(mad, 1e-9)我個人的經(jīng)驗是對于次數(shù)型字段下單次數(shù)、登錄次數(shù)、點擊次數(shù)MAD 和 IQR 都不太好使因為分布是離散且高度集中的。這時候更靠譜的做法是直接用業(yè)務(wù)規(guī)則比如下單次數(shù)大于 50 次且 7 天內(nèi)完成這類組合條件。2.3 多變量異常馬氏距離和孤立森林的落地寫法單變量檢測看不到組合起來才異常的記錄。比如一個用戶年齡 25 歲、年消費 80 萬這兩個值單獨看都不算極端但放在一起就非??梢?。這類問題需要多變量方法。馬氏距離考慮變量間的相關(guān)性要求數(shù)據(jù)近似多元正態(tài)而且樣本量要大于特征數(shù)否則協(xié)方差矩陣不可逆from scipy.spatial.distance import mahalanobis cols [age, amount, order_cnt] X df[cols].dropna().to_numpy() mu X.mean(axis0) cov_inv np.linalg.pinv(np.cov(X, rowvarFalse)) d np.array([mahalanobis(row, mu, cov_inv) for row in X]) threshold np.quantile(d, 0.99)注意這里用了pinv而不是inv因為特征之間高度相關(guān)時協(xié)方差矩陣奇異inv會直接報錯。另外mahalanobis是逐行調(diào)用的幾百萬行會非常慢實際項目里建議用矩陣運(yùn)算重寫d np.sqrt(np.einsum(ij,jk,ik-i, X - mu, cov_inv, X - mu))。孤立森林不依賴分布假設(shè)思路是隨機(jī)切分空間異常點因為稀疏所以更容易被孤立出來路徑更短。落地寫法from sklearn.ensemble import IsolationForest model IsolationForest( n_estimators200, contamination0.01, max_samplesauto, random_state42, n_jobs-1, ) model.fit(df[cols].fillna(0)) df[if_flag] model.predict(df[cols].fillna(0)) # -1 為異常 df[if_score] model.score_samples(df[cols].fillna(0))contamination是最關(guān)鍵的參數(shù)它直接決定判定比例設(shè)成 0.01 就意味著一定有 1% 的記錄被判為異常不管數(shù)據(jù)里到底有沒有這么多。這是一個很強(qiáng)的先驗假設(shè)所以我一般不用predict的硬標(biāo)簽而是用score_samples拿連續(xù)分?jǐn)?shù)再結(jié)合業(yè)務(wù)規(guī)則人工圈定閾值。這樣既能利用算法的排序能力又不會因為參數(shù)設(shè)置錯誤而誤刪大量正常數(shù)據(jù)。2.4 時間序列上的異常滾動統(tǒng)計量比全局閾值靠譜時間序列的異常判定不能用全局閾值因為業(yè)務(wù)本身有周期性和趨勢。春節(jié)期間的訂單量比平時高五倍那是正常的但某個工作日的訂單量突然掉了一半那才是異常。常用做法是滾動中位數(shù)加滾動 MAD用局部統(tǒng)計量代替全局統(tǒng)計量df df.sort_values(dt).reset_index(dropTrue) roll_med df[amount].rolling(window7, min_periods3).median() roll_mad (df[amount] - roll_med).abs().rolling(window7, min_periods3).median() score 0.6745 * (df[amount] - roll_med) / roll_mad.replace(0, np.nan) df[ts_flag] score.abs() 3.5min_periods必須顯式設(shè)置否則前 6 行的結(jié)果全是NaN容易在后面被誤當(dāng)成正常值。窗口大小按業(yè)務(wù)周期定日數(shù)據(jù)用 7周數(shù)據(jù)用 4 到 8太小容易把正常波動判成異常太大會讓異常點污染窗口內(nèi)的統(tǒng)計量導(dǎo)致檢測滯后。還有一個更實用的做法是同比環(huán)比結(jié)合即(今日 - 上周同日) / 上周同日超過某個比例就標(biāo)記。這個方法業(yè)務(wù)解釋性極強(qiáng)報表上可以直接展示較上周同日下降 62%比一堆統(tǒng)計量更容易讓人相信。3. sample 不只是隨機(jī)抽幾行抽樣參數(shù)、分層方案與代表性校驗抽樣這件事在很多人心里就是數(shù)據(jù)太大跑不動抽一萬行先看看。但抽樣的目的是讓樣本能代表總體一旦這個前提不成立后面所有的分析結(jié)論都是廢的。我見過最典型的翻車是拿df.sample(1000)抽出來的樣本去評估轉(zhuǎn)化率抽出來的結(jié)果比全量高了兩個百分點查到最后是因為原始數(shù)據(jù)按時間排序隨機(jī)抽樣恰好抽到了一個促銷時段。3.1 n、frac、weights、replace 的實際含義sample的參數(shù)不多但每個都有實際影響df.sample(n1000, random_state42) # 固定條數(shù) df.sample(frac0.1, random_state42) # 固定比例 df.sample(n1000, replaceTrue, random_state42) # 有放回 df.sample(n1000, weightsweight_col, random_state42) # 加權(quán)random_state在需要復(fù)現(xiàn)的場景必須固定尤其是做 A/B 對比分析時兩次抽樣用了不同的種子結(jié)果差異可能完全來自抽樣本身而不是業(yè)務(wù)變化。replaceTrue只在一種情況下需要樣本量要超過總體或者要做 Bootstrap 估計。日常抽樣基本不用因為重復(fù)樣本會讓統(tǒng)計量的方差被低估。weights是加權(quán)抽樣適合做重要性抽樣或者過采樣。有個坑值得說weights可以傳列名也可以傳數(shù)組但如果傳入的 Series 索引和 DataFrame 索引不一致pandas 會按位置對齊而不是按索引結(jié)果可能完全錯亂。穩(wěn)妥做法是直接傳.to_numpy()。frac和n不能同時指定這個大家都知道。但有個隱蔽問題frac大于 1 且沒設(shè)replaceTrue時會報錯而frac1返回的是打亂后的全量數(shù)據(jù)不是原始順序很多人在這一步誤以為數(shù)據(jù)被改了。3.2 分層抽樣手寫循環(huán)比 groupby.apply 更省心分層抽樣保證每個分組在樣本里的比例和總體一致這是報表抽樣幾乎必做的事。常見寫法有兩種我更推薦手寫循環(huán)def stratified_sample(df, col, n_per_groupNone, fracNone, seed42): parts [] for key, g in df.groupby(col, observedTrue, sortFalse): if n_per_group is not None: k min(n_per_group, len(g)) parts.append(g.sample(nk, random_stateseed)) else: parts.append(g.sample(fracfrac, random_stateseed)) return pd.concat(parts, ignore_indexTrue) sample_df stratified_sample(df, channel, frac0.05)為什么不用groupby.apply(lambda x: x.sample(...))兩個原因。一是新版 pandas 對返回結(jié)果形狀不一致的apply會有棄用警告行為在版本間有變化維護(hù)成本高。二是apply會把每個分組當(dāng)獨立函數(shù)調(diào)用幾萬個分組的時候速度慢一個數(shù)量級。手寫循環(huán)雖然多幾行但行為完全可控出問題好排查。min(n_per_group, len(g))這個保護(hù)必須加。小分組的數(shù)據(jù)量小于要求抽樣量時sample(nk)會直接拋ValueError整個流程中斷。用min兜底配合后面的一致性核對能馬上發(fā)現(xiàn)哪些分組樣本不足。observedTrue也不能省。如果你的分組字段是category類型默認(rèn)行為會把所有類別組合都列出來包括數(shù)據(jù)里根本不存在的組合白跑一堆空分組。新版 pandas 里這個默認(rèn)值已經(jīng)改了但如果代碼要兼容老版本顯式寫上更保險。3.3 樣本量怎么估以及抽完必須做的一致性核對樣本量不是拍腦袋定的。判斷比例類指標(biāo)比如轉(zhuǎn)化率時用這個公式n z2 × p × (1-p) / e2z是置信水平對應(yīng)的分位數(shù)95% 對應(yīng) 1.96p是預(yù)期比例不知道就取 0.5此時方差最大e是允許誤差。取p0.5、e0.03算出來 n 約等于 1067。如果總體本身不大還要做有限總體修正n_adj n / (1 (n - 1) / N)總體 5000 條時修正后的樣本量是 878比 1067 小了不少。這個修正很容易被忽略導(dǎo)致對小數(shù)據(jù)集做了不必要的過度抽樣。抽完之后必須做一致性核對這一步比抽樣本身更重要。我通常跑三件事分組占比對比、關(guān)鍵字段的分位數(shù)對比、空值率對比。total_ratio df[channel].value_counts(normalizeTrue) sample_ratio sample_df[channel].value_counts(normalizeTrue) compare pd.DataFrame({總體: total_ratio, 樣本: sample_ratio}) compare[偏差] (compare[樣本] - compare[總體]).round(4) print(compare.sort_values(偏差, keyabs, ascendingFalse))偏差超過 1 個百分點就要警惕。如果發(fā)現(xiàn)某個分組偏差明顯先檢查這個分組的總量是不是太小小于 100 條時抽樣波動本身就大排除之后再考慮加大樣本量或者改成按權(quán)重抽樣。對連續(xù)型字段用quantile([0.1, 0.25, 0.5, 0.75, 0.9])對比總體和樣本兩列并排看。這一步能發(fā)現(xiàn)隨機(jī)抽樣抽偏了分布的情況比如整體樣本量夠了但高分位被系統(tǒng)性低估。3.4 分層抽樣的一個變體按業(yè)務(wù)重要性分配配額嚴(yán)格按比例分層有時候不實用。比如做渠道分析時主力渠道占 90% 的量長尾渠道加起來只占 10% 但包含幾十個渠道按比例抽的話每個長尾渠道只能分到幾條根本沒法單獨看。這時候用配額抽樣更合理主力渠道按比例抽長尾渠道強(qiáng)制保底若干條。big stratified_sample(df[df[channel].isin([A, B])], channel, frac0.02) small stratified_sample(df[~df[channel].isin([A, B])], channel, n_per_group50) sample_df pd.concat([big, small], ignore_indexTrue)這樣做出來的樣本不能直接用來算整體均值因為它經(jīng)過了人為加權(quán)。但如果用途是看每個渠道的畫像那完全合理。關(guān)鍵在于樣本用途決定了抽樣方案而不是反過來。這一點我會在交付分析結(jié)果時明確寫出來避免下游拿著加權(quán)樣本去算全站 GMV。4. groupby 的執(zhí)行邏輯與 agg 寫法把聚合結(jié)果做成能直接進(jìn)報表的形狀聚合是三個環(huán)節(jié)里最常用的也是最容易產(chǎn)生結(jié)果對不上的環(huán)節(jié)。原因往往不在groupby本身而在于 NaN 的處理、索引的形狀、以及聚合函數(shù)的語義選擇——sum()對全 NaN 分組返回 0mean()對全 NaN 分組返回 NaN這兩個行為的差異能讓報表數(shù)字出現(xiàn)明顯偏差。4.1 groupby 到底做了什么為什么要關(guān)注 as_index 和 observedgroupby的執(zhí)行過程是拆分-應(yīng)用-合并按 key 把數(shù)據(jù)切成若干塊對每塊執(zhí)行聚合函數(shù)再把結(jié)果拼成新表。理解這一點很多行為的來源就清楚了。as_indexFalse決定了分組字段是留在索引上還是變成普通列。大多數(shù)接報表的場景都應(yīng)該設(shè)成False因為后續(xù)要merge、要導(dǎo)出 Excel、要寫進(jìn)數(shù)據(jù)庫索引里的列很麻煩result df.groupby(channel, as_indexFalse).agg(gmv(amount, sum))dropna決定分組字段為 NaN 的記錄要不要參與。默認(rèn)是丟棄這在統(tǒng)計上合理但在業(yè)務(wù)上經(jīng)常出問題——空的分組字段往往代表未歸類直接丟掉會讓總數(shù)對不上。我一般會先把空值填成未知再分組這樣總量是守恒的。observedTrue前面提過主要影響 categorical 類型。還有一個相關(guān)的坑如果分組字段的 dtype 是object但實際取值只有少數(shù)幾個可以先轉(zhuǎn)成category分組速度能快好幾倍內(nèi)存也能省一半以上。4.2 命名聚合比傳字典更清晰也更好接下游聚合的寫法有好幾種從差到好排下來# 寫法一多函數(shù)聚合結(jié)果是 MultiIndex 列 df.groupby(channel).agg({amount: [sum, mean, count]}) # 寫法二傳字典只能給一列配一個函數(shù)或函數(shù)列表 df.groupby(channel).agg({amount: sum, order_id: nunique}) # 寫法三命名聚合推薦 summary df.groupby(channel, as_indexFalse).agg( gmv(amount, sum), order_cnt(order_id, nunique), avg_price(amount, mean), p90(amount, lambda x: x.quantile(0.9)), )寫法一的問題是多函數(shù)聚合出來是二級列名result[amount][sum]這種取法在導(dǎo)出、重命名、拼接時都很別扭得用flatten處理。寫法三直接給每個聚合結(jié)果命名列名是扁平的可以直接進(jìn)報表。用lambda算分位數(shù)很方便但性能很差——它是逐組調(diào)用 Python 函數(shù)幾萬個分組時能慢十倍以上。數(shù)據(jù)量大時改用functools.partial或者先算分位數(shù)列再聚合from functools import partial q90 partial(pd.Series.quantile, q0.9) summary df.groupby(channel, as_indexFalse).agg(p90(amount, q90))另外還有一個語義陷阱count和size的區(qū)別。count統(tǒng)計非空值數(shù)量size統(tǒng)計行數(shù)含空值。做訂單數(shù)統(tǒng)計時如果用錯空值多的分組會少算。nunique默認(rèn)不統(tǒng)計空值這個行為一般符合預(yù)期但如果需要把空值也算一種取值得顯式dropnaFalse。4.3 transform 和 apply 的分工以及性能差距transform的作用是按組計算但結(jié)果保持原表形狀用來做組內(nèi)標(biāo)準(zhǔn)化、組內(nèi)占比、缺失值組內(nèi)填充特別方便df[channel_avg] df.groupby(channel)[amount].transform(mean) df[amount_ratio] df[amount] / df[channel_avg] df[rank_in_channel] df.groupby(channel)[amount].rank(ascendingFalse, methoddense)如果不要求保留原形狀只是想拿到每組一個值那就用agg它比transform快因為不需要把結(jié)果廣播回每一行。apply最靈活可以返回任意形狀但也是三者里最慢的。它的價值在于邏輯復(fù)雜、沒法用內(nèi)置函數(shù)表達(dá)的場景比如組內(nèi)要做時間序列插值、要做排序后取第 N 行top3 df.groupby(channel, group_keysFalse).apply( lambda g: g.nlargest(3, amount), include_groupsFalse )新版 pandas 里apply作用在 DataFrame 上時分組列默認(rèn)會包含在數(shù)據(jù)里需要在函數(shù)里排除否則會報錯或者產(chǎn)生重復(fù)列。加include_groupsFalse是比較穩(wěn)妥的寫法老版本沒有這個參數(shù)需要用g.drop(columns...)手動剔除。4.4 pivot_table 和 crosstab 的適用邊界pivot_table本質(zhì)上是groupby加透視適合做二維交叉表。跟groupby的區(qū)別在于它能一次把行維度、列維度都鋪開適合直接給人看pivot pd.pivot_table( df, indexchannel, columnsmonth, valuesamount, aggfuncsum, fill_value0, marginsTrue, margins_name合計 )fill_value0很重要否則交叉表里沒有數(shù)據(jù)的位置是NaN做后續(xù)計算時會傳播。marginsTrue會自動加行列合計省去手工算總數(shù)的一步但要注意合計行在索引里叫All可以自定義跟數(shù)據(jù)行混在一起如果后面還要做運(yùn)算記得先剔除。crosstab適合算頻次分布比pivot_table寫起來簡潔pd.crosstab(df[channel], df[status], normalizeindex, marginsFalse)normalizeindex按行歸一化輸出的就是每個渠道里各狀態(tài)的占比做轉(zhuǎn)化率分析很方便。normalizecolumns按列normalizeTrue按總數(shù)。這三個值容易搞混我的記法是歸一化的方向就是分母所在的方向。5. 三個環(huán)節(jié)串成一條流水線可復(fù)用函數(shù)與幾個高頻報錯分開看每個環(huán)節(jié)都不難真到項目里麻煩出在三者交織的地方。異常值處理改變了分布抽樣就要重新校驗抽樣讓部分分組數(shù)據(jù)變少聚合時就要處理小樣本分組聚合結(jié)果又要回到異常值判斷里做交叉驗證。把這些串起來我的做法是把每一步寫成獨立函數(shù)中間產(chǎn)物落盤方便回溯。5.1 函數(shù)拆分與參數(shù)設(shè)計整條流水線拆成四個函數(shù)每個函數(shù)只做一件事參數(shù)顯式傳入不依賴全局變量def profile(df, cols): 輸出字段體檢表空值率、唯一值數(shù)、分位數(shù)、疑似哨兵值 rows [] for c in cols: s df[c] rows.append({ col: c, dtype: str(s.dtype), null_rate: round(s.isna().mean(), 4), nunique: s.nunique(), min: s.min() if pd.api.types.is_numeric_dtype(s) else None, p01: s.quantile(0.01) if pd.api.types.is_numeric_dtype(s) else None, p50: s.quantile(0.5) if pd.api.types.is_numeric_dtype(s) else None, p99: s.quantile(0.99) if pd.api.types.is_numeric_dtype(s) else None, max: s.max() if pd.api.types.is_numeric_dtype(s) else None, }) return pd.DataFrame(rows) def flag_outliers(df, col, methodmad, k3.5): 只打標(biāo)記不刪數(shù)據(jù) s df[col] if method mad: med s.median() mad max((s - med).abs().median(), 1e-9) score 0.6745 * (s - med) / mad return (score.abs() k).fillna(False) if method iqr: q1, q3 s.quantile([0.25, 0.75]) iqr q3 - q1 return ~s.between(q1 - 1.5 * iqr, q3 1.5 * iqr) raise ValueError(funknown method: {method}) def build_sample(df, group_col, frac0.05, min_n30, seed42): 分層抽樣小分組保底 min_n 條 parts [] for key, g in df.groupby(group_col, observedTrue, sortFalse): k max(min_n, int(round(len(g) * frac))) parts.append(g.sample(nmin(k, len(g)), random_stateseed)) return pd.concat(parts, ignore_indexTrue) def build_summary(df, group_col, value_col, id_col): return df.groupby(group_col, as_indexFalse).agg( cnt(id_col, nunique), total(value_col, sum), avg(value_col, mean), p50(value_col, median), )這樣拆的好處是每一步都能單獨驗證。profile的輸出可以直接貼進(jìn)分析報告當(dāng)數(shù)據(jù)質(zhì)量說明flag_outliers加了_flag列而不刪數(shù)據(jù)出問題隨時能切換策略重跑。5.2 SettingWithCopyWarning 的根因和三種消除方式這個警告幾乎人人都見過很多人直接warnings.filterwarnings(ignore)了事但它是真實問題的信號。根因在于 pandas 無法確定你拿到的 DataFrame 是原始數(shù)據(jù)的視圖還是副本賦值操作可能改了原表也可能沒改行為不確定。最常見的觸發(fā)寫法是鏈?zhǔn)剿饕? 觸發(fā)警告 df[df[status] paid][discount] 0.9 # 正確寫法一先 copy sub df[df[status] paid].copy() sub[discount] 0.9 # 正確寫法二用 loc 一次定位 df.loc[df[status] paid, discount] 0.9寫法二最推薦一次完成定位和賦值不會產(chǎn)生中間對象。寫法的關(guān)鍵是copy()不能省很多人覺得加了copy()會多占內(nèi)存實際上 pandas 3.0 之后寫時復(fù)制是默認(rèn)行為copy()的開銷比想象中小得多而且能避免一堆難以排查的問題。還有一類更隱蔽的情況merge之后修改某一列時觸發(fā)這個警告。原因是merge結(jié)果的某些塊可能跟原始 DataFrame 共享內(nèi)存。處理方法一樣merge之后如果要做原地修改先.copy()。5.3 dtype 被悄悄改掉整數(shù)變浮點、空值被當(dāng)成 0這個坑比上一個大得多因為它不報警告只給你一個錯誤的數(shù)字。第一個典型場景原本是int64的列里出現(xiàn)空值pandas 會自動把它轉(zhuǎn)成float64??雌饋碇皇穷愋妥兞藢嶋H影響是id列變成浮點之后作為字典鍵或者跟字符串拼接會出現(xiàn)123.0這種結(jié)果去重、關(guān)聯(lián)、導(dǎo)出全都會出問題。解法是用可空整型df[qty] df[qty].astype(Int64) # 注意大寫 IInt64大寫是 pandas 擴(kuò)展類型支持pd.NAint64小寫是 numpy 類型不支持。這個大小寫區(qū)別坑過很多人。同理還有string和object、boolean和bool。第二個場景sum()把 NaN 當(dāng) 0 加。這是sum的設(shè)計行為skipnaTrue是默認(rèn)值。影響在于分母——如果算客單價時用amount_sum / order_count而amount有一批是 NaN那分子少算、分母照算客單價就被系統(tǒng)性低估。正確做法是先把空值處理掉再算或者在聚合里顯式指定df.groupby(channel).agg( gmv(amount, lambda x: x.sum(min_count1)), # 全空時返回 NaN 而不是 0 cnt(order_id, nunique), )min_count1的意思是至少要有 1 個非空值才計算結(jié)果全空分組返回 NaN這樣在報表里一眼就能看出哪些分組數(shù)據(jù)缺失而不是被 0 悄悄糊過去。第三個場景groupby之后 dtype 發(fā)生變化。分類字段轉(zhuǎn)成索引之后類型可能變尤其是用了category的地方。做完聚合之后加一句print(result.dtypes)檢查一下養(yǎng)成習(xí)慣能省掉大量為什么數(shù)字不對的排查時間。5.4 內(nèi)存與速度category 和避免 apply 的實測差距數(shù)據(jù)量上到千萬行之后性能就變成必須考慮的事。我做過一輪對比同一份 800 萬行的訂單數(shù)據(jù)幾個改動帶來的差異很明顯改動大致效果說明分組字段轉(zhuǎn)category分組耗時下降 40%–60%取值基數(shù)低時收益最大用agg命名聚合替代apply聚合耗時下降一個數(shù)量級apply是逐組 Python 調(diào)用數(shù)值列降精度float32內(nèi)存占用減少約一半精度要求不高的場景可用讀數(shù)據(jù)時指定dtype和usecols讀取階段內(nèi)存減少 60% 以上從源頭控制最有效用pd.NA替代np.nan語義更清晰內(nèi)存略增整數(shù)列可空時必需category的收益來自兩點一是值實際只存一份每個位置存的是整數(shù)編碼內(nèi)存從每行一個字符串變成每行一個小整數(shù)二是分組時可以直接按整數(shù)編碼做哈希比字符串比較快得多。轉(zhuǎn)的時候要注意如果某列取值基數(shù)接近行數(shù)比如用戶 ID轉(zhuǎn)成 category 反而更慢更占內(nèi)存轉(zhuǎn)之前先看nunique() / len(df)這個比值低于 0.1 再考慮。讀取階段優(yōu)化是最劃算的因為省的是全流程的內(nèi)存峰值dtype_map { order_id: string, channel: category, qty: Int32, amount: float32, } df pd.read_csv(orders.csv, usecolslist(dtype_map), dtypedtype_map)usecols只讀需要的列這一步經(jīng)常能省掉一半以上的內(nèi)存和時間。很多人的習(xí)慣是先全量讀進(jìn)來再刪列實際上源頭就過濾掉更高效。float32要注意精度金額類字段如果對小數(shù)位有嚴(yán)格要求比如到分用float32可能產(chǎn)生累積誤差建議保留float64或者干脆用整數(shù)存分。最后提一個容易被忽略的性能陷阱在groupby之后鏈?zhǔn)秸{(diào)用多次聚合不如一次agg里全寫完。每次鏈?zhǔn)秸{(diào)用都會重新觸發(fā)一次分組計算雖然 pandas 內(nèi)部有一些優(yōu)化但顯式一次寫完更穩(wěn)定。我在幾個項目里對比過把三次獨立的groupby().sum()、groupby().mean()、groupby().count()合并成一個agg耗時大約能降到三分之一。還有一個我個人的小習(xí)慣所有聚合結(jié)果在導(dǎo)出之前先跑一次總量守衡校驗——用原始數(shù)據(jù)的amount.sum()和聚合結(jié)果的total.sum()對比兩者必須完全相等浮點用np.isclose。這一步能抓出絕大多數(shù)過濾條件寫錯、空值被丟棄、分組字段意外為 NaN 的問題。寫完一條流水線加上這個校驗交付時心里就有底了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
超碰国产精品久| 丝袜内射| 亚洲日韩久久精品一区| 永久免费发布性爱网| 搞中出视频在线观看| 日本熟女不卡视频| 亚洲综合在线视频| av毛片aaaaa免费看| 好吊色一区| 久草精品国产99| 欧色性第一页| 国产AV超爽| 欧色网址| 后入人妻一区| 操高情无码| 人妻喷水| 亚洲熟女国产综合另类| 日韩乱伦AⅤ| 精品无码少妇| 国产夫妻一区二区| 奸色色 男人天堂 天天射| 久久免费少妇| 亚洲清纯唯美| 伊人97色天使| 熟女精品一区二区三区| 97在线精品观看视频| 91综合在线| 一级毛片电影免费看| 中日无幕一二三四区| 午夜免费福利视频一区| 欧美日韩国产一区二区小黄片大全| 国产又长又大又粗的视频| 久久精彩免费视频| 很黄很色的视频在线观看| 素人伊尹大香蕉免费下载视频| 诱惑网综合| 亚洲美腿丝袜香蕉影视欧美成人| 九九精品99| 日韩 女同 综合| 亚洲AV无码翔田千里网站| 东京热毛片177b2viP| 超碰激情808| 97se亚洲综合自| 久久系列| 91色s| 欧美三级免费伊人| 色色色色电影网| 天天色播亚洲综合网站| 亚洲日韩东京热一区| 芊芊操逼视频无码| 午夜无码熟妇丰满人妻| 综合欧美亚洲| 97超久碰| 久久久久久中文| 夫妻AV网站| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 日韩精品国产精品五码一区二区| 久久久蜜桃臀无码视频| 亚洲欧美日韩制服另类| 日韩免费在线视频观看| 天欧美在线| 91处女在线视频| 91成人在线| 91精品婷婷国产综合久久竹菊| 久久人人爽爽爽人久久久| 九九九九免费| 97超碰超欧美。| 性欧美第一页| 久久露脸国产老熟女| 沈阳熟女高潮对白视频| 日韩人成网站在线播放| 成人乱人伦一区二区| 久久一级无码精品毛片6| 国产av又色又爽又黄| 欧美精品69性爱| 嗯啊视频免费在线观看| 久99热| 日韩黄色一区二区三区| 亚洲无套久久嗯嗯| 色色激情五月天| 97资源站日韩| 大黄片做爱的大的| 国产精品内射婷婷一级二| 99久久婷婷丁香| 精品人妻一区二区三区不卡断| 久久 精品| 嫩草美女久久| 激情久久久| 亚洲自拍偷拍视频在线| 自慰白浆在线观看| 黄色网址久久精品欧美喷水| 屌逼麻豆| 啊啊啊啊啊啊啊网址在线观看| 超碰欧美| 一本久久久精品| 在线亚洲欧美| 国产精品视频一区二区三区八戒| 国产亚洲精品av一区| 大香蕉人妻| 欧美午夜精品久久久久久超碰| 麻豆精品A片免费观看| 99只有精品| 九一综合精品视品av| 国产精品在线网站| 综合第一页| 成人五月天色网| 免费观看欧美日韩操逼视频| 亚洲一区日韩精品中文字幕| 久久久婷| 92大香蕉| 免费观看有码高清视频| 国产又黄又爽| 香港澳门日本三级网站| 久久久久国产亚洲一区欧美色图日韩 | 日本一区二区三区欧美日韩中文字幕| 欧美日韩资源| 日本福利社| 91熟女视频网| 日本99久久| 五月婷婷六月丁香| 亚洲欧美国产中文字幕| 无码区蜜乳| 91c色| 久久女女| 爆乳免费黄网站| 天堂v无码免费视频| 亚州精人品大香蕉| a亚洲欧美色欲| 久久久不卡区一区二区三区久久久| 欧美性xxxxx狂欢| 国内精品a| 日韩ab网 | 午夜男女爽爽爽在线视频| 青青青青青手机视频| 九月丁香| 色色色色日本| 91天天爽| 亚洲自拍一区夜夜操| 久久五十路熟女人妻| 熟妇高潮精品一区二区三区下载| 干超碰碰熟女| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 91色色综合| 五月婷婷爱六月丁香色| 国产h片在线观看视频| 久久国产精品视频| 欧美色日本| 丁香五月激情网| 操逼不卡中文字幕| 久久夜黄色无码A级大片| 国产精品久久久久久久久久久久久久| 国产AV毛片| 久久久精品日本一道| 日欧操屄| 麻豆精品天美| 99ri精品| a片自拍直播视频| 大香蕉伊人亚洲| 国产成人www免费人成看片| 91精品国产综合久久久蜜臀酒店| 91bbbbbb| 国产美女高潮| 欧美亚洲国产91在线| 婷婷五月天激情网| 久草婷婷| 亚州色图欧美| 午夜亚洲| 91大神电影天堂| 粉嫩国产精品久久粉嫩| 婷婷国产精品九区| 一区二区不卡| 日本亚洲嫩草影院啪啪| 久久综合日韩亚洲欧美| 欧美亚洲影视| 欧美亚洲综合色| 殴美性色a级欧美| 天天干天天日天天射黄色| 亚熟在线| 欧美高清第一页| 精品91日日夜夜超清资源| 亚洲欧美另类小说| 亚洲欧美日韩制服另类| 99久久九九| 色哟哟-国产专区| 日日骚 av| 另类一区| 久热伊人99re| 日本三级人妻a人妻一在线| 在线色资源| 草久在线| 91狠狠综合久久久久久| 久久成年片色大黄全免费网站| 91free福利| 东京男人天堂| 欧美,日韩,亚洲视频| 97操综合| 亚洲色图在线视频| 九九精品无码专区免费| 人妻少妇久久| 久久久久久久久久久久久久久性生活视频 | 97久久久久久久久久| 91|九色|国产熟女| 久久激情婷婷| 久久综合av| 丰满人妻一区二区三区| 无码 黑人一区二区三区| 婷婷五月天伊人| 老司机福利青青草| 久久m| 久久久久久久一级黄色打同平台| 边做饭边操逼逼| 天天操天天日天天干| 另类专区在线观看| 俄罗斯一区二区视频在线观看| 亚洲青青草| 天美av在线观看| 国产尹人在线视频免费| 99这里只有精品国产| 校园春色美腿丝袜| 中文字幕在线2| 国产AAAAAABBBBB| 91人妻丝袜无码| 台湾佬激情综合| 夜夜做夜夜爽精品视频| WWW黄片COM| 99re99在线视频| 无码av永久免费专区网站| 蜜臀精品1区2区| 天天拍夜夜| 加勒比大香蕉视频在线| 一区二区三| 天天爱天天韩国日本牛牛牛牛 | 夜夜操夜夜高潮夜夜爽国产精品区| jazzjazz国产精品麻豆| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 一块操欧美性爱| 和协无码影院| 国产精品一区二区校花| ai欧美亚洲小说| 亚欧性爱ab| 欧美人妖内射| 熟女乱伦二区| 美女裸体无遮挡永久免费观看网站| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 91欧洲入口| 大香蕉五月天婷婷| 国产www色在线观看| 国产午夜精品一区二区三区牛牛| 极品少妇99| 亚洲国产激情国产av| 9久热这里只有精品| 人妻干天天| 国产97av| 日韩欧美~中文字| 久久熟女人| 2020中文在线一区二区三区| 综合五月天| 九九热九九热| 婷婷五月天小说| 91小视频| 精品九九国产无码| 蜜臀va69| 欧美日本视频一区| 97超碰中文| 亚洲精品1区| 国产精品一二三免费网站| 色色色色日本| 黄色大片免费在线| 男插女青青影院| 四虎AV无码| 99热这里只有精品9| 亚洲国产一级精品毛一级精品看免费视频 | ji熟女.com| 国产男女边吃边摸视频网站| 久艾草在线精品视频在线观看| 成人资源中文字幕在线观看| 亚洲清纯唯美| 伊人久久亚洲色欲综合网站 | 久久男女激情视频网站| 国产一区在线免费播放| 在线啊v一区| 91久久久久久| 97福利视频| 亚洲宗合电影| AV天天在线观看| 三级三久久线久久99久目本WW| 亚洲成a人片在线观看中文!!!| 色哟哟511老熟女| 中文字幕av亚洲在线| 久久性爱城| 激情五月丁香五月| 日韩欧美亚洲国产日韩| 91九色丨国产丨爆乳| 日日夜夜国产综合| 国产热av| 98人妻精品一区二区色欲| 高潮的A片激情扒开一区| 日本理论在线| 91麻豆一二三区| 亚洲自拍小说| 日韩成人精品| 九九久久九九久久| 国产中文字幕在线观看| 欧美 亚洲| 蜜臀久久99精品久久久| 久久精视频美日韩在线视频| 天美欧美国产| 国产欧美精选激情视频| 久久久久久久九九九九九九| 日本性一区| 秋霞 色色| 亚洲操逼视频网站| 久久精品无码不卡| 91人妻素女| 欧美青青视频| 夜间福利片1000无码| 人妻密肉在线观看| 情趣丝袜无码操逼视频| 97超碰无码网| 久热精品在线| 免费黄色视频网址| 99色热| 欧美日韩性爱视屏免费看了| 色路综合| 久久精品72| 特级特黄一级毛片免费| 97色涩| 伊人精品久久网站| 91国精产品| 欧美性爱日韩高清| 91久久堂| 欧美亚洲玖玖玖| 国产又粗又长视频| 久久久一区二区三区四曲免费听 | 欧美高潮在线| 日本欧美一区二区三区视频麻豆| 极品粉嫩少妇视频| 男女真人网18| 绯色一区二区三区不卡少妇 | 国产丝袜美女在线一区| 欧美综合色综合| 日本超碰在线国产一区| 精品少妇人妻av久久免费| 夜夜嗨免费视频| 日本天天色| 高清无码一区二区三区| 2017天天拍大香蕉| 四虎精品亚洲| 夜草欧美| 欧美日韩国产传媒在线精品| 亚洲国产婷婷在线播放| 亚洲在线网站| 亚洲视频精选| 91蜜臀熟女| 狼狼色丁香久久婷婷综合五月| 青青草久草AV| 射丝袜高跟鞋99| 九九成人| 又黄又爽在线观看视频| 国产福利影视| 操B在线观看| 欧美日本成人一区二区| 99re6在线视频播放免费精品| 在线一区| 蜜臀在线看片| 蜜桃臀一区二区三区久久| 欧美一区二区在线资源| 中文字幕在线观看AV| 性吧在线视频| 大香交伊人网| 人人考人人摸人人干| 日韩精品在线观看观看| 99久久综合网| 伦伦成年午夜免费视频| 丰满高潮18xxxx| 日韩精品在线观看观看| 成人七区| 日韩欧美字幕亚洲一区二区| 国产超碰| 激情图片伦理国产一区二区日韩| 久久99999| 欧美一区二区三区黄色影视| 日本一久是| 久久婷婷苹果| 国产黄色视频久久| 天天草夜夜草高潮片| 亚洲 欧美日韩 另类| 思思热在线视频精品| 国产AV久久久蜜爱影集| 人妻夜夜爽天天爽麻豆三区网站| 囯产精品强| 人妻娇喘 激情视频| 一区二区播放| 人妻丝袜一区二区三区在线| av天堂电影网| 蜜乳AV一区二区三区四| 九九九精品美女| 久久精品国产精品一区 | 大香蕉伊利av| 东京男人天堂| 成人亚欧免费视频| 久久鲁夜| 不卡在线观看视频| 一起草日韩| 人妻22p| 欧美日韩亚洲高清不卡一区二区三区| 人妻无码一区二区三区久久99| 欧美精品亚洲精品日韩传电影| 99热在线播放| 久久精品亚洲成a人天堂| 超碰调教97| 少妇精品| 日夜啪电影| 美女天天干| 亚洲日本激情| 婷婷精品国产一区二区三区日韩| 日韩有码 一区二区三区| 男人夜色天堂ss| 99re视频这里只有精品| 曰韩av中文字幕专区| 亚洲人久久久网| 看大黄色大片原件| 人妻天天爽夜夜爽2| 国产传媒午夜理伦精品| 怡红院怡春院| 日韩国产欧美伦理在线| 亚av顶级裸体一区二区三区四区五区 | 91欧美色| 国产999精品久久久久久| 美女9118禁| 日韩有码免费视频| 草草影院最新网址| 大香蕉色欲AV| 桃色五月天| 超碰97人妻在线| 国产美女口爆吞精| 大香网站| 91精品国产综合久久久蜜臀酒店| 亚洲成人一二三区| 日本中文字幕在线视频| 日本一区二区亚洲综合| 麻豆区久久久久亚| 人妻激情偷乱视频一区二区三区| 男女啪啪啪18禁网站| 久久久禁| 成人影 天天操 亚洲| 午夜视频久久久久一区| 国产97色在线 | 亚洲| 亚洲情色五月天 | 久久精品一区二区三区不卡| 国产亚洲中文不卡二区| 日韩精品人妻| 夜夜爽夜夜操| 久草电影网| 国产精品久久久久久夜夜夜| 久热99| 青草av在线| 国产极品美女高潮无套在线观看 | 综合欧美日韩在线| 女人的天堂大香蕉网| 日韩情色视频| 99熟女| 日本污ww视频网站| 日人妻视频91| 日韩久久激情精品| AV污污污污| www.亚洲成人一区| 亚洲伊人成综合成人网| 精品国产一区探花在线观看| 一本久道久久综合狠狠爱一密臀精| 精品成人女人久久| 激情黄色五月天| 欧美91丝袜| 怡红院亚洲怡春院av| 超碰色大香蕉| 欧美日韩欧美| 青娱乐国产剧情av一区| 国产精品爱欲| 欧美强奸一区二区诱惑| 91精品国产高清久久久久久,亚洲成人| 日韩 国产 欧美自拍| 国产 日韩 欧美一区| 亚洲精品一区二区日本| 中文字幕日韩人妻视频一区二区三区| 人人操肉肉| 强奸乱伦日韩AV| 亚洲高清无码免费观看视频| 熟妇女人妻呻吟久久AV| 日本黄色天堂| 国产精品熟女一区二区三区| 素人一区二区三区日韩| 六九九九| 婷婷人妻激情| 亚洲精品一区二区三区在线播放| 九九热免费视频| 麻豆 亚洲 97| 96久久久| 99这里有精品视频| 伦理日韩国产久久| 国产女人视频三四五区| 亚洲aV性爱| 欧美 综合| 一二三区精品视频| 日日摸夜夜夜夜爽| 中文高清一区二区的| 亚洲s色图| av三级电影在线播放| 亚洲一区二区三区欧美日韩| 97网址www| 竹菊一区二区三区AV线| 亚洲av无线观看| 熟女露脸激情自拍视频| 男人的天堂午夜av| 91撸色网 玖玖网 欧美| 成人自拍三级在线观看| 99热aaa| 亚洲春色一区二区三区| 五月丁香啪啪啪| 自拍六区| 99re6久热只有精品6在线直播| 九九九草| 亚洲精品成人| 亚洲天天更新| 亚洲精品欧美专业| 精品国产丝袜一区二区三区乱码| 久久久久久久久久黄色网| 国产精品亚洲色婷婷久久久| 欧美日韩精品国产91| 国产久久免费精品视频| 亚洲欧美精品一区天堂久久 | 特级特黄一级毛片免费| 嗯嗯啊啊视频在线看| 久久一区二区蜜桃| 超碰在线974| 国产极品精品美女视频| 亚洲诱惑天堂 | 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 夜夜肏2021| 欧美91精品国产自产| 日本天天色| 国产精品美女久久久久AⅤ国产馆| 麻豆婷婷成人一二三| 超碰在线香蕉| 青青草在线视频播放器| 97综合在线观看| 日韩亚洲国产视频| 大香蕉久久| 色偷偷人人玩人人舔人人操人人摸人人爽| 天堂种子在线www网资源| 欧美亚洲首页| 91 亚洲情侣偷拍 久久| 久久久不能久久久久| 青草草免费网站av| 久久久96| 久久国产精品m码| 麻豆伊人网| 欧美亚洲20p| 97色色视频| 26uuu国产日韩综合在线观看| 亚洲色图图片| 农村妇女精品一二区| 综合视频91| 久久亚洲天天做| 欧美日韩国第一区| 色哟哟-国产专区| 强奸少妇AV导航网| 亚洲 欧美都市激情| 婷婷五月天激情网| www.色婷婷.com| 久久综合婷婷| 国产11页| 9超碰免费| 亚洲免费精品一区| 99re69综合| 久久精9| 男人的天堂欧美| 97色诱| 美女网站黄页| 日韩精品资源| 欧美性xxxxx狂欢| 日本潮催一卡操| 国产精品黄色三级av| 欧美不卡在线一区二区| 亚洲黄色视频在线观看视频| 九九九九AV| 中国操逼无码| 温婉少妇玩3p| 91黑丝露脚| 久久乐| 欧美狠狠鲁| 日本精品九九九| 97超碰中文在线| 色久桃花影院在线观看| 亚洲日本韩国在线| 久久久爆乳翘臀一线天伦理视频| 男人兔费天堂| 97 九色| 校园春色亚洲| 亚洲天堂7777| 岛国小电影| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 日韩电影天堂视频一区二区| 欧美色97| 久久久久国产无av| 亚洲高清少妇| 国产一国产一级毛片古装| 2020中文在线一区二区三区| 综合五月天| 后入福利| 久久怡红院| 久久网亚洲| 久热在线精品免费观看| 观看视频图片一区二区三区| 亚州五月| 中文字幕精品区先锋资源| 超碰这里只有精品| 激情无码日韩| 99在线观看无大码| 国产二区三区免费视频| 九九热免费国产视频婷婷伊人| 欧美中文狠| 亚洲影院无码在线| 超碰97资源中文字幕| 亚洲色欧美| 欧美爆操91| 69少妇一区二区| 东北女人操比视频| 强奸乱伦动态污图免费| 国产乱不卡| 99re视频在线观看这里只有精品| asc国产精品| 久久婷婷六月综合| 天天躁日日躁AAAAXXXX国产 | 天天爽爽爽爽| 搡老女人老妇女AAA一VU麻豆 | 999久久久九九九九| 色噜噜国产在线| 国产精品一区二区校花| 亚洲综合一| 在线播放成人网站| 久久久少妇诱惑精品视频| 国产超碰在线| 国产日韩精品人妻久久久久色欲网站| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 日本日皮视频逼| 97欧美精品| 亚洲精品白丝| 久久久久久九九九九-美女久久久久久久-成人AV| 国产精品一区av在线| 人伦四五区| 欧美A√综合网| 夜夜操狠狠操| 五月婷婷爱六月丁香色| 自拍视频一区在线观看| 中文字幕第9页萱萱影音先锋| 日韩少妇在线视频| A V少妇特黄三级| 成人午夜小视频手机在线看| 色噜噜狠狠色综无码久久合欧美| 国产精品网站www| 91人妻做a观看视频| 超碰免费人妻人人| 国产路线专区| 狠狠入| 欧美天天搞| 啊啊啊 在线| 亚洲国产丝袜在线观看| 欧美色图天堂网m| 操b网站亚洲无码| 18一区二区三区| AV天堂丝袜| 激情五月综合| 亚洲一二三四区机械| 久久欧美按摩999| 精品免费一区二区三区在线亚洲人成| 乱人伦 国语对白:视频直接看| 99啪啪| 青青草视频爽一爽| 欧美日韩少妇色情| 久久久一区二区| 男人的天堂日韩| 人妻少妇无码| 日本操逼视频免费| 操迟操逼在巾线Fre看| 欧美激情另类一区二区| 肉嘟嘟www视频在线观看高清| 欧美日本一区二区a人| 小泽玛利亚一二三| 亚洲成人色情五月天丁香花| 国产热av| 香蕉国产精品麻豆亚洲欧美日韩 | 欧美aaaaaaa| 日本免费一级AAA大片器| 亚洲精品中文字幕一区在线视频| 久久99视频| 日韩中文字幕二区| 99re只有精品| 唯美清纯 妖精视频| 日本三级一区二区 在线| 免费人成?大片在线播放| 日本 欧美 国产一区| 天天射网| 精品成人久久久人人亚洲| 国模私拍一区二区三区神乳| 久久激情网| 一区二区三区色综合| 精品久| 丁香五月激情婷婷| 久久久久久人| 亚洲成人久久美女| 国产午夜福利合集| 久久久精品视频免费观看| 人妻天天爽夜夜爽精品2| 97资源久久| 免费黄色片子| 日韩15p| 精精夜夜| 清纯唯美综合亚洲| 欧美亚洲中文字幕| 一区二区视频在看| 激情文学网伊人| 殴美色网| 东京热免费视频| 日韩综合第八区国产精品| 深夜视频| 五月天激情四射| 91岛国动作片| 鲁鲁色综合网| 三男一女不戴套的A片| 亚洲成人网站在线观看| 久久久久成人网| 91ise欧美| 91操人| 天天日天天看| 超碰97网址| 搡老熟女老女人老熟妇免费视频| 中出20p| 中文字幕国产精品1区| 人人妻人人爽 97人人看碰人免费公开视频| 丰满少妇一区二区三区专区| 久久久久久国产手机AV| 中文字幕在线观| 日少妇亚洲版| 五月天伊人| 国产日逼视频| 91熟女视频| 91 国产丝袜在线播放-百度| 丰满人妻-区二区三区免费| 国产婷婷综合在线观看| 男人天堂新| 欧美色图97| 亚洲av热热色| 亚洲 中文 女同| 99操逼| 男人的天堂一区三区| 成人性爱免费播放| 日比av无码| 我要色综合网站| 欧美综合网1| 欧美亚洲涩涩| 久干网| 欧美日韩少妇色情| 免费看污网站| 中文字幕一区av| 人人操人人爽人人操人人| 欧美日韩制服| 日本欧美不卡| 91人人操| 色欲天天综合久久久无码网中文| 欧美日韩亚洲天堂| 97国产|免费| 精品无av| 超碰免费人妻人人| 狠狠操官网| 日韩国产欧美伦理在线| 亚洲强奸乱伦影视网| AV网站高清无码在线观看| 人干人人人操人人摸| 亚洲美女自拍偷拍视频| 日操粉逼逼| 一区在线观看中文字幕| 欧美三级一级| 综合欧美日韩在线| 国产乱不卡| 日语五十路和六十路亚洲国产精品| 日韩免费a级毛片无码a∨| 浓厚中出中文字幕在线| 第一高清av中文字幕| 婷婷综合五月| 色婷婷婷五月天激情四射| 久久禁| 色婷婷一区二区三区久久| 人人摸人人入| www.久久最新地址| 中文字幕视频2区| 久久精品一区二区三区蜜桃臀| 国产日本顶级一区二区三区| 老熟女乱子伦中文字幕一区二区| 免费看一级a性色生活片久久无| 97香焦色区| 欧美图片色五月天| 操操操日本的逼| 亚洲aw毛茸茸在线| 男人的天堂va| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 国产精品探花色| 欧美日韩超碰在线| 超碰精品97| 婷婷丁香五月天综合东京热| 亚洲美欧999| 超碰91在线| 欧美老熟另类| 另类亚洲一区二区三区| 九一屌逼| 人人操人人摸人人骑| 国产97色在线| 亚洲电影91| 26uuu最新| 四虎影库国产精品免费| 好吊色综合| 婷婷综合| 九九九九久久久久| 超碰 另类 欧美| 天天激情干| 国产和美国毛片| 久久亚洲欧美中文字幕国语 | JIZZJIZZ亚洲女人被躁| 国模限制级电影| 一中国女人毛片水真多| 黄网站黄视频网站进入口| 国产精品视频内谢女人| 蜜臀久久99精品久久久老,,| 97在线视频免费看| 欧美一区二区亚洲天堂| 欧美综合网在线| 精品久久久久久久久久久久| 日韩一性一交一A片俄罗斯| 骚货 中文字幕 av| 91五月天| 人妻嗯啊啊在线播放| 91网站在线播放| 婷婷久久五月天| 亚洲无码国产探花在线观看| 亚州再线| 伊人久久艹| 久久久久久久九九九九九九| 天天夜夜rb| 天天激色| 天天摸,夜夜摸| 高清成年美女黄网站免费大全| 日曰骚久久精品| 色91综合网| 伊人网av| 欧美亚洲第一页| 国产精品禁久久久精品| 国模不卡一本二本三电影| 六六久久日韩不卡| 久久久激情| 特级毛片特黄久久免费看| 欧美亚洲自拍另类人妻| 久草新在线| 国产精品扒开腿做爽爽爽视频| 很狠操| 亚洲情色综合网| 欧美日韩另类字幕中文| 亚洲色入欧美| 亚洲人码13| 偷拍综合亚洲| 国产妇女精品视频青青草| 91挑色欧美| 欧美97日韩精品| 青青草玖玖爱| 亚洲视频二区 | 性爱Av免费| 网页导航五月天免费一二三区| 国产理论视频在线播放| 激情小说图片亚洲首页| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 欧美性爱免费短视频| 国产一区免费午夜视频| 51一区二区三区| 激情久久久| 真实高潮91| 懂色av中文字幕一区二区三区天美| 久久精品无码熟妇一区二区三区视频导航 | 在线a亚洲视频播放在线| 91精品久久久| 少妇超碰在线| 亚洲视频二区 | 色狠狠 - 百度| 欧美综合站| 日本最新免费韩国1区2区视频播放| 9999亚洲精品| 精品视频一区二区| 五十路三级片| 奸色色 男人天堂 天天射| 国产视频第2页| 老妇女91| 免费AV播放| 91男人天堂网| 翔田千里Av在线| 精品四五区| 日本二三四区| 操逼片中文| 欧美78p| 麻豆av一区二区| 黄色av一区二区在线| 国产精品久久久999| 乱伦日本中文自拍| 91久久久久久| 国产人妻精品一区二区三区秋霞 | 另类图片欧美激情综合| 婷婷色中文字幕| 中文无线日韩一区| 欧日a| 夜夜嗨TV| 中文字幕成人| 久久黄人人爽视频| 欧美啪啪女女| 蜜臀视频网站| 91欧美成人色站| 免费?级毛片无码?∨蜜芽试看| 久妇网| 26uuu欧美日韩| 人妻五十路在线| 丁香六月激情综合| 国产亚洲色停停久久99精品91| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 国产v片在线免费观看| 黄日韩| 日韩AV一起草| 男人天堂新在线| 睡产熟女乱伦| 久久这里只| 青青草视频导航官网| 在线强奷到舒服的无码视频| 久久一区二区蜜桃| 人妻大相焦在线| 国产自偷自拍一区| 久久久夜夜夜| 无码久| 操久久久久久| 色嗨嗨在线| 欧美日韩成人在线| 二男一女成人A片| 一级乱伦网站| 欧洲站一级二级三级h| 嗯~啊~快点 死我视频| 性爱av网站| 二男一女成人A片| 中文字幕精品探花视频 | 97视频新免费| 久久蜜色情在线视频xxx免费观看| 91久操| 人妻乱仑一区二区三区| 91网九色蝌蚪操熟女| 久久视频少妇美女| 色婷婷成人综合| 人人喜人人妻| 女色视频社区| 天天影视色香色欲| 欧美 亚洲 综合 制服| 欧美国产日韩清纯唯美| 97WW精品| 五月综合视频| 欧美不卡二区| 1人人看人人摸人人操| 国产91av在线播放| 91久久免费视频互動交流| 国产精品白领在线观看 | 天天做天天爱天天爽AV| 亚洲成人一二三区| 神马久久69| 国内精品久9| 国产精品一区二区三区四区五区| 欧美在线天堂| 国产偷拍网站| 先锋色眉乱伦资源| 成人性爱电影一区二区| 天天爽天天| 色好看av| 久久久性少妇| 东京男人天堂| 日韩日本欧美在线观看| 啪啪资源网| 亚洲欧美精品一区天堂久久| 黑人中出21连凳花野真衣| 无码男人天堂| 偷拍精品一区二区三区| 秋霞久久亚洲精品成人| 99热99色| 免费网站观看www在线观| 午夜久久久| 91丝袜在线观看| 黄色AAAAAAAAAAA大片| 欧美日韩999| 亚洲欧洲无码97久久精品| 四虎影视国产精品| 麻花豆传媒剧国产MV出差| 殴美,日韩国产伦精品| 青青操视频在线| 精品国模无码| 久久久久久午夜男人的天堂| 中文字幕免费看| 日B操| 狠狠色综合网| 夜夜嗨TV| 狠狠爱综合网| 国产又长又大又粗的视频| 亚洲精品尤物yw在线影院| 天天操天天射青青草| 中文字幕97| 五月激情综合网| 中文字幕乱妇免费视频| 欧美疯狂做爰xxxx| 欧美偷偷网| 欧美在线干| 欧美三级偷拍| 全球成人中文在线| 夫妻AV网站| 综合五月婷婷亚洲一区| 99抽插| 国产av波波国产精品| 天天拍天| 丁香九月激情啪| 亚洲日韩美女丝袜美腿人妻视频| 91黑人无码激情在线| 国产综合久| 色综合一区二区三巨| 天天躁日日躁狠狠躁| 这里是精品| 国产高清在线观看欧美| 久久激情视频| 婷婷色一区| 国产精品成人无码a v毛片| www.av不卡中文字幕| 99热最新| 激情熟女12P| 亚洲熟久久| 久久久精品日本一道| 欧美一区二区三区四区综合| 日韩青久久| 一区二区三区日韩欧美| 国产92麻豆天美精品色欲5| 天天射日日干| 97超碰色中文字幕| 亚洲麻豆精品二区三区| 综合欧美激情网| 伊人天天久久动态图| 骚日日av| 欧美天天在线| 目产99999久久999| 操九九九九九九| 激情网五月天| 免费看久久久性性| 成年人性爱日韩| 日韩激情小说一区二区| 成人a v在线播放免费| 欧美亚洲手机在线| 超碰97久| 97超碰色情| 青娱乐黄色录像| 亚洲精品欧洲色| 日韩内| AV在线播放网址| 99久热精品99re6热| 久久亚洲天天做| 800zy一区二区| 91撸色网 玖玖网 欧美| 久久久久久久久久久久久久久乱码| 欧美综合骚| 亚洲 中文 女同| 日本A级视频| 偷拍五区| 狠狠躁伊人中文字幕| 亚洲AV无码乱码| 国产 日韩 欧美一区| 曰韩人妻中文字幕在线| 亚洲熟女av中文字幕| 97se亚洲综合自| 人人弄人人摸| 无码丰满熟妇一区二区浪潮AV| 青青操狠狠撩| 日韩99999色| 九九五月天| 日本不卡一二区| 欧美一级在线观看成人| heyZO天然素人无码AⅤ专区| 亚洲最新av无码成人精品区| 婷婷伊人网| 黄色成品网站| 一卡二卡三卡| AV在线性爱| 丁香婷婷色五月| 亚洲情色综合网| 美国日韩黄片| 丁香啪啪| 伊人久久蜜月| 热思思免费视频| 婷婷五月天AV| 蜜桃臀一区二区三区久久| 人人操人人摸avav| 欧美精品四区| 欧美碰碰综合色| 美国aaaaa一级黄片| 试看福利| 人人搞人人插人人操| 丁香婷婷色五月| 啊啊啊啊无码| 日本日皮视频逼| 欧美一品道| 国产成人综合在线播放| 青青草五月天| 影音先锋少妇| 97超碰资源网| 秋霞久久亚洲精品成人| 人夜夜精品网站香蕉嫩草| 国产91 丝袜在线播放 | 夜夜爽爽爽| 97 色综合| 熟妇视频一区二区三区在线观看| 91性感在线| 国产天美欧美| 日本免费人成视频播放120秒| 久久久999网站| 天天谢天天干| 综合网亚洲1| 乱精品一区字幕二区| 亚洲精品国语在线播放| 精品少妇一区二区三区免费观看| 91模特在线观看| 精彩久久中文| 六月色婷婷| 色色色日本| 亚洲AV在线资源| 久热久一区二区三区| 人人做天天爱| 99热销国产这里有精品| 久久精品天美| 午夜黄色免费在线观看| 激情小说在线视频| 亚洲色丰满少妇高潮| 国产精品麻豆成人AV艾秋| 无码人妻精品一区二区三区99不卡 | 97欧美性爱| 亚洲男人天堂av| 色香伊人| 久久久久久久久久黄色网| 人人干人人搞人人摸| 成人免费毛片| 亚洲色天| 亚洲区小说| 亚洲 中文 欧美 日韩 在线| 中文字幕在线观看AV| www.久久99| 91Chinese在线| 少妇xx精品| 日韩成人精品| 欧美人黑A片无码免视费| 人妻久久|