天池o2o優(yōu)惠券使用預(yù)測(cè)比賽解析(初級(jí))

天池o2o優(yōu)惠券使用預(yù)測(cè)比賽解析(初級(jí))

賽題鏈接:

天池o2o優(yōu)惠券使用預(yù)測(cè)

import os, sys, pickle
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import date
from sklearn.linear_model import SGDClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import KFold,train_test_split,StratifiedKFold,GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.metrics import  auc, roc_curve

加載數(shù)據(jù)

df_train = pd.read_csv('data/ccf_offline_stage1_train.csv')
df_test = pd.read_csv('data/ccf_offline_stage1_test_revised.csv')
print(df_train.head())
   User_id  Merchant_id  Coupon_id Discount_rate  Distance  Date_received  \
0  1439408         2632        NaN           NaN       0.0            NaN   
1  1439408         4663    11002.0        150:20       1.0     20160528.0   
2  1439408         2632     8591.0          20:1       0.0     20160217.0   
3  1439408         2632     1078.0          20:1       0.0     20160319.0   
4  1439408         2632     8591.0          20:1       0.0     20160613.0   

         Date  
0  20160217.0  
1         NaN  
2         NaN  
3         NaN  
4         NaN  

缺失值處理

df_train=df_train.fillna('null')
df_test=df_test.fillna('null')

統(tǒng)計(jì)

df_train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1754884 entries, 0 to 1754883
Data columns (total 7 columns):
User_id          int64
Merchant_id      int64
Coupon_id        object
Discount_rate    object
Distance         object
Date_received    object
Date             object
dtypes: int64(2), object(5)
memory usage: 93.7+ MB
print('有優(yōu)惠券藐不,有購(gòu)買商品: %s 人' %df_train[(df_train['Date_received'] != 'null') & (df_train['Date'] != 'null')].shape[0])
print('有優(yōu)惠券闰围,沒購(gòu)買商品: %s 人' %df_train[(df_train['Date_received'] != 'null') & (df_train['Date'] == 'null')].shape[0])
print('沒優(yōu)惠券,有購(gòu)買商品: %s 人' %df_train[(df_train['Date_received'] == 'null') & (df_train['Date'] != 'null')].shape[0])
print('沒優(yōu)惠券,沒購(gòu)買商品: %s 人' %df_train[(df_train['Date_received'] == 'null') & (df_train['Date'] == 'null')].shape[0])
有優(yōu)惠券絮短,有購(gòu)買商品: 75382 人
有優(yōu)惠券雌隅,沒購(gòu)買商品: 977900 人
沒優(yōu)惠券,有購(gòu)買商品: 701602 人
沒優(yōu)惠券辆童,沒購(gòu)買商品: 0 人
  • 比賽的意義是把優(yōu)惠券給那要購(gòu)買商品卻沒有優(yōu)惠券的人(701602 人),真正有需要的人惠赫。

特征提取

1. 打折率

#打折率的元素有三種類型把鉴,需要拆分開成為新的特征
df_train.Discount_rate.unique()
array(['null', '150:20', '20:1', '200:20', '30:5', '50:10', '10:5',
       '100:10', '200:30', '20:5', '30:10', '50:5', '150:10', '100:30',
       '200:50', '100:50', '300:30', '50:20', '0.9', '10:1', '30:1',
       '0.95', '100:5', '5:1', '100:20', '0.8', '50:1', '200:10',
       '300:20', '100:1', '150:30', '300:50', '20:10', '0.85', '0.6',
       '150:50', '0.75', '0.5', '200:5', '0.7', '30:20', '300:10', '0.2',
       '50:30', '200:100', '150:5'], dtype=object)
#定義函數(shù)拆分discount_rate列為新的四個(gè)特征
def getDiscountType(row):
    if 'null' in row:
        return 0
    else:
        return 1

def convertRate(row):
    if 'null' in row:
        return 1
    elif ':' in row:
        money = row.split(':')
        rate = 1.0 - float(money[1])/float(money[0])
        return rate
    else:
        return float(row)
def getDiscountMan(row):
    if ':' in row:
        money = row.split(':')
        return int(money[0])
    else:
        return 0
def getDiscountJian(row):
    if ':' in row:
        money = row.split(':')
        return int(money[1])
    else:
        return 0

