当前位置:   article > 正文

精心整理20+Python实战案例(附源码、数据)

python实战项目源码

最近小编认真整理了20+个基于python的实战案例,主要包含:数据分析、可视化、机器学习/深度学习、时序预测等,案例的主要特点:

  • 提供源码:代码都是基于jupyter notebook,附带一定的注释,运行即可

  • 数据齐全:大部分案例都有提供数据,部分案例使用内置数据集

数据统计分析

基于python和第三方库进行数据处理和分析,主要使用pandas、plotly、matplotlib等库,具体案例:

电子产品(手机)销售分析:

(1)不同内存下的销量(代码片段)

  1. nei_cun = color_size["Number_GB"].value_counts().reset_index()
  2. nei_cun.columns = ["Number_of_GB","Count"]  # 重命名
  3. nei_cun["Number_of_GB"] = nei_cun["Number_of_GB"].apply(lambda x: str(x) + "GB")
  4. fig = px.pie(nei_cun,
  5.              values="Count",
  6.              names="Number_of_GB")
  7. fig.show()
ad8b86ce9080a8f8daf2ae23af177dfc.png

(2)不同闪存Ram下的价格分布(代码片段)

  1. fig = px.box(df, y="Sale Price",color="Ram")
  2. fig.update_layout(height=600, width=800, showlegend=False)
  3. fig.update_layout(
  4.     title={ "text":'不同<b>闪存</b>下的价格分布'
  5.             "y":0.96,  
  6.             "x":0.5,  
  7.             "xanchor":"center",  
  8.             "yanchor":"top"  
  9.           },
  10.     xaxis_tickfont_size=12,   
  11.     yaxis=dict(
  12.         title='Distribution',  
  13.         titlefont_size=16,  
  14.         tickfont_size=12,  
  15.     ),
  16.     legend=dict(
  17.         x=0,  
  18.         y=1,
  19.         bgcolor='rgba(255, 255, 255, 0)',  
  20.         bordercolor='rgba(2, 255, 255, 0)'   
  21.     )
  22. )
  23. fig.show()
8ddcb3cfc6e0039c0fd1651f8703340c.png

7万条餐饮数据分析

  1. fig = px.bar(df2_top3,x="行政区",y="店铺数量",color="类别",text="店铺数量")
  2. fig.update_layout(title="不同行政区下不同类别的店铺数量对比")
  3. fig.show()
d319ca8f693d0892322d6fa994441ca0.png

不同店铺下的点评数量对比:d748ea7f9773007d5e8b63bd1cb7c392.png

4个指标的关系:口味、环境、服务和人均消费

22b36dd72d53e21005fc3b9bdd73822d.png

基于python实现RFM模型(用户画像)

RFM模型是客户关系管理(CRM)中的一种重要分析模型,用于衡量客户价值和客户创利能力。该模型通过以下三个指标来评估客户的价值和发展潜力:

  • 近期购买行为(R):指的是客户最近一次购买的时间间隔。这个指标可以反映客户的活跃程度和购买意向,进而判断客户的质量和潜在价值。

  • 购买的总体频率(F):指的是客户在一定时间内购买商品的次数。这个指标可以反映客户对品牌的忠诚度和消费习惯,进而判断客户的潜力和价值。

  • 花了多少钱(M):指的是客户在一定时间内购买商品的总金额。这个指标可以反映客户的消费能力和对品牌的认可度,进而判断客户的价值和潜力。

计算R、F、M三个指标值:

  1. data['Recency'] = (datetime.now().date() - data['PurchaseDate'].dt.date).dt.days
  2. frequency_data = data.groupby('CustomerID')['OrderID'].count().reset_index()
  3. # 重命名
  4. frequency_data.rename(columns={'OrderID''Frequency'}, inplace=True)
  5. monetary_data = data.groupby('CustomerID')['TransactionAmount'].sum().reset_index()
  6. monetary_data.rename(columns={'TransactionAmount''MonetaryValue'}, inplace=True)

可视化

可视化主要是讲解了matplotlib的3D图和统计相关图形的绘制和plotly_express的入门:

(1) matplotlib的3D图形绘制

  1. plt.style.use('fivethirtyeight')
  2. fig = plt.figure(figsize=(8,6))
  3. ax = fig.gca(projection='3d')
  4. z = np.linspace(0201000)
  5. x = np.sin(z)
  6. y = np.cos(z)
  7. surf=ax.plot3D(x,y,z)
  8. z = 15 * np.random.random(200)
  9. x = np.sin(z) + 0.1 * np.random.randn(200)
  10. y = np.cos(z) + 0.1 * np.random.randn(200)
  11. ax.scatter3D(x, y, z, c=z, cmap='Greens')
  12. plt.show()
