【数据挖掘与商务智能决策】第二章 特征工程与数据预处理

news2024/10/6 8:31:10

数据预处理

非数值类型数据处理

Get_dummies哑变量处理

1. 简单示例:“男”和“女”的数值转换

import pandas as pd
df = pd.DataFrame({'客户编号': [1, 2, 3], '性别': ['男', '女', '男']})
df
客户编号性别
01
12
23
df = pd.get_dummies(df, columns=['性别'])
df
客户编号性别_女性别_男
0101
1210
2301
df = df.drop(columns='性别_女') 
df
客户编号性别_男
011
120
231
df = df.rename(columns={'性别_男':'性别'})
df
客户编号性别
011
120
231

2. 稍复杂点的案例:房屋朝向的数值转换

import pandas as pd
df = pd.DataFrame({'房屋编号': [1, 2, 3, 4, 5], '朝向': ['东', '南', '西', '北', '南']})
df
房屋编号朝向
01
12
23西
34
45
df = pd.get_dummies(df, columns=['朝向'])
df
房屋编号朝向_东朝向_北朝向_南朝向_西
011000
120010
230001
340100
450010
df = df.drop(columns='朝向_西') 
df
房屋编号朝向_东朝向_北朝向_南
01100
12001
23000
34010
45001

Label Encoding编号处理

import pandas as pd
df = pd.DataFrame({'编号': [1, 2, 3, 4, 5], '城市': ['北京', '上海', '广州', '深圳', '北京']})
df
编号城市
01北京
12上海
23广州
34深圳
45北京
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
label = le.fit_transform(df['城市'])
print(label)
[1 0 2 3 1]
df
编号城市
01北京
12上海
23广州
34深圳
45北京
df['城市'] = label
df
编号城市
011
120
232
343
451

补充知识点:pandas库中的replace()函数

df = pd.DataFrame({'编号': [1, 2, 3, 4, 5], '城市': ['北京', '上海', '广州', '深圳', '北京']})
df['城市'].value_counts()
北京    2
上海    1
广州    1
深圳    1
Name: 城市, dtype: int64
df['城市'] = df['城市'].replace({'北京': 0, '上海': 1, '广州': 2, '深圳':3})
df
编号城市
010
121
232
343
450

总结来说,Get_dummies的优点就是它的值只有0和1,缺点是当类别的数量很多时,特征维度会很高,我们可以配合使用下一章即将讲到的PCA主成分分析来减少维度。所以如果Get_dummies类别数目不多时可以优先考虑,其次考虑Label Encoding或replace()函数,但如果是基于树模型的机器学习模型,则是用Label Encoding编号处理则没有太大关系。

重复值、缺失值及异常值处理

重复值处理

# 这里首先创建一个含有重复值的DataFrame,代码如下:
import pandas as pd
data = pd.DataFrame([[1, 2, 3], [1, 2, 3], [4, 5, 6]], columns=['c1', 'c2', 'c3'])
# 此时的data二维列表如下所示,可以看到第一行和第二行是重复的。
data
c1c2c3
0123
1123
2456
# 如果数据量较大,我们可以通过duplicated()函数来查询重复的内容,代码如下:
data[data.duplicated()]
c1c2c3
1123
# 如果想统计重复行的数量,可以通过sum()函数进行查看,代码如下,本案例结果为1。
data.duplicated().sum()
1
# 发现有重复行的时候,可以通过drop_duplicates()函数删除重复行,代码如下:
data = data.drop_duplicates()
data
c1c2c3
0123
2456
# 如果想按列进行去重,比如说如果c1列出现相同的内容,就把那行代码删掉,可以采用如下代码。这样的筛选条件则不如之前要全部一样才删除严格。
data = pd.DataFrame([[1, 2, 3], [1, 2, 3], [4, 5, 6]], columns=['c1', 'c2', 'c3'])
data = data.drop_duplicates('c1')
data
c1c2c3
0123
2456

缺失值处理