'''
之前犯錯(cuò)在于誤以為series.apply(func)輸入的是series,所以函數(shù)都有個(gè)for循環(huán):
def getDiscountType(row):
    for i in row:
        if 'null' in i:
            return 0
        else:
            return 1
其實(shí)是迭代輸入series的每一個(gè)元素儿咱,這一點(diǎn)和直接func(series)區(qū)分開來
'''
def processData(df):
    df['discount_type'] = df['Discount_rate'].apply(getDiscountType)
    df['discount_rate'] = df_train['Discount_rate'].apply(convertRate)
    df['discount_man'] = df_train['Discount_rate'].apply(getDiscountMan)
    df['discount_jian'] = df_train['Discount_rate'].apply(getDiscountJian)
    print('打折率 %s' %df['discount_rate'].unique())
    return df
  • 之前犯錯(cuò)在于誤以為series.apply(func)輸入的是series纸镊,所以函數(shù)都有個(gè)for循環(huán):
def getDiscountType(row):
    for i in row:
        if 'null' in i:
            return 0
        else:
            return 1

其實(shí)是迭代輸入series的每一個(gè)元素倍阐,這一點(diǎn)和直接func(series)區(qū)分開來

df_train = processData(df_train)
df_test = processData(df_test)
print(df_train.head())
打折率 [1.         0.86666667 0.95       0.9        0.83333333 0.8
 0.5        0.85       0.75       0.66666667 0.93333333 0.7
 0.6        0.96666667 0.98       0.99       0.975      0.33333333
 0.2        0.4       ]
打折率 [1.         0.86666667 0.95       0.9        0.83333333 0.8
 0.5        0.85       0.75       0.66666667 0.93333333 0.7
 0.6        0.96666667 0.98       0.99       0.975      0.33333333
 0.2       ]
   User_id  Merchant_id Coupon_id Discount_rate Distance Date_received  \
0  1439408         2632      null          null        0          null   
1  1439408         4663     11002        150:20        1   2.01605e+07   
2  1439408         2632      8591          20:1        0   2.01602e+07   
3  1439408         2632      1078          20:1        0   2.01603e+07   
4  1439408         2632      8591          20:1        0   2.01606e+07   

          Date  discount_type  discount_rate  discount_man  discount_jian  
0  2.01602e+07              0       1.000000             0              0  
1         null              1       0.866667           150             20  
2         null              1       0.950000            20              1  
3         null              1       0.950000            20              1  
4         null              1       0.950000            20              1  

2. 距離

df_train['Distance'].unique()
array([0.0, 1.0, 'null', 2.0, 10.0, 4.0, 7.0, 9.0, 3.0, 5.0, 6.0, 8.0],
      dtype=object)
  • 處理一下'null',轉(zhuǎn)換成int
df_train['distance'] = df_train['Distance'].replace('null',-1).astype(int)
df_test['distance'] = df_test['Distance'].replace('null',-1).astype(int)
df_train['distance'] .unique()
array([ 0,  1, -1,  2, 10,  4,  7,  9,  3,  5,  6,  8])
df_train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1754884 entries, 0 to 1754883
Data columns (total 12 columns):
User_id          int64
Merchant_id      int64
Coupon_id        object
Discount_rate    object
Distance         object
Date_received    object
Date             object
discount_type    int64
discount_rate    float64
discount_man     int64
discount_jian    int64
distance         int64
dtypes: float64(1), int64(6), object(5)
memory usage: 160.7+ MB

3. 領(lǐng)券日期

#領(lǐng)券日期
date_receive = df_train['Date_received'].unique()
date_receive = sorted(date_receive[date_receive != 'null'])
print('領(lǐng)券日期:%d - %d'%(date_receive[0],date_receive[-1]))

#消費(fèi)日期
date_buy = df_train['Date'].unique()
date_buy = sorted(date_buy[date_buy != 'null'])
print('領(lǐng)券日期:%d - %d'%(date_buy[0],date_buy[-1]))
領(lǐng)券日期:20160101 - 20160615
領(lǐng)券日期:20160101 - 20160630

