通常我們獲取到的股票交易數(shù)據(jù)會以 CSV 格式文件存儲在本地,不僅僅是因為 CSV 格式文件在量化領(lǐng)域中比較常用,最主要的是作為一種文本文件,它可以非常容易地被導(dǎo)入到各種表格類型的軟件以及數(shù)據(jù)庫中。如果要用 Pandas 庫中的各種方法對這些數(shù)據(jù)進(jìn)行處理和分析的話,勢必要將 CSV 文件格式中的數(shù)據(jù)轉(zhuǎn)換為 Pandas 支持的格式數(shù)據(jù)。 Series 是一維的數(shù)據(jù)對象,DataFrame 是二維的數(shù)據(jù)對象,股票的數(shù)據(jù)內(nèi)容包括了日期、收盤價、開盤價等信息內(nèi)容,很顯然我們要將股票數(shù)據(jù)轉(zhuǎn)換為二維的 DataFrame 數(shù)據(jù)對象。對應(yīng)的 DataFrame 格式的股票交易數(shù)據(jù),我們也需要以 CSV 文件格式另存在本地。
Pandas庫提供了用于將表格型數(shù)據(jù)讀取為DataFrame對象的方法,其中read_csv可支持從文件、URL、文件型對象中加載帶分隔符(默認(rèn)為逗號)的數(shù)據(jù),同時也可以通過to_csv方法將DataFrame數(shù)據(jù)以逗號分隔方式存儲于CSV格式文件中。本小節(jié)重點(diǎn)介紹下Pandas庫中導(dǎo)入CSV格式文件和存儲CSV格式文件的方法。
加載CSV文件
首先從同花順網(wǎng)站導(dǎo)出csv文件,
接下來我們再來深究下read_csv方法不同選項參數(shù)對應(yīng)的效果。方法的參數(shù)有很多,這里主要介紹幾個常用參數(shù)的用法,其余參數(shù)的用法可以參考官方文檔 https://docs.python.org/3/library/csv.html#module-csv
header
參數(shù)指定數(shù)據(jù)開始的行數(shù)作為列名。如果文件中沒有指定列索引,則默認(rèn)header=0,表示文件第0行為列索引。如果header=1,表示文件第1行作為列索引。如果header=None則表明文件數(shù)據(jù)沒有列索引。除非你給定列索引的名字,否則read_csv會自動加上列索引。
import pandas as pd
# 參數(shù)header=1
df_csv_load = pd.read_csv('C:\\app\\pycharm\\projects\\myenv\\CSV_load\\table.csv', header=1, parse_dates=True, index_col=0, encoding='gb2312')
print(df_csv_load)
index_col 參數(shù)指定數(shù)據(jù)中哪一列作為Dataframe的行索引,比如前面例子中 index_col=0指定了第0列作為Dataframe的行索引。如果index_col=None,表明文件數(shù)據(jù)沒有行索引時,read_csv會自動加上行索引(從0開始的整數(shù))。index_col也可以指定多列作為Dataframe的行索引,形成層次索引,比如指定第0列和第1列作為Dataframe的行索引index_col=[0,1] 。
parse_dates參數(shù)可以為boolean形式值或者列表形式的值。這里我們采用boolean形式值,parse_dates=True,指把行索引字符串解析成時間格式。我們打印index可以看到,當(dāng)parse_dates=False時行索引時間這一列數(shù)據(jù)類型dtype為object,代表了字符串類型,parse_dates=True時打印index可以看到,行索引時間這一列數(shù)據(jù)類型dtype為datatime時間格式,這樣后續(xù)數(shù)據(jù)處理以及繪制圖形時會比較便捷。
#參數(shù)parse_dates=False
df_csvload = pd.read_csv('C:\\app\\pycharm\\projects\\myenv\\CSV_load\\table.csv',parse_dates=False,index_col=0,encoding='gb2312')
#參數(shù)parse_dates=True打印索引信息
DatetimeIndex(['2018-01-03', '2018-01-04', '2018-01-05', '2018-01-08',
'2018-01-09', '2018-01-10', '2018-01-11', '2018-01-12',
'2018-01-15', '2018-01-16', '2018-01-17', '2018-01-18',
'2018-01-19', '2018-01-22', '2018-01-23', '2018-01-24',
'2018-01-25', '2018-01-26', '2018-01-29', '2018-01-30',
'2018-01-31'],
dtype='datetime64[ns]', name='2018/1/2', freq=None)
#參數(shù)parse_dates=False打印索引信息
Index(['2018/1/2', '2018/1/3', '2018/1/4', '2018/1/5', '2018/1/8', '2018/1/9',
'2018/1/10', '2018/1/11', '2018/1/12', '2018/1/15', '2018/1/16',
'2018/1/17', '2018/1/18', '2018/1/19', '2018/1/22', '2018/1/23',
'2018/1/24', '2018/1/25', '2018/1/26', '2018/1/29', '2018/1/30',
'2018/1/31'],
dtype='object', name='Date')
encoding用于指定unicode文本編碼的格式。我們知道字符串在Python內(nèi)部的表示是unicode編碼,因此在進(jìn)行編碼轉(zhuǎn)換時,通常需要以unicode作為中間編碼,先將其他編碼的字符串解碼decode成unicode,再從unicode編碼encode成另一種編碼)。此處編碼格式為'gb2312',如果格式不對應(yīng)的話控制臺會將中文解析為亂碼。
- 存儲CSV文件
用read_csv方法讀取CSV文件的數(shù)據(jù)并轉(zhuǎn)換為DataFrame格式的數(shù)據(jù)后,接下來我們對這些DataFrame數(shù)據(jù)進(jìn)行擴(kuò)充,用to_csv方法另存為CSV文件。這里就擴(kuò)充2個交易日的股票數(shù)據(jù),并合并至從table.csv文件中加載獲取的DataFrame數(shù)據(jù)中。df_csv_load是我們創(chuàng)建的DataFrame對象,支持to_csv這個方法。括號中第一個參數(shù)為存儲路徑,columns和index分別指定寫入列索引和行索引內(nèi)容。
import datetime
import pandas as pd
# 獲取數(shù)據(jù)
df_csv_load = pd.read_csv('C:\\app\\pycharm\\projects\\myenv\\CSV_load\\table.csv', header=1, parse_dates=True, index_col=0, encoding='gb2312')
# 擴(kuò)充2個交易日的股票數(shù)據(jù)
df_add_dat = pd.DataFrame([{u'Open':1.1, u'High':1.2, u'Low':1.3, u'Close':1.4}, {u'Open':2.1, u'High':2.2, u'Low':2.3, u'Close':2.4}],index=[datetime.datetime.strptime("2016-06-25 00:00:00", "%Y-%m-%d %H:%M:%S"),datetime.datetime.strptime("2016-06-26 00:00:00", "%Y-%m-%d %H:%M:%S")])
df_csv_load = df_csv_load.append(df_add_dat)
#存儲csv文件數(shù)據(jù)
df_csv_load.to_csv('C:\\app\\pycharm\\projects\\myenv\\CSV_load\\table-add.csv', columns=df_csv_load.columns, index=True)
print(df_csv_load)