close

一、前言

檢視資料、處理遺失值常見方法(丟棄 向下向上填滿)、索引資料方法、插入一欄、刪除一欄、插入一列、index轉成時間格式、df改欄名,df排序、df物件轉數值、df畫圖、df改index名、df.join資料合併、pandas.concat用法、df快速畫圖、df高級快速畫圖、df快速統計運用

 

以上是剛開始分析時最容易遇到的問題,5分鐘看完此篇,少走1個月彎路!讓我們快速進入量化領域吧!

如果擁有基礎的人建議用ctrl+f直接找你要的關鍵處理方法!

 

二、常用語法大全

八成會遇到下面的問題,但也每次都要用的方法

程式碼詳解 持續更新唷!

import pandas, numpy
import pandas_datareader as web # 下載股價
import matplotlib.pyplot as plt # 繪圖
from matplotlib.gridspec import  GridSpec # 畫板分割

# 下載股價資料當範例------------------------------------------------------
df = web.DataReader(name='2330.TW', data_source='yahoo', start='2020-01-01', end='2020-12-31') # name為股票代號名稱 start、end為資料下載期間
df2 = web.DataReader(name='2454.TW', data_source='yahoo', start='2020-01-01', end='2020-12-31')['Close'] # 只取收盤價
df2 = df2.to_frame('2454Close') # 數據型態並改名


# 檢視資料---------------------------------------------------------------
df.tail(3) # 查看後3筆
df.head(3) # 前3筆

'''
             High    Low   Open  Close      Volume  Adj Close
Date                                                         
2020-12-29  517.0  513.0  515.0  515.0  19907528.0      515.0
2020-12-30  525.0  514.0  516.0  525.0  46292401.0      525.0
2020-12-31  530.0  524.0  526.0  530.0  29970398.0      530.0
'''


# 處理遺失值nan-----------------------------------------------------------
df = df.dropna() # 有nan整列丟棄
df = df.dropna(0) # 用0取代
df = df.ffill() # 向下填滿nan
df = df.bfill() # 向上填滿nan


# 索引資料---------------------------------------------------------------
df['Close'] # 看Close欄
df.iloc[:, 1] # 看第row全部 第1欄 iloc用數字
df.loc['2020-12-31', 'Close'] # 看row 2021231 col Close loc填文字

# 欄名操作--------------------------------------------------------------
df.columns
df.columns = ['High', 'Low', 'Open', 'Close', 'Volume', 'Adj Close']  # 更改欄名
df.rename(columns={'High': '高'}) # 更改欄名方法2

# 插入一欄---------------------------------------------------------------
df['zero'] = 0 # 插入一欄裡面全都是0
df['SMA20'] = df['Close'].rolling(20).mean() # 直接df['新列名稱'] = 要插入的資料


# 刪除欄---------------------------------------------------------------
df.drop(columns=['zero', 'SMA20'], inplace=True)


# 插入一列---------------------------------------------------------------
df.loc['2021-01-01'] = 1
df.loc['2021-01-02'] = [0, 0, 0, 0, 0, 0] # 值不一樣時用[]

'''
            High  Low  Open  Close  Volume  Adj Close
Date                                                 
2021-01-01   5.0  5.0   5.0    5.0     5.0        5.0
2021-01-02   0.0  0.0   0.0    0.0     0.0        0.0
'''

# index 基本操作--------------------------------------------------------------
df.reset_index() # 重製index
df.sort_index(ascending=True) # True遞增 False遞減


# index轉成時間格式 時間序列--------------------------------------------------
df.index = pandas.to_datetime(df.index)


# 改變index名稱------------------------------------------------------------
df.index.name = 'Time'

'''
            High  Low  Open  Close  Volume  Adj Close
Time                                                 
2021-01-01   5.0  5.0   5.0    5.0     5.0        5.0
2021-01-02   0.0  0.0   0.0    0.0     0.0        0.0
'''


# 資料值轉成其他格式------------------------------------------------------
df = df.astype('float') # float:浮點數 int:整數 str:字串


# 快速畫圖---------------------------------------------------------------
df['Close'].plot() # 直接畫什麼參數都不加
df[['Close', 'Volume']].plot(secondary_y=['Close'], grid=True, figsize=(15, 5), title='Stock', style=['-', '--'])

'''
grid=True # 格線
secondary_y=['Close'] # 雙y軸
figsize=(15, 5) # (長, 寬)
title='Stock' # 標題
style=['-', '--'] # 線的樣式依序給 其他還有['-', '--', '.', '.-', '*-', '^-']
color='b' # 線的顏色
'''


# 高級快速繪圖----------------------------------------------------------
fig = plt.figure(figsize=(15, 5)) # 長寬
gs = GridSpec(2,1) # 規劃成 2列 1欄
ax = fig.add_subplot(gs[0,:]) # fig ax的東西畫在第0列第全欄
ax2 = fig.add_subplot(gs[1,:]) # fig ax2的東西畫在第1列第全欄

df['Close'].plot(grid=True, ax=ax, color='r') # Close放在ax
df['Volume'].plot(grid=True, ax=ax2) # Close放在ax2


# 基本統計應用--------------------------------------------------------------
df.describe() # 敘述統計
df.corr() # 相關係數矩陣
df.cov() # 變異數矩陣
df.sum() # 加總


# 基本運算--------------------------------------------------------------
sma20 = df['Close'].rolling(20).mean() # rolling >> 20天算一平均(滾動) 其他還有max(), min(), std()
ret = (df - df.shift(1)) / df.shift(1) # shift >> 過去1天的值
cumret = ret.cumsum() # cumsum >> 累計加總


# 資料合併------------------------------------------------------------------
df_all_join = df.join(df2) # 依照index合併沒有的給nan
df_all_concat = pandas.concat([df, df2]) # 依照columns合併沒有的給nan


 

三、後記

還有遇到其他常見問題可以留言告訴我唷!為你解答!

 

arrow
arrow

    恩哥Python 發表在 痞客邦 留言(2) 人氣()