5. 本地數據源——DataSource對象

本地數據源是qteasy數據管理功能的核心,所有的數據都必須首先下載並保存在本地數據源中,才能爲qteasy所用。qteasy使用DataSource對象管理本地數據源,本地數據源類似於一個數據庫,包含一系列預先定義的數據表,DataSource類提供了一系列API用於數據表中數據的管理,包括讀取、更新、刪除和查詢其中的數據。

要創建一個新的DataSource對象,可以使用下面的命令:

>>> import qteasy as qt
>>> ds = qt.DataSource()

通過列印DataSource對象,可以查看其最基本的屬性:

>>> print(ds)
file://csv@qt_root/data/

DataSource的列印字符串file://csv@qt_root/data/中,可以看出它的基本屬性

列印結果包含數據源對象的基本資訊:

  • file: – 數據源的類型。qteasy支持兩種類型的數據源:文件型和數據庫型,file代表數據源中的所有數據表都是以文件的形式保存在磁盤上的,同樣,數據也可以保存在mysql數據庫中,此時數據源的類型代碼爲db

  • csv: – 數據文件保存格式。qteasy可以將數據文件以不同的格式保存在磁盤上,最基本的格式爲csv文件,但是用戶同樣可以將數據保存爲hdf文件和fth文件(feather文件),以滿足不同的性能偏好。

  • qt_root/data/: – 數據文件的保存路徑。其中qt_root表示qteasy的安裝根路徑,默認情況下所有數據文件都保存在根目錄下的/data/子路徑下

同樣,可以創建一個數據保存類型爲數據庫的數據源對象,並查看其基本屬性: 不過,創建類型爲數據庫的數據源時,需要指定需要連接的Mysql數據庫的主機名、用戶名、密碼、(或者)數據庫名稱等資訊:

>>> ds_db = qt.DataSource(source_type='database', host='localhost', user='您的用户名', password='您的密码', db_name='test_db')
>>> print(ds_db)
db:mysql://localhost@3306/test_db

同樣,列印結果中包含數據源的基本資訊:

  • db:mysql – 數據源的類型爲mysql數據庫,所有的數據表都保存在數據庫中

  • localhost – 數據庫的主機名

  • 3306 – 數據庫連接端口

  • test_db – 數據庫名稱,如果不指定名稱,默認數據庫qt_db,不過這個數據庫必須事先創建好

不同的數據源對象,如果它們的存儲方式不同,存儲路徑不同,那麼它們所保存的數據沒有關係,互不干擾,但如果兩個數據源指向同一個路徑,且文件類型相同時,那麼它們所保存的數據就會重複。

要查看數據源的更多基本屬性,可以調用數據源對象的幾個屬性查看:

>>> print(ds.source_type)  # 数据源的类型
file
>>> print(ds_db.source_type)
db
>>> print(ds.file_type, ds.file_path)  # 数据源的文件类型和存储路径
csv /Users/jackie/Projects/qteasy/qteasy/data/
>>> print(ds.connection_type, ds_db.connection_type)  # 数据源的连接类型
file://csv@qt_root/data/ db:mysql://localhost@3306/test_db

5.1. 默認數據源

qteasy有一個內置默認的數據源,不需要用戶手動創建,默認情況下,所有的數據都會保存到這個默認數據源,並從這個數據源讀取。用戶可以通過qteasy的配置文件配置該數據源的參數,確保該數據源指向正確的路徑或使用正確的用戶名登陸正確的數據庫。通過下面的方法查看內置默認數據源的屬性:

>>> print(qt.QT_DATA_SOURCE)
db:mysql://www.qteasy.online@3306/ts_db

5.2. 查看數據表

瞭解數據源對象的基本屬性後,下一步可以進一步瞭解數據源中保存的數據。