換算成weekday

  • weekday : {null, 1, 2, 3, 4, 5, 6, 7}

  • weekday_type : {1, 0}(周六和周日為1逗威,其他為0)

  • Weekday_1 : {1, 0, 0, 0, 0, 0, 0}

  • Weekday_2 : {0, 1, 0, 0, 0, 0, 0}

  • Weekday_3 : {0, 0, 1, 0, 0, 0, 0}

  • Weekday_4 : {0, 0, 0, 1, 0, 0, 0}

  • Weekday_5 : {0, 0, 0, 0, 1, 0, 0}

  • Weekday_6 : {0, 0, 0, 0, 0, 1, 0}

  • Weekday_7 : {0, 0, 0, 0, 0, 0, 1}

構(gòu)造weekday特征

def getWeekday(row):
    if row == 'null':
        return row
    else:
        weekday = date(int(row[0:4]),int(row[4:6]),int(row[6:8])).weekday() + 1
        return weekday
df_train['weekday'] = df_train['Date_received'].astype(str).apply(getWeekday)
df_test['weekday'] = df_test['Date_received'].astype(str).apply(getWeekday)
df_train['weekday'].unique()
array(['null', 6, 3, 1, 5, 4, 7, 2], dtype=object)

構(gòu)造weekday_tye特征

df_train['weekday_type'] = df_train['weekday'].apply(lambda x: 1 if x in [6,7] else 0)
df_test['weekday_type'] = df_test['weekday'].apply(lambda x: 1 if x in [6,7] else 0)
df_train['weekday_type'] .unique()
array([0, 1])

構(gòu)造weekday_number特征

#訓(xùn)練數(shù)據(jù)
#one-hot-encoding
data = df_train['weekday'].replace('null',np.nan)
tmpdf = pd.get_dummies(data,prefix='weekday')

#拼接數(shù)據(jù)
df_train = pd.concat([df_train,tmpdf],axis=1)

#測(cè)試數(shù)據(jù)
#one-hot-encoding
data = df_test['weekday'].replace('null',np.nan)
tmpdf = pd.get_dummies(data,prefix='weekday')

#拼接數(shù)據(jù)
df_test = pd.concat([df_test,tmpdf],axis=1)
print(df_train.head())
   User_id  Merchant_id Coupon_id Discount_rate Distance Date_received  \
0  1439408         2632      null          null        0          null   
1  1439408         4663     11002        150:20        1    20160528.0   
2  1439408         2632      8591          20:1        0    20160217.0   
3  1439408         2632      1078          20:1        0    20160319.0   
4  1439408         2632      8591          20:1        0    20160613.0   

          Date  discount_type  discount_rate  discount_man  ...    weekday  \
0  2.01602e+07              0       1.000000             0  ...       null   
1         null              1       0.866667           150  ...          6   
2         null              1       0.950000            20  ...          3   
3         null              1       0.950000            20  ...          6   
4         null              1       0.950000            20  ...          1   

   weekday_type weekday_1.0  weekday_2.0  weekday_3.0  weekday_4.0  \
0             0           0            0            0            0   
1             1           0            0            0            0   
2             0           0            0            1            0   
3             1           0            0            0            0   
4             0           1            0            0            0   

   weekday_5.0  weekday_6.0  weekday_7.0  label  
0            0            0            0     -1  
1            0            1            0      0  
2            0            0            0      0  
3            0            1            0      0  
4            0            0            0      0  

[5 rows x 22 columns]
print('所有特征:')
for i in df_train.columns:
    print('\t',i)
所有特征:
     User_id
     Merchant_id
     Coupon_id
     Discount_rate
     Distance
     Date_received
     Date
     discount_type
     discount_rate
     discount_man
     discount_jian
     distance
     weekday
     weekday_type
     weekday_1.0
     weekday_2.0
     weekday_3.0
     weekday_4.0
     weekday_5.0
     weekday_6.0
     weekday_7.0

標(biāo)注label

三種情況:

  • Date_received == 'null':表示沒有領(lǐng)到優(yōu)惠券峰搪,無需考慮,y = -1

  • (Date_received != 'null') & (Date != 'null') & (Date - Date_received <= 15):表示領(lǐng)取優(yōu)惠券且在15天內(nèi)使用凯旭,即正樣本概耻,y = 1

  • (Date_received != 'null') & ((Date == 'null') | (Date - Date_received > 15)):表示領(lǐng)取優(yōu)惠券未在在15天內(nèi)使用,即負(fù)樣本罐呼,y = 0

