主頁 > 後端開發 > 【技識訓累】Python中的Pandas庫【二】

【技識訓累】Python中的Pandas庫【二】

2023-06-08 07:54:38 後端開發

如何在 Pandas 中進行文本的匹配和替換操作?

在 Pandas 中,使用 str 屬性與正則運算式可以進行文本的匹配和替換操作,下面是一些常用的方法:

  • str.contains():判斷字串中是否包含指定的文本,
import pandas as pd

df = pd.DataFrame({'text': ['apple', 'banana', 'orange']})
df['contains_a'] = df['text'].str.contains('a')
print(df)
  • str.replace():替換字串中指定的文本,
df = pd.DataFrame({'text': ['apple', 'banana', 'orange']})
df['new_text'] = df['text'].str.replace('a', 'e')
print(df)
  • str.extract():從字串中提取滿足指定正則運算式的部分,
df = pd.DataFrame({'text': ['Name: John', 'Name: Michael', 'Name: David']})
df['name'] = df['text'].str.extract('Name: (.*)')
print(df)

如何在 Pandas 中進行時間序列資料的重采樣和滾動統計?

時間序列資料重采樣是指將資料從一個時間頻率轉換為另一個時間頻率的程序,例如將每日資料轉換為每周資料,滾動統計是指計算一段時間內的統計指標,例如計算每日收盤價的移動平均值,

在 Pandas 中,可以使用 resample() 函式進行時間序列資料的重采樣,使用 rolling() 函式進行滾動統計,具體操作如下:

  1. 讀取時間序列資料并將日期列設定為索引:
  2. 對資料進行重采樣:
  3. 對資料進行滾動統計:
import pandas as pd
df = pd.read_csv('data.csv', index_col='date', parse_dates=True)
# 將資料從每日轉換為每周
df_weekly = df.resample('W').mean()

# 將資料從每日轉換為每月
df_monthly = df.resample('M').mean()
# 計算收盤價的滾動平均值
df['rolling_mean'] = df['close'].rolling(window=10).mean()

# 計算收盤價的滾動標準差
df['rolling_std'] = df['close'].rolling(window=10).std()

如何在 Pandas 中對資料進行隨機抽樣和生成亂數?

在 Pandas 中對資料進行隨機抽樣,可以使用 DataFrame 或 Series 物件的 sample() 方法,該方法可以設定抽樣的數量、比例、是否有放回等引數,示例代碼如下:

import pandas as pd

# 創建一個 DataFrame 物件
df = pd.DataFrame({'A': [1,2,3,4,5], 'B': ['a','b','c','d','e']})

# 對 DataFrame 進行隨機抽樣
sample_df = df.sample(n=3, replace=True)  # 抽樣數量為 3,有放回
print(sample_df)

生成亂數,可以使用 numpy 庫中的 random 模塊,示例代碼如下:

import numpy as np

# 生成一個 [0, 1) 之間的亂數
rand_num = np.random.rand()
print(rand_num)

除了生成單個亂數外,也可以生成多個亂數,例如:

# 生成一個大小為 3x2 的隨機矩陣
rand_matrix = np.random.rand(3, 2)
print(rand_matrix)

如何在 Pandas 中使用進階的 DataFrame 和 Series 的操作方法,例如 stack、unstack、pivot、melt 等?

在 Pandas 中,可以通過以下方法使用進階的 DataFrame 和 Series 操作方法:

  • stack:將列資料壓縮為行資料,使得 DataFrame 的行數增加,列數減少,
  • unstack:將行資料展開成列資料,使得 DataFrame 的列數增加,行數減少,
  • pivot:將一列作為橫軸,一列作為縱軸,另一列作為對應值,構造新的 DataFrame,
  • melt:將多列合并成一列,
import pandas as pd

# 構造資料
df = pd.DataFrame({
    'name': ['Alice', 'Bob'],
    'salary2019': [5000, 6000],
    'salary2020': [5500, 6800]
})
print(df)
# 輸出:
#     name  salary2019  salary2020
# 0  Alice        5000        5500
# 1    Bob        6000        6800