# 这里先构造一个含有缺失值的DataFrame,代码如下:
import numpy as np
data = pd.DataFrame([[1, np.nan, 3], [np.nan, 2, np.nan], [1, np.nan, 0]], columns=['c1', 'c2', 'c3'])
data
c1c2c3
01.0NaN3.0
1NaN2.0NaN
21.0NaN0.0
# 可以用isnull()函数或isna()函数(两者作用类似)来查看空值,代码如下:
data.isnull()  # 或者写data.isna()
c1c2c3
0FalseTrueFalse
1TrueFalseTrue
2FalseTrueFalse
# 也可以对单列查看缺失值情况,代码如下:
data['c1'].isnull()
0    False
1     True
2    False
Name: c1, dtype: bool
# 如果数据量较大,可以通过如下代码筛选某列内容为空值的行,代码如下:
data[data['c1'].isnull()]
c1c2c3
1NaN2.0NaN
# 对于空值有两种常见的处理方式:删除空值和填补空值。
# 通过dropna()函数可以删除空值,代码如下:
a = data.dropna()
a
c1c2c3
# 如果觉得该删除方法过于激进,可以设置thresh参数,比如将其设置为n,那么其含义是如果该行的非空值少于n个则删除该行,演示代码如下:
a = data.dropna(thresh=2)
a
c1c2c3
01.0NaN3.0
21.0NaN0.0
# 通过finllna()函数可以填补空值,这里采用的是均值填充法,通过每一列的均值对该列的空值进行填充,也可以把其中的data.mean()换成data.meian()则变为中位数填充。
b = data.fillna(data.mean())
b
c1c2c3
01.02.03.0
11.02.01.5
21.02.00.0
# 此处method='pad'代表用缺失值所在列的前一个值填充,如果前一个值不存在或也缺失,则结果不变。运行结果如下:
c = data.fillna(method='pad')
c
c1c2c3
01.0NaN3.0
11.02.03.0
21.02.00.0
# 还可以采用method='backfill'或method='bfill'用缺失值所在列的后一个值填充,如果后一个值不存在或也缺失,则结果不变。
d = data.fillna(method='backfill')
e = data.fillna(method='bfill')
e
c1c2c3
01.02.03.0
11.02.00.0
21.0NaN0.0

异常值处理

# 这里先构造一个含有异常值的数据集:
data = pd.DataFrame({'c1': [3, 10, 5, 7, 1, 9, 69], 'c2': [15, 16, 14, 100, 19, 11, 8], 'c3': [20, 15, 18, 21, 120, 27, 29]}, columns=['c1', 'c2', 'c3'])
data
c1c2c3
031520
1101615
251418
3710021
4119120
591127
669829

可以看到第一列的数字69,第二列的数字100,第三列的数字120为比较明显的异常值,那么该如何利用Python来进行异常值的检测呢?下面我们主要通过两种方法来进行检测:利用箱体图观察和利用标准差检测。

1. 利用箱型图观察

%matplotlib inline
data.boxplot()  # 画箱型图
<matplotlib.axes._subplots.AxesSubplot at 0x2636e7c2e80>

[

2. 利用标准差检测

a = pd.DataFrame()
for i in data.columns:
    z = (data[i] - data[i].mean()) / data[i].std()
    a[i] = abs(z) > 2
a
c1c2c3
0FalseFalseFalse
1FalseFalseFalse
2FalseFalseFalse
3FalseTrueFalse
4FalseFalseTrue
5FalseFalseFalse
6TrueFalseFalse

数据标准化

# 构造数据
import pandas as pd
X = pd.DataFrame({'酒精含量(%)': [50, 60, 40, 80, 90], '苹果酸含量(%)': [2, 1, 1, 3, 2]})
y = [0, 0, 0, 1, 1]

X  # 查看X
酒精含量(%)苹果酸含量(%)
0502
1601
2401
3803
4902

min-max标准化

from sklearn.preprocessing import MinMaxScaler
X_new = MinMaxScaler().fit_transform(X)

print(X_new)  # 查看X_new
[[0.2 0.5]
 [0.4 0. ]
 [0.  0. ]
 [0.8 1. ]
 [1.  0.5]]

其中第一列为酒精含量归一化后的值,第二列为苹果酸含量归一化后的值,可以看到它们都属于[0,1]了。在实际应用中,通常将所有数据都归一化后,再进行训练集和测试集划分,演示代码如下:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_new, y, test_size=0.2, random_state=123)

Z-score标准化

from sklearn.preprocessing import StandardScaler
X_new = StandardScaler().fit_transform(X)

print(X_new)  # 查看X_new
[[-0.75482941  0.26726124]
 [-0.21566555 -1.06904497]
 [-1.29399328 -1.06904497]
 [ 0.86266219  1.60356745]
 [ 1.40182605  0.26726124]]

数据分箱