def label(row):
    if row['Date_received'] == 'null':
        return -1
    if row['Date'] != 'null':
        date_buy = pd.to_datetime(row['Date'],format='%Y%m%d')
        date_receive = pd.to_datetime(row['Date_received'],format='%Y%m%d')
        td =  date_buy - date_receive
        if td.days <= 15:
            return 1
    return 0

df_train['label'] = df_train.apply(label,axis=1)
df_train['label'].value_counts()
 0    988887
-1    701602
 1     64395
Name: label, dtype: int64

建立線性模型 SGDClassifier

  • 使用下面面提取的14個(gè)特征:
  • discount_rate
  • discount_type

  • discount_man

  • discount_jian

  • distance

  • weekday

  • weekday_type

  • weekday_1

  • weekday_2

  • weekday_3

  • weekday_4

  • weekday_5

  • weekday_6

  • weekday_7

  • 訓(xùn)練集:20160101-20160515鞠柄;驗(yàn)證集:20160516-20160615。

  • 用線性模型 SGDClassifier

劃分訓(xùn)練集/驗(yàn)證集

df_train['Date_received'] = df_train['Date_received'].astype(str)
df_train['Date_received'].unique()
array(['null', '20160528.0', '20160217.0', '20160319.0', '20160613.0',
       '20160516.0', '20160429.0', '20160129.0', '20160530.0',
       '20160519.0', '20160606.0', '20160207.0', '20160421.0',
       '20160130.0', '20160412.0', '20160518.0', '20160327.0',
       '20160127.0', '20160215.0', '20160524.0', '20160523.0',
       '20160515.0', '20160521.0', '20160114.0', '20160321.0',
       '20160426.0', '20160409.0', '20160326.0', '20160322.0',
       '20160131.0', '20160125.0', '20160602.0', '20160128.0',
       '20160605.0', '20160607.0', '20160324.0', '20160601.0',
       '20160126.0', '20160124.0', '20160123.0', '20160201.0',
       '20160522.0', '20160203.0', '20160417.0', '20160415.0',
       '20160202.0', '20160206.0', '20160218.0', '20160611.0',
       '20160329.0', '20160510.0', '20160302.0', '20160526.0',
       '20160318.0', '20160205.0', '20160411.0', '20160520.0',
       '20160527.0', '20160317.0', '20160213.0', '20160505.0',
       '20160402.0', '20160211.0', '20160405.0', '20160408.0',
       '20160323.0', '20160204.0', '20160112.0', '20160430.0',
       '20160525.0', '20160609.0', '20160403.0', '20160325.0',
       '20160413.0', '20160210.0', '20160610.0', '20160414.0',
       '20160401.0', '20160109.0', '20160328.0', '20160420.0',
       '20160422.0', '20160615.0', '20160120.0', '20160614.0',
       '20160107.0', '20160508.0', '20160608.0', '20160603.0',
       '20160425.0', '20160424.0', '20160305.0', '20160330.0',
       '20160511.0', '20160504.0', '20160223.0', '20160404.0',
       '20160416.0', '20160118.0', '20160303.0', '20160212.0',
       '20160423.0', '20160308.0', '20160228.0', '20160418.0',
       '20160509.0', '20160501.0', '20160428.0', '20160427.0',
       '20160229.0', '20160512.0', '20160506.0', '20160117.0',
       '20160514.0', '20160407.0', '20160410.0', '20160314.0',
       '20160116.0', '20160503.0', '20160502.0', '20160531.0',
       '20160316.0', '20160331.0', '20160517.0', '20160222.0',
       '20160101.0', '20160306.0', '20160604.0', '20160214.0',
       '20160406.0', '20160121.0', '20160313.0', '20160225.0',
       '20160220.0', '20160110.0', '20160301.0', '20160105.0',
       '20160122.0', '20160104.0', '20160113.0', '20160108.0',
       '20160115.0', '20160513.0', '20160208.0', '20160612.0',
       '20160419.0', '20160103.0', '20160312.0', '20160209.0',
       '20160529.0', '20160119.0', '20160227.0', '20160315.0',
       '20160304.0', '20160216.0', '20160507.0', '20160311.0',
       '20160320.0', '20160102.0', '20160106.0', '20160224.0',
       '20160219.0', '20160111.0', '20160310.0', '20160307.0',
       '20160221.0', '20160226.0', '20160309.0'], dtype=object)