數據源中的數據表都是事先定義好的,每一張數據表都保存一類不同的數據,這些數據涵蓋滬深股市、期貨市場的股票、指數、基金、期貨、期權等各種不同投資產品的基本資訊、K線行情、上市公司業績報表、宏觀經濟數據等等大量的數據,完整的數據表清單介紹,請參見下一章節,這裏主要介紹如何查看各種數據表的基本情況和數據。

數據源中的數據表清單可以通過數據源的all_tables屬性獲取,它會返回一個列表對象,包含數據源中已經預定義的所有數據表。不過,這裏必須釐清一個概念,數據源中雖然已經定義好了很多數據表,但這些數據表僅僅是有了基本的定義,即表頭資訊,數據表的字段名稱、每個字段的含義以及數據類型都定義好了,但是剛剛建立的新數據源,其數據表往往都是空的,還沒有任何數據。如果要查看數據源中有哪些數據表已經有了數據,需要用get_table_info()函數來獲取:

>>> print('All tables in datasource:', len(ds.all_tables))
All tables in datasource: 108
>>> print('Some tables:', ds.all_tables[5:15])
Some tables: ['hk_trade_calendar', 'us_trade_calendar', 'stock_basic', 'hk_stock_basic', 'us_stock_basic', 'stock_names', 'stock_company', 'stk_managers', 'new_share', 'money_flow']

可見,目前版本的qteasy預定義了108張數據表,其中部分數據表的名稱包括stock_basic等。

如果要查看當前數據源中某張數據表的詳情,例如該數據表的定義,是否包含數據等資訊,使用get_table_info()方法獲取:

>>> info = ds.get_table_info('stock_basic')
<stock_basic>--<股票基本信息>
852KB/5K records on disc
primary keys: 
----------------------------------------
1:   ts_code:  <5396> entries
     starts: 000001.SZ, end: 920128.BJ

columns of table:
------------------------------------
        columns        dtypes remarks
0       ts_code    varchar(9)    证券代码
1        symbol    varchar(6)    股票代码
2          name   varchar(20)    股票名称
3          area   varchar(10)      地域
4      industry   varchar(10)    所属行业
5      fullname   varchar(50)    股票全称
6        enname  varchar(120)    英文全称
7       cnspell   varchar(40)    拼音缩写
8        market    varchar(6)    市场类型
9      exchange    varchar(6)   交易所代码
10    curr_type    varchar(6)    交易货币
11  list_status    varchar(4)    上市状态
12    list_date          date    上市日期
13  delist_date          date    退市日期
14        is_hs    varchar(2)  是否沪深港通

列印的資訊包括數據表的名稱、說明、數據表的字段定義以及數據類型。

值得說明的是,如果數據表中已經填充了數據,那麼就會顯示出數據表目前的大小,在上面的例子中,一些關鍵資訊的解釋如下:

  • 852KB/5K records on disc – 表示數據表佔用磁盤空間大約852K字節,且數據量大約爲5000行

  • primary keys – 顯示數據的主鍵列,這裏表示ts_code列爲數據表的主鍵,且該列大約有5396條不同的記錄。如果數據表有多個主鍵,那麼每個主鍵列都分別列出,同時會列出該字段數據的範圍,例如上例中ts_code列數據範圍就是從000001.SZ開始一直到920128.BJ爲止,讓我們知道股票基本資訊表裏包含了代碼從000001一直到920128爲止的共五千多隻股票的資訊

  • columns of table – 這裏顯示數據表的字段定義,也就是數據表的schema。列出每一列的名稱columns、數據類型dtypes以及說明資訊remarks

另外,get_table_info()方法返回一個dict,同樣包含該數據表的資訊,可以將這些資訊列印出來,與上述格式化資訊對照了解:

>>> print(info)
{'table': 'stock_basic', 'table_exists': True, 'table_size': '852KB', 'table_rows': '5K', 'primary_key1': 'ts_code', 'pk_records1': 5396, 'pk_min1': '000001.SZ', 'pk_max1': '920128.BJ', 'primary_key2': None, 'pk_records2': None, 'pk_min2': None, 'pk_max2': None}