import pandas as pd
data = pd.DataFrame([[22,1],[25,1],[20,0],[35,0],[32,1],[38,0],[50,0],[46,1]], columns=['年龄', '是否违约'])
data
年龄是否违约
0221
1251
2200
3350
4321
5380
6500
7461
# 通过如下代码即可进行等宽数据分箱:
data_cut = pd.cut(data['年龄'], 3)
print(data_cut)
0    (19.97, 30.0]
1    (19.97, 30.0]
2    (19.97, 30.0]
3     (30.0, 40.0]
4     (30.0, 40.0]
5     (30.0, 40.0]
6     (40.0, 50.0]
7     (40.0, 50.0]
Name: 年龄, dtype: category
Categories (3, interval[float64, right]): [(19.97, 30.0] < (30.0, 40.0] < (40.0, 50.0]]
# 通过groupby()函数进行分组,count()函数(详见14.3节补充知识点)进行计数可以获取每个分箱中的样本数目,代码如下:
data['年龄'].groupby(data_cut).count()
年龄
(19.97, 30.0]    3
(30.0, 40.0]     3
(40.0, 50.0]     2
Name: 年龄, dtype: int64
# 补充知识点,分箱并进行编号
print(pd.cut(data['年龄'], 3, labels=[1, 2, 3]))
0    1
1    1
2    1
3    2
4    2
5    2
6    3
7    3
Name: 年龄, dtype: category
Categories (3, int64): [1 < 2 < 3]

WOE值与IV值

WOE值的定义与计算

1. WOE值的定义

2. WOE值的计算过程演示

IV值的定义与计算

1. IV值的定义

2. IV值的计算过程演示

WOE值与IV值的代码实现

1. 数据分箱

# 首先通过如下代码构造数据:
import pandas as pd
data = pd.DataFrame([[22,1],[25,1],[20,0],[35,0],[32,1],[38,0],[50,0],[46,1]], columns=['年龄', '是否违约'])
data
年龄是否违约
0221
1251
2200
3350
4321
5380
6500
7461
# 有了数据之后,根据“年龄”这一特征变量进行数据分箱,代码如下:
data_cut = pd.cut(data['年龄'], 3)
data_cut
0    (19.97, 30.0]
1    (19.97, 30.0]
2    (19.97, 30.0]
3     (30.0, 40.0]
4     (30.0, 40.0]
5     (30.0, 40.0]
6     (40.0, 50.0]
7     (40.0, 50.0]
Name: 年龄, dtype: category
Categories (3, interval[float64, right]): [(19.97, 30.0] < (30.0, 40.0] < (40.0, 50.0]]

2. 统计各个分箱样本总数、坏样本数和好样本数

# 统计总客户数
cut_group_all = data['是否违约'].groupby(data_cut).count()
# 统计违约客户
cut_y = data['是否违约'].groupby(data_cut).sum()
# 统计未违约客户
cut_n = cut_group_all - cut_y
# 通过2.2.1节相关知识点将cut_group_all、cut_y、cut_n进行汇总,代码如下,这里我们将违约客户命名为“坏样本”,非违约客户命名为“好样本”。
df = pd.DataFrame()  # 创建一个空DataFrame用来汇总数据
df['总数'] = cut_group_all
df['坏样本'] = cut_y
df['好样本'] = cut_n
df
总数坏样本好样本
年龄
(19.97, 30.0]321
(30.0, 40.0]312
(40.0, 50.0]211

3. 统计各分箱中坏样本比率和好样本比率

# 计算坏样本%和好样本%
df['坏样本%'] = df['坏样本'] / df['坏样本'].sum()
df['好样本%'] = df['好样本'] / df['好样本'].sum()
df
总数坏样本好样本坏样本%好样本%
年龄
(19.97, 30.0]3210.500.25
(30.0, 40.0]3120.250.50
(40.0, 50.0]2110.250.25

4. 计算WOE值

import numpy as np
df['WOE'] = np.log(df['坏样本%'] / df['好样本%'])
df
总数坏样本好样本坏样本%好样本%WOE
年龄
(19.97, 30.0]3210.500.250.693147
(30.0, 40.0]3120.250.50-0.693147
(40.0, 50.0]2110.250.250.000000

此外,我们在11.5.1节第一部分也讲过,在实际应用中,我们不希望WOE值出现无穷大(这样会导致之后计算的IV值也变为无穷大,丧失了IV值的意义),但是有的时候可能由于数据特殊性及分箱的原因,它还是出现了WOE值为无穷大的情况(某个分箱中只含有一种类别的数据),此时解决办法是当WOE值为无穷大时,将它替换为0,代码如下:

df = df.replace({'WOE': {np.inf: 0, -np.inf: 0}})
df
总数坏样本好样本坏样本%好样本%WOE
年龄
(19.97, 30.0]3210.500.250.693147
(30.0, 40.0]3120.250.50-0.693147
(40.0, 50.0]2110.250.250.000000

5. 计算IV值

df['IV'] = df['WOE'] * (df['坏样本%'] - df['好样本%'])
df
总数坏样本好样本坏样本%好样本%WOEIV
年龄
(19.97, 30.0]3210.500.250.6931470.173287
(30.0, 40.0]3120.250.50-0.6931470.173287
(40.0, 50.0]2110.250.250.0000000.000000
iv = df['IV'].sum()
print(iv)
0.34657359027997264

整理上面计算WOE值和IV值的内容,完整代码如下所示:

# 1.构造数据
import pandas as pd
data = pd.DataFrame([[22,1],[25,1],[20,0],[35,0],[32,1],[38,0],[50,0],[46,1]], columns=['年龄', '是否违约'])

# 2.数据分箱
data_cut = pd.cut(data['年龄'], 3)

# 3.统计各个分箱样本总数、坏样本数和好样本数并汇总数据
# 统计总客户数
cut_group_all = data['是否违约'].groupby(data_cut).count()
# 统计违约客户
cut_y = data['是否违约'].groupby(data_cut).sum()
# 统计未违约客户
cut_n = cut_group_all - cut_y
# 汇总基础数据
df = pd.DataFrame()  # 创建一个空DataFrame用来汇总数据
df['总数'] = cut_group_all
df['坏样本'] = cut_y
df['好样本'] = cut_n

# 4.统计坏样本%和好样本%
df['坏样本%'] = df['坏样本'] / df['坏样本'].sum()
df['好样本%'] = df['好样本'] / df['好样本'].sum()

# 5.计算WOE值
import numpy as np
df['WOE'] = np.log(df['坏样本%'] / df['好样本%'])
df = df.replace({'WOE': {np.inf: 0, -np.inf: 0}})  # 替换可能存在的无穷大

# 6.计算各个分箱的IV值
df['IV'] = df['WOE'] * (df['坏样本%'] - df['好样本%'])

# 7.汇总各个分箱的IV值,获得特征变量的IV值
iv = df['IV'].sum()
print(iv)
0.34657359027997264

案例实战:客户流失预警模型的IV值计算

# 将上面的内容首先定义为一个函数
import pandas as pd
import numpy as np

def cal_iv(data, cut_num, feature, target):
    # 1.数据分箱
    data_cut = pd.cut(data[feature], cut_num)

    # 2.统计各个分箱样本总数、坏样本数和好样本数
    cut_group_all = data[target].groupby(data_cut).count()  # 总客户数
    cut_y = data[target].groupby(data_cut).sum()  # 坏样本数
    cut_n = cut_group_all - cut_y  # 好样本数
    # 汇总基础数据
    df = pd.DataFrame()  # 创建一个空DataFrame用来汇总数据
    df['总数'] = cut_group_all
    df['坏样本'] = cut_y
    df['好样本'] = cut_n

    # 3.统计坏样本%和好样本%
    df['坏样本%'] = df['坏样本'] / df['坏样本'].sum()
    df['好样本%'] = df['好样本'] / df['好样本'].sum()

    # 4.计算WOE值
    df['WOE'] = np.log(df['坏样本%'] / df['好样本%'])
    df = df.replace({'WOE': {np.inf: 0, -np.inf: 0}}) 

    # 5.计算各个分箱的IV值
    df['IV'] = df['WOE'] * (df['坏样本%'] - df['好样本%'])

    # 6.汇总各个分箱的IV值,获得特征变量的IV值
    iv = df['IV'].sum()
    
    print(iv)
# 有了上面的自动计算IV值的函数后,通过如下代码来读取客户流失预警模型中的相关数据:
data = pd.read_excel('股票客户流失.xlsx')
data.head()
账户资金(元)最后一次交易距今时间(天)上月交易佣金(元)本券商使用时长(年)是否流失
022686.5297149.2500
1190055.042284.7520
229733.5233269.2501
3185667.544211.5030
433648.5213353.5001
# 我们利用刚刚编好的函数进行第一个特征变量“账户资金(元)”的IV值计算,代码如下:
cal_iv(data, 4, '账户资金(元)', '是否流失')
0.15205722409339645
for i in data.columns[:-1]:
    print(i + '的IV值为:')
    cal_iv(data, 4, i, '是否流失')  # 调用函数