df = df_train[df_train['label']!=-1].copy()
train = df_train[df_train['Date_received'] <='20160515.0'].copy()
valid = df_train[(df_train['Date_received'] >='20160516.0') & (df_train['Date_received'] <'20160615.0')]
print('Train Set:\n',train['label'].value_counts())
print('Valid Set:\n',valid['label'].value_counts())
Train Set:
 0    759172
1     41524
Name: label, dtype: int64
Valid Set:
 0    226595
1     22516
Name: label, dtype: int64

特征

feature = ['discount_type', 'discount_rate',
       'discount_man', 'discount_jian', 'distance', 'weekday', 'weekday_type',
       'weekday_1.0', 'weekday_2.0', 'weekday_3.0', 'weekday_4.0',
       'weekday_5.0', 'weekday_6.0', 'weekday_7.0']
print(feature)
['discount_type', 'discount_rate', 'discount_man', 'discount_jian', 'distance', 'weekday', 'weekday_type', 'weekday_1.0', 'weekday_2.0', 'weekday_3.0', 'weekday_4.0', 'weekday_5.0', 'weekday_6.0', 'weekday_7.0']

建立模型

def check_model(data,feature):
    classifier = SGDClassifier(
        loss='log',#The ‘log’ loss gives logistic regression
        penalty='elasticnet',
        fit_intercept=True, # 是否存在截距嫉柴,默認(rèn)存在
        max_iter=100,
        shuffle=True,
        n_jobs=1,
        class_weight=None)
    
    #管道機(jī)制實(shí)現(xiàn)了對(duì)全部步驟的流式化封裝和管理厌杜。
    model = Pipeline(steps=[
        ('ss',StandardScaler()),
        ('clf',classifier)
    ])
    parameters = {
        'clf__alpha':[0.001,0.01,0.1],
        'clf__l1_ratio':[0.001,0.01,0.1]
    }
    #分成采樣,確保訓(xùn)練集计螺,測(cè)試集中各類別樣本的比例與原始數(shù)據(jù)集中相同夯尽。
    folder = StratifiedKFold(n_splits=3,shuffle=True)
    
    #網(wǎng)格搜索
    grid_search = GridSearchCV(
        model,
        parameters,
        cv=folder,
        n_jobs=-1,
        verbose=1)
    grid_search = grid_search.fit(data[feature],data['label'])
    return grid_search

訓(xùn)練

model = check_model(train,feature)
Fitting 3 folds for each of 9 candidates, totalling 27 fits


[Parallel(n_jobs=-1)]: Done  27 out of  27 | elapsed: 10.3min finished

驗(yàn)證

對(duì)驗(yàn)證集中每個(gè)優(yōu)惠券預(yù)測(cè)的結(jié)果計(jì)算 AUC,再對(duì)所有優(yōu)惠券的 AUC 求平均登馒。計(jì)算 AUC 的時(shí)候匙握,如果 label 只有一類,就直接跳過陈轿,因?yàn)?AUC 無法計(jì)算圈纺。

y_valid_pred = model.predict_proba(valid[feature])
valid1 = valid.copy()
valid1['pred_prob'] = y_valid_pred[:,1]
print(valid1.head())
    User_id  Merchant_id Coupon_id Discount_rate Distance Date_received  \
1   1439408         4663     11002        150:20        1    20160528.0   
4   1439408         2632      8591          20:1        0    20160613.0   
6   1439408         2632      8591          20:1        0    20160516.0   
9   2029232          450      1532          30:5        0    20160530.0   
10  2029232         6459     12737          20:1        0    20160519.0   

           Date  discount_type  discount_rate  discount_man    ...      \
1          null              1       0.866667           150    ...       
4          null              1       0.950000            20    ...       
6   2.01606e+07              1       0.950000            20    ...       
9          null              1       0.833333            30    ...       
10         null              1       0.950000            20    ...       

    weekday_type  weekday_1.0 weekday_2.0  weekday_3.0  weekday_4.0  \
1              1            0           0            0            0   
4              0            1           0            0            0   
6              0            1           0            0            0   
9              0            1           0            0            0   
10             0            0           0            0            1   

    weekday_5.0  weekday_6.0  weekday_7.0  label  pred_prob  
1             0            1            0      0   0.019839  
4             0            0            0      0   0.098629  
6             0            0            0      0   0.098629  
9             0            0            0      0   0.095701  
10            0            0            0      0   0.129752  

