Python數據分析與挖掘實戰(1-3章)

非原創,僅個人關於《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

\[極差=max-min \]

statistics.loc['range'] = statistics.loc['max']-statistics.loc['min']
  • 標準差

\[s=\sqrt \frac{\sum(x_i-\overline x)^2}{n} \]

  • 變異係數

\[CV=\frac{s}{\overline x}\times 100\% \]

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()

案例:股票收益率的波動性分析

假設你是一位金融分析師,正在研究某科技公司股票的歷史表現,並希望評估其收益率的波動性。你收集了該公司過去一年內每個交易日的收盤價,並計算了每日的收益率。爲了更直觀地展示這些數據,你決定使用誤差條形圖。

步驟:

  1. 數據收集:收集過去一年內,每個交易日的收盤價。
  2. 計算收益率:計算每個交易日的收益率。收益率可以通過以下公式計算:
    \(收益率=\frac{今日收盤價−昨日收盤價}{昨日收盤價}\)
  3. 計算統計量:計算收益率的均值、標準差等統計量。
  4. 繪製誤差條形圖:使用誤差條形圖展示每日收益率的分佈情況,誤差條表示標準差。
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

  • 均值:

表示收益率的平均水平,可以作爲評估股票長期表現的一個指標。

  • 誤差條:

表示收益率的波動性。較長的誤差條表明在某些交易日,股票的收益波動較大,這可能意味着較高的風險。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章