在 Pandas 中,使用 str 屬性與正規表示式可以進行文字的匹配和替換操作。下面是一些常用的方法:
import pandas as pd
df = pd.DataFrame({'text': ['apple', 'banana', 'orange']})
df['contains_a'] = df['text'].str.contains('a')
print(df)
df = pd.DataFrame({'text': ['apple', 'banana', 'orange']})
df['new_text'] = df['text'].str.replace('a', 'e')
print(df)
df = pd.DataFrame({'text': ['Name: John', 'Name: Michael', 'Name: David']})
df['name'] = df['text'].str.extract('Name: (.*)')
print(df)
時間序列資料重取樣是指將資料從一個時間頻率轉換為另一個時間頻率的過程,例如將每日資料轉換為每週資料。捲動統計是指計算一段時間內的統計指標,例如計算每日收盤價的移動平均值。
在 Pandas 中,可以使用 resample() 函數進行時間序列資料的重取樣,使用 rolling() 函數進行卷動統計。具體操作如下:
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 中對資料進行隨機抽樣,可以使用 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 操作方法:
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 中的 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。
下面是一個簡單的範例,演示如何使用 rolling 函數對資料進行滑動視窗統計操作:
import pandas as pd
# 建立資料
data = 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 中,資料的合併、去重和拼接操作可以通過以下幾個方法實現:
pd.concat():將多個資料表按行或列拼接在一起,並且可以指定資料表之間的連線方式(inner或outer)和連線軸(axis=0或1)。
pd.merge():用於合併兩個資料表,其中一個資料表作為基礎表,另一個資料表作為待合併的表,可以指定基礎表和待合併表中的共同列來進行合併,並且可以指定連線方式(inner、left、right或outer)。
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 函數可以對缺失值進行插值操作。以下是使用 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 中有兩種處理時間序列資料的型別: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 中進行機器學習和深度學習處理的一些具體步驟:
資料預處理包括資料淨化、缺失值填充、資料轉換等。在 Pandas 中可以使用 DataFrame 提供的方法來實現。
資料淨化:
刪除重複資料:使用 drop_duplicates() 方法。
刪除異常值:可以使用統計方法,例如用中位數或均值替換異常值。
缺失值填充:
使用平均值、中位數或眾數填充:使用 fillna() 方法。
使用插值法填充:使用 interpolate() 方法。
資料轉換:
離散化:使用 cut() 方法。
連續化:使用 qcut() 方法。
特徵工程包括特徵選擇、特徵提取、特徵變換等。使用 Pandas 可以方便地進行特徵工程。
特徵選擇:
相關係數分析:使用 corr() 方法。
方差分析:使用 variance() 方法。
特徵提取:
文字特徵提取:使用 countvectorizer() 方法。
影象特徵提取:使用 PIL 庫或 OpenCV 工具包。
特徵變換:
標準化:使用 sklearn 的 StandardScaler。
歸一化:使用 sklearn 的 MinMaxScaler。
在 Pandas 中可以使用 sklearn 包提供的機器學習和深度學習演演算法進行模型構建。
機器學習:使用 Random Forest、KNN、SVM、LR 等演演算法。
深度學習:使用 TensorFlow、Keras、PyTorch、MXNet 等框架。
使用交叉驗證或測試集進行模型評估,並選擇最優模型。
交叉驗證:使用 cross_val_score() 方法。
測試集評估:使用 predict() 方法和 confusion_matrix() 方法。
綜上所述,在 Pandas 中進行資料的機器學習和深度學習處理需要進行資料預處理、特徵工程、模型構建和模型評估等步驟。在每一步驟中,Pandas 提供了一些方法方便進行資料分析和資料處理。