5. Lokale Datenquelle – DataSource-Objekt

Die lokale Datenquelle ist der Kern der Datenverwaltungsfunktionalität von „qteasy“. Alle Daten müssen zunächst heruntergeladen und in der lokalen Datenquelle gespeichert werden, bevor sie von „qteasy“ verwendet werden können. „qteasy“ verwendet „DataSource“-Objekte, um die lokale Datenquelle zu verwalten. Die lokale Datenquelle ähnelt einer Datenbank und enthält eine Reihe vordefinierter Datentabellen. Die Klasse „DataSource“ stellt eine Reihe von APIs zum Verwalten der Daten in den Datentabellen bereit, einschließlich Lesen, Aktualisieren, Löschen und Abfragen von Daten.

Um ein neues „DataSource“-Objekt zu erstellen, können Sie den folgenden Befehl verwenden:

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

Durch Drucken des Objekts „DataSource“ können Sie seine grundlegendsten Eigenschaften anzeigen:

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

Aus der gedruckten Zeichenfolge „file://csv@qt_root/data/“ von „DataSource“ können wir seine grundlegenden Eigenschaften erkennen.

Die gedruckten Ergebnisse enthalten grundlegende Informationen zum Datenquellenobjekt:

  • file: – Der Typ der Datenquelle. „qteasy“ unterstützt zwei Arten von Datenquellen: dateibasiert und datenbankbasiert. „Datei“ bedeutet, dass alle Datentabellen in der Datenquelle als Dateien auf der Festplatte gespeichert werden. Ebenso können Daten auch in einer „MySQL“-Datenbank gespeichert werden, wobei in diesem Fall der Datenquellentypcode „db“ lautet.

  • csv: – Format zum Speichern von Datendateien. „qteasy“ kann Datendateien in verschiedenen Formaten auf der Festplatte speichern. Das einfachste Format ist „csv“, aber Benutzer können Daten auch als „hdf“- und „fth“-Dateien („Feather“) speichern, um unterschiedlichen Leistungspräferenzen gerecht zu werden.

  • qt_root/data/: – Der Pfad zum Speichern von Datendateien. „qt_root“ stellt den Installations-Root-Pfad von „qteasy“ dar. Standardmäßig werden alle Datendateien im Unterverzeichnis „/data/“ im Stammverzeichnis gespeichert.

Ebenso können Sie ein Datenquellenobjekt mit dem Datenspeichertyp „Datenbank“ erstellen und dessen grundlegende Eigenschaften anzeigen. Wenn Sie jedoch eine Datenquelle vom Typ „Datenbank“ erstellen, müssen Sie den Hostnamen, den Benutzernamen, das Passwort und/oder den Datenbanknamen der MySQL-Datenbank angeben, zu der Sie eine Verbindung herstellen möchten.

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

Ebenso enthalten die gedruckten Ergebnisse grundlegende Informationen zur Datenquelle:

  • „db:mysql“ – Der Datenquellentyp ist eine MySQL-Datenbank; Alle Datentabellen werden in dieser Datenbank gespeichert.

  • localhost – der Hostname der Datenbank

  • 3306 – Datenbankverbindungsport

  • test_db – Datenbankname. Wenn kein Name angegeben wird, ist die Standarddatenbank „qt_db“, diese Datenbank muss jedoch vorher erstellt werden.

Wenn verschiedene Datenquellenobjekte unterschiedliche Speichermethoden und Speicherpfade haben, haben sie keine Beziehung zueinander und beeinträchtigen die Daten des anderen nicht. Wenn jedoch zwei Datenquellen auf denselben Pfad verweisen und denselben Dateityp haben, speichern sie doppelte Daten.

Um weitere grundlegende Eigenschaften der Datenquelle anzuzeigen, können Sie auf mehrere Eigenschaften des Datenquellenobjekts zugreifen:

>>> 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. Standarddatenquelle

„qteasy“ verfügt über eine integrierte Standarddatenquelle, die keine manuelle Erstellung durch den Benutzer erfordert. Standardmäßig werden alle Daten in dieser Standarddatenquelle gespeichert und aus dieser gelesen. Benutzer können die Parameter dieser Datenquelle über die Konfigurationsdatei von „qteasy“ konfigurieren und so sicherstellen, dass die Datenquelle auf den richtigen Pfad verweist oder dass der richtige Benutzername für die Anmeldung bei der richtigen Datenbank verwendet wird. Die Eigenschaften der integrierten Standarddatenquelle können mit der folgenden Methode angezeigt werden:

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

5.2. Datentabelle anzeigen

