通常我們獲取到的股票交易數(shù)據(jù)會(huì)以 CSV 格式文件存儲(chǔ)在本地,不僅僅是因?yàn)?CSV 格式文件在量化領(lǐng)域中比較常用,最主要的是作為一種文本文件,它可以非常容易地被導(dǎo)入到各種表格類型的軟件以及數(shù)據(jù)庫中。如果要用 Pandas 庫中的各種方法對(duì)這些數(shù)據(jù)進(jìn)行處理和分析的話,勢(shì)必要將 CSV 文件格式中的數(shù)據(jù)轉(zhuǎn)換為 Pandas 支持的格式數(shù)據(jù)。 Series 是一維的數(shù)據(jù)對(duì)象,DataFrame 是二維的數(shù)據(jù)對(duì)象,股票的數(shù)據(jù)內(nèi)容包括了日期、收盤價(jià)、開盤價(jià)等信息內(nèi)容,很顯然我們要將股票數(shù)據(jù)轉(zhuǎn)換為二維的 DataFrame 數(shù)據(jù)對(duì)象。對(duì)應(yīng)的 DataFrame 格式的股票交易數(shù)據(jù),我們也需要以 CSV 文件格式另存在本地。
Pandas庫提供了用于將表格型數(shù)據(jù)讀取為DataFrame對(duì)象的方法,其中read_csv可支持從文件、URL、文件型對(duì)象中加載帶分隔符(默認(rèn)為逗號(hào))的數(shù)據(jù),同時(shí)也可以通過to_csv方法將DataFrame數(shù)據(jù)以逗號(hào)分隔方式存儲(chǔ)于CSV格式文件中。本小節(jié)重點(diǎn)介紹下Pandas庫中導(dǎo)入CSV格式文件和存儲(chǔ)CSV格式文件的方法。
加載CSV文件
首先從同花順網(wǎng)站導(dǎo)出csv文件,
接下來我們?cè)賮砩罹肯聄ead_csv方法不同選項(xiàng)參數(shù)對(duì)應(yīng)的效果。方法的參數(shù)有很多,這里主要介紹幾個(gè)常用參數(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會(huì)自動(dòng)加上列索引。
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ù)沒有行索引時(shí),read_csv會(huì)自動(dòng)加上行索引(從0開始的整數(shù))。index_col也可以指定多列作為Dataframe的行索引,形成層次索引,比如指定第0列和第1列作為Dataframe的行索引index_col=[0,1] 。
parse_dates參數(shù)可以為boolean形式值或者列表形式的值。這里我們采用boolean形式值,parse_dates=True,指把行索引字符串解析成時(shí)間格式。我們打印index可以看到,當(dāng)parse_dates=False時(shí)行索引時(shí)間這一列數(shù)據(jù)類型dtype為object,代表了字符串類型,parse_dates=True時(shí)打印index可以看到,行索引時(shí)間這一列數(shù)據(jù)類型dtype為datatime時(shí)間格式,這樣后續(xù)數(shù)據(jù)處理以及繪制圖形時(shí)會(huì)比較便捷。
#參數(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)換時(shí),通常需要以u(píng)nicode作為中間編碼,先將其他編碼的字符串解碼decode成unicode,再從unicode編碼encode成另一種編碼)。此處編碼格式為'gb2312',如果格式不對(duì)應(yīng)的話控制臺(tái)會(huì)將中文解析為亂碼。
- 存儲(chǔ)CSV文件
用read_csv方法讀取CSV文件的數(shù)據(jù)并轉(zhuǎn)換為DataFrame格式的數(shù)據(jù)后,接下來我們對(duì)這些DataFrame數(shù)據(jù)進(jìn)行擴(kuò)充,用to_csv方法另存為CSV文件。這里就擴(kuò)充2個(gè)交易日的股票數(shù)據(jù),并合并至從table.csv文件中加載獲取的DataFrame數(shù)據(jù)中。df_csv_load是我們創(chuàng)建的DataFrame對(duì)象,支持to_csv這個(gè)方法。括號(hào)中第一個(gè)參數(shù)為存儲(chǔ)路徑,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個(gè)交易日的股票數(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)
#存儲(chǔ)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)