d6598f1651b57afb1d8daa77e544fff2.png
  1. plt.style.use('fivethirtyeight')
  2. fig = plt.figure(figsize=(14,8))
  3. ax = plt.axes(projection='3d')
  4. ax.plot_surface(x, 
  5.                 y,
  6.                 z, 
  7.                 rstride=1,
  8.                 cstride=1
  9.                 cmap='viridis',
  10.                 edgecolor='none')
  11. ax.set_title('surface')
  12. # ax.set(xticklabels=[],  # 隐藏刻度
  13. #        yticklabels=[],
  14. #        zticklabels=[])
  15. plt.show()
5ab7da756721a4b2914e9f7e9ea9287b.png

(2) 统计图形绘制

绘制箱型图:

  1. np.random.seed(10)
  2. D = np.random.normal((354), (1.251.001.25), (1003))
  3. fig, ax = plt.subplots(22, figsize=(9,6), constrained_layout=True)
  4. ax[0,0].boxplot(D, positions=[123])
  5. ax[0,0].set_title('positions=[1, 2, 3]')
  6. ax[0,1].boxplot(D, positions=[123], notch=True)  # 凹槽显示
  7. ax[0,1].set_title('notch=True')
  8. ax[1,0].boxplot(D, positions=[123], sym='+')  # 设置标记符号
  9. ax[1,0].set_title("sym='+'")
  10. ax[1,1].boxplot(D, positions=[123], 
  11.                 patch_artist=True,
  12.                 showmeans=False, 
  13.                 showfliers=False,
  14.                 medianprops={"color""white""linewidth"0.5},
  15.                 boxprops={"facecolor""C0""edgecolor""white""linewidth"0.5},
  16.                 whiskerprops={"color""C0""linewidth"1.5},
  17.                 capprops={"color""C0""linewidth"1.5})
  18. ax[1,1].set_title("patch_artist=True")
  19. # 设置每个子图的x-y轴的刻度范围
  20. for i in np.arange(2):
  21.     for j in np.arange(2):
  22.         ax[i,j].set(xlim=(04), xticks=[1,2,3],
  23.                     ylim=(08), yticks=np.arange(09))
  24. plt.show()
7e1864bf5296a7c3bf94f044cc7d2088.png

绘制栅格图:

  1. np.random.seed(1)
  2. x = [246]
  3. D = np.random.gamma(4, size=(350))
  4. # plt.style.use('fivethirtyeight')
  5. fig, ax = plt.subplots(22, figsize=(9,6), constrained_layout=True)
  6. # 默认栅格图-水平方向
  7. ax[0,0].eventplot(D)
  8. ax[0,0].set_title('default')
  9. # 垂直方向
  10. ax[0,1].eventplot(D, 
  11.                   orientation='vertical'
  12.                   lineoffsets=[1,2,3])
  13. ax[0,1].set_title("orientation='vertical', lineoffsets=[1,2,3]")
  14. ax[1,0].eventplot(D, 
  15.                   orientation='vertical',
  16.                   lineoffsets=[1,2,3],
  17.                   linelengths=0.5) # 线条长度
  18. ax[1,0].set_title('linelengths=0.5')
  19. ax[1,1].eventplot(D, 
  20.                   orientation='vertical',
  21.                   lineoffsets=[1,2,3],
  22.                   linelengths=0.5,
  23.                  colors='orange')
  24. ax[1,1].set_title("colors='orange'")
  25. plt.show()
6eff107a09d052afd9d9d471f1da79c5.png

(3) plotly_express入门      使用plotly_express如何快速绘制散点图、散点矩阵图、气泡图、箱型图、小提琴图、经验累积分布图、旭日图等

db90ef3a5d02c4baf5ed49ae54f89eb5.png 364d53ea03388d68ec54881accdb3768.png baa09101a9f923660568c60d95968cf8.png a93770392cd5ecef6706187bd876afb1.png 37b0736fc58f388562690ba2bf93238a.png ebb517c912af95638bdc54d4ae158821.png

机器学习

基于机器学习的Titanic生存预测

目标变量分析:

6baef4f3020d73d20d81938386136c5a.png 6e9caf1c74fbd841a2cfe4fb3c159801.png

相关性分析:

a7739ab441167f30b66c4cc67b40a3e6.png