Nachdem Sie die grundlegenden Eigenschaften des Datenquellenobjekts verstanden haben, besteht der nächste Schritt darin, die in der Datenquelle gespeicherten Daten besser zu verstehen.

Die Datentabellen in der Datenquelle sind alle vordefiniert. Jede Datentabelle speichert einen anderen Datentyp. Diese Daten umfassen eine große Datenmenge, darunter Basisinformationen, K-Line-Daten, Leistungsberichte börsennotierter Unternehmen, makroökonomische Daten usw. für verschiedene Anlageprodukte wie Aktien, Indizes, Fonds, Futures und Optionen an den Aktien- und Terminmärkten von Shanghai und Shenzhen. Eine vollständige Liste der Datentabellen finden Sie im nächsten Kapitel. In diesem Abschnitt wird hauptsächlich erläutert, wie die grundlegenden Informationen und Daten verschiedener Datentabellen angezeigt werden.

Die Liste der Tabellen in einer Datenquelle kann über die Eigenschaft „all_tables“ der Datenquelle abgerufen werden, die ein Listenobjekt zurückgibt, das alle vordefinierten Tabellen in der Datenquelle enthält. Es muss jedoch unbedingt klargestellt werden, dass viele Tabellen zwar in der Datenquelle definiert sind, diese jedoch nur über grundlegende Definitionen verfügen: Headerinformationen, Feldnamen, Feldbedeutungen und Datentypen sind alle definiert. Neu erstellte Datenquellen verfügen normalerweise über leere Tabellen, die keine Daten enthalten. Um zu sehen, welche Tabellen in der Datenquelle bereits Daten enthalten, müssen Sie die Funktion „get_table_info()“ verwenden.

>>> 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']

Wie man sieht, sind in der aktuellen Version von „qteasy“ 108 Datentabellen vordefiniert, von denen einige Namen wie „stock_basic“ tragen.

Um Details einer bestimmten Tabelle in der aktuellen Datenquelle anzuzeigen, z. B. ihre Definition und ob sie Daten enthält, verwenden Sie die Methode „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)  是否沪深港通

Zu den gedruckten Informationen gehören der Tabellenname, die Beschreibung, Felddefinitionen und Datentypen.

Beachten Sie, dass die aktuelle Größe der Tabelle angezeigt wird, wenn die Datentabelle bereits mit Daten gefüllt ist. Im obigen Beispiel werden einige wichtige Informationen im Folgenden erläutert:

  • „852 KB/5 KB Datensätze auf Datenträger“ – Dies bedeutet, dass die Tabelle etwa 852 KB Speicherplatz belegt und etwa 5.000 Datenzeilen enthält.

  • „Primärschlüssel“ – Zeigt die Primärschlüsselspalten der Daten an. Hier bedeutet es, dass die Spalte „ts_code“ der Primärschlüssel der Tabelle ist und diese Spalte etwa 5396 verschiedene Datensätze enthält. Wenn die Tabelle mehrere Primärschlüssel enthält, wird jede Primärschlüsselspalte separat aufgelistet, zusammen mit dem Datenbereich für dieses Feld. Im obigen Beispiel reicht der Datenbereich für die Spalte „ts_code“ beispielsweise von „000001.SZ“ bis „920128.BJ“, was uns mitteilt, dass die grundlegende Aktieninformationstabelle Informationen zu mehr als 5.000 Aktien mit Codes von 000001 bis 920128 enthält.

  • „Tabellenspalten“ – Hier werden die Felddefinitionen der Datentabelle angezeigt, die das „Schema“ der Tabelle darstellt. Es listet den Namen „columns“, den Datentyp „dtypes“ und beschreibende Informationen „remarks“ für jede Spalte auf.

Darüber hinaus gibt die Methode „get_table_info()“ ein „dict“ zurück, das auch Informationen über die Tabelle enthält. Diese Informationen können zum besseren Verständnis ausgedruckt und mit den oben beschriebenen formatierten Informationen verglichen werden.

>>> 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. Gesamtinformationen zur Datenquelle anzeigen

Verwenden Sie die oben genannten Methoden, um jede Tabelle zu überprüfen. overview() fasst das gesamte DataSource zusammen:

>>> 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

Das Anzeigen der Gesamtinformationen der gesamten Datenquelle kann mehrere Minuten dauern, da hierfür alle Informationen aus jeder Datentabelle zusammengefasst werden müssen.

Während der Übersicht zeigt qteasy einen Fortschrittsbalken an, gibt dann einen „DataFrame“ aller Tabellen zurück und druckt wichtige Statistiken.

Die Zusammenfassung zeigt drei gefüllte Tabellen – „trade_calendar“, „stock_basic“, „stock_daily“ – mit Zeilenanzahl, Festplattennutzung und Start-/Enddatum. Drucken Sie den zurückgegebenen „DataFrame“ aus, um alle Tabellen anzuzeigen:

>>> 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. Die wichtigste Datentabelle

Bei der ersten Verwendung sind Tabellen häufig leer – qteasy vereinfacht durch sein Design die Erfassung und Verwendung von Finanzdaten.

Grundlegende Daten lassen sich leicht herunterladen, einige Tabellen sind jedoch wichtiger – füllen Sie sie zuerst aus, da andere von ihnen und von qteasy selbst abhängen:

  • „trade_calendar“ – Handelskalender für alle Börsen (Handelstag, Börsencode/Name). Kern zu qteasy: Viele Funktionen schlagen ohne sie fehl oder werden langsamer. Wird verwendet, um Handelstage und Download-Datumsbereiche zu bestimmen – füllen Sie diese Tabelle zuerst aus.

  • „stock_basic“ – Aktien-Grundlagentabelle mit Code, Name, Listungs-/Delisting-Daten, Branche, Region usw. Grundlage für tägliche K-Line- und Finanztabellen für Aktien; Priorität beim Ausfüllen dieser Tabelle.

  • „index_basic“ – Index-Grundlagentabelle mit Code, Name, Veröffentlichungs-/Delisting-Daten usw. Grundlage für Index-Tages-K-Line- und Konstituententabellen; Priorität beim Ausfüllen dieser Tabelle.

  • „fund_basic“ – Fonds-Grundlagentabelle mit Code, Name, Typ, Größe usw. Grundlage für die täglichen K-Line- und NAV-Tabellen des Fonds; Priorität beim Ausfüllen dieser Tabelle.

Sobald diese Schlüsseltabellen gefüllt sind, funktionieren die meisten qteasy-Datenfunktionen reibungslos.

qteasy definiert außerdem vier Systemtabellen für Live-Handelsdatensätze:

  • „sys_op_live_accounts“ – Stammtabelle für Live-Handelskonten mit Konto-ID, Name, Typ, Status usw.

  • „sys_op_positions“ – Live-Positionstabelle mit Konto-ID, Sicherheitscode/-name, Menge, Kosten usw.

  • „sys_op_trade_orders“ – Live-Auftragstabelle mit Konto-ID, Bestellzeit/-typ, Sicherheitscode, Menge, Preis usw.

  • „sys_op_trade_results“ – Live-Ausfülltabelle mit Konto-ID, Füllzeit, Sicherheitscode, Menge, Preis usw.

Diese vier Systemtabellen unterstützen den Live-Handel; Daten werden automatisch generiert – füllen, anzeigen oder löschen Sie sie nicht manuell.

Andere Tische

Neben wichtigen Tabellen definiert DataSource viele weitere Tabellen, die Grundlagen, tägliche K-Linie, Finanzen, Dividenden, Gewinnberichte, Makrodaten usw. abdecken:

  • Marktdatentabellen – OHLCV in verschiedenen Häufigkeiten für Aktien, Fonds, Indizes

  • Grundlagentabellen – Aktien, Fonds, Indizes, Futures, Optionen usw.

  • Indikatortabellen – technische, fundamentale, Makroindikatoren usw.

  • Finanzberichtstabellen – Bilanz, Gewinn- und Verlustrechnung, Cashflow usw.

  • Gewinnberichtstabellen – Expressberichte, Gewinnprognosen, Prognosen usw.

  • Dividenden- und Block-Trade-Tabellen – Dividenden, Block-Trades, Aktionärs-Trades usw.

  • Referenztabellen – Makro-, Branchen-, Börsen- und andere Referenzdaten

Informationen zu Tabellendefinitionen und Datentypen finden Sie unter „get_table_info()“ oder im nächsten Kapitel.

5.5. Daten aus Tabellen lesen

Nach dem Ausfüllen können Sie mit „read_table_data()“ mit Datums-/Codefiltern lesen, ohne sich Gedanken über Speicherdetails machen zu müssen.

Um große Lesevorgänge zu vermeiden, übergeben Sie immer Filter. Mit „read_table_data()“ können Sie nach Sicherheitscode und Datumsbereich filtern:

  • Aktien: Ein Sicherheitscode oder durch Kommas getrennte Codes. Wenn der Primärschlüssel einen Sicherheitscode enthält, filtern Sie die Ausgabe nach diesen Codes

  • start: Ein Datum im Format „JJJJMMTT“. Wenn der Tabellenprimärschlüssel Uhrzeit oder Datum enthält, filtern Sie die Zeilen zwischen „Start“ und „Ende“. „start“/„end“ muss als Paar angegeben werden

  • Ende: Ein Datum im Format „JJJJMMTT“. Wenn der Tabellenprimärschlüssel Uhrzeit oder Datum enthält, filtern Sie die Zeilen zwischen „Start“ und „Ende“. „start“/„end“ muss als Paar angegeben werden