[5 rows x 23 columns]
  • groupby之后是元組的形式
valid_groupby = valid1.groupby(['Coupon_id'])
for i in valid_groupby:
    print(i)

(1.0,          User_id  Merchant_id Coupon_id Discount_rate Distance Date_received  \
768069    472146         6889         1          20:1        9    20160522.0   
962551   2266597         6889         1          20:1        0    20160603.0   
964821   3057133         6889         1          20:1        0    20160606.0   
1665538  5555255         6889         1          20:1        3    20160530.0   

                Date  discount_type  discount_rate  discount_man    ...      \
768069   2.01606e+07              1           0.95            20    ...       
962551          null              1           0.95            20    ...       
964821          null              1           0.95            20    ...       
1665538         null              1           0.95            20    ...       

         weekday_type  weekday_1.0 weekday_2.0  weekday_3.0  weekday_4.0  \
768069              1            0           0            0            0   
962551              0            0           0            0            0   
964821              0            1           0            0            0   
1665538             0            1           0            0            0   

         weekday_5.0  weekday_6.0  weekday_7.0  label  pred_prob  
768069             0            0            1      1   0.013089  
962551             1            0            0      0   0.103987  
964821             0            0            0      0   0.099109  
1665538            0            0            0      0   0.052904  

[4 rows x 23 columns])
#計(jì)算AUC
valid_groupby = valid1.groupby(['Coupon_id'])
aucs = []
mean_tpr = 0.0
for i in valid_groupby:
    tmpdf = i[1]
    if len(tmpdf['label'].unique())==1:
        continue
    fpr, tpr, thresholds = roc_curve(tmpdf['label'], tmpdf['pred_prob'], pos_label=1)
    aucs.append(auc(fpr,tpr))

print(np.mean(aucs))
0.5334629648536017
valid[feature].shape
(249111, 14)

測(cè)試

feature_test = [ 'discount_type', 'discount_rate',
       'discount_man', 'discount_jian', 'distance', 'weekday', 'weekday_type','weekday_1',
       'weekday_2', 'weekday_3', 'weekday_4', 'weekday_5', 'weekday_6',
       'weekday_7']
y_test_pred = model.predict_proba(df_test[feature_test])
df_test_1 = df_test[['User_id','Coupon_id','Date_received']].copy()
df_test_1['Probability'] = y_test_pred[:,1]
df_test_1.to_csv('submit2.csv',index=False,header=False)
print(df_test_1.head())
   User_id  Coupon_id  Date_received  Probability
0  4129537       9983       20160712     0.118748
1  6949378       3429       20160706     0.034147
2  2166529       6928       20160727     0.045592
3  2166529       1808       20160727     0.045592
4  6172162       6500       20160708     0.068717

保存模型 & 導(dǎo)入模型

if not os.path.isfile('model.pkl'):
    with open('model.pkl','wb') as f:
        pickle.dump(model,f)
else:
    with open('model.pkl','rb') as f:
        model = pickle.load(f)

比賽第一名代碼與解析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市麦射,隨后出現(xiàn)的幾起案子蛾娶,更是在濱河造成了極大的恐慌,老刑警劉巖潜秋,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茫叭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡半等,警方通過查閱死者的電腦和手機(jī)揍愁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杀饵,“玉大人莽囤,你說我怎么就攤上這事∏芯啵” “怎么了朽缎?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我话肖,道長(zhǎng),這世上最難降的妖魔是什么贺氓? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上尾抑,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好灸异,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般田柔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天糟把,我揣著相機(jī)與錄音,去河邊找鬼另锋。 笑死夭坪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的亡鼠。 我是一名探鬼主播间涵,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起威兜,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤扼睬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后特纤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體担败,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狈网,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年宙搬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拓哺。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勇垛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出士鸥,到底是詐尸還是另有隱情闲孤,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布烤礁,位于F島的核電站讼积,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鸽凶。R本人自食惡果不足惜币砂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一建峭、第九天 我趴在偏房一處隱蔽的房頂上張望玻侥。 院中可真熱鬧,春花似錦亿蒸、人聲如沸凑兰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姑食。三九已至,卻和暖如春茅坛,著一層夾襖步出監(jiān)牢的瞬間音半,已是汗流浹背则拷。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留曹鸠,地道東北人煌茬。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像彻桃,于是被迫代替她去往敵國(guó)和親坛善。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容