基于树模型的特征重要性排序代码:

  1. f,ax=plt.subplots(2,2,figsize=(15,12))
  2. 1、模型
  3. rf=RandomForestClassifier(n_estimators=500,random_state=0)
  4. 2、训练
  5. rf.fit(X,Y)
  6. 3、重要性排序
  7. pd.Series(rf.feature_importances_, X.columns).sort_values(ascending=True).plot.barh(width=0.8,ax=ax[0,0])
  8. 4、添加标题
  9. ax[0,0].set_title('Feature Importance in Random Forests')
  10. ada=AdaBoostClassifier(n_estimators=200,learning_rate=0.05,random_state=0)
  11. ada.fit(X,Y)
  12. pd.Series(ada.feature_importances_, X.columns).sort_values(ascending=True).plot.barh(width=0.8,ax=ax[0,1],color='#9dff11')
  13. ax[0,1].set_title('Feature Importance in AdaBoost')
  14. gbc=GradientBoostingClassifier(n_estimators=500,learning_rate=0.1,random_state=0)
  15. gbc.fit(X,Y)
  16. pd.Series(gbc.feature_importances_, X.columns).sort_values(ascending=True).plot.barh(width=0.8,ax=ax[1,0],cmap='RdYlGn_r')
  17. ax[1,0].set_title('Feature Importance in Gradient Boosting')
  18. xgbc=xg.XGBClassifier(n_estimators=900,learning_rate=0.1)
  19. xgbc.fit(X,Y)
  20. pd.Series(xgbc.feature_importances_, X.columns).sort_values(ascending=True).plot.barh(width=0.8,ax=ax[1,1],color='#FD0F00')
  21. ax[1,1].set_title('Feature Importance in XgBoost')
  22. plt.show()

不同模型对比:

307b60fe89e715fc7e55804684968cc3.png

基于KNN算法的iris数据集分类

特征分布情况:

  1. pd.plotting.scatter_matrix(X_train, 
  2.                            c=y_train, 
  3.                            figsize=(1515),
  4.                            marker='o'
  5.                            hist_kwds={'bins'20}, 
  6.                            s=60,
  7.                            alpha=.8
  8.                           )
  9. plt.show()
b62ff7a824195efdce348352d4b40400.png

混淆矩阵:

  1. from sklearn.metrics import classification_report,f1_score,accuracy_score,confusion_matrix
  2. sns.heatmap(confusion_matrix(y_pred, y_test), annot=True)
  3. plt.show()
9cc77f81f5a5917649fa30b86cbc3e6e.png

对新数据预测:

  1. x_new = np.array([[52.910.2]])
  2. prediction = knn.predict(x_new)

基于随机森林算法的员工流失预测

不同教育背景下的人群对比:

  1. fig = go.Figure(data=[go.Pie(
  2.     labels=attrition_by['EducationField'],
  3.     values=attrition_by['Count'],
  4.     hole=0.4,
  5.     marker=dict(colors=['#3CAEA3''#F6D55C']),
  6.     textposition='inside'
  7. )])
  8. fig.update_layout(title='Attrition by Educational Field'
  9.                   font=dict(size=12), 
  10.                   legend=dict(
  11.                       orientation="h",
  12.                       yanchor="bottom",
  13.                       y=1.02
  14.                       xanchor="right",
  15.                       x=1
  16. ))
  17. fig.show()
01c538cfee58c297aa5f31fd1baa02c2.png

年龄和月收入关系:

8f65734e1799664014553df2a0e2c4bb.png

类型编码:

  1. from sklearn.preprocessing import LabelEncoder
  2. le = LabelEncoder()
  3. df['Attrition'] = le.fit_transform(df['Attrition'])
  4. df['BusinessTravel'] = le.fit_transform(df['BusinessTravel'])
  5. df['Department'] = le.fit_transform(df['Department'])
  6. df['EducationField'] = le.fit_transform(df['EducationField'])
  7. df['Gender'] = le.fit_transform(df['Gender'])
  8. df['JobRole'] = le.fit_transform(df['JobRole'])
  9. df['MaritalStatus'] = le.fit_transform(df['MaritalStatus'])
  10. df['Over18'] = le.fit_transform(df['Over18'])
  11. df['OverTime'] = le.fit_transform(df['OverTime'])

相关性分析:

1fa605bfd898c353564bb6e2847f8bb4.png

基于LSTM的股价预测

LSTM网络模型搭建:

  1. from keras.models import Sequential
  2. from keras.layers import Dense, LSTM
  3. model = Sequential()
  4. # 输入层
  5. model.add(LSTM(128, return_sequences=True, input_shape= (xtrain.shape[1], 1)))
  6. # 隐藏层
  7. model.add(LSTM(64, return_sequences=False))
  8. model.add(Dense(25))
  9. # 输出层
  10. model.add(Dense(1))
  11. # 模型概览
  12. model.summary()