„DataSource“ filtert Daten automatisch anhand Ihrer Kriterien, zum Beispiel:

Lesen Sie die täglichen K-Line-Daten für „000651.SZ“ von „stock_daily“ zwischen dem 01.01.2024 und dem 15.01.2024:

>>> 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“ wendet die richtigen Filter für jede Tabelle an und ignoriert unnötige Parameter. Wenn Sie beispielsweise grundlegende Informationen für zwei Aktien abfragen, ist das Handelsdatum nicht erforderlich – „qteasy“ ignoriert „Start“/„Ende“ mit einem Hinweis. Der Parameter „Aktien“ funktioniert auch für Fonds, Indizes, Futures und Optionen, nicht nur für Aktien:

>>> 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]

Weitere Informationen zu read_table_data() finden Sie in der DataSource-Referenz.

5.6. Daten zu Tabellen hinzufügen

Lesevorgänge schlagen fehl, wenn die Tabellen leer oder nicht ausreichend sind – füllen Sie die Tabellen zuerst.

Notiz:

Dies gilt nur für manuelle Schreibvorgänge; Automatisches Herunterladen, Reinigen und Nachfüllen werden später behandelt.

Füllen Sie Tabellen über „update_table_data()“ und schreiben Sie einen „DataFrame“ mit drei Parametern:

  • table: Name der Zieltabelle, in die geschrieben werden soll

  • df: Ein „DataFrame“, der Daten enthält, die in eine Tabelle geschrieben werden sollen

  • merge_type: Bei „update“ werden vorhandene Zeilen in der Tabelle aktualisiert; Bei „Ignorieren“ werden doppelte Zeilen übersprungen.

Bei „update_table_data()“ ist keine genaue Schemaübereinstimmung erforderlich – qteasy normalisiert das Format und dedupliziert vor dem Schreiben.

Beispieldaten werden unten nur zur Demonstration aufgeführt.

>>> 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

Das obige Beispiel „DataFrame“ wird in „index_daily“ geschrieben. Derzeit ist „index_daily“ leer und sein „Schema“ unterscheidet sich geringfügig vom „DataFrame“:

  • Das Tabellenschema „index_daily“ definiert 11 Spalten, während das Beispiel „DataFrame“ oben nur 6 hat; Alle „DataFrame“-Spalten befinden sich weiterhin im „index_daily“-Schema.

  • Die Tabelle „index_daily“ ist derzeit leer und enthält keine Daten.

>>> 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  成交额(千元)

Als nächstes schreiben wir Daten; Bei Erfolg gibt die Methode folgende Zeilen zurück:

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

Nach dem Schreiben können wir die gerade eingefügten Daten zurücklesen.

Viele Spalten lauten „NaN“, weil das geschriebene „df“ diese Felder nicht enthielt.

>>> 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. Drop-Tisch – seien Sie vorsichtig; Die Löschung ist unwiderruflich!!

Sie können auch ganze Tabellen löschen – qteasy unterstützt keine teilweisen Löschungen; Seien Sie sehr vorsichtig.

DataSource ist für Speicherung und Lesevorgänge optimiert, nicht für häufiges Löschen – es handelt sich um ein Data Warehouse, nicht um eine allgemeine Datenbank.

Die DataSource-Methode drop_table_data() löscht eine gesamte Tabelle und kann nicht rückgängig gemacht werden!

Um versehentliches Löschen zu verhindern, werden standardmäßig „drop_table_data()“-Fehler angezeigt – z. beim Löschen temporärer „index_daily“-Daten:

>>> 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

Setzen Sie „allow_drop_table“ auf „True“, um Drops zuzulassen. Setzen Sie es anschließend wieder auf „False“.

Der folgende Code löscht „index_daily“; Danach schlagen Lesevorgänge aus dieser Tabelle fehl:

>>> 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. Zusammenfassung

Wir verstehen jetzt DataSource, die Kernklasse von qteasy für die Verwaltung von Finanzhistoriendaten, einschließlich:

  • Was ist DataSource und wie erstellt man einen?

  • Extrahieren von Daten aus DataSource

  • Arbeiten mit DataSource

Spätere Kapitel behandeln mehr:

  • Welche nützlichen Finanzdaten sind in DataSource enthalten?

  • Wie lade ich DataSource stapelweise herunter und fülle es aus?

  • Informationen effektiver aus DataSource extrahieren?