# stack
stacked_df = df.set_index('name').stack().reset_index()
print(stacked_df)
# 輸出:
#     name      level_1     0
# 0  Alice  salary2019  5000
# 1  Alice  salary2020  5500
# 2    Bob  salary2019  6000
# 3    Bob  salary2020  6800

# unstack
unstacked_df = stacked_df.set_index(['name', 'level_1']).unstack()
print(unstacked_df)
# 輸出:
#              0
# level_1 salary2019 salary2020
# name
# Alice         5000       5500
# Bob           6000       6800
import pandas as pd

# 構造資料
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'year': [2019, 2019, 2020],
    'salary': [5000, 6000, 7000]
})
print(df)
# 輸出:
#       name  year  salary
# 0    Alice  2019    5000
# 1      Bob  2019    6000
# 2  Charlie  2020    7000

# pivot
pivot_df = df.pivot(index='name', columns='year', values='salary')
print(pivot_df)
# 輸出:
# year       2019    2020
# name
# Alice      5000     NaN
# Bob        6000     NaN
# Charlie     NaN    7000
import pandas as pd

# 構造資料
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'salary2019': [5000, 6000, 7000],
    'salary2020': [5500, 6800, 7500]
})
print(df)
# 輸出:
#       name  salary2019  salary2020
# 0    Alice        5000        5500
# 1      Bob        6000        6800
# 2  Charlie        7000        7500

# melt
melted_df = df.melt(id_vars=['name'], value_vars=['salary2019', 'salary2020'], var_name='year', value_name='salary')
print(melted_df)
# 輸出:
#       name        year  salary
# 0    Alice  salary2019    5000
# 1      Bob  salary2019    6000
# 2  Charlie  salary2019    7000
# 3    Alice  salary2020    5500
# 4      Bob  salary2020    6800
# 5  Charlie  salary2020    7500

如何在 Pandas 中使用 mask 和 where 函式對資料進行條件賦值操作?

在 Pandas 中,可以使用 mask 和 where 函式對資料進行條件賦值操作,

  • mask:根據條件,對符合條件的元素進行替換
  • where:根據條件,對不符合條件的元素進行替換

以下是對 Pandas 中的 DataFrame 進行條件賦值的示例代碼:

import pandas as pd

# 創建 DataFrame
df = pd.DataFrame({'A': [-1, 2, 3, -4], 'B': [5, 6, -7, 8]})

# mask:將 df 中小于 0 的元素替換為 0
df_mask = df.mask(df < 0, 0)
print(df_mask)

# where:將 df 中大于 0 的元素替換為 0
df_where = df.where(df < 0, 0)
print(df_where)

可以看到,使用 mask 函式將 df 中小于 0 的元素替換為 0,使用 where 函式將 df 中大于 0 的元素替換為 0,

如何在 Pandas 中使用 rolling 函式對資料進行滑動視窗統計操作?

  1. 將資料轉換為 Pandas 的 Series 或 DataFrame 格式,
  2. 呼叫 rolling 函式,并設定視窗大小和統計函式,
  3. 對回傳的物件進行操作,如篩選或繪圖,

下面是一個簡單的示例,演示如何使用 rolling 函式對資料進行滑動視窗統計操作:

import pandas as pd

# 創建資料
data = https://www.cnblogs.com/yyyyfly1/p/pd.Series([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

# 使用 rolling 函式進行統計
result = data.rolling(window=3).sum()

# 輸出結果
print(result)
0     NaN
1     NaN
2     3.0
3     6.0
4     9.0
5    12.0
6    15.0
7    18.0
8    21.0
9    24.0
dtype: float64

如何在 Pandas 中進行資料的合并去重和拼接操作?