交叉验证实现:

  1. k = 5
  2. number_val = len(xtrain) // k  # 验证数据集的大小
  3. number_epochs = 20
  4. all_mae_scores = []
  5. all_loss_scores = []
  6. for i in range(k):
  7.     # 只取i到i+1部分作为验证集
  8.     vali_X = xtrain[i * number_val: (i+1) * number_val]
  9.     vali_y = ytrain[i * number_val: (i+1) * number_val]
  10.     # 训练集
  11.     part_X_train = np.concatenate([xtrain[:i * number_val],
  12.                                   xtrain[(i+1) * number_val:]],
  13.                                   axis=0
  14.                                  ) 
  15.     part_y_train = np.concatenate([ytrain[:i * number_val],
  16.                                   ytrain[(i+1) * number_val:]],
  17.                                   axis=0
  18.                                  )
  19.     
  20.     print("pxt: \n",part_X_train[:3])
  21.     print("pyt: \n",part_y_train[:3])
  22.     
  23.     # 模型训练
  24.     history = model.fit(part_X_train,
  25.                         part_y_train,
  26.                         epochs=number_epochs,
  27.                         # 传入验证集的数据
  28.                         validation_data=(vali_X, vali_y),
  29.                         batch_size=300,
  30.                         verbose=0  # 0-静默模式 1-日志模式
  31.                        )
  32.     
  33.     mae_history = history.history["mae"]
  34.     loss_history = history.history["loss"]
  35.     all_mae_scores.append(mae_history)
  36.     all_loss_scores.append(loss_history)

时序预测

基于AMIRA的销量预测

自相关性图:

921dee75854dc2f5163979d9e8fdb904.png

偏自相关性:

130fc01275a38add82698b4f684115b8.png

预测未来10天

  1. p,d,q = 5,1,2
  2. model = sm.tsa.statespace.SARIMAX(df['Revenue'],
  3.                                 order=(p, d, q),
  4.                                 seasonal_order=(p, d, q, 12))
  5. model = model.fit()
  6. model.summary()
  7. ten_predictions = model.predict(len(df), len(df) + 10)  # 预测10
dde4a07121df718ca237bb89563bdd60.png

基于prophet的天气预测

特征间的关系:

de32a9a423a3d71268f608d35a0a7ba4.png 2f0ea977a34a7f69683cd8fad0c36d53.png

预测效果:97e4207f81a77cf733f730bac88e4be1.png

其他案例

python的6种实现99乘法表

提供2种:

  1. for i in range(110):
  2.     for j in range(1, i+1):  # 例如3*34*4的情况,必须保证j能取到i值,所以i+1range函数本身是不包含尾部数据
  3.         print(f'{j}x{i}={i*j} ', end="")  # end默认是换行;需要改成空格
  4.     print("\n")  # 末尾自动换空行
  1. for i in range(110):       # 外层循环
  2.     j = 1      # 内层循环初始值
  3.     while j <= i:      # 内层循环条件:从1开始循环
  4.         print("{}x{}={}".format(i,j,(i*j)), end=' ')  # 输出格式
  5.         j += 1  # j每循环一次加1,进入下次,直到j<=i的条件不满足,再进入下个i的循环中
  6.     print("\n")
  1. i = 1  # i初始值
  2. while i <= 9:  # 循环终止条件
  3.     j = 1  # j初始值
  4.     while j <= i:    # j的大小由i来控制
  5.         print(f'{i}x{j}={i*j} ', end='')
  6.         j += 1   # j每循环一次都+1,直到j<=i不再满足,跳出这个while循环 
  7.     i += 1  # 跳出上面的while循环后i+1,只要i<9就换行进入下一轮的循环;否则结束整个循环
  8.     print('\n')

python实现简易计算器(GUI界面)

提供部分代码:

  1. import tkinter as tk
  2. root = tk.Tk()  
  3. root.title("Standard Calculator")  
  4. root.resizable(00)  
  5. e = tk.Entry(root,
  6.              width=35,
  7.              bg='#f0ffff',
  8.              fg='black',
  9.              borderwidth=5,
  10.              justify='right',
  11.              font='Calibri 15')
  12. e.grid(row=0, column=0, columnspan=3, padx=12, pady=12)
  13. # 点击按钮
  14. def buttonClick(num): 
  15.     temp = e.get(
  16.     )  
  17.     e.delete(0, tk.END)  
  18.     e.insert(0, temp + num)  
  19. # 清除按钮
  20. def buttonClear():  
  21.     e.delete(0, tk.END)
  22. def buttonGet(oper):  
  23.     global num1, math  
  24.     num1 = e.get()  
  25.     math = oper  
  26.     e.insert(tk.END, math)
  27.     try:
  28.         num1 = float(num1)  
  29.     except ValueError:  
  30.         buttonClear()
推荐阅读
相关标签