账户资金(元)的IV值为:
0.15205722409339645
最后一次交易距今时间(天)的IV值为:
0.2508468300174099
上月交易佣金(元)的IV值为:
0.30811632146662304
本券商使用时长(年)的IV值为:
0.6144219248359752

多重共线性的分析与处理

多重共线性的定义

多重共线性的分析与检验

# 使用Pandas库读入一组存在多重共线性的数据,并对其回归作为示例:
import pandas as pd
df = pd.read_excel('数据.xlsx')
df.head()
X1X2X3Y
0816-3277
1714-3152
249-1242
31256
412819
# 对数据集划分特征变量和目标变量:
X = df.drop(columns='Y')
Y = df['Y']

下面我们需要做的就是分析与检验这三个特征变量是否存在多重共线性,这里主要讲解两种判别方法:相关系数判断以及方差膨胀因子法(VIF检验)来检验多重共线性。

1. 相关系数判断

X.corr()
X1X2X3
X11.0000000.992956-0.422788
X20.9929561.000000-0.410412
X3-0.422788-0.4104121.000000

其中第i行第j列的内容表示的就是对应的第i个特征变量和第j个特征变量的相关系数,例如第1行第2列的相关系数:0.99表示的就是特征变量X1和特征变量X2的相关系数,可以看到这两个特征变量的相关性还是非常强的,因此有理由相信这两个变量会导致多重共线性的现象,因此需要删去其中一个特征变量。注意对角线上的相关系数都为1,这个其实没有什么意义,因为它表示的是自身与自身的相关系数,那自然是1了。

2. 方差膨胀因子法(VIF检验)

# 为了检验上述回归中是否存在严重的多重共线性,我们使用Python的VIF检验模块来验证:
from statsmodels.stats.outliers_influence import variance_inflation_factor
vif = [variance_inflation_factor(X.values, X.columns.get_loc(i)) for i in X.columns]
vif
[259.6430487184967, 257.6315718292196, 1.302330632715429]
# 如果对上面的快捷写法不太理解,上面的代码也可以写成:
vif = []
for i in X.columns:  # i对应的是每一列的列名
    vif.append(variance_inflation_factor(X.values, X.columns.get_loc(i)))
    
vif
[259.6430487184967, 257.6315718292196, 1.302330632715429]
# 对数据集重新划分特征变量和目标变量:
X = df[['X1', 'X3']]
Y = df['Y']
# 进行检验VIF检验:
from statsmodels.stats.outliers_influence import variance_inflation_factor
vif = [variance_inflation_factor(X.values, X.columns.get_loc(i)) for i in X.columns]

vif
[1.289349054516766, 1.289349054516766]

过采样和欠采样

过采样

1. 过采样的原理

(1) 随机过采样

(2) SMOTE法过采样

2. 过采样的代码实现

import pandas as pd
data = pd.read_excel("信用卡数据.xlsx")
data.head()
编号年龄负债比率月收入贷款数量家属人数分类
01290.227800130
12520.464650100
23280.103000000
34290.205916000
45271.281300001
# 通过如下代码提取特征变量并将其赋值给变量X,提取目标变量并将其赋值给变量y:。
X = data.drop(columns='分类')
y = data['分类']
# 然后使用collections库中的Counter()方法,对目标变量进行计数:
from collections import Counter
Counter(y)
Counter({0: 1000, 1: 100})

不违约的样本数有1000个,远远大于违约的样本数100。为了防止建立信用违约模型时,模型着重拟合不违约的样本,而无法找出违约的样本,我们采用过采样的方法来改善样本比例不均衡的问题,这里我们将通过上面讲到的随机过采样和SMOTE法过采样来进行代码实现。

(1)随机过采样

from imblearn.over_sampling import RandomOverSampler
ros = RandomOverSampler(random_state=0)
X_oversampled, y_oversampled = ros.fit_resample(X, y)
# 用Counter()方法检验一下SMOTE过采样的效果。
Counter(y_oversampled)
Counter({0: 1000, 1: 1000})