在 Pandas 中,資料的合并、去重和拼接操作可以通過以下幾個方法實作:

  1. pd.concat():將多個資料表按行或列拼接在一起,并且可以指定資料表之間的連接方式(inner或outer)和連接軸(axis=0或1),

  2. pd.merge():用于合并兩個資料表,其中一個資料表作為基礎表,另一個資料表作為待合并的表,可以指定基礎表和待合并表中的共同列來進行合并,并且可以指定連接方式(inner、left、right或outer),

  3. df.drop_duplicates():用于去除資料表中的重復行,可以根據指定的列名來進行去重操作,

# 創建示例資料表
import numpy as np
import pandas as pd

df1 = pd.DataFrame({'A': ['a', 'b', 'c', 'd'],
                    'B': [1, 2, 3, 4],
                    'C': [np.nan, 2, 3, 4]})
df2 = pd.DataFrame({'A': ['e', 'b', 'f', 'g'],
                    'B': [5, 6, 7, 8],
                    'C': [1, 2, np.nan, 4]})

# pd.concat()方法進行拼接操作
df_concat = pd.concat([df1, df2], axis=0, join='outer')

# pd.merge()方法進行合并操作
df_merge = pd.merge(df1, df2, on='A', how='inner')

# df.drop_duplicates()方法進行去重操作
df_drop_dup = df_concat.drop_duplicates(['A'], keep='last')

如何在 Pandas 中使用 interpolate 函式對資料進行插值操作?

Pandas 中 interpolate 函式可以對缺失值進行插值操作,以下是使用 interpolate 函式的示例代碼:

import pandas as pd

# 創建一個包含缺失值的 Series
s = pd.Series([1, 2, 3, np.nan, 5, np.nan, 7])

# 使用線性插值對缺失值進行填充
s_interpolated = s.interpolate()

print(s_interpolated)
0    1.000000
1    2.000000
2    3.000000
3    4.000000
4    5.000000
5    6.000000
6    7.000000
dtype: float64

該示例代碼中,使用了默認的線性插值方式對缺失值進行填充,可以通過引數設定來改變插值方式,比如使用多項式插值或者樣條插值等,使用 interpolate 函式的注意點是,待插值資料必須是單調的,否則插值結果可能不準確,

如何在 Pandas 中進行時間序列資料的處理和分析?

Pandas 中有兩種處理時間序列資料的型別:Timestamp 和 DatetimeIndex,Timestamp 是 Pandas 中表示單個時間點的資料型別,而 DatetimeIndex 是 Pandas 中表示一個時間序列的資料型別,

以下是 Pandas 中處理時間序列資料的常用方法:

  • 創建時間序列

可以使用 Pandas 中的 to_datetime() 方法將字串轉換為 Timestamp 物件或 DatetimeIndex 物件,

import pandas as pd

# 將字串轉換為 Timestamp 物件
timestamp = pd.to_datetime('2021-01-01')
print(timestamp)

# 將字串串列轉換為 DatetimeIndex 物件
date_list = ['2021-01-01', '2021-01-02', '2021-01-03']
date_index = pd.DatetimeIndex(date_list)
print(date_index)
  • 時間序列切片

可以使用 loc 或 iloc 方法對時間序列進行切片,

import pandas as pd

date_index = pd.date_range(start='2021-01-01', end='2021-01-10')
df = pd.DataFrame({'value': range(10)}, index=date_index)

# 使用 loc 方法對時間序列進行切片,取 2021-01-01 至 2021-01-03 的資料
print(df.loc['2021-01-01':'2021-01-03'])

# 使用 iloc 方法對時間序列進行切片,取第一行至第三行的資料
print(df.iloc[0:3])
  • 時間序列的聚合

可以使用 resample() 方法將時間序列按照一定的時間周期進行聚合,

import pandas as pd

date_index = pd.date_range(start='2021-01-01', end='2021-01-10')
df = pd.DataFrame({'value': range(10)}, index=date_index)

# 將時間序列按照每天進行聚合,并計算平均值
daily_mean = df.resample('D').mean()
print(daily_mean)

# 將時間序列按照每兩天進行聚合,并計算平均值
two_day_mean = df.resample('2D').mean()
print(two_day_mean)
  • 移動視窗分析

