在Python中,字典可能是應用最廣泛的類型之一。由於字典特殊的訪問方式,使得我們在讀取一些數據的時候,可以很方便的來使用字典對數據進行修改、插入、刪除和排序等各種操作。
而JSON是一種文本數據,可以很方便的轉爲可操作的字典格式。大家知道我們在讀取文件的時候,讀出來的默認都是字符串的形式,而Python的json包可以非常方便的幫助我們。
本文我仍然採用一個實際的例子來說明字典和Json文件格式。我們使用上一篇文章中使用的數據文本,假定我們有一個文本文件,其內容如下。我們需要將其讀取出來,然後處理爲字典的格式,並且最後將字典存爲一個json文件。
date,open,high,low,close
19991110,29.5,29.8,27.0,27.75
19991111,27.58,28.38,27.53,27.71
19991112,27.86,28.3,27.77,28.05
19991115,28.2,28.25,27.7,27.75
19991116,27.88,27.97,26.48,26.55
19991117,26.5,27.18,26.37,27.18
19991118,27.2,27.58,26.78,27.02
19991119,27.5,27.53,26.8,26.88
19991122,26.88,26.95,26.3,26.45
19991123,26.45,26.55,26.1,26.45
大家可以看到,爲了方便大家閱讀,我們對文件的內容進行了一些刪減,這樣更有利於我們進行操作。
之所以大家看到我使用的是股票的OHLCV數據,原因是因爲大家其實可以看到我前面有一個專題是專門講人工智能、深度學習和量化炒股的。其實這一部分也很簡單,只是輿論對人工智能和深度學習都有一些誤解。我舉一個簡單的例子,比如我讓大家用C語言來寫一個計算器程序,大家肯定覺得太困難了,尤其是UI的部分;但如果我讓大家用Python或者Java來寫,大家就覺得沒那麼困難了!爲什麼呢?我們有了很多封裝好的API可以用了,對吧。
深度學習和人工智能也是如此,我們不僅有Python這門膠水語言來幫助我們完成數據處理的部分,Tensorflow中我們還有更高級和更好用的Keras來進行模型的設計和訓練。所以其實一切並沒有大家想象的那麼需要數學和Matlab知識。
言歸正傳,我們先看看讀取這個文件後,我們如何來將其變爲一個字典的格式。我們先採用上篇文章的方法將文本讀入到一個列表。
file_path = 'ohlcv.txt'
stockList = []
stockDict = {}
with open(file_path) as f:
----stockList = f.readlines()
----stockList = [line.replace('', '').split(',') for line in stockList]
----stockList = list(zip(*stockList))
----print(stockList)
其運行結果我們將後面的值省略,只保留每一行的最前面的幾個元素。
[('date', '19991110', ......'),
('open', '29.5',......),
('high', '29.8',.....),
('low', '27.0', ......),
('close', '27.75', ......)]
然後我們將這個列表變成一個有5個Key值的字典。
----stockDict = {x[0]:x[1:] for x in stockList}
----print(stockDict)
我們可以看到運行結果爲:
{'date': ('19991110', '19991111',......),
'open': ('29.5', '27.58', ......),
'high': ('29.8', '28.38', ......),
'low': ('27.0', '27.53',......),
'close': ('27.75', '27.71',......')}
這個運行結果我們可以看到Key值是一個字符串,而Value是一個元組。如果我們希望Value是列表,也很容易。只需要對上面的程序稍作修改,如下。
----stockDict = {x[0]:list(x[1:]) for x in stockList}
----print(stockDict)
然後我們可以看到打印結果變爲:
{'date': ['19991110', '19991111', ......],
'open': ['29.5', '27.58', ......],
'high': ['29.8', '28.38', ......],
'low': ['27.0', '27.53',......],
'close': ['27.75', '27.71',......]}
這樣基本符合我們的預期了,我們可以很方便的獲得開盤、收盤等數據。那麼如果我們希望獲得1999年11月10日的所有數據,我們該怎麼處理呢?很簡單,我們可以用如下代碼。
idx = stockDict['date'].index('19991110')
date = stockDict['date'][idx]
o = stockDict['open'][idx]
h = stockDict['high'][idx]
l = stockDict['low'][idx]
c = stockDict['close'][idx]
print([date, o, h, l, c])
上面第一行我們可以根據列表的值來獲得索引號,然後我們可以通過索引號來獲取這個日期的其餘的OHLC的值。
接下來我們看看如何來使用json包,將這個文件存爲json文件格式,方便我們來讀寫。
with open('ohlc.json', 'w') as jf:
----json.dump(stockDict, jf, indent=4)
這裏我們創建一個文件,並且用json的方法來將其寫入到文件裏,indent表示縮進,我們來看看生成的文件的內容。照例我們省略一些內容,方便大家查看。
{
----"date": [
----"19991110",
----"19991111",
----....
----],
----"open": [
----"29.5",
----"27.58",
----......
----],
----"high": [
----"29.8",
----"28.38",
----......
----],
----"low": [
----"27.0",
----"27.53",
----......
----],
----"close": [
----"27.75",
----"27.71",
----......
----]
}
接下來我們再來看看我們如何從Json文件中讀取內容,這相對來說就更簡單了。
with open('ohlc.json') as jrf:
----content = json.load(jrf)
----print(content)
我們可以發現打印結果正是我們之前的字典的形式,毫無差別。也就是說我們其實用這種方法來將字典存儲爲json文件之後,我們可以非常方便的進行讀取和處理以及寫入,而不需要對數據進行額外的處理。藉助字典的操作的便利性,我們可以很方便的來操作數據。
當然,我們前面說了,如果使用Pandas這個數據包,會更加的方便。下面我們把本片文章的全部代碼貼到下面。
import json
file_path = 'ohlcv.txt'
stockList = []
stockDict = []
with open(file_path) as f:
----stockList = f.readlines()
----stockList = [line.replace('', '').split(',') for line in stockList]
----stockList = list(zip(*stockList))
----stockDict = {x[0]: list(x[1:]) for x in stockList}
----print(stockDict)
----idx = stockDict['date'].index('19991110')
----date = stockDict['date'][idx]
----o = stockDict['open'][idx]
----h = stockDict['high'][idx]
----l = stockDict['low'][idx]
----c = stockDict['close'][idx]
----print([date, o, h, l, c])
----with open('ohlc.json', 'w') as jf:
--------json.dump(stockDict, jf, indent=4)
----with open('ohlc.json') as jrf:
--------content = json.load(jrf)
--------print(content)
大家在拷貝代碼之後可以用編輯器的替換將“----”替換爲縮進,好了,字典和Json的結合用法,我們就介紹到這裏,大家如果有疑問可以提出。其實關於字典,還有很多的用法,我們沒有介紹,下一篇文章我會專門來講一下字典的一些小技巧。
人工智能與深度學習做量化請關注:AI量化(https://t.zsxq.com/RvfY37y) 星球限時免費,如需加入,請私信我獲得免費邀請碼!
零基礎學習Python與深度學習應用請關注星球:Python與深度學習 https://t.zsxq.com/bUFayZ3
微信公衆號:QTechAI