3.8.1 Pandas分箱操作
數據分箱(Binning) 是一種數據預處理方法,用于將連續型變量的數值范圍分割成若干個區間或“箱”(bins),將數據按照這些區間進行分類,從而轉換為離散型變量。這種方法常用于將數據的變化范圍縮小,使其更加適合某些分析或模型算法的處理,或通過減少異常值的影響來提高模型的穩定性。
- 等距分箱操作
將數據的取值范圍等分為若干個區間,區間的寬度相等。例如,將數據范圍從0到100分為5個區間,每個區間的寬度為20。
# 等距分箱
x=pd.cut(x=df["Chinese"], #要做分箱的數據bins=4, #分箱的數目right=True, #默認左閉右開labels=["差勁","一般","良好","優秀",] #各箱的名稱
)
# [(11.92, 32.0] < (32.0, 52.0] < (52.0, 72.0] < (72.0, 92.0]]
# ['差勁' < '一般' < '良好' < '優秀']
x.value_counts()
"""
Chinese
一般 3
差勁 2
優秀 2
良好 1
"""
- 等頻分箱操作
將數據分成若干個區間,使每個區間中包含相同數量的數據點。
# 等頻分箱
x=pd.qcut(x=df["Chinese"], #要做分箱的數據q=4, #分箱的數目,使得每個箱分得的元素個數基本相同labels=["差勁","一般","良好","優秀",] #各箱的名稱
)
# [(11.999, 35.0] < (35.0, 41.5] < (41.5, 66.5] < (66.5, 92.0]]
# ['差勁' < '一般' < '良好' < '優秀']
x.value_counts()
"""
Chinese
差勁 2
一般 2
良好 2
優秀 2
"""
3.8.2 Pandas時間序列
在數據科學和分析領域,時間序列數據是一個非常重要的組成部分。無論是在金融、氣象還是其他領域,時間序列數據的處理和分析都非常常見。Pandas庫為時間序列數據提供了強大的支持,使得處理和分析這些數據變得簡單高效。本文將帶你通過Pandas的一些時間序列功能,幫助你更好地理解如何處理、轉換和操作時間序列數據。
- 獲取時間數據
pd.Timestamp("2025-02-01") #時刻數據
pd.Period("2025-02-01", freq='D') #時期數據:D日 M月 Y年
- 批量生成時間數據
pd.date_range("2025-02-01", periods=4, freq='D') #生成時刻數據:periods是生成的數量,freq是按照日/月/年進行生成
pd.period_range("2025-02-01",periods=4, freq='D') #生成時期數據
- 時間的轉換
# 1.to_datetime將時間轉換為Timestamp類型
pd.to_datetime("2025.2.1")
pd.to_datetime("2025-02-01")
pd.to_datetime("2025/2/1")
pd.to_datetime("1/2/2025")
# 2.將時間戳轉換為時間Timestamp類型
pd.to_datetime(1809459200, unit='s')
- 時間差
date = pd.to_datetime("2025.2.1")
date + pd.DateOffset(days=6)
date + pd.DateOffset(months=6)
date + pd.DateOffset(years=6)
- 時間索引與切片
index = pd.date_range("2025-02-01", periods=100, freq='D')
ts = pd.Series(np.random.randint(0, 10, size=(100,)), index=index)
ts['2025-02-01'] #具體日期
ts['2025-02'] #2月份
ts['2025'] #2025年
ts['2025-02-01':'2025-03-25'] #時間范圍切片
- 屬性
ts.index
ts.index.year #獲取所有年份
ts.index.month #獲取所有月份
ts.index.day #獲取所有日
- 數據移動
index = pd.date_range("2025-02-01", periods=100, freq='D')ts = pd.Series(np.random.randint(0, 10, size=(100,)), index=index)
ts.shift(periods=1) #向下移動一位
ts.shift(periods=-2) #向上移動兩位
- 頻率轉換
ts.asfreq(pd.tseries.offsets.Week())#將頻率轉換成周
ts.asfreq(pd.tseries.offsets.MonthEnd())#將頻率轉換成月
ts.asfreq(pd.tseries.offsets.YearEnd())#將頻率轉換成年
ts.asfreq(pd.tseries.offsets.Hour(), fill_value=0)#將頻率轉換成小時,空白處用0填充
- 重采樣
重采樣通常是指對時間序列數據進行重新采樣的過程,尤其是在使用 pandas
庫時。重采樣可以用于改變數據的頻率,向上采樣或向下采樣數據。
-
向下采樣:將數據從高頻率的時間序列轉變為低頻率,比如從小時數據轉換為日數據。
-
向上采樣:將數據從低頻率的時間序列轉換為高頻率,比如從日數據轉換為小時數據。
# 對Series進行重采樣
index = pd.date_range("2025-02-01", periods=100, freq='D')
ts = pd.Series(np.random.randint(0, 10, size=(100,)), index=index)
ts.resample("2D").sum() #每兩天的數進行相加
ts.resample("1ME").sum() #每個月的數進行相加
ts.resample("3ME").sum() #每個季度的數進行相加
# 對DataFrame進行重采樣
df = pd.DataFrame({"price":np.random.randint(0, 100, size=(100,)),"time":pd.date_range("2025-02-01", periods=100, freq='D')
})
#rule指定聚合的方式,on指定聚合的列名
df.resample(rule="ME", on="time").sum() #求每個月的價格總合
3.8.3 Pandas繪圖
- 折線圖
通過plot()函數繪制折線圖
# Series繪制折線圖
s = pd.Series(np.arange(0, 2*np.pi, 0.01))
np.sin(s).plot() #DataFrame繪制折線圖
df = pd.DataFrame(np.random.randint(1, 100, (4,3)), index=["zhangsan", "lisi", "wangwu", "zhouliu"], columns=["Chinese", "Math", "English"])
df.plot()
- 柱狀圖和條形圖
df.plot(kind="bar")#柱狀圖方法1
df.plot.bar()#柱狀圖方法2
df.plot.bar(stacked=True) #堆疊類型的柱狀圖
df.plot.barh()#水平柱狀圖(條形圖)
- 直方圖
柱高表示數據的頻數,柱寬表示各組數據的組距
#參數bins可以設置直方圖方柱的個數上限,越大柱寬越小,數據分組越細致
#bins表示分的組數:每組的范圍是(max-min)/bins
s=pd.Series([1,1,1,1,2,2,3,3,3,3,3,4,4,5,6,6,6])
s.plot(kind='hist')
#設置density參數為True,可以把頻數轉換為概率
s.plot(kind='hist', density=True)
#添加kde圖
s.plot(kind='hist')
s.plot(kind='kde')
- 餅圖
# 畫一列的餅圖
# kind='pie':表示餅圖
# autopct='%.1f%%':在圖中展示.1f%
df['A'].plot(kind='pie', autopct='%.1f%%')# 畫所有列的餅圖
# subplots=True:畫出所有子圖
df.plot.pie(subplots=True, autopct='%.1f%%')
- 散點圖
# 描述兩列之間的關系
data=np.random.randn(1000,2)
df=pd.DataFrame(data, columns=['A', 'B'])
df.plot(kind="scatter", x='A', y='B')#x為A列,y為B列