可以使用 rolling() 方法對時間序列進行移動視窗分析,

import pandas as pd

date_index = pd.date_range(start='2021-01-01', end='2021-01-10')
df = pd.DataFrame({'value': range(10)}, index=date_index)

# 對時間序列進行 3 天的移動視窗計算
rolling_mean = df.rolling(window=3).mean()
print(rolling_mean)
  • 時間序列可視化

可以使用 Pandas 中的 plot() 方法對時間序列進行可視化,

import pandas as pd
import matplotlib.pyplot as plt

date_index = pd.date_range(start='2021-01-01', end='2021-01-10')
df = pd.DataFrame({'value': range(10)}, index=date_index)

# 對時間序列進行可視化
df.plot()
plt.show()

如何在 Pandas 中進行資料的機器學習和深度學習處理,例如特征工程、資料預處理、模型構建等?

在 Pandas 中進行資料的機器學習和深度學習處理,需要進行以下步驟:

  1. 資料預處理:包括資料清洗、缺失值填充、資料轉換等,

  2. 特征工程:包括特征選擇、特征提取、特征變換等,

  3. 模型構建:選擇合適的機器學習或深度學習模型,并進行模型訓練和引數調優,

  4. 模型評估:使用交叉驗證或測驗集進行模型評估,并選擇最優模型,

下面是在 Pandas 中進行機器學習和深度學習處理的一些具體步驟:

  1. 資料預處理

資料預處理包括資料清洗、缺失值填充、資料轉換等,在 Pandas 中可以使用 DataFrame 提供的方法來實作,

資料清洗:

  • 洗掉重復資料:使用 drop_duplicates() 方法,

  • 洗掉例外值:可以使用統計方法,例如用中位數或均值替換例外值,

缺失值填充:

  • 使用平均值、中位數或眾數填充:使用 fillna() 方法,

  • 使用插值法填充:使用 interpolate() 方法,

資料轉換:

  • 離散化:使用 cut() 方法,

  • 連續化:使用 qcut() 方法,

  1. 特征工程

特征工程包括特征選擇、特征提取、特征變換等,使用 Pandas 可以方便地進行特征工程,

特征選擇:

  • 相關系數分析:使用 corr() 方法,

  • 方差分析:使用 variance() 方法,

特征提取:

  • 文本特征提取:使用 countvectorizer() 方法,

  • 影像特征提取:使用 PIL 庫或 OpenCV 工具包,

特征變換:

  • 標準化:使用 sklearn 的 StandardScaler,

  • 歸一化:使用 sklearn 的 MinMaxScaler,

  1. 模型構建

在 Pandas 中可以使用 sklearn 包提供的機器學習和深度學習演算法進行模型構建,

  • 機器學習:使用 Random Forest、KNN、SVM、LR 等演算法,

  • 深度學習:使用 TensorFlow、Keras、PyTorch、MXNet 等框架,

  1. 模型評估

使用交叉驗證或測驗集進行模型評估,并選擇最優模型,

  • 交叉驗證:使用 cross_val_score() 方法,

  • 測驗集評估:使用 predict() 方法和 confusion_matrix() 方法,

綜上所述,在 Pandas 中進行資料的機器學習和深度學習處理需要進行資料預處理、特征工程、模型構建和模型評估等步驟,在每一步驟中,Pandas 提供了一些方法方便進行資料分析和資料處理,

在黑夜里夢想著光,心中覆寫悲傷,在悲傷里忍受孤獨,空守一絲溫暖, 我的淚水是無底深海,對你的愛已無言,相信無盡的力量,那是真愛永在, 我的信仰是無底深海,澎湃著心中火焰,燃燒無盡的力量,那是忠誠永在,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/554524.html

標籤:Python

上一篇:【python基礎】if陳述句-處理串列

下一篇:返回列表

