三件课常用设置
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 显示减号
plt.rcParams['axes.unicode_minus'] = False
# 同时设置中文、数字和减号字体
plt.rcParams['font.family'] = 'Times New Roman, SimHei'
# 保留两位有效数字
os_count['线索点击量'].apply(lambda x: '{:.2%}'.format(x / total_clicks))
'{:.2%}'.format()
# 修改图例位置
plt.legend(bbox_to_anchor=(1, 1))
# 设置x轴显示格式
import matplotlib.dates as mdates
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M:%S'))
# 打印numpy时设置显示宽度,并且不用科学计数法显示
np.set_printoptions(linewidth=100, suppress=True)
# 绘图禁用科学计数法
plt.ticklabel_format(style='plain')
ax.ticklabel_format(style='plain')
# 显示所有列
pd.set_option('display.max_columns', None)
pd.set_option('display.max_columns', 5) #最多显示5列
# 显示所有行
pd.set_option('display.max_rows', None)
pd.set_option('display.max_rows', 10) #最多显示10行
#显示小数位数
pd.options.display.float_format = '{:.2%}'.format
pd.set_option('display.float_format',lambda x: '%.2f'%x)
#显示宽度
pd.set_option('display.width', 100)
# 设置显示宽度
pd.set_option('display.width', 100)
# 设置显示数值的精度
pd.set_option('precision', 1)
双轴绘图
双轴示例
import matplotlib.pyplot as plt
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 显示减号
plt.rcParams['axes.unicode_minus'] = False
# 分组统计每个月份的被风控拦截消息总数
per_month_sum = data_csv.groupby('年月')['被风控拦截消息数'].sum().rename('总数').reset_index()
# 计算同比
per_month_sum['同比'] = per_month_sum['总数'].pct_change(periods=1,fill_method=None)
# 绘制柱状图
plt.figure(figsize=(10, 4))
plt.bar(x=per_month_sum['年月'], height=per_month_sum['总数'], label='总数')
plt.xlabel('年月')
plt.ylabel('数量')
plt.legend(loc='upper left')
# 添加第二个y轴用于绘制占比
ax2 = plt.twinx()
ax2.plot(per_month_sum['年月'], per_month_sum['同比'] * 100, color='red', label='同比', marker='o')
ax2.set_ylabel('同比 (%)')
ax2.legend(loc='upper right')
# 设置x轴刻度
plt.xticks(per_month_sum['年月'][::2])
# 添加标题
plt.title('年月留存的数量和占比')
plt.show(), per_month_sum.loc[:, ['年月', '总数', '同比']]import seaborn as sns
# 显示减号
plt.rcParams['axes.unicode_minus'] = False
# 计算各种指标之间的相关系数
data_corr = data_csv.drop(columns='Date').corr()
# 使用热力图进行展示
sns.heatmap(data=data_corr, fmt='.2', annot=True, cmap='viridis', vmin=-1, vmax=1)
# 显示图像
plt.show()
LSTM
import numpy as np
import tensorflow as tf
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
# 设置随机数种子
tf.random.set_seed(0)
# 提取所需列
df = df[['p_date', 'TOTALDEMAND']]
# 将时间列设置为索引
df['p_date'] = pd.to_datetime(df['p_date'])
df.set_index('p_date', inplace=True)
# 归一化数据
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(df)
# 定义时间序列窗口长度,用过去10个时间步作为输入来预测下一个时间步
sequence_length = 10
# 准备训练数据
def prepare_data(data, sequence_length):
X, y = [], []
for i in range(len(data) - sequence_length):
X.append(data[i:(i + sequence_length)])
y.append(data[i + sequence_length])
return np.array(X), np.array(y)
# 创建训练集
X, y = prepare_data(scaled_data, sequence_length)
# 调整数据形状以适应LSTM模型
X = X.reshape((X.shape[0], X.shape[1], 1))
# 构建LSTM模型
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(sequence_length, 1)))
model.add(LSTM(50))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')
# 训练LSTM模型
model.fit(X, y, epochs=50, batch_size=32)
# 需要预测的时间
times = 10
# 准备未来日期的数据以进行预测
future_dates = pd.date_range(start=df.index.max(), periods=times + 1, freq='')[1:]
# 存储预测结果
predicted_demand = []
# 使用训练好的模型进行预测
for date in future_dates:
x_input = scaled_data[-sequence_length:].reshape((1, sequence_length, 1))
predicted_value = model.predict(x_input)
scaled_data = np.concatenate((scaled_data, predicted_value), axis=0)
predicted_demand.append(predicted_value[0, 0])
# 反向转换归一化以获得预测结果
predicted_demand = scaler.inverse_transform(np.array(predicted_demand).reshape(-1, 1))
# 创建包含预测结果的DataFrame
predicted_df = pd.DataFrame(index=future_dates, columns=['预测值'], data=predicted_demand)
# 预测结果
predicted_df
ROC曲线
from sklearn.metrics import roc_curve, auc
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 计算预测概率
y_pred_prob = knn.predict_proba(X_test)
for i in range(y_pred_prob.shape[1]):
# 计算真阳性率(TPR)和假阳性率(FPR)
fpr, tpr, thresholds = roc_curve(y_test, y_pred_prob[:, i], pos_label=knn.classes_[i])
# 计算AUC
roc_auc = auc(fpr, tpr)
# 绘制ROC曲线
plt.plot(fpr, tpr, label='{} 类 (面积为{:.3})'.format(knn.classes_[i], roc_auc))
# 绘制对角线
plt.plot([0, 1], [0, 1], color='green', lw=2, linestyle='--')
# 添加标题和坐标轴信息
plt.xlabel('假阳性率')
plt.ylabel('真阳性率')
plt.title('预测结果的ROC曲线')
# 显示图例
plt.legend(bbox_to_anchor=(1, 1))
# 显示图像
plt.show()
相关系数-热力图
import seaborn as sns
import matplotlib.pyplot as plt
# 显示减号
plt.rcParams['axes.unicode_minus'] = False
# 计算各种指标之间的相关系数
data_corr = data_csv.corr()
# 使用热力图进行展示
sns.heatmap(data=data_corr, fmt='.2', annot=True, cmap='viridis', vmin=-1, vmax=1)
# 显示图像
plt.show()
轮廓系数
from sklearn.metrics import silhouette_score
from sklearn.cluster import KMeans
# 聚类簇数
K = list(range(2, 11))
# 保存轮廓系数
score = []
for k in K:
# 构建KMeans模型并训练
kmeans = KMeans(n_clusters=k, n_init=10)
kmeans.fit(data_csv)
# 计算并保存轮廓系数
score.append(silhouette_score(data_csv, kmeans.labels_, metric='euclidean', random_state=0))
# 筛选得到轮廓系数最大值对应的所有索引
max_index = [i for i, x in enumerate(score) if x == max(score)]
# 输出最大索引对应的所有k值
{'轮廓系数计算的最佳k值为': ','.join([str(K[i]) for i in max_index])}
轮廓系数(Silhouette Coefficient)是常用用于评估聚类结果质量的指标。该方法衡量每个样本与其所属聚类簇内其他样本的相似程度,以及与其他聚类簇样本的区分程度。包含以下部分:
- 簇内不相似度:计算样本 i {i} i到同簇其它样本的平均距离为𝑎(𝑖),应尽可能小。
- 簇间不相似度:计算样本 i {i} i到其它簇 C j {C_j} Cj的所有样本的平均距离 b i j b_{ij} bij,应尽可能大。
轮廓系数的计算公式为:
s
(
i
)
=
b
(
i
)
−
a
(
i
)
m
a
x
(
a
(
i
)
,
b
(
i
)
)
s(i) = \frac{b(i) - a(i)}{max(a(i), b(i))}
s(i)=max(a(i),b(i))b(i)−a(i)
其中,
s
(
i
)
s(i)
s(i) 表示样本
i
i
i 的轮廓系数,
a
(
i
)
a(i)
a(i)表示样本
i
i
i 与其他簇中样本的平均距离,
b
(
i
)
b(i)
b(i)表示样本
i
i
i 与同一簇
C
j
{C_j}
Cj中其他样本的平均距离。
a
(
i
)
a(i)
a(i)和
b
(
i
)
b(i)
b(i)的计算公式为:
a
(
i
)
=
1
n
−
1
∑
j
≠
i
n
d
(
i
,
j
)
a(i)=\frac{1}{n-1}\sum_{j\neq i}^{n}d(i,j)
a(i)=n−11∑j=ind(i,j),
b
(
i
)
=
1
n
i
∑
j
∈
C
i
d
(
i
,
j
)
b(i)=\frac{1}{n_i}\sum_{j\in C_i}d(i,j)
b(i)=ni1∑j∈Cid(i,j)
其中,
n
i
n_i
ni 是样本
i
i
i所在簇
C
i
C_i
Ci中的样本数量,
d
(
i
,
j
)
d(i,j)
d(i,j) 是样本
i
i
i和样本
j
j
j之间的距离。
在实际应用中,可能需要根据具体的情况选择合适的距离度量方式(如欧几里得距离、曼哈顿距离等)。
轮廓系数的取值范围在-1到1之间。取值接近1表示聚类结果较好,样本在所属簇内的相似度较高,且与其他簇的区分较明显。取值接近-1表示聚类结果较差,样本可能被错误地分配到了不同的簇中。取值接近0表示聚类结果不明确,无法有效区分不同的簇。
需要注意的是,轮廓系数的计算方法可能因具体应用和算法而有所不同。上述公式是一种常见的计算方法,但在实际使用中,可能需要根据具体情况进行适当的调整和解释。此外,轮廓系数只是评估聚类质量的一种指标,还可以结合其他指标和可视化方法来综合评估聚类结果的质量。
kneed库
import matplotlib.pyplot as plt
from kneed import KneeLocator
from sklearn.cluster import KMeans
# 选取列
features = df[['国家分类标签', 'sharePlastics']]
# 定义簇值范围
k_values = range(2, 11)
# 使用K均值聚类算法计算簇内平方和
sse = [KMeans(n_clusters=k, random_state=42, n_init=10).fit(features).inertia_ for k in k_values]
# 创建对象KneeLocator
knee = KneeLocator(k_values, sse, curve='convex', direction='decreasing')
# 找出最佳簇数
best_k = knee.elbow
簇内平方和
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
# 示例数据
data = data_csv
# 调用肘部法函数
max_k = 10
distortions = []
for k in range(1, max_k + 1):
kmeans = KMeans(n_clusters=k)
kmeans.fit(data)
distortions.append(sum(np.min(cdist(data, kmeans.cluster_centers_, 'euclidean'), axis=1)) / data.shape[0])
# 计算变化率
rate_of_change = [distortions[i] - distortions[i-1] for i in range(1, len(distortions))]
# 计算二阶导数
second_derivative = np.gradient(np.gradient(rate_of_change))
# 找到开始趋近于零的点
for i in range(len(second_derivative) - 1):
if second_derivative[i]>=0 and second_derivative[i+1] < 0:
best_k = i + 1
print("Best K:", best_k)
地图
df 原数据
lat 维度
lon 经度
hover_name 数据点显示的标题 H4-5
color 颜色分组字段
hover_data 显示的信息
color_continuous_scale 颜色条
import plotly.express as px
# 绘制地图
fig_map = px.scatter_mapbox(df, lat='reclat', lon='reclong', hover_name='recclass', color='year', hover_data=['mass (g)'], color_continuous_scale=px.colors.sequential.Viridis)
# 自定义地图布局
fig_map.update_layout(mapbox_style='open-street-map', mapbox=dict(center=dict(lat=0, lon=0), zoom=0), margin=dict(l=0, r=0, t=0, b=0), width=1100, height=1000)
# 显示地图
fig_map.show()
相关系数
from scipy.stats import pearsonr
# 计算Pearson相关系数和p值
corr, p_value = pearsonr(df['x'], df['y'])
{'皮尔逊相关系数': corr, 'p值': p_value}
ARIMA
from pmdarima import auto_arima
from statsmodels.tsa.arima.model import ARIMA
# 使用AIC信息准则自动计算最佳的p, d, q参数
auto_model = auto_arima(total_data[:-1], information_criterion='aic')
# 得到最优的ARIMA模型参数
order = auto_model.order
# 拟合模型
model = ARIMA(total_data[:-1], order=order)
model_fit = model.fit()
# 预测未来1个月的数据
forecast = model_fit.forecast(steps=1)
forecast
plotly.express交互图
import plotly.express as px
import plotly.graph_objects as go
# 绘制折线图
fig = px.line(data_frame=whole_data[-60:].reset_index(), x='Date', y='Adj Close', title='')
# 添加第二条线
fig.add_trace(go.Scatter(x=forecast.index, y=forecast, mode='lines', name='预测值'))
fig.show()
决策树可视化
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
# 构建决策树分类器
dt = DecisionTreeClassifier(max_depth=3, random_state=0)
dt.fit(X_train, y_train)
# 绘制决策过程
plot_tree(dt, filled=True, feature_names=features.columns.tolist(), class_names=dt.classes_.astype(str).tolist(), rounded=True)
# 显示图像
plt.show()
周期性判断
没有明显的峰值应该就表示没有什么周期性
from scipy.signal import periodogramimport numpy as np
from scipy import signal
import matplotlib.pyplot as plt
rng = np.random.default_rng()
fs = 10e3
N = 1e5
amp = 2*np.sqrt(2)
freq = 1234.0
noise_power = 0.001 * fs / 2
time = np.arange(N) / fs
x = amp*np.sin(2*np.pi*freq*time)
x += rng.normal(scale=np.sqrt(noise_power), size=time.shape)
f, Pxx_den = signal.periodogram(x, fs)
plt.semilogy(f, Pxx_den)
plt.ylim([1e-7, 1e2])
plt.xlabel('frequency [Hz]')
plt.ylabel('PSD [V**2/Hz]')
plt.show()