Python常用模板设置--永久更新

三件课常用设置

# 设置中文字体
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)=n11j=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)=ni1jCid(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()
  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值