標籤雲
其他(160512) Python(38208) JavaScript(25478) Java(18209) C(15237) 區塊鏈(8270) C#(7972) AI(7469) 爪哇(7425) MySQL(7235) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4585) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1983) 功能(1967) HtmlCss(1952) Web開發(1951) C++(1933) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1879) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • 【技識訓累】Python中的Pandas庫【二】

    博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ......

    uj5u.com 2023-06-08 07:54:38 more
  • 【python基礎】if陳述句-處理串列

    通過結合使用if陳述句和串列,可以完成一些程式上的需求,比如,對串列中特定的值做特殊處理 # 1.測驗特殊值 比如我們有一個學員名單,其中'劉柏宏'入學比較晚,需要我們重點關注,撰寫程式如下所示: ![image](https://img2023.cnblogs.com/blog/3179433/20 ......

    uj5u.com 2023-06-08 07:54:29 more
  • IO流 p11 Properties

    **# Properties類** - **基本介紹** ![](https://img2023.cnblogs.com/blog/3008601/202306/3008601-20230604103622859-1793594469.png) 1. 專門用于讀寫組態檔的集合類 組態檔的格式: ......

    uj5u.com 2023-06-08 07:54:02 more
  • SpringMVC引數接收與資料回應

    ## SpringMVC如何接受請求引數(普通型別引數/物件型別引數/陣列/json資料等) 1、普通型別引數 (1)在可以在方法引數上使用@RequestParam注解來系結請求引數,此注解允許指定請求引數的名稱,以及是否是必須傳的引數。 ~~~java @RequestMapping("/exa ......

    uj5u.com 2023-06-08 07:53:56 more
  • vscode rest client

    # 安裝 略 # hello world > 1. 檔案地址: [https://marketplace.visualstudio.com/items?itemName=humao.rest-client](https://marketplace.visualstudio.com/items?ite ......

    uj5u.com 2023-06-08 07:48:38 more
  • 你沒見過的分庫分表原理決議和解決方案(一)

    # 你沒見過的分庫分表原理決議和解決方案(一) 高并發三駕馬車:分庫分表、MQ、快取。今天給大家帶來的就是分庫分表的干貨解決方案,哪怕你不用我的框架也可以從中聽到不一樣的結局方案和實作。 一款支持自動分表分庫的orm框架[`easy-query`](https://github.com/xuejmn ......

    uj5u.com 2023-06-07 08:52:31 more
  • 【QCustomPlot】下載

    ## 說明 使用 QCustomPlot 繪圖庫輔助開發時整理的學習筆記。同系列文章目錄可見 [《繪圖庫 QCustomPlot 學習筆記》目錄](https://www.cnblogs.com/young520/p/17461129.html)。本篇介紹 QCustomPlot 的下載。 [TOC ......

    uj5u.com 2023-06-07 08:46:38 more
  • 你沒見過的分庫分表原理決議和解決方案(一)

    # 你沒見過的分庫分表原理決議和解決方案(一) 高并發三駕馬車:分庫分表、MQ、快取。今天給大家帶來的就是分庫分表的干貨解決方案,哪怕你不用我的框架也可以從中聽到不一樣的結局方案和實作。 一款支持自動分表分庫的orm框架[`easy-query`](https://github.com/xuejmn ......

    uj5u.com 2023-06-07 08:35:02 more
  • 【QCustomPlot】下載

    ## 說明 使用 QCustomPlot 繪圖庫輔助開發時整理的學習筆記。同系列文章目錄可見 [《繪圖庫 QCustomPlot 學習筆記》目錄](https://www.cnblogs.com/young520/p/17461129.html)。本篇介紹 QCustomPlot 的下載。 [TOC ......

    uj5u.com 2023-06-07 08:29:05 more
  • 說說驗證碼功能的實作

    大家好,我是 god23bin,今天說說驗證碼功能的實作,相信大家都經常接觸到驗證碼的,畢竟平時上網也能遇到各種驗證碼,需要我們輸入驗證碼進行驗證我們是人類,而不是機器人。 ......

    uj5u.com 2023-06-07 07:42:41 more