5.3. 查看數據源的整體資訊

通過上面的方法,我們可以查看每一張數據表的具體定義和已經填充的數據資訊。同樣,通過overview()方法,我們可以檢查所有的數據表,並彙總出整個數據源的整體資訊:

>>> overview = ds.overview()
Analyzing local data source tables... depending on size of tables, it may take a few minutes
[########################################]104/104-100.0%  A...zing completed!
Finished analyzing datasource: 
file://csv@qt_root/data/
3 table(s) out of 104 contain local data as summary below, to view complete list, print returned DataFrame
===============================tables with local data===============================
               Has_data Size_on_disk Record_count Record_start Record_end
table                                                                    
trade_calendar   True       1.8MB         70K          CFFEX        SZSE 
stock_basic      True       852KB          5K           None        None 
stock_daily      True      98.8MB        1.3M       20211112    20241231

查看整個數據源的總體資訊,可能需要花費數分鐘的時間,因爲需要統計每張數據表的所有資訊。

在統計過程中,qteasy會顯示一根進度條顯示統計的進度,最終統計分析完成後,qteasy會將數據源中所有數據表的資訊以DataFrame的形式返回,並列印出關鍵的資訊。

上面的資訊顯示了數據源中有3張數據表已經有了數據,包括trade_calendarstock_basicstock_daily,並顯示了這些數據表的數據量、佔用磁盤空間、數據的起始日期��結束日期等資訊。如果想查看所有數據表的資訊,可以將返回的DataFrame列印出來:

>>> print(overview)
                   has_data   size records       pk1 records1       min1  \
table                                                                      
trade_calendar         True  1.8MB     70K  cal_date    12865   19901012   
hk_trade_calendar     False      0       0  cal_date  unknown        N/A   
us_trade_calendar     False      0       0  cal_date  unknown        N/A   
stock_basic            True  852KB      5K   ts_code     5396  000001.SZ   
hk_stock_basic        False      0       0   ts_code  unknown        N/A   
...                     ...    ...     ...       ...      ...        ...   
cn_cpi                False      0       0     month  unknown        N/A   
cn_ppi                False      0       0     month  unknown        N/A   
cn_money              False      0       0     month  unknown        N/A   
cn_sf                 False      0       0     month  unknown        N/A   
cn_pmi                False      0       0     month  unknown        N/A   

                        max1       pk2 records2   min2  max2  
table                                                         
trade_calendar      20251231  exchange        7  CFFEX  SZSE  
hk_trade_calendar        N/A      None     None   None  None  
us_trade_calendar        N/A      None     None   None  None  
stock_basic        920128.BJ      None     None   None  None  
hk_stock_basic           N/A      None     None   None  None  
...                      ...       ...      ...    ...   ...  
cn_cpi                   N/A      None     None   None  None  
cn_ppi                   N/A      None     None   None  None  
cn_money                 N/A      None     None   None  None  
cn_sf                    N/A      None     None   None  None  
cn_pmi                   N/A      None     None   None  None  

[104 rows x 11 columns]

5.4. 最重要的數據表

如果您是第一次使用qteasy,很可能數據源中的數據表都是空的,沒有任何數據。通常這沒有任何問題,因爲qteasy的設計初衷就是極大地簡化金融數據的獲取和使用過程。

您可以非常容易地從網絡數據提供商處獲取最基本的數據。不過,雖然數據表中的數據可以是空的,但是有幾張數據表卻比其他的數據表更加重要,您應該優先將這幾張數據表的數據填充完整,因爲這幾張數據表中的數據是很多其他數據表的基礎,甚至是qteasy的運行基礎:

  • trade_calendar – 交易日曆表,包含了所有交易所的交易日曆資訊,包括交易日、交易所代碼、交易所名稱等資訊。可以說這是qteasy運行的基礎,如果缺了這張表,qteasy的很多功能都將無法運行或者將降低效率。 qteasy使用這張表中的數據來判斷交易日,如果要下載其他的數據表,通常也必須通過交易日數據表來確定下載的起止日期,因此,這是您應該絕對優先填充的數據表。

  • stock_basic – 股票基本資訊表,包含了所有上市股票的基本資訊,包括股票代碼、股票名稱、上市日期、退市日期、所屬行業、地域等資訊。這張表是很多其他數據表的基礎,例如股票日K線數據表、股票財務數據表等,因此,這也是您應該優先填充的數據表。

  • index_basic – 指數基本資訊表,包含了所有指數的基本資訊,包括指數代碼、指數名稱、發佈日期、退市日期等資訊。這張表是很多其他數據表的基礎,例如指數日K線數據表、指數成分股表等,因此,這也是您應該優先填充的數據表。

  • fund_basic – 基金基本資訊表,包含了所有基金的基本資訊,包括基金代碼、基金名稱、基金類型、基金規模等資訊。這張表是很多其他數據表的基礎,例如基金日K線數據表、基金淨值數據表等,因此,這也是您應該優先填充的數據表。

基本上,如果您能夠填充了上面這幾張數據表的數據,那麼您就可以開始比較順暢使用qteasy的大部分數據相關的功能了。

另外,qteasy還在數據源中定義了幾張系統數據表,這些表一共四張,用於存儲跟實盤交易相關的資訊:

  • sys_op_live_accounts – 實盤交易賬戶資訊表,包含了所有實盤交易賬戶的基本資訊,包括賬戶ID、賬戶名稱、賬戶類型、賬戶狀態等資訊。

  • sys_op_positions – 實盤持倉資訊表,包括所有實盤交易賬戶的持倉資訊,包括賬戶ID、證券代碼、證券名稱、持倉數量、持倉成本等資訊。

  • sys_op_trade_orders – 實盤交易委託表,包括所有實盤交易賬戶的交易委託資訊,包括賬戶ID、委託時間、委託類型、證券代碼、委託數量、委託價格等資訊。

  • sys_op_trade_results – 實盤交易成交表,包括所有實盤交易賬戶的交易成交資訊,包括賬戶ID、成交時間、證券代碼、成交數量、成交價格等資訊。

上面四張表是qteasy實盤交易功能的基礎,這幾張表中的數據不需要人爲填充,而是系統自動生成,您不需要查看、填充或刪除這些表

其他的數據表

除了上面提到的幾張重要的數據表之外,數據源中還定義了大量的數據表,這些數據表包含了各種各樣的金融數據,包括股票、指數、基金、期貨、期權等各種金融產品的基本資訊、日K線數據、財務數據、分紅數據、業績報表、宏觀經濟數據等等,主要分類如下:

  • 行情數據表 – 這類數據表包含了股票、基金、指數各個不同頻率的K線行情數據

  • 基本資訊表 – 這類數據表包含了股票、基金、指數、期貨、期權等各種金融產品的基本資訊

  • 指標資訊表 – 這類數據表包含了各種指標的資訊,例如技術指標、基本面指標、宏觀經濟指標等

  • 財務數據表 – 這類數據表包含了上市公司的財務報表數據,包括資產負債表、利潤表、現金流量表等

  • 業績報表表 – 這類數據表包含了上市公司的業績報表數據,包括業績快報、業績預告、業績預測等

  • 分紅交易數據表 – 這類數據表包含了上市公司的分紅數據,以及股票大宗交易、股東交易等資訊表

  • 參考數據表 – 這類數據表包含了各種參考數據,例如宏觀經濟數據、行業數據、交易所數據等

這些數據表的具體定義和數據類型,可以通過get_table_info()方法查看,或者通過本文檔的下一章節查詢。

5.5. 從數據表中獲取數據

如果數據表中已經填充了數據,那麼現在就可以從中讀取數據了。DataSource提供了read_table_data()方法,從數據源中直接讀取某個數據表中的數據,同時,用戶可以篩選數據的起止日期以及證券代碼,同時不用考慮數據表的具體結構、存儲方式、存儲位置等具體的實現方式。

爲了避免讀取的數據量過大,建議在讀取數據時一定要同時給出某些篩選條件。對於read_table_data()方法來說,用戶總是可以通過證券代碼和起止日期來篩選數據:

  • shares: 給出一個證券代碼或者逗號分隔的多個證券代碼,如果數據表的主鍵中含有證券代碼,那麼根據該證券代碼篩選輸出的數據

  • start: 給出一個日期,格式爲“YYYYMMDD”,如果數據表的主鍵包含時間或日期,那麼根據篩選startend之間的數據,start/end必須成對給出

  • end: 給出一個日期,格式爲“YYYYMMDD”,如果數據表的主鍵包含時間或日期,那麼根據篩選startend之間的數據,start/end必須成對給出

DataSource對象會根據輸入的篩選條件自動篩選數據,例如:

stock_daily表中讀取一隻股票(000651.SZ)從2024年1月1日到2024年1月15日之間的股票日K線數據:

>>> ds.read_table_data(table='stock_daily', shares='000651.SZ', start='20240101', end='20240115')
                       open   high    low  ...  pct_chg        vol       amount
ts_code   trade_date                       ...                                 
000651.SZ 2024-01-03  32.00  32.08  31.70  ...  -0.7181  254468.92   810315.013
          2024-01-04  31.90  32.01  31.45  ...   0.4717  333398.05  1057458.411
          2024-01-08  33.12  33.21  32.85  ...  -0.2426  415911.34  1372722.050
          2024-01-02  32.17  32.20  31.96  ...  -0.4352  253797.30   814257.175
          2024-01-15  33.45  33.95  33.42  ...   0.6544  295681.34   996815.725
          2024-01-11  33.66  33.82  33.42  ...  -0.2376  284088.74   955075.100
          2024-01-09  32.81  33.55  32.65  ...   1.7933  438207.66  1454959.637
          2024-01-10  33.35  33.84  33.28  ...   0.5375  366485.52  1233441.572
          2024-01-12  33.50  33.83  33.42  ...   0.0893  224012.73   753931.821
          2024-01-05  32.05  33.29  31.62  ...   3.2238  832156.75  2738167.636

[10 rows x 9 columns]

DataSource對象會自動根據數據表的定義來進行正確的篩選,並忽略掉不必要的參數。例如,我們可以篩選出某兩支股票的基本資訊。對於股票基本資訊來說,交易日期是個不必要的參數,此時qteasy會自動忽略掉start/end參數並給出提示資訊。同樣,shares參數也不一定只能匹配股票代碼,對於基金、指數、甚至期貨、期權,都可以同樣匹配:

>>> ds.read_table_data(table='stock_basic', shares='000651.SZ,000700.SZ', start='20240101', end='20240131')
/Users/jackie/Projects/qteasy/qteasy/database.py:1314: RuntimeWarning: list index out of range
can not find date-like primary key in the table stock_basic!
passed start(2024-01-01) and end(2024-01-31) arguments will be ignored!
  warnings.warn(msg, RuntimeWarning)
           symbol  name area industry  ... list_status list_date delist_date is_hs
ts_code                                ...                                        
000651.SZ     651  格力电器   广东     家用电器  ...           L  19961118         NaN     S
000700.SZ     700  模塑科技   江苏     汽车配件  ...           L  19970228         NaN     S

[2 rows x 14 columns]

關於read_table_data()方法的更多資訊,請參閱DataSource對象的參考資訊。

5.6. 向數據表中添加數據

如果數據表中尚未填充數據,或者數據表中填充的數據不足以滿足我們的需求,那麼讀取數據就會不成功。爲了避免這種情況,我們需要向數據表中填充數據。

請注意:

這裏介紹的僅僅是向數據表中手動添加數據的基本方法。qteasy還提供了全自動數據下載、數據清洗、數據填充等功能,可以幫助用戶自動從網絡數據源中下載數據,並將數據整理、清洗、更新到數據表中。這些功能將在後續章節中介紹。

向數據表中填充數據可以使用數據源的update_table_data()方法。使用這個API,用戶可以將保存在一個DataFrame中的數據寫入到相應的數據表中。這個API只需要給出三個參數:

  • table: 一個數據表的名稱,需要寫入數據的數據表

  • df: 一個DataFrame,保存了需要寫入數據表中的數據

  • merge_type: 如果是update則更新數據表中已經存在的數據,如果是ignore則忽略重複的數據.

使用update_table_data()方法,用戶不需要保證寫入的數據格式與數據表完全一致,只要數據格式與數據表大致一致,qteasy就會自動整理數據格式、刪除重複數據,確保寫入數據表中的數據符合要求。

下面將一些示例數據寫入數據源(寫入的數據僅爲演示效果)

>>> import pandas as pd
>>> df = pd.DataFrame({
...         'ts_code':    ['000001.SZ', '000002.SZ', '000003.SZ', '000004.SZ', '000005.SZ',
...                        '000001.SZ', '000002.SZ', '000003.SZ', '000004.SZ', '000005.SZ'],
...         'trade_date': ['20211112', '20211112', '20211112', '20211112', '20211112',
...                        '20211113', '20211113', '20211113', '20211113', '20211113'],
...         'open':       [1., 2., 3., 4., 5., 6., 7., 8., 9., 10.],
...         'high':       [2., 3., 4., 5., 6., 7., 8., 9., 10., 1.],
...         'low':        [3., 4., 5., 6., 7., 8., 9., 10., 1., 2.],
...         'close':      [4., 5., 6., 7., 8., 9., 10., 1., 2., 3.]
...     })
>>> print(df)
     ts_code trade_date  open  high   low  close
0  000001.SZ   20211112   1.0   2.0   3.0    4.0
1  000002.SZ   20211112   2.0   3.0   4.0    5.0
2  000003.SZ   20211112   3.0   4.0   5.0    6.0
3  000004.SZ   20211112   4.0   5.0   6.0    7.0
4  000005.SZ   20211112   5.0   6.0   7.0    8.0
5  000001.SZ   20211113   6.0   7.0   8.0    9.0
6  000002.SZ   20211113   7.0   8.0   9.0   10.0
7  000003.SZ   20211113   8.0   9.0  10.0    1.0
8  000004.SZ   20211113   9.0  10.0   1.0    2.0
9  000005.SZ   20211113  10.0   1.0   2.0    3.0

上面的DataFrame中保存了一些示例數據,我們下面將把這個DataFrame的數據寫入數據源中的index_daily數據表。 目前我們可以看到,index_daily數據表是空的,而且這個數據表的schema與上面的DataFrame並不完全相同:

  • index_daily數據表的數據定義中包含11列,而上面的數據只有6列,不過DataFrame中的所有列都包含在index_daily數據表的schema

  • index_daily數據表目前是空的,沒有填充任何數據

>>> info = ds.get_table_info('index_daily')
<index_daily>--<指数日线行情>
0 MB/0 records on disc
primary keys: 
----------------------------------------
1:   ts_code:  <unknown> entries
     starts: N/A, end: N/A
2:   trade_date:  <unknown> entries
     starts: N/A, end: N/A

columns of table:
------------------------------------
       columns       dtypes  remarks
0      ts_code  varchar(20)     证券代码
1   trade_date         date     交易日期
2         open        float      开盘价
3         high        float      最高价
4          low        float      最低价
5        close        float      收盘价
6    pre_close        float      昨收价
7       change        float      涨跌额
8      pct_chg        float      涨跌幅
9          vol       double   成交量(手)
10      amount       double  成交额(千元)

接下來我們可以將數據寫入數據表,如果方法執行正確,它將返回寫入數據表中的數據的行數,如下所示:

>>> ds.update_table_data(table='index_daily', df=df)
10

將數據寫入數據表之後,我們可以嘗試一下從數據表中讀取數據,現在我們已經可以讀出剛纔寫入的數據了。

請注意,讀出來的數據有許多列都是NaN值,這表明這些列沒有寫入數據,原因就是我們寫入的df並不包含這些數據,因此讀出的數據爲NaN值。

>>> df = ds.read_table_data('index_daily', shares='000001.SZ, 000002.SZ')
>>> print(df)
                      open  high  low  close  pre_close  change  pct_chg  vol  \
ts_code   trade_date                                                            
000001.SZ 2021-11-12   1.0   2.0  3.0    4.0        NaN     NaN      NaN  NaN   
000002.SZ 2021-11-12   2.0   3.0  4.0    5.0        NaN     NaN      NaN  NaN   
000001.SZ 2021-11-13   6.0   7.0  8.0    9.0        NaN     NaN      NaN  NaN   
000002.SZ 2021-11-13   7.0   8.0  9.0   10.0        NaN     NaN      NaN  NaN   

                      amount  
ts_code   trade_date          
000001.SZ 2021-11-12     NaN  
000002.SZ 2021-11-12     NaN  
000001.SZ 2021-11-13     NaN  
000002.SZ 2021-11-13     NaN  

5.7. 刪除數據表 —— 請儘量小心,刪除後無法恢復!!

我們除了可以向數據表中寫入數據,從數據表中讀取數據之外,當然也可以刪除數據,不過請注意,在qteasy中操作DataSource刪除數據時,您務必非常小心:因爲qteasy不支持從數據表中刪除部分數據,您只能刪除整張數據表。

這是因爲qteasy的數據源被設計爲高效地存儲和讀取數據,但它並不是一個通常的數據庫,我們並不需要經常操作其中的數據,這個數據倉庫的作用是爲了存儲巨量的數據,因此,它的重點在於保存和提取數據,而不是刪除操作。

qteasyDataSource對象提供了一個刪除數據表的方法: drop_table_data(),這個方法將刪除整個數據表,而且刪除後無法恢復

爲了避免在代碼中誤刪除數據表,默認情況下drop_table_data()會導致錯誤,例如我們想刪除之前寫入臨時數據的index_daily表:

>>> ds.drop_table_data('index_daily')
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
Cell In[19], line 1
----> 1 ds.drop_table_data('index_daily')

File ~/Projects/qteasy/qteasy/database.py:1587, in DataSource.drop_table_data(self, table)
   1584 if not self.allow_drop_table:
   1585     err = RuntimeError('Can\'t drop table from current datasource according to setting, please check: '
   1586                        'datasource.allow_drop_table')
-> 1587     raise err
   1589 if self.source_type == 'db':
   1590     self._drop_db_table(db_table=table)

RuntimeError: Can't drop table from current datasource according to setting, please check: datasource.allow_drop_table

這時候我們需要修改數據源的allow_drop_table屬性,將其修改爲True,這樣就可以刪除數據表了,請記住刪除後將allow_drop_table改爲False

下面代碼刪除了index_daily表,然後就會發現,無法從該表讀取數據了:

>>> ds.allow_drop_table = True
>>> ds.drop_table_data('index_daily')
>>> ds.allow_drop_table = False
>>> df = ds.read_table_data(table='index_daily')
>>> print(df)
    
Empty DataFrame
Columns: []
Index: []

5.8. 總結

至此,我們已經瞭解了DataSource對象,qteasy中金融歷史數據管理的最重要的核心類的基本工作方式,瞭解了下面內容:

  • 什麼是DataSource,如何創建一個數據源

  • 如何從數據源中提取數據

  • 如何操作數據源

在後面的章節中,您將會了解更多的內容:

  • 數據源中有哪些有用的金融數據?

  • 如何批量下載數據並填充到數據源中?

  • 如何從數據源中更有效地提取資訊?