违约的样本数从100上升至不违约的样本数1000,这证明我们的随机过采样有效。同时我们可以打印特征变量X_oversampled的shape来看看特征变量的变化:

X_oversampled.shape
(2000, 6)

这里的2000就是1000个违约样本和1000个不违约样本相加得到的,可以看到,随机过采样后特征变量的数据也随之增多。

(2)SMOTE过采样

# 通过如下代码即可进行SMOTE过采样:
from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=0)
X_smotesampled, y_smotesampled = smote.fit_resample(X, y)
# 用Counter()方法检验一下SMOTE过采样的效果。
Counter(y_smotesampled)
Counter({0: 1000, 1: 1000})

欠采样

1. 欠采样的原理

2. 欠采样的代码实现

# 仍然采用上方的信用违约数据进行欠采样代码的展示:
from imblearn.under_sampling import RandomUnderSampler
rus = RandomUnderSampler(random_state=0)
X_undersampled, y_undersampled = rus.fit_resample(X, y)
# 用Counter()方法检验一下随机欠采样的效果。
Counter(y_undersampled)
Counter({0: 100, 1: 100})
# 不违约的样本数从1000下降至违约的样本数100,这证明我们的随机欠采样有效。同时我们可以打印特征变量X_undersampled的shape来看看特征变量的变化:
X_undersampled.shape
(200, 6)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DetectGPT:使用概率曲率的零样本机器生成文本检测

DetectGPT的目的是确定一段文本是否由特定的llm生成&#xff0c;例如GPT-3。为了对段落 x 进行分类&#xff0c;DetectGPT 首先使用通用的预训练模型&#xff08;例如 T5&#xff09;对段落 ~xi 生成较小的扰动。然后DetectGPT将原始样本x的对数概率与每个扰动样本~xi进行比较。…

浏览器主页被hao123劫持的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

Redis哨兵(Sentinel)模式

前言 上一期实现了Redis的主从复制架构&#xff0c;由于主从模式在主节点宕机故障时整个Redis服务都不能再执行写操作&#xff0c;而无法保证Redis在整个系统中的高可用。 Redis提供了Sentinel哨兵机制来解决以上问题&#xff0c;当哨兵服务监测到master下线或宕机&#xff0…

汽车标定知识整理(二):CCP报文基本命令介绍

目录 一、基本命令 CRO命令报文的基本命令表&#xff1a; 二、基本命令与可选命令帧格式介绍 1、CONNECT——建立连接&#xff08;0x01&#xff09; 2、GET_CPP_VERSION——获取CCP版本&#xff08;0x1B&#xff09; 3、SET_MTA——设置内存传输地址&#xff08;0x02&#…

FPGA_边沿监测理解

一、简易频率计设计中为什么一定要获取下降沿?gate_a:实际闸门信号gate_a_stand:将实际闸门信号打一拍之后的信号gate_a_fall_s:下降沿标志信号cnt_clk_stand: Y值&#xff0c;即在实际闸门信号下&#xff0c;标准时钟信号的周期个数cnt_clk_stand_reg:保存Y值的寄存器核心问题…

展示企业情况的BI数据可视化大屏怎么做?

做综合展示企业情况的BI数据可视化大屏&#xff0c;就意味着要综合展示多个子公司或者部门的数据情况。首先要解决的就是多系统数据的整合、数据孤岛的束缚&#xff0c;其次才是数据分析模型构建、BI数据可视化大屏报表的制作。 1、整合多系统数据&#xff0c;消除数据孤岛现象…

flink大数据处理流式计算详解

flink大数据处理 文章目录flink大数据处理二、WebUI可视化界面&#xff08;测试用&#xff09;三、Flink部署3.1 JobManager3.2 TaskManager3.3 并行度的调整配置3.4 区分 TaskSolt和parallelism并行度配置四、Source Operator(资源算子)五、Sink Operator(输出算子)六、Flink滑…

系统检测维护工具Wsycheck使用(18)

实验目的 &#xff08;1&#xff09;学习Wsycheck的基本功能&#xff1b; &#xff08;2&#xff09;掌握Wsycheck的基本使用方法&#xff1b; 预备知识 windows操作系统的基本知识如&#xff1a;进程、网络、服务和文件等的了解。 Wsycheck是一款强大的系统检测维护工具,进程和…

js求解《初级算法》19.删除链表的倒数第N个结点

一、题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 二、思路 用虚拟头结点&#xff0b;双指针的方法解决该题&#xff0c;我们知道题目要求我们返回的是…

