非原創,僅個人關於《Python數據分析與挖掘實戰》的學習筆記
第一章 基礎
略
第二章 數據分析簡介
基本概念
元組、列表、字典、集合
函數式編程:
- map()函數:定義一個函數,然後用map()逐一應用到map列表中的每個元素。map(lambda x+2:a)
- reduce()函數:用於遞歸計算。reduce(lambda x,y:x*y,range(1,n+1))
數據分析常用庫
- numpy 數組,高效處理函數
- scipy 矩陣相關計算
- matplotlib 可視化
- pandas 數據分析
- statsmodels 統計建模
- scikit-learn 迴歸、分類、聚類等機器學習
- keras 深度學習,建立神經網絡及深度學習模型
- gensim 文本主題模型,文本挖掘
第三章 數據探索
3.1 數據質量分析
- 缺失值分析
- 異常值
import pandas as pd
from scipy import stats
# 讀取CSV文件
data = pd.read_csv(f'E:\中經社\中資美元債\PVR\CEIS_Corps_Pricing_Liquidity_20240409.csv')
# 假設我們對數值型數據進行異常值檢測,這裏以'amountOutstanding'列爲例
# 首先,確保數據是數值型的
data['amountOutstanding'] = pd.to_numeric(data['amountOutstanding'], errors='coerce')
# 計算Z-score
z_scores = stats.zscore(data['amountOutstanding'])
# 找出Z-score的絕對值大於1的點作爲異常值
threshold = 1
abs_z_scores = abs(z_scores)
anomaly_indices = abs_z_scores > threshold
# 標記異常值
data['anomaly'] = False
data.loc[anomaly_indices, 'anomaly'] = True
# 顯示含有異常值的行
data[data['anomaly']]
priceAsOf | name | isin | cusip | shortName | ticker | amountOutstanding | classification | bondType | bondSubType | ... | liquidityScore30DayCount | liquidityScore60Day | liquidityScore60DayCount | liquidityScore90Day | liquidityScore90DayCount | quotesCount1Day | quotesCount10Day | quotesDealerCount1Day | quotesDealerCount10Day | anomaly | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2024-04-09 | GS1600 | XS2446005907 | Y3991YRL9 | Indl & Coml Bk China Ltd Hong Kong | UNBKHK | 1200000000 | Financials | Fixed | Fixed | ... | 22 | 1 | 42 | 1 | 64 | 112 | 90 | 16 | 13 | True |
1 | 2024-04-09 | GS1600 | USG7801RAE92 | G7801RAE9 | Sands China Ltd | SANDCHI | 3062000 | Consumer Services | Stepup | FixedStep | ... | 22 | 1 | 42 | 1 | 64 | 228 | 169 | 20 | 14 | True |
2 | 2024-04-09 | GS1600 | USG7801RAD10 | G7801RAD1 | Sands China Ltd | SANDCHI | 2625000 | Consumer Services | Stepup | FixedStep | ... | 22 | 1 | 42 | 1 | 64 | 201 | 168 | 20 | 14 | True |
9 | 2024-04-09 | GS1600 | US00131MAJ27 | 00131MAJ2 | AIA Group Ltd | AIAGRO | 1000000000 | Financials | Fixed | Fixed | ... | 22 | 1 | 42 | 1 | 64 | 368 | 275 | 23 | 17 | True |
10 | 2024-04-09 | GS1600 | US00131LAJ44 | 00131LAJ4 | AIA Group Ltd | AIAGRO | 1000000000 | Financials | Fixed | Fixed | ... | 22 | 1 | 42 | 1 | 64 | 350 | 256 | 22 | 16 | True |
16 | 2024-04-09 | GS1600 | XS2384565508 | Y3969JAU8 | INDL COML BK OF CHINA LTD SINGAPORE BRH | INDUANBE | 1050000000 | Financials | Fixed | Fixed | ... | 22 | 1 | 42 | 1 | 64 | 106 | 88 | 13 | 11 | True |
6 rows × 169 columns
箱型圖異常值檢測
import pandas as pd
import matplotlib.pyplot as plt
# 解決中文亂碼
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 請確保您的文件路徑是正確的
file_path = r'E:\中經社\中資美元債\PVR\CEIS_Corps_Pricing_Liquidity_20240409.csv'
# 讀取CSV文件
data = pd.read_csv(file_path)
# 選擇'bidPrice'列數據進行箱型圖繪製,並確保數據是數值型的
data['bidPrice'] = pd.to_numeric(data['bidPrice'], errors='coerce')
# 計算箱線圖的統計數據,quantile()樣本分位數 (不同 % 的值)
Q1 = data['bidPrice'].quantile(0.25)
Q3 = data['bidPrice'].quantile(0.75)
IQR = Q3 - Q1
# 計算異常值的閾值
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 過濾出數據中的異常值
outliers = data[(data['bidPrice'] < lower_bound) | (data['bidPrice'] > upper_bound)]
# 繪製箱線圖
plt.figure(figsize=(10, 6)) # 設置圖表的大小
# 繪製箱型圖,這裏notch=True表示帶有凹槽的箱型圖,vert=True表示垂直箱型圖
box = plt.boxplot(data['bidPrice'], notch=True, vert=True)
# 添加異常值標記
plt.plot([1]*len(outliers), outliers['bidPrice'], 'ro', markersize=5)
# 設置標題和軸標籤
plt.title('異常值檢測箱型圖分析')
plt.xlabel('Bid Price')
# 由於只有一個箱體,我們將X軸的刻度和標籤設置爲一個點,以避免混淆
plt.xticks([1])
# 顯示圖表
plt.show()
- 不一致的值
- 重複數據及含有特殊符號的數據
3.2 數據特徵分析
3.2.1 分佈分析
3.2.1.1 定量
從df中提取銷售額數據
# 方法1:
sales = df['銷售額(元)']
# 繪製直方圖
plt.hist(sales, bins=10, edgecolor='black')
# 添加標題和標籤
plt.title('頻率分佈直方圖')
plt.xlabel('銷售額(元)')
plt.ylabel('頻次')
# 顯示圖形
plt.show()
# 方法2:
import matplotlib.pyplot as plt
import numpy as np
# 從df中提取銷售額數據
sales = df['銷售額(元)']
# 計算頻率分佈
values, base = np.histogram(sales, bins=10, density=True)
# 計算直方圖的寬度,即每個bin的寬度
width = (df['銷售額(元)'].max() - df['銷售額(元)'].min()) / 10
# 計算直方圖的中心點
center = (base[1:] + base[:-1]) * 0.5
# 繪製直方圖
plt.bar(center, values, width=width, label='頻率分佈', edgecolor='black')
# 添加標題和標籤
plt.title('頻率分佈直方圖')
plt.xlabel('銷售額(元)')
plt.ylabel('頻率')
# 顯示圖例
plt.legend()
# 顯示圖形
plt.show()
3.2.1.2 定性
常常採用餅圖和條形圖來描述。
3.2.2 對比分析
- 絕對比較
- 相對比較
3.2.3 統計量分析
3.2.3.1 集中趨勢度量
- 均值
- 中位數
- 衆數
3.2.3.1 離中趨勢度量
- 極差
statistics = sales.describe()
statistics
count 19.000000
mean 1496.684211
std 1198.271211
min 45.000000
25% 420.000000
50% 1710.000000
75% 2220.000000
max 3960.000000
Name: 銷售額(元), dtype: float64
statistics.loc['range'] = statistics.loc['max']-statistics.loc['min']
- 標準差
- 變異係數
statistics.loc['var'] = statistics.loc['std']-statistics.loc['mean']
- 四分位數區距
statistics.loc['dis'] = statistics.loc['75%']-statistics.loc['25%']
statistics
count 19.000000
mean 1496.684211
std 1198.271211
min 45.000000
25% 420.000000
50% 1710.000000
75% 2220.000000
max 3960.000000
range 3915.000000
var -298.413000
dis 1800.000000
Name: 銷售額(元), dtype: float64
3.2.4 週期性分析
- 時序圖
3.2.5 貢獻度分析
from io import StringIO
# 假設數據已經被轉換成了CSV格式的字符串
data_csv = """id,mame,profit
17148,Al,9173
17154,A2,5729
109,A3,4811
117,A4,3594
17151,AS,3195
14,A6,3026
2868,A7,2378
397,A8,1970
88,A9,1877
426,A10,1782"""
# 使用StringIO來創建一個字符串流
data_csv_df = pd.read_csv(StringIO(data_csv))
# 顯示DataFrame
data_csv_df
id | mame | profit | |
---|---|---|---|
0 | 17148 | Al | 9173 |
1 | 17154 | A2 | 5729 |
2 | 109 | A3 | 4811 |
3 | 117 | A4 | 3594 |
4 | 17151 | AS | 3195 |
5 | 14 | A6 | 3026 |
6 | 2868 | A7 | 2378 |
7 | 397 | A8 | 1970 |
8 | 88 | A9 | 1877 |
9 | 426 | A10 | 1782 |
通過分析,做出增加對哪些菜品的成本投入。
data_csv_df = data_csv_df['profit'].copy()
data_csv_df.sort_values (ascending = False)
0 9173
1 5729
2 4811
3 3594
4 3195
5 3026
6 2378
7 1970
8 1877
9 1782
Name: profit, dtype: int64
import matplotlib.pyplot as plt
# 創建圖形並繪製柱狀圖
plt.figure()
data_csv_df.plot(kind='bar')
plt.ylabel('盈利') # 設置主 y 軸的標籤
# 計算累計和並繪製
p = 1.0 * data_csv_df.cumsum() / data_csv_df.sum()
p.plot(color='r', secondary_y=True, style='-o', linewidth=2)
# 設置次 y 軸的標籤,並指定顏色
plt.ylabel('盈利(比例)', color='r')
# 選擇要註釋的數據點
# 假設我們註釋第七個數據點
value_to_annotate = p.iloc[6]
# 格式化數據點的值
formatted_value = format(value_to_annotate, '.4%')
# 添加註釋
plt.annotate(
formatted_value, # 註釋的文本
xy=(p.index[6], value_to_annotate), # 註釋文本的起始點 (x, y)
xytext=(0, 20), # 註釋文本的結束點 (x, y),根據實際情況調整
textcoords='offset points', # 指定註釋文本的座標系統
arrowprops=dict(
arrowstyle="->", # 箭頭樣式
connectionstyle="arc3,rad=.2" # 連接樣式
),
color='r' # 註釋文本顏色與線顏色相同
)
# 顯示圖形
plt.show()
<b結論:
A1~A7 這7個菜品,佔菜品種類數的70%,總盈利佔總盈利額的85.0003%
3.2.6 相關性分析
3.2.6.1 直接繪製散點圖
import numpy as np
import matplotlib.pyplot as plt
# 生成隨機數據
np.random.seed(0)
x = np.random.rand(100) # 第一個變量
y = 2 * x + np.random.normal(0, 0.1, 100) # 第二個變量與第一個變量存在線性關係,並加入一些噪聲
# y = 2 * x**2 + np.random.normal(0, 0.1, 100) # 第二個變量與第一個變量存在非線性關係,並加入一些噪聲
# y = -2 * x + np.random.normal(0, 0.1, 100) # 第二個變量與第一個變量存在負線性關係,並加入一些噪聲
# 繪製散點圖
plt.scatter(x, y, color='blue', label='Data Points')
# 計算相關係數
correlation = np.corrcoef(x, y)[0, 1]
# 添加標題和標籤
plt.title('2個變量的相關性分析')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
# # 添加相關係數標註
# plt.annotate(f'Correlation: {correlation:.2f}', xy=(0.05, 0.95), xycoords='axes fraction', fontsize=10, ha='left', va='top', bbox=dict(boxstyle='round,pad=0.5', fc='yellow', alpha=0.5))
# 顯示圖形
plt.show()
3.2.6.2 繪製散點圖矩陣
import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
# 忽略警告
warnings.filterwarnings("ignore")
# 生成一些示例數據
np.random.seed(0)
data = pd.DataFrame(np.random.randn(100, 4), columns=['A', 'B', 'C', 'D'])
# 添加非線性相關關係
data['B'] = data['A'] + np.random.normal(0, 1, 100)
data['C'] = 2 * data['A'] + np.random.normal(0, 2, 100)
data['D'] = -3 * data['A'] + np.random.normal(0, 3, 100)
# 將無窮大值替換爲NaN
data.replace([np.inf, -np.inf], np.nan, inplace=True)
# 繪製散點圖矩陣
sns.pairplot(data)
plt.show()
3.2.6.3 計算相關係數
皮爾遜相關
import numpy as np
# 生成示例數據
np.random.seed(0)
x = np.random.rand(100) # 生成100個在[0,1)之間的隨機數
y = 2 * x + np.random.normal(0, 0.1, 100) # y與x存在線性關係,並加入一些噪聲
# 使用NumPy計算Pearson相關係數
correlation = np.corrcoef(x, y)[0, 1]
print("Pearson相關係數:", correlation)
print("p_value:", p_value)
Pearson相關係數: 0.9853103832101714
p_value: 5.4168015521507496e-42
斯皮爾曼相關
import numpy as np
from scipy.stats import spearmanr
# 生成示例數據
np.random.seed(0)
x = np.random.rand(100) # 生成100個在[0,1)之間的隨機數
y = x**2 + np.random.normal(0, 0.1, 100) # y與x存在非線性關係,並加入一些噪聲
# 使用SciPy計算Spearman相關係數
correlation, p_value = spearmanr(x, y)
print("Spearman相關係數:", correlation)
print("p_value:", p_value)
Spearman相關係數: 0.9213201320132012
p_value: 5.4168015521507496e-42
import numpy as np
from scipy.stats import spearmanr
# 生成示例數據
np.random.seed(0)
x = np.random.rand(100) # 生成100個在[0,1)之間的隨機數
y = x**2 + np.random.normal(0, 0.1, 100) # y與x存在非線性關係,並加入一些噪聲
# 使用SciPy計算Spearman相關係數
correlation, p_value = spearmanr(x, y)
print("Spearman相關係數:", correlation)
print("p-value:", p_value)
# 判斷相關係數是否顯著
alpha = 0.05
if p_value < alpha:
print("Spearman相關係數顯著")
else:
print("Spearman相關係數不顯著")
Spearman相關係數: 0.9213201320132012
p-value: 5.4168015521507496e-42
Spearman相關係數顯著
p-value(P值)
p-value(P值)是用於評估在零假設成立的情況下,觀察到的統計量或更極端情況的概率。在統計學中,零假設通常是指兩個變量之間不存在任何關係,或者另一種說法是它們之間的關係是隨機的。
在Spearman相關係數的情境下,p-value可以用來判斷樣本數據中的Spearman相關係數是否顯著。具體來說:
- 如果p-value小於給定的顯著性水平(通常設爲0.05),則我們拒絕零假設,即我們認爲觀察到的Spearman相關係數不是由隨機性導致的,而是由於真實的相關性。
- 如果p-value大於顯著性水平,則我們接受零假設,即我們認爲觀察到的Spearman相關係數可能是由隨機性引起的,而不是真實的相關性。
import numpy as np
from scipy.stats import spearmanr
# 生成示例數據
x = np.array([1, 2, 3, 4, 5])
y = np.array([3434, 2343, 4234, 125,56])
# 使用SciPy計算Spearman相關係數
correlation, p_value = spearmanr(x, y)
print("Spearman相關係數:", correlation)
print("p-value:", p_value)
# 判斷相關係數是否顯著
alpha = 0.05
if p_value < alpha:
print("Spearman相關係數顯著")
else:
print("Spearman相關係數不顯著")
Spearman相關係數: -0.7
p-value: 0.1881204043741873
Spearman相關係數不顯著
繼續介紹案例:
# 菜品名稱
dishes = ['百合醬蒸鳳爪', '翡翠蒸香茜餃', '金銀蒜汁蒸排骨', '樂膳真味雞', '蜜汁焗餐包', '生炒菜心', '鐵板酸菜豆腐', '香煎韭菜餃', '香煎蘿蔔糕', '原汁原味菜心']
# 日期
dates = ['2015/1/1', '2015/1/2', '2015/1/3', '2015/1/4', '2015/1/5', '2015/1/6']
# 銷量數據,每個列表中的數字對應相應菜品在對應日期的銷量
sales_data = [
[17, 6, 8, 24, 13, 13, 18, 10, 10, 27],
[11, 15, 14, 13, 9, 10, 19, 13, 14, 13],
[10, 8, 12, 13, 8, 3, 7, 11, 10, 9],
[9, 6, 6, 3, 10, 9, 9, 13, 14, 13],
[4, 10, 13, 0, 12, 10, 17, 11, 13, 14],
[13, 10, 13, 16, 8, 9, 12, 11, 5, 9]
]
# 創建DataFrame
sales_data_df = pd.DataFrame(sales_data, index=dates, columns=dishes)
sales_data_df
百合醬蒸鳳爪 | 翡翠蒸香茜餃 | 金銀蒜汁蒸排骨 | 樂膳真味雞 | 蜜汁焗餐包 | 生炒菜心 | 鐵板酸菜豆腐 | 香煎韭菜餃 | 香煎蘿蔔糕 | 原汁原味菜心 | |
---|---|---|---|---|---|---|---|---|---|---|
2015/1/1 | 17 | 6 | 8 | 24 | 13 | 13 | 18 | 10 | 10 | 27 |
2015/1/2 | 11 | 15 | 14 | 13 | 9 | 10 | 19 | 13 | 14 | 13 |
2015/1/3 | 10 | 8 | 12 | 13 | 8 | 3 | 7 | 11 | 10 | 9 |
2015/1/4 | 9 | 6 | 6 | 3 | 10 | 9 | 9 | 13 | 14 | 13 |
2015/1/5 | 4 | 10 | 13 | 0 | 12 | 10 | 17 | 11 | 13 | 14 |
2015/1/6 | 13 | 10 | 13 | 16 | 8 | 9 | 12 | 11 | 5 | 9 |
# 計算Spearman相關係數
spearman_corr = sales_data_df.corr(method='spearman')
spearman_corr
百合醬蒸鳳爪 | 翡翠蒸香茜餃 | 金銀蒜汁蒸排骨 | 樂膳真味雞 | 蜜汁焗餐包 | 生炒菜心 | 鐵板酸菜豆腐 | 香煎韭菜餃 | 香煎蘿蔔糕 | 原汁原味菜心 | |
---|---|---|---|---|---|---|---|---|---|---|
百合醬蒸鳳爪 | 1.000000 | -0.088273 | 0.028989 | 0.985611 | -0.028989 | 0.323669 | 0.371429 | -0.462910 | -0.529641 | 0.029424 |
翡翠蒸香茜餃 | -0.088273 | 1.000000 | 0.985184 | -0.179124 | -0.403030 | 0.045455 | 0.441367 | 0.333712 | 0.090909 | -0.272727 |
金銀蒜汁蒸排骨 | 0.028989 | 0.985184 | 1.000000 | -0.058824 | -0.338235 | 0.149270 | 0.521794 | 0.187867 | 0.000000 | -0.194051 |
樂膳真味雞 | 0.985611 | -0.179124 | -0.058824 | 1.000000 | -0.073529 | 0.223906 | 0.231908 | -0.547946 | -0.626936 | -0.029854 |
蜜汁焗餐包 | -0.028989 | -0.403030 | -0.338235 | -0.073529 | 1.000000 | 0.820987 | 0.492805 | -0.313112 | 0.313468 | 0.985184 |
生炒菜心 | 0.323669 | 0.045455 | 0.149270 | 0.223906 | 0.820987 | 1.000000 | 0.882735 | -0.317821 | 0.181818 | 0.893939 |
鐵板酸菜豆腐 | 0.371429 | 0.441367 | 0.521794 | 0.231908 | 0.492805 | 0.882735 | 1.000000 | -0.030861 | 0.264820 | 0.617914 |
香煎韭菜餃 | -0.462910 | 0.333712 | 0.187867 | -0.547946 | -0.313112 | -0.317821 | -0.030861 | 1.000000 | 0.762770 | -0.317821 |
香煎蘿蔔糕 | -0.529641 | 0.090909 | 0.000000 | -0.626936 | 0.313468 | 0.181818 | 0.264820 | 0.762770 | 1.000000 | 0.318182 |
原汁原味菜心 | 0.029424 | -0.272727 | -0.194051 | -0.029854 | 0.985184 | 0.893939 | 0.617914 | -0.317821 | 0.318182 | 1.000000 |
spearman_corr['百合醬蒸鳳爪']
百合醬蒸鳳爪 1.000000
翡翠蒸香茜餃 -0.088273
金銀蒜汁蒸排骨 0.028989
樂膳真味雞 0.985611
蜜汁焗餐包 -0.028989
生炒菜心 0.323669
鐵板酸菜豆腐 0.371429
香煎韭菜餃 -0.462910
香煎蘿蔔糕 -0.529641
原汁原味菜心 0.029424
Name: 百合醬蒸鳳爪, dtype: float64
結論:
相關係數越接近1,表示相關性更大,越接近0,則表示無相關性,如果是負數,則更加無相關性。
# 計算Pearson相關係數
Pearson_corr = sales_data_df.corr()
Pearson_corr
百合醬蒸鳳爪 | 翡翠蒸香茜餃 | 金銀蒜汁蒸排骨 | 樂膳真味雞 | 蜜汁焗餐包 | 生炒菜心 | 鐵板酸菜豆腐 | 香煎韭菜餃 | 香煎蘿蔔糕 | 原汁原味菜心 | |
---|---|---|---|---|---|---|---|---|---|---|
百合醬蒸鳳爪 | 1.000000 | -0.215108 | -0.272730 | 0.948947 | 0.044137 | 0.323976 | 0.140652 | -0.340168 | -0.494433 | 0.524731 |
翡翠蒸香茜餃 | -0.215108 | 1.000000 | 0.827769 | -0.077693 | -0.367647 | 0.018051 | 0.485879 | 0.411706 | 0.154122 | -0.376388 |
金銀蒜汁蒸排骨 | -0.272730 | 0.827769 | 1.000000 | -0.021189 | -0.413919 | -0.245327 | 0.282654 | -0.050637 | -0.214834 | -0.485254 |
樂膳真味雞 | 0.948947 | -0.077693 | -0.021189 | 1.000000 | 0.010859 | 0.214859 | 0.207623 | -0.492837 | -0.558896 | 0.478112 |
蜜汁焗餐包 | 0.044137 | -0.367647 | -0.413919 | 0.010859 | 1.000000 | 0.725324 | 0.585705 | -0.389249 | 0.330289 | 0.860811 |
生炒菜心 | 0.323976 | 0.018051 | -0.245327 | 0.214859 | 0.725324 | 1.000000 | 0.795932 | -0.099381 | 0.122977 | 0.741747 |
鐵板酸菜豆腐 | 0.140652 | 0.485879 | 0.282654 | 0.207623 | 0.585705 | 0.795932 | 1.000000 | -0.097078 | 0.240255 | 0.580441 |
香煎韭菜餃 | -0.340168 | 0.411706 | -0.050637 | -0.492837 | -0.389249 | -0.099381 | -0.097078 | 1.000000 | 0.612826 | -0.430007 |
香煎蘿蔔糕 | -0.494433 | 0.154122 | -0.214834 | -0.558896 | 0.330289 | 0.122977 | 0.240255 | 0.612826 | 1.000000 | 0.138999 |
原汁原味菜心 | 0.524731 | -0.376388 | -0.485254 | 0.478112 | 0.860811 | 0.741747 | 0.580441 | -0.430007 | 0.138999 | 1.000000 |
3.2 Python主要數據探索函數
數據探索的庫主要是Pandas和Matplotlib。
常用統計特徵函數:
- sum() 計算數據樣本的總和
- mean() 計算數據樣本的算術平均數
- var() 計算數據樣本的方差
- std() 計算數據樣本的標準差
- corr() 計算數據樣本的Spearman(Pearson)相關係數矩陣
- cov() 計算數據樣本的協方差矩陣
- skew() 計算數據樣本值的偏度(三階矩)
- kurt() 計算數據樣本值的偏度(四階矩)
- describe() 給出樣本的基本描述
拓展統計特徵函數:
-
cumsum() 依次給出前1、2、3...、n個數的和
-
cumprod() 依次給出前1、2、3...、n個數的積
-
cummax() 依次給出前1、2、3...、n個數的最大值
-
cummin() 依次給出前1、2、3...、n個數的最小值
-
rolling_window.sum()
-
rolling_window.mean()
-
rolling_window.var()
-
rolling_window.std()
-
rolling_window.corr()
-
rolling_window.cov()
-
rolling_window.skew()
-
rolling_window.kurt()
rolling_window.sum()
import pandas as pd
# 假設我們有一個DataFrame,其中包含了按日期索引的時間序列數據
data = {
'date': pd.date_range(start='2021-01-01', periods=5, freq='D'),
'value': [1, 2, 3, 4, 5]
}
df = pd.DataFrame(data).set_index('date')
# 計算窗口大小爲2的滾動求和,依次對相鄰兩項求和
rolling_window = df['value'].rolling(window=2)
rolling_sum = rolling_window.sum()
rolling_sum
date
2021-01-01 NaN
2021-01-02 3.0
2021-01-03 5.0
2021-01-04 7.0
2021-01-05 9.0
Name: value, dtype: float64
統計作圖函數:
- plot() 折線圖
- pie() 餅圖
- hist() 直方圖
- boxplot() 箱型圖
- plot(logy=True) 繪製y軸的對數圖形
- plot(yerr=error) 繪製誤差條形圖
plot(yerr=error)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 生成一個隨機誤差數組
error = np.abs(np.random.randn(10)) # 確保誤差爲正值
# 生成一個正弦波形的Series
y = pd.Series(np.sin(np.arange(10)))
# 使用plot方法繪製正弦波形圖
plt.plot(y.index, y, '-o') # 使用 '-o' 格式,表示用線段和圓點繪製
# 使用errorbar添加誤差條
plt.errorbar(y.index, y, yerr=error, fmt='none', ecolor='red', capsize=5)
# 顯示圖表
plt.show()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 生成一個隨機誤差矩陣,其形狀與DataFrame的列數相同
error = np.abs(np.random.randn(10, 2)) # 假設DataFrame有兩列
# 生成一個包含正弦和餘弦值的DataFrame
x = np.arange(10)
data = pd.DataFrame({
'sin': np.sin(x),
'cos': np.cos(x)
})
# 設置繪圖參數
plt.figure(figsize=(10, 6))
# 爲DataFrame的每一列繪製帶有誤差條的線
for column in data.columns:
plt.errorbar(x, data[column], yerr=error[:, data.columns.get_loc(column)],
fmt='-o', label=column, capsize=5)
# 添加圖例
plt.legend()
# 顯示圖表
plt.show()
案例:股票收益率的波動性分析
假設你是一位金融分析師,正在研究某科技公司股票的歷史表現,並希望評估其收益率的波動性。你收集了該公司過去一年內每個交易日的收盤價,並計算了每日的收益率。爲了更直觀地展示這些數據,你決定使用誤差條形圖。
步驟:
- 數據收集:收集過去一年內,每個交易日的收盤價。
- 計算收益率:計算每個交易日的收益率。收益率可以通過以下公式計算:
\(收益率=\frac{今日收盤價−昨日收盤價}{昨日收盤價}\) - 計算統計量:計算收益率的均值、標準差等統計量。
- 繪製誤差條形圖:使用誤差條形圖展示每日收益率的分佈情況,誤差條表示標準差。
import pandas as pd
import matplotlib.pyplot as plt
# 假設dataframe 'df' 包含過去一年每個交易日的收盤價
df = pd.read_excel(f'D:/Notebook/excel/300059_close.xls')
df = df[0:100]
# 計算每日收益率
df['return'] = df['close'].pct_change()
# 計算每日收益率的均值和標準差
mean_return = df['return'].mean()
std_return = df['return'].std()
# 繪製誤差條形圖
plt.figure(figsize=(20, 6))
plt.errorbar(df.index, df['return'], yerr=std_return, fmt='none', ecolor='gray', capsize=5)
plt.axhline(y=mean_return, color='r', linestyle='--', label='收益率的均值')
plt.title('帶有標準差誤差條的每日股票收益率圖')
plt.xlabel('交易日')
plt.ylabel('收益率')
plt.legend()
plt.show()
df
date | close | return | |
---|---|---|---|
0 | 2010-03-19 | 0.720866 | NaN |
1 | 2010-03-22 | 0.793014 | 0.100086 |
2 | 2010-03-23 | 0.804256 | 0.014177 |
3 | 2010-03-24 | 0.848608 | 0.055146 |
4 | 2010-03-25 | 0.862074 | 0.015868 |
... | ... | ... | ... |
95 | 2010-08-10 | 0.669737 | -0.051966 |
96 | 2010-08-11 | 0.675566 | 0.008704 |
97 | 2010-08-12 | 0.664776 | -0.015972 |
98 | 2010-08-13 | 0.680031 | 0.022948 |
99 | 2010-08-16 | 0.692434 | 0.018238 |
100 rows × 3 columns
- 均值:
表示收益率的平均水平,可以作爲評估股票長期表現的一個指標。
- 誤差條:
表示收益率的波動性。較長的誤差條表明在某些交易日,股票的收益波動較大,這可能意味着較高的風險。