【技術積累】Python中的Pandas庫【二】

2023-06-07 12:01:41

如何在 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 = 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 提供了一些方法方便進行資料分析和資料處理。