SpringMVC源码:参数解析、方法调用与返回值处理

参考资料&#xff1a; 《SpringMVC源码解析系列》 《SpringMVC源码分析》 《Spring MVC源码》 写在开头&#xff1a;本文为个人学习笔记&#xff0c;内容比较随意&#xff0c;夹杂个人理解&#xff0c;如有错误&#xff0c;欢迎指正。 前文&#xff1a; 《SpringMVC源码&a…

并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?

第20讲 | 并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别&#xff1f; 在上一讲中&#xff0c;我分析了 Java 并发包中的部分内容&#xff0c;今天我来介绍一下线程安全队列。Java 标准库提供了非常多的线程安全队列&#xff0c;很容易混淆。 今天我要问你的…

谷歌浏览器和火狐浏览器永久禁用缓存【一劳永逸的解决方式】

目录 前言 谷歌浏览器 方式一 方式二 火狐浏览器 前言 缓存对于开发人员来说异常的痛苦,很多莫名其妙的bug就是由缓存导致的,但当我们在网上查找禁用缓存的方式时,找到的方式大多数都是在开发者工具的面板中勾选禁用缓存的选项,但这种方式有个弊端就是需要一直打开这个…

软件测试工程师没有碰到算我输-2023最全的接口测试面试题及参考答案

接口测试最近几年被炒的火热了&#xff0c;越来越多的测试同行意识到接口测试的重要性。接口测试为什么会如此重要呢&#xff1f; 主要是平常的功能点点点&#xff0c;大家水平都一样&#xff0c;是个人都能点&#xff0c;面试时候如果问你平常在公司怎么测试的&#xff0c;你除…

【pytorch】使用mixup技术扩充数据集进行训练

目录1.mixup技术简介2.pytorch实现代码&#xff0c;以图片分类为例1.mixup技术简介 mixup是一种数据增强技术&#xff0c;它可以通过将多组不同数据集的样本进行线性组合&#xff0c;生成新的样本&#xff0c;从而扩充数据集。mixup的核心原理是将两个不同的图片按照一定的比例…

【嵌入式开发】iperf

iperf一级目录用法help文档iperf参数功能iperf测试实例测试网口上行速率测试网口下行速率perf 是一个网络性能测试工具。Iperf可以测试最大TCP和UDP带宽性能&#xff0c;具有多种参数和UDP特性&#xff0c;可以根据需要调整&#xff0c;可以报告带宽、延迟抖动和数据包丢失。一…

小程序项目在hbuilder里面给它打包成app

小程序项目临时有些登录需求&#xff0c;需要把&#xff08;小程序某些功能通过条件编译让它显示到app上&#xff09;小程序打包成app的话就必须需要一个打包的证书&#xff0c;证书的话就要去重新生成&#xff0c;苹果电脑可以去自动生成证书&#xff0c;平时是用windows进行开…

Java的四种引用强软弱虚及其使用场景

一.强引用 回收时机&#xff1a;在内存不足时也不会被回收。 使用方式&#xff1a;String str new String("str"); 使用场景&#xff1a;是平常用的最多的引用 二.软引用 回收时机&#xff1a; 在内存不足时会被回收。 使用方式&#xff1a;SoftRefere…

阿里云全量物理备份.xb备份文件本地恢复

一、下载备份文件并上传到本地 二、安装转码软件 1、yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm2、yum install percona-xtrabackup-24三、解包并解压 1、先解包 cat test1_qp.xb | xbstream -x -v -C /home/mysql/data 2、然后解压&…

【历史上的今天】3 月 6 日:Unix 版权争夺战;豆瓣网上线;谷歌推出了 Google Play

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 3 月 6 日&#xff0c;在 1475 年的今天&#xff0c;大艺术家米开朗琪罗诞辰。米开朗琪罗是意大利文艺复兴时期的雕塑家、画家&#xff0c;他活到 89 岁&#…

Web服务器基础介绍与Apache的简单介绍(LAMP架构与搭建论坛)

目录 Web服务器基础介绍 一.HTML是什么&#xff1f; 二.静态网页和动态网页 1.静态网页 2.动态网页 3.动态网页语言 三.HTTP协议 1.HTTP协议是什么&#xff1f; 2.HTTP方法 3.HTTP状态码 4.HTTP请求流程分析 4.1 请求报文 4.2 响应报文 Apache的简单介绍 一.Apa…