Best Python code snippet using avocado_python
save_tdx.py
Source:save_tdx.py  
1# coding:utf-82#3# The MIT License (MIT)4#5# Copyright (c) 2016-2021 yutiansut/QUANTAXIS6#7# Permission is hereby granted, free of charge, to any person obtaining a copy8# of this software and associated documentation files (the "Software"), to deal9# in the Software without restriction, including without limitation the rights10# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell11# copies of the Software, and to permit persons to whom the Software is12# furnished to do so, subject to the following conditions:13#14# The above copyright notice and this permission notice shall be included in all15# copies or substantial portions of the Software.16#17# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR18# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,19# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE20# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER21# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,22# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE23# SOFTWARE.24import concurrent25import datetime26from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor27import json28import pandas as pd29import pymongo30from QUANTAXIS.QAFetch import QA_fetch_get_stock_block31from QUANTAXIS.QAFetch.QATdx import (32    QA_fetch_get_option_day,33    QA_fetch_get_option_min,34    QA_fetch_get_index_day,35    QA_fetch_get_index_min,36    QA_fetch_get_stock_day,37    QA_fetch_get_stock_info,38    QA_fetch_get_stock_list,39    QA_fetch_get_future_list,40    QA_fetch_get_index_list,41    QA_fetch_get_future_day,42    QA_fetch_get_future_min,43    QA_fetch_get_stock_min,44    QA_fetch_get_stock_transaction,45    QA_fetch_get_index_transaction,46    QA_fetch_get_stock_xdxr,47    QA_fetch_get_bond_day,48    QA_fetch_get_bond_list,49    QA_fetch_get_bond_min,50    select_best_ip,51    QA_fetch_get_hkstock_day,52    QA_fetch_get_hkstock_list,53    QA_fetch_get_hkstock_min,54    QA_fetch_get_usstock_list,55    QA_fetch_get_usstock_day,56    QA_fetch_get_usstock_min,57)58from QUANTAXIS.QAFetch.QATdx import (59    QA_fetch_get_commodity_option_AL_contract_time_to_market,60    QA_fetch_get_commodity_option_AU_contract_time_to_market,61    QA_fetch_get_commodity_option_CU_contract_time_to_market,62    QA_fetch_get_commodity_option_SR_contract_time_to_market,63    QA_fetch_get_commodity_option_M_contract_time_to_market,64    QA_fetch_get_commodity_option_RU_contract_time_to_market,65    QA_fetch_get_commodity_option_CF_contract_time_to_market,66    QA_fetch_get_commodity_option_C_contract_time_to_market,67    QA_fetch_get_option_50etf_contract_time_to_market,68    QA_fetch_get_option_300etf_contract_time_to_market,69    QA_fetch_get_option_all_contract_time_to_market,70    QA_fetch_get_option_list,71)72from QUANTAXIS.QAUtil import (73    DATABASE,74    QA_util_get_next_day,75    QA_util_get_real_date,76    QA_util_log_info,77    QA_util_to_json_from_pandas,78    trade_date_sse79)80from QUANTAXIS.QAData.data_fq import _QA_data_stock_to_fq81from QUANTAXIS.QAFetch.QAQuery import QA_fetch_stock_day82from QUANTAXIS.QAUtil import Parallelism83from QUANTAXIS.QAFetch.QATdx import ping, get_ip_list_by_multi_process_ping, stock_ip_list84from multiprocessing import cpu_count85# ip=select_best_ip()86def now_time():87    return str(QA_util_get_real_date(str(datetime.date.today() - datetime.timedelta(days=1)), trade_date_sse, -1)) + \88           ' 17:00:00' if datetime.datetime.now().hour < 15 else str(QA_util_get_real_date(89        str(datetime.date.today()), trade_date_sse, -1)) + ' 15:00:00'90def QA_SU_save_single_stock_day(code : str, client= DATABASE, ui_log=None):91    '''92     save single stock_day93    ä¿åå个è¡ç¥¨æ¥çº¿æ°æ®94    :param code: è¦ä¿åæ°æ®çè¡ç¥¨ä»£ç 95    :param client:96    :param ui_log:  ç»GUI qt çé¢ä½¿ç¨97    :param ui_progress: ç»GUI qt çé¢ä½¿ç¨98    '''99    #stock_list = QA_fetch_get_stock_list().code.unique().tolist()100    coll_stock_day = client.stock_day101    coll_stock_day.create_index(102        [("code",103          pymongo.ASCENDING),104         ("date_stamp",105          pymongo.ASCENDING)]106    )107    err = []108    def __saving_work(code, coll_stock_day):109        try:110            QA_util_log_info(111                '##JOB01 Now Saving STOCK_DAY==== {}'.format(str(code)),112                ui_log113            )114            # é¦éæ¥æ¾æ°æ®åº æ¯å¦ æ è¿ä¸ªä»£ç çæ°æ®115            ref = coll_stock_day.find({'code': str(code)[0:6]})116            end_date = str(now_time())[0:10]117            # å½åæ°æ®åºå·²ç»å
å«äºè¿ä¸ªä»£ç çæ°æ®ï¼ ç»§ç»å¢éæ´æ°118            # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦æè¡ç¥¨æ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°119            if ref.count() > 0:120                # æ¥ç䏿¬¡è·åçæ¥æç»§ç»æ´æ°121                start_date = ref[ref.count() - 1]['date']122                QA_util_log_info(123                    'UPDATE_STOCK_DAY \n Trying updating {} from {} to {}'124                    .format(code,125                            start_date,126                            end_date),127                    ui_log128                )129                if start_date != end_date:130                    coll_stock_day.insert_many(131                        QA_util_to_json_from_pandas(132                            QA_fetch_get_stock_day(133                                str(code),134                                QA_util_get_next_day(start_date),135                                end_date,136                                '00'137                            )138                        )139                    )140            # å½åæ°æ®åºä¸æ²¡æè¿ä¸ªä»£ç çè¡ç¥¨æ°æ®ï¼ ä»1990-01-01 å¼å§ä¸è½½ææçæ°æ®141            else:142                start_date = '1990-01-01'143                QA_util_log_info(144                    'UPDATE_STOCK_DAY \n Trying updating {} from {} to {}'145                    .format(code,146                            start_date,147                            end_date),148                    ui_log149                )150                if start_date != end_date:151                    coll_stock_day.insert_many(152                        QA_util_to_json_from_pandas(153                            QA_fetch_get_stock_day(154                                str(code),155                                start_date,156                                end_date,157                                '00'158                            )159                        )160                    )161        except Exception as error0:162            print(error0)163            err.append(str(code))164    __saving_work(code, coll_stock_day)165    if len(err) < 1:166        QA_util_log_info('SUCCESS save stock day ^_^', ui_log)167    else:168        QA_util_log_info('ERROR CODE \n ', ui_log)169        QA_util_log_info(err, ui_log)170def QA_SU_save_stock_day(client=DATABASE, ui_log=None, ui_progress=None):171    '''172     save stock_day173    ä¿åæ¥çº¿æ°æ®174    :param client:175    :param ui_log:  ç»GUI qt çé¢ä½¿ç¨176    :param ui_progress: ç»GUI qt çé¢ä½¿ç¨177    :param ui_progress_int_value: ç»GUI qt çé¢ä½¿ç¨178    '''179    stock_list = QA_fetch_get_stock_list().code.unique().tolist()180    coll_stock_day = client.stock_day181    coll_stock_day.create_index(182        [("code",183          pymongo.ASCENDING),184         ("date_stamp",185          pymongo.ASCENDING)]186    )187    err = []188    def __saving_work(code, coll_stock_day):189        try:190            QA_util_log_info(191                '##JOB01 Now Saving STOCK_DAY==== {}'.format(str(code)),192                ui_log193            )194            # é¦éæ¥æ¾æ°æ®åº æ¯å¦ æ è¿ä¸ªä»£ç çæ°æ®195            ref = coll_stock_day.find({'code': str(code)[0:6]})196            end_date = str(now_time())[0:10]197            # å½åæ°æ®åºå·²ç»å
å«äºè¿ä¸ªä»£ç çæ°æ®ï¼ ç»§ç»å¢éæ´æ°198            # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦æè¡ç¥¨æ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°199            if ref.count() > 0:200                # æ¥ç䏿¬¡è·åçæ¥æç»§ç»æ´æ°201                start_date = ref[ref.count() - 1]['date']202                QA_util_log_info(203                    'UPDATE_STOCK_DAY \n Trying updating {} from {} to {}'204                    .format(code,205                            start_date,206                            end_date),207                    ui_log208                )209                if start_date != end_date:210                    coll_stock_day.insert_many(211                        QA_util_to_json_from_pandas(212                            QA_fetch_get_stock_day(213                                str(code),214                                QA_util_get_next_day(start_date),215                                end_date,216                                '00'217                            )218                        )219                    )220            # å½åæ°æ®åºä¸æ²¡æè¿ä¸ªä»£ç çè¡ç¥¨æ°æ®ï¼ ä»1990-01-01 å¼å§ä¸è½½ææçæ°æ®221            else:222                start_date = '1990-01-01'223                QA_util_log_info(224                    'UPDATE_STOCK_DAY \n Trying updating {} from {} to {}'225                    .format(code,226                            start_date,227                            end_date),228                    ui_log229                )230                if start_date != end_date:231                    coll_stock_day.insert_many(232                        QA_util_to_json_from_pandas(233                            QA_fetch_get_stock_day(234                                str(code),235                                start_date,236                                end_date,237                                '00'238                            )239                        )240                    )241        except Exception as error0:242            print(error0)243            err.append(str(code))244    for item in range(len(stock_list)):245        QA_util_log_info('The {} of Total {}'.format(item, len(stock_list)))246        strProgressToLog = 'DOWNLOAD PROGRESS {} {}'.format(247            str(float(item / len(stock_list) * 100))[0:4] + '%',248            ui_log249        )250        intProgressToLog = int(float(item / len(stock_list) * 100))251        QA_util_log_info(252            strProgressToLog,253            ui_log=ui_log,254            ui_progress=ui_progress,255            ui_progress_int_value=intProgressToLog256        )257        __saving_work(stock_list[item], coll_stock_day)258    if len(err) < 1:259        QA_util_log_info('SUCCESS save stock day ^_^', ui_log)260    else:261        QA_util_log_info('ERROR CODE \n ', ui_log)262        QA_util_log_info(err, ui_log)263def gen_param(codelist, start_date=None, end_date=None, if_fq='00', frequence='day', IPList=[]):264    # çæQA.QAFetch.QATdx.QQA_fetch_get_stock_dayå¤è¿ç¨å¤ççåæ°265    count = len(IPList)266    my_iterator = iter(range(len(codelist)))267    start_date = str(start_date)[0:10]268    end_date = str(end_date)[0:10]269    return [(code, start_date, end_date, if_fq, frequence, IPList[i % count]['ip'], IPList[i % count]['port'])270            for code, i in [(code, next(my_iterator) % count) for code in codelist]]271def QA_SU_save_stock_week(client=DATABASE, ui_log=None, ui_progress=None):272    """save stock_week273    Keyword Arguments:274        client {[type]} -- [description] (default: {DATABASE})275    """276    stock_list = QA_fetch_get_stock_list().code.unique().tolist()277    coll_stock_week = client.stock_week278    coll_stock_week.create_index(279        [("code",280          pymongo.ASCENDING),281         ("date_stamp",282          pymongo.ASCENDING)]283    )284    err = []285    def __saving_work(code, coll_stock_week):286        try:287            QA_util_log_info(288                '##JOB01 Now Saving STOCK_WEEK==== {}'.format(str(code)),289                ui_log=ui_log290            )291            ref = coll_stock_week.find({'code': str(code)[0:6]})292            end_date = str(now_time())[0:10]293            if ref.count() > 0:294                # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦æè¡ç¥¨æ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°295                start_date = ref[ref.count() - 1]['date']296                QA_util_log_info(297                    'UPDATE_STOCK_WEEK \n Trying updating {} from {} to {}'298                        .format(code,299                                start_date,300                                end_date),301                    ui_log=ui_log302                )303                if start_date != end_date:304                    coll_stock_week.insert_many(305                        QA_util_to_json_from_pandas(306                            QA_fetch_get_stock_day(307                                str(code),308                                QA_util_get_next_day(start_date),309                                end_date,310                                '00',311                                frequence='week'312                            )313                        )314                    )315            else:316                start_date = '1990-01-01'317                QA_util_log_info(318                    'UPDATE_STOCK_WEEK \n Trying updating {} from {} to {}'319                        .format(code,320                                start_date,321                                end_date),322                    ui_log=ui_log323                )324                if start_date != end_date:325                    coll_stock_week.insert_many(326                        QA_util_to_json_from_pandas(327                            QA_fetch_get_stock_day(328                                str(code),329                                start_date,330                                end_date,331                                '00',332                                frequence='week'333                            )334                        )335                    )336        except:337            err.append(str(code))338    for item in range(len(stock_list)):339        QA_util_log_info(340            'The {} of Total {}'.format(item,341                                        len(stock_list)),342            ui_log=ui_log343        )344        strProgress = 'DOWNLOAD PROGRESS {} '.format(345            str(float(item / len(stock_list) * 100))[0:4] + '%'346        )347        intProgress = int(float(item / len(stock_list) * 100))348        QA_util_log_info(349            strProgress,350            ui_log=ui_log,351            ui_progress=ui_progress,352            ui_progress_int_value=intProgress353        )354        __saving_work(stock_list[item], coll_stock_week)355    if len(err) < 1:356        QA_util_log_info('SUCCESS', ui_log=ui_log)357    else:358        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)359        QA_util_log_info(err, ui_log=ui_log)360def QA_SU_save_stock_month(client=DATABASE, ui_log=None, ui_progress=None):361    """save stock_month362    Keyword Arguments:363        client {[type]} -- [description] (default: {DATABASE})364    """365    stock_list = QA_fetch_get_stock_list().code.unique().tolist()366    coll_stock_month = client.stock_month367    coll_stock_month.create_index(368        [("code",369          pymongo.ASCENDING),370         ("date_stamp",371          pymongo.ASCENDING)]372    )373    err = []374    def __saving_work(code, coll_stock_month):375        try:376            QA_util_log_info(377                '##JOB01 Now Saving STOCK_MONTH==== {}'.format(str(code)),378                ui_log=ui_log379            )380            ref = coll_stock_month.find({'code': str(code)[0:6]})381            end_date = str(now_time())[0:10]382            if ref.count() > 0:383                # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦æè¡ç¥¨æ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°384                start_date = ref[ref.count() - 1]['date']385                QA_util_log_info(386                    'UPDATE_STOCK_MONTH \n Trying updating {} from {} to {}'387                        .format(code,388                                start_date,389                                end_date),390                    ui_log=ui_log391                )392                if start_date != end_date:393                    coll_stock_month.insert_many(394                        QA_util_to_json_from_pandas(395                            QA_fetch_get_stock_day(396                                str(code),397                                QA_util_get_next_day(start_date),398                                end_date,399                                '00',400                                frequence='month'401                            )402                        )403                    )404            else:405                start_date = '1990-01-01'406                QA_util_log_info(407                    'UPDATE_STOCK_MONTH \n Trying updating {} from {} to {}'408                        .format(code,409                                start_date,410                                end_date),411                    ui_log=ui_log412                )413                if start_date != end_date:414                    coll_stock_month.insert_many(415                        QA_util_to_json_from_pandas(416                            QA_fetch_get_stock_day(417                                str(code),418                                start_date,419                                end_date,420                                '00',421                                frequence='month'422                            )423                        )424                    )425        except:426            err.append(str(code))427    for item in range(len(stock_list)):428        QA_util_log_info(429            'The {} of Total {}'.format(item,430                                        len(stock_list)),431            ui_log=ui_log432        )433        strProgress = 'DOWNLOAD PROGRESS {} '.format(434            str(float(item / len(stock_list) * 100))[0:4] + '%'435        )436        intProgress = int(float(item / len(stock_list) * 100))437        QA_util_log_info(438            strProgress,439            ui_log=ui_log,440            ui_progress=ui_progress,441            ui_progress_int_value=intProgress442        )443        __saving_work(stock_list[item], coll_stock_month)444    if len(err) < 1:445        QA_util_log_info('SUCCESS', ui_log=ui_log)446    else:447        QA_util_log_info('ERROR CODE \n ', ui_log=ui_log)448        QA_util_log_info(err, ui_log=ui_log)449def QA_SU_save_stock_year(client=DATABASE, ui_log=None, ui_progress=None):450    """save stock_year451    Keyword Arguments:452        client {[type]} -- [description] (default: {DATABASE})453    """454    stock_list = QA_fetch_get_stock_list().code.unique().tolist()455    coll_stock_year = client.stock_year456    coll_stock_year.create_index(457        [("code",458          pymongo.ASCENDING),459         ("date_stamp",460          pymongo.ASCENDING)]461    )462    err = []463    def __saving_work(code, coll_stock_year):464        try:465            QA_util_log_info(466                '##JOB01 Now Saving STOCK_YEAR==== {}'.format(str(code)),467                ui_log=ui_log468            )469            ref = coll_stock_year.find({'code': str(code)[0:6]})470            end_date = str(now_time())[0:10]471            if ref.count() > 0:472                # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦æè¡ç¥¨æ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°473                start_date = ref[ref.count() - 1]['date']474                QA_util_log_info(475                    'UPDATE_STOCK_YEAR \n Trying updating {} from {} to {}'476                        .format(code,477                                start_date,478                                end_date),479                    ui_log=ui_log480                )481                if start_date != end_date:482                    coll_stock_year.insert_many(483                        QA_util_to_json_from_pandas(484                            QA_fetch_get_stock_day(485                                str(code),486                                QA_util_get_next_day(start_date),487                                end_date,488                                '00',489                                frequence='year'490                            )491                        )492                    )493            else:494                start_date = '1990-01-01'495                QA_util_log_info(496                    'UPDATE_STOCK_YEAR \n Trying updating {} from {} to {}'497                        .format(code,498                                start_date,499                                end_date),500                    ui_log=ui_log501                )502                if start_date != end_date:503                    coll_stock_year.insert_many(504                        QA_util_to_json_from_pandas(505                            QA_fetch_get_stock_day(506                                str(code),507                                start_date,508                                end_date,509                                '00',510                                frequence='year'511                            )512                        )513                    )514        except:515            err.append(str(code))516    for item in range(len(stock_list)):517        QA_util_log_info(518            'The {} of Total {}'.format(item,519                                        len(stock_list)),520            ui_log=ui_log521        )522        strProgress = 'DOWNLOAD PROGRESS {} '.format(523            str(float(item / len(stock_list) * 100))[0:4] + '%'524        )525        intProgress = int(float(item / len(stock_list) * 100))526        QA_util_log_info(527            strProgress,528            ui_log=ui_log,529            ui_progress=ui_progress,530            ui_progress_int_value=intProgress531        )532        __saving_work(stock_list[item], coll_stock_year)533    if len(err) < 1:534        QA_util_log_info('SUCCESS', ui_log=ui_log)535    else:536        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)537        QA_util_log_info(err, ui_log=ui_log)538def QA_SU_save_stock_xdxr(client=DATABASE, ui_log=None, ui_progress=None):539    """[summary]540    Keyword Arguments:541        client {[type]} -- [description] (default: {DATABASE})542    """543    stock_list = QA_fetch_get_stock_list().code.unique().tolist()544    # client.drop_collection('stock_xdxr')545    try:546        coll = client.stock_xdxr547        coll.create_index(548            [('code',549              pymongo.ASCENDING),550             ('date',551              pymongo.ASCENDING)],552            unique=True553        )554        coll_adj = client.stock_adj555        coll_adj.create_index(556            [('code',557                pymongo.ASCENDING),558                ('date',559                pymongo.ASCENDING)],560            unique=True561        )562    except:563        client.drop_collection('stock_xdxr')564        coll = client.stock_xdxr565        coll.create_index(566            [('code',567              pymongo.ASCENDING),568             ('date',569              pymongo.ASCENDING)],570            unique=True571        )572        client.drop_collection('stock_adj')573        coll_adj = client.stock_adj574        coll_adj.create_index(575            [('code',576                pymongo.ASCENDING),577                ('date',578                pymongo.ASCENDING)],579            unique=True580        )581    err = []582    def __saving_work(code, coll):583        QA_util_log_info(584            '##JOB02 Now Saving XDXR INFO ==== {}'.format(str(code)),585            ui_log=ui_log586        )587        try:588            xdxr  = QA_fetch_get_stock_xdxr(str(code))589            try:590                coll.insert_many(591                    QA_util_to_json_from_pandas(xdxr),592                    ordered=False593                )594            except:595                pass596            try:597                data = QA_fetch_stock_day(str(code), '1990-01-01',str(datetime.date.today()), 'pd')598                qfq = _QA_data_stock_to_fq(data, xdxr, 'qfq')599                qfq = qfq.assign(date=qfq.date.apply(lambda x: str(x)[0:10]))600                adjdata = QA_util_to_json_from_pandas(qfq.loc[:, ['date','code', 'adj']])601                coll_adj.delete_many({'code': code})602                #print(adjdata)603                coll_adj.insert_many(adjdata)604            except Exception as e:605                print(e)606        except Exception as e:607            print(e)608            err.append(str(code))609    for i_ in range(len(stock_list)):610        QA_util_log_info(611            'The {} of Total {}'.format(i_,612                                        len(stock_list)),613            ui_log=ui_log614        )615        strLogInfo = 'DOWNLOAD PROGRESS {} '.format(616            str(float(i_ / len(stock_list) * 100))[0:4] + '%'617        )618        intLogProgress = int(float(i_ / len(stock_list) * 100))619        QA_util_log_info(620            strLogInfo,621            ui_log=ui_log,622            ui_progress=ui_progress,623            ui_progress_int_value=intLogProgress624        )625        __saving_work(stock_list[i_], coll)626def QA_SU_save_stock_min(client=DATABASE, ui_log=None, ui_progress=None):627    """save stock_min628    Keyword Arguments:629        client {[type]} -- [description] (default: {DATABASE})630    """631    stock_list = QA_fetch_get_stock_list().code.unique().tolist()632    coll = client.stock_min633    coll.create_index(634        [635            ('code',636             pymongo.ASCENDING),637            ('time_stamp',638             pymongo.ASCENDING),639            ('date_stamp',640             pymongo.ASCENDING)641        ]642    )643    err = []644    def __saving_work(code, coll):645        QA_util_log_info(646            '##JOB03 Now Saving STOCK_MIN ==== {}'.format(str(code)),647            ui_log=ui_log648        )649        try:650            for type in ['1min', '5min', '15min', '30min', '60min']:651                ref_ = coll.find({'code': str(code)[0:6], 'type': type})652                end_time = str(now_time())[0:19]653                if ref_.count() > 0:654                    start_time = ref_[ref_.count() - 1]['datetime']655                    QA_util_log_info(656                        '##JOB03.{} Now Saving {} from {} to {} =={} '.format(657                            ['1min',658                             '5min',659                             '15min',660                             '30min',661                             '60min'].index(type),662                            str(code),663                            start_time,664                            end_time,665                            type666                        ),667                        ui_log=ui_log668                    )669                    if start_time != end_time:670                        __data = QA_fetch_get_stock_min(671                            str(code),672                            start_time,673                            end_time,674                            type675                        )676                        if len(__data) > 1:677                            coll.insert_many(678                                QA_util_to_json_from_pandas(__data)[1::]679                            )680                else:681                    start_time = '2015-01-01'682                    QA_util_log_info(683                        '##JOB03.{} Now Saving {} from {} to {} =={} '.format(684                            ['1min',685                             '5min',686                             '15min',687                             '30min',688                             '60min'].index(type),689                            str(code),690                            start_time,691                            end_time,692                            type693                        ),694                        ui_log=ui_log695                    )696                    if start_time != end_time:697                        __data = QA_fetch_get_stock_min(698                            str(code),699                            start_time,700                            end_time,701                            type702                        )703                        if len(__data) > 1:704                            coll.insert_many(705                                QA_util_to_json_from_pandas(__data)706                            )707        except Exception as e:708            QA_util_log_info(e, ui_log=ui_log)709            err.append(code)710            QA_util_log_info(err, ui_log=ui_log)711    executor = ThreadPoolExecutor(max_workers=4)712    # executor.map((__saving_work,  stock_list[i_], coll),URLS)713    res = {714        executor.submit(__saving_work,715                        stock_list[i_],716                        coll)717        for i_ in range(len(stock_list))718    }719    count = 0720    for i_ in concurrent.futures.as_completed(res):721        QA_util_log_info(722            'The {} of Total {}'.format(count,723                                        len(stock_list)),724            ui_log=ui_log725        )726        strProgress = 'DOWNLOAD PROGRESS {} '.format(727            str(float(count / len(stock_list) * 100))[0:4] + '%'728        )729        intProgress = int(count / len(stock_list) * 10000.0)730        QA_util_log_info(731            strProgress,732            ui_log,733            ui_progress=ui_progress,734            ui_progress_int_value=intProgress735        )736        count = count + 1737    if len(err) < 1:738        QA_util_log_info('SUCCESS', ui_log=ui_log)739    else:740        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)741        QA_util_log_info(err, ui_log=ui_log)742def QA_SU_save_single_stock_min(code : str, client=DATABASE, ui_log=None, ui_progress=None):743    """save single stock_min744    Keyword Arguments:745        client {[type]} -- [description] (default: {DATABASE})746    """747    #stock_list = QA_fetch_get_stock_list().code.unique().tolist()748    stock_list = [code]749    coll = client.stock_min750    coll.create_index(751        [752            ('code',753             pymongo.ASCENDING),754            ('time_stamp',755             pymongo.ASCENDING),756            ('date_stamp',757             pymongo.ASCENDING)758        ]759    )760    err = []761    def __saving_work(code, coll):762        QA_util_log_info(763            '##JOB03 Now Saving STOCK_MIN ==== {}'.format(str(code)),764            ui_log=ui_log765        )766        try:767            for type in ['1min', '5min', '15min', '30min', '60min']:768                ref_ = coll.find({'code': str(code)[0:6], 'type': type})769                end_time = str(now_time())[0:19]770                if ref_.count() > 0:771                    start_time = ref_[ref_.count() - 1]['datetime']772                    QA_util_log_info(773                        '##JOB03.{} Now Saving {} from {} to {} =={} '.format(774                            ['1min',775                             '5min',776                             '15min',777                             '30min',778                             '60min'].index(type),779                            str(code),780                            start_time,781                            end_time,782                            type783                        ),784                        ui_log=ui_log785                    )786                    if start_time != end_time:787                        __data = QA_fetch_get_stock_min(788                            str(code),789                            start_time,790                            end_time,791                            type792                        )793                        if len(__data) > 1:794                            coll.insert_many(795                                QA_util_to_json_from_pandas(__data)[1::]796                            )797                else:798                    start_time = '2015-01-01'799                    QA_util_log_info(800                        '##JOB03.{} Now Saving {} from {} to {} =={} '.format(801                            ['1min',802                             '5min',803                             '15min',804                             '30min',805                             '60min'].index(type),806                            str(code),807                            start_time,808                            end_time,809                            type810                        ),811                        ui_log=ui_log812                    )813                    if start_time != end_time:814                        __data = QA_fetch_get_stock_min(815                            str(code),816                            start_time,817                            end_time,818                            type819                        )820                        if len(__data) > 1:821                            coll.insert_many(822                                QA_util_to_json_from_pandas(__data)823                            )824        except Exception as e:825            QA_util_log_info(e, ui_log=ui_log)826            err.append(code)827            QA_util_log_info(err, ui_log=ui_log)828    executor = ThreadPoolExecutor(max_workers=4)829    # executor.map((__saving_work,  stock_list[i_], coll),URLS)830    res = {831        executor.submit(__saving_work,832                        stock_list[i_],833                        coll)834        for i_ in range(len(stock_list))835    }836    count = 1837    for i_ in concurrent.futures.as_completed(res):838        QA_util_log_info(839            'The {} of Total {}'.format(count,840                                        len(stock_list)),841            ui_log=ui_log842        )843        strProgress = 'DOWNLOAD PROGRESS {} '.format(844            str(float(count / len(stock_list) * 100))[0:4] + '%'845        )846        intProgress = int(count / len(stock_list) * 10000.0)847        QA_util_log_info(848            strProgress,849            ui_log,850            ui_progress=ui_progress,851            ui_progress_int_value=intProgress852        )853        count = count + 1854    if len(err) < 1:855        QA_util_log_info('SUCCESS', ui_log=ui_log)856    else:857        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)858        QA_util_log_info(err, ui_log=ui_log)859def QA_SU_save_single_index_day(code : str, client=DATABASE, ui_log=None):860    """save index_day861    Keyword Arguments:862        code : single index code863        client {[type]} -- [description] (default: {DATABASE})864    """865    #__index_list = QA_fetch_get_stock_list('index')866    coll = client.index_day867    coll.create_index(868        [('code',869          pymongo.ASCENDING),870         ('date_stamp',871          pymongo.ASCENDING)]872    )873    err = []874    def __saving_work(code, coll):875        try:876            ref_ = coll.find({'code': str(code)[0:6]})877            end_time = str(now_time())[0:10]878            if ref_.count() > 0:879                start_time = ref_[ref_.count() - 1]['date']880                QA_util_log_info(881                    '##JOB04 Now Saving INDEX_DAY==== \n Trying updating {} from {} to {}'882                        .format(code,883                                start_time,884                                end_time),885                    ui_log=ui_log886                )887                if start_time != end_time:888                    coll.insert_many(889                        QA_util_to_json_from_pandas(890                            QA_fetch_get_index_day(891                                str(code),892                                QA_util_get_next_day(start_time),893                                end_time894                            )895                        )896                    )897            else:898                try:899                    start_time = '1990-01-01'900                    QA_util_log_info(901                        '##JOB04 Now Saving INDEX_DAY==== \n Trying updating {} from {} to {}'902                            .format(code,903                                    start_time,904                                    end_time),905                        ui_log=ui_log906                    )907                    coll.insert_many(908                        QA_util_to_json_from_pandas(909                            QA_fetch_get_index_day(910                                str(code),911                                start_time,912                                end_time913                            )914                        )915                    )916                except:917                    start_time = '2009-01-01'918                    QA_util_log_info(919                        '##JOB04 Now Saving INDEX_DAY==== \n Trying updating {} from {} to {}'920                            .format(code,921                                    start_time,922                                    end_time),923                        ui_log=ui_log924                    )925                    coll.insert_many(926                        QA_util_to_json_from_pandas(927                            QA_fetch_get_index_day(928                                str(code),929                                start_time,930                                end_time931                            )932                        )933                    )934        except Exception as e:935            QA_util_log_info(e, ui_log=ui_log)936            err.append(str(code))937            QA_util_log_info(err, ui_log=ui_log)938    __saving_work(code, coll)939    if len(err) < 1:940        QA_util_log_info('SUCCESS', ui_log=ui_log)941    else:942        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)943        QA_util_log_info(err, ui_log=ui_log)944def QA_SU_save_index_day(client=DATABASE, ui_log=None, ui_progress=None):945    """save index_day946    Keyword Arguments:947        client {[type]} -- [description] (default: {DATABASE})948    """949    __index_list = QA_fetch_get_stock_list('index')950    coll = client.index_day951    coll.create_index(952        [('code',953          pymongo.ASCENDING),954         ('date_stamp',955          pymongo.ASCENDING)]956    )957    err = []958    def __saving_work(code, coll):959        try:960            ref_ = coll.find({'code': str(code)[0:6]})961            end_time = str(now_time())[0:10]962            if ref_.count() > 0:963                start_time = ref_[ref_.count() - 1]['date']964                QA_util_log_info(965                    '##JOB04 Now Saving INDEX_DAY==== \n Trying updating {} from {} to {}'966                        .format(code,967                                start_time,968                                end_time),969                    ui_log=ui_log970                )971                if start_time != end_time:972                    coll.insert_many(973                        QA_util_to_json_from_pandas(974                            QA_fetch_get_index_day(975                                str(code),976                                QA_util_get_next_day(start_time),977                                end_time978                            )979                        )980                    )981            else:982                try:983                    start_time = '1990-01-01'984                    QA_util_log_info(985                        '##JOB04 Now Saving INDEX_DAY==== \n Trying updating {} from {} to {}'986                            .format(code,987                                    start_time,988                                    end_time),989                        ui_log=ui_log990                    )991                    coll.insert_many(992                        QA_util_to_json_from_pandas(993                            QA_fetch_get_index_day(994                                str(code),995                                start_time,996                                end_time997                            )998                        )999                    )1000                except:1001                    start_time = '2009-01-01'1002                    QA_util_log_info(1003                        '##JOB04 Now Saving INDEX_DAY==== \n Trying updating {} from {} to {}'1004                            .format(code,1005                                    start_time,1006                                    end_time),1007                        ui_log=ui_log1008                    )1009                    coll.insert_many(1010                        QA_util_to_json_from_pandas(1011                            QA_fetch_get_index_day(1012                                str(code),1013                                start_time,1014                                end_time1015                            )1016                        )1017                    )1018        except Exception as e:1019            QA_util_log_info(e, ui_log=ui_log)1020            err.append(str(code))1021            QA_util_log_info(err, ui_log=ui_log)1022    for i_ in range(len(__index_list)):1023        # __saving_work('000001')1024        QA_util_log_info(1025            'The {} of Total {}'.format(i_,1026                                        len(__index_list)),1027            ui_log=ui_log1028        )1029        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(1030            str(float(i_ / len(__index_list) * 100))[0:4] + '%'1031        )1032        intLogProgress = int(float(i_ / len(__index_list) * 10000.0))1033        QA_util_log_info(1034            strLogProgress,1035            ui_log=ui_log,1036            ui_progress=ui_progress,1037            ui_progress_int_value=intLogProgress1038        )1039        __saving_work(__index_list.index[i_][0], coll)1040    if len(err) < 1:1041        QA_util_log_info('SUCCESS', ui_log=ui_log)1042    else:1043        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)1044        QA_util_log_info(err, ui_log=ui_log)1045def QA_SU_save_index_min(client=DATABASE, ui_log=None, ui_progress=None):1046    """save index_min1047    Keyword Arguments:1048        client {[type]} -- [description] (default: {DATABASE})1049    """1050    __index_list = QA_fetch_get_stock_list('index')1051    coll = client.index_min1052    coll.create_index(1053        [1054            ('code',1055             pymongo.ASCENDING),1056            ('time_stamp',1057             pymongo.ASCENDING),1058            ('date_stamp',1059             pymongo.ASCENDING)1060        ]1061    )1062    err = []1063    def __saving_work(code, coll):1064        QA_util_log_info(1065            '##JOB05 Now Saving Index_MIN ==== {}'.format(str(code)),1066            ui_log=ui_log1067        )1068        try:1069            for type in ['1min', '5min', '15min', '30min', '60min']:1070                ref_ = coll.find({'code': str(code)[0:6], 'type': type})1071                end_time = str(now_time())[0:19]1072                if ref_.count() > 0:1073                    start_time = ref_[ref_.count() - 1]['datetime']1074                    QA_util_log_info(1075                        '##JOB05.{} Now Saving {} from {} to {} =={} '.format(1076                            ['1min',1077                             '5min',1078                             '15min',1079                             '30min',1080                             '60min'].index(type),1081                            str(code),1082                            start_time,1083                            end_time,1084                            type1085                        ),1086                        ui_log=ui_log1087                    )1088                    if start_time != end_time:1089                        __data = QA_fetch_get_index_min(1090                            str(code),1091                            start_time,1092                            end_time,1093                            type1094                        )1095                        if len(__data) > 1:1096                            coll.insert_many(1097                                QA_util_to_json_from_pandas(__data[1::])1098                            )1099                else:1100                    start_time = '2015-01-01'1101                    QA_util_log_info(1102                        '##JOB05.{} Now Saving {} from {} to {} =={} '.format(1103                            ['1min',1104                             '5min',1105                             '15min',1106                             '30min',1107                             '60min'].index(type),1108                            str(code),1109                            start_time,1110                            end_time,1111                            type1112                        ),1113                        ui_log=ui_log1114                    )1115                    if start_time != end_time:1116                        __data = QA_fetch_get_index_min(1117                            str(code),1118                            start_time,1119                            end_time,1120                            type1121                        )1122                        if len(__data) > 1:1123                            coll.insert_many(1124                                QA_util_to_json_from_pandas(__data)1125                            )1126        except:1127            err.append(code)1128    executor = ThreadPoolExecutor(max_workers=4)1129    res = {1130        executor.submit(__saving_work,1131                        __index_list.index[i_][0],1132                        coll)1133        for i_ in range(len(__index_list))1134    }  # multi index ./.1135    count = 01136    for i_ in concurrent.futures.as_completed(res):1137        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(1138            str(float(count / len(__index_list) * 100))[0:4] + '%'1139        )1140        intLogProgress = int(float(count / len(__index_list) * 10000.0))1141        QA_util_log_info(1142            'The {} of Total {}'.format(count,1143                                        len(__index_list)),1144            ui_log=ui_log1145        )1146        QA_util_log_info(1147            strLogProgress,1148            ui_log=ui_log,1149            ui_progress=ui_progress,1150            ui_progress_int_value=intLogProgress1151        )1152        count = count + 11153    if len(err) < 1:1154        QA_util_log_info('SUCCESS', ui_log=ui_log)1155    else:1156        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)1157        QA_util_log_info(err, ui_log=ui_log)1158def QA_SU_save_single_index_min(code : str, client=DATABASE, ui_log=None, ui_progress=None):1159    """save single index_min1160    Keyword Arguments:1161        client {[type]} -- [description] (default: {DATABASE})1162    """1163    #__index_list = QA_fetch_get_stock_list('index')1164    __index_list = [code]1165    coll = client.index_min1166    coll.create_index(1167        [1168            ('code',1169             pymongo.ASCENDING),1170            ('time_stamp',1171             pymongo.ASCENDING),1172            ('date_stamp',1173             pymongo.ASCENDING)1174        ]1175    )1176    err = []1177    def __saving_work(code, coll):1178        QA_util_log_info(1179            '##JOB05 Now Saving Index_MIN ==== {}'.format(str(code)),1180            ui_log=ui_log1181        )1182        try:1183            for type in ['1min', '5min', '15min', '30min', '60min']:1184                ref_ = coll.find({'code': str(code)[0:6], 'type': type})1185                end_time = str(now_time())[0:19]1186                if ref_.count() > 0:1187                    start_time = ref_[ref_.count() - 1]['datetime']1188                    QA_util_log_info(1189                        '##JOB05.{} Now Saving {} from {} to {} =={} '.format(1190                            ['1min',1191                             '5min',1192                             '15min',1193                             '30min',1194                             '60min'].index(type),1195                            str(code),1196                            start_time,1197                            end_time,1198                            type1199                        ),1200                        ui_log=ui_log1201                    )1202                    if start_time != end_time:1203                        __data = QA_fetch_get_index_min(1204                            str(code),1205                            start_time,1206                            end_time,1207                            type1208                        )1209                        if len(__data) > 1:1210                            coll.insert_many(1211                                QA_util_to_json_from_pandas(__data[1::])1212                            )1213                else:1214                    start_time = '2015-01-01'1215                    QA_util_log_info(1216                        '##JOB05.{} Now Saving {} from {} to {} =={} '.format(1217                            ['1min',1218                             '5min',1219                             '15min',1220                             '30min',1221                             '60min'].index(type),1222                            str(code),1223                            start_time,1224                            end_time,1225                            type1226                        ),1227                        ui_log=ui_log1228                    )1229                    if start_time != end_time:1230                        __data = QA_fetch_get_index_min(1231                            str(code),1232                            start_time,1233                            end_time,1234                            type1235                        )1236                        if len(__data) > 1:1237                            coll.insert_many(1238                                QA_util_to_json_from_pandas(__data)1239                            )1240        except:1241            err.append(code)1242    executor = ThreadPoolExecutor(max_workers=4)1243    res = {1244        executor.submit(__saving_work,1245                        __index_list[i_],1246                        coll)1247        for i_ in range(len(__index_list))1248    }  # multi index ./.1249    count = 11250    for i_ in concurrent.futures.as_completed(res):1251        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(1252            str(float(count / len(__index_list) * 100))[0:4] + '%'1253        )1254        intLogProgress = int(float(count / len(__index_list) * 10000.0))1255        QA_util_log_info(1256            'The {} of Total {}'.format(count,1257                                        len(__index_list)),1258            ui_log=ui_log1259        )1260        QA_util_log_info(1261            strLogProgress,1262            ui_log=ui_log,1263            ui_progress=ui_progress,1264            ui_progress_int_value=intLogProgress1265        )1266        count = count + 11267    if len(err) < 1:1268        QA_util_log_info('SUCCESS', ui_log=ui_log)1269    else:1270        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)1271        QA_util_log_info(err, ui_log=ui_log)1272def QA_SU_save_single_etf_day(code : str, client=DATABASE, ui_log=None):1273    """save etf_day1274    Keyword Arguments:1275        code : single etf code1276        client {[type]} -- [description] (default: {DATABASE})1277    """1278    #__index_list = QA_fetch_get_stock_list('etf')1279    coll = client.index_day1280    coll.create_index(1281        [('code',1282          pymongo.ASCENDING),1283         ('date_stamp',1284          pymongo.ASCENDING)]1285    )1286    err = []1287    def __saving_work(code, coll):1288        try:1289            ref_ = coll.find({'code': str(code)[0:6]})1290            end_time = str(now_time())[0:10]1291            if ref_.count() > 0:1292                start_time = ref_[ref_.count() - 1]['date']1293                QA_util_log_info(1294                    '##JOB06 Now Saving ETF_DAY==== \n Trying updating {} from {} to {}'1295                        .format(code,1296                                start_time,1297                                end_time),1298                    ui_log=ui_log1299                )1300                if start_time != end_time:1301                    coll.insert_many(1302                        QA_util_to_json_from_pandas(1303                            QA_fetch_get_index_day(1304                                str(code),1305                                QA_util_get_next_day(start_time),1306                                end_time1307                            )1308                        )1309                    )1310            else:1311                start_time = '1990-01-01'1312                QA_util_log_info(1313                    '##JOB06 Now Saving ETF_DAY==== \n Trying updating {} from {} to {}'1314                        .format(code,1315                                start_time,1316                                end_time),1317                    ui_log=ui_log1318                )1319                if start_time != end_time:1320                    coll.insert_many(1321                        QA_util_to_json_from_pandas(1322                            QA_fetch_get_index_day(1323                                str(code),1324                                start_time,1325                                end_time1326                            )1327                        )1328                    )1329        except:1330            err.append(str(code))1331    __saving_work(code, coll)1332    if len(err) < 1:1333        QA_util_log_info('SUCCESS', ui_log=ui_log)1334    else:1335        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)1336        QA_util_log_info(err, ui_log=ui_log)1337def QA_SU_save_etf_day(client=DATABASE, ui_log=None, ui_progress=None):1338    """save etf_day1339    Keyword Arguments:1340        client {[type]} -- [description] (default: {DATABASE})1341    """1342    __index_list = QA_fetch_get_stock_list('etf')1343    coll = client.index_day1344    coll.create_index(1345        [('code',1346          pymongo.ASCENDING),1347         ('date_stamp',1348          pymongo.ASCENDING)]1349    )1350    err = []1351    def __saving_work(code, coll):1352        try:1353            ref_ = coll.find({'code': str(code)[0:6]})1354            end_time = str(now_time())[0:10]1355            if ref_.count() > 0:1356                start_time = ref_[ref_.count() - 1]['date']1357                QA_util_log_info(1358                    '##JOB06 Now Saving ETF_DAY==== \n Trying updating {} from {} to {}'1359                        .format(code,1360                                start_time,1361                                end_time),1362                    ui_log=ui_log1363                )1364                if start_time != end_time:1365                    coll.insert_many(1366                        QA_util_to_json_from_pandas(1367                            QA_fetch_get_index_day(1368                                str(code),1369                                QA_util_get_next_day(start_time),1370                                end_time1371                            )1372                        )1373                    )1374            else:1375                start_time = '1990-01-01'1376                QA_util_log_info(1377                    '##JOB06 Now Saving ETF_DAY==== \n Trying updating {} from {} to {}'1378                        .format(code,1379                                start_time,1380                                end_time),1381                    ui_log=ui_log1382                )1383                if start_time != end_time:1384                    coll.insert_many(1385                        QA_util_to_json_from_pandas(1386                            QA_fetch_get_index_day(1387                                str(code),1388                                start_time,1389                                end_time1390                            )1391                        )1392                    )1393        except:1394            err.append(str(code))1395    for i_ in range(len(__index_list)):1396        # __saving_work('000001')1397        QA_util_log_info(1398            'The {} of Total {}'.format(i_,1399                                        len(__index_list)),1400            ui_log=ui_log1401        )1402        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(1403            str(float(i_ / len(__index_list) * 100))[0:4] + '%'1404        )1405        intLogProgress = int(float(i_ / len(__index_list) * 10000.0))1406        QA_util_log_info(1407            strLogProgress,1408            ui_log=ui_log,1409            ui_progress=ui_progress,1410            ui_progress_int_value=intLogProgress1411        )1412        __saving_work(__index_list.index[i_][0], coll)1413    if len(err) < 1:1414        QA_util_log_info('SUCCESS', ui_log=ui_log)1415    else:1416        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)1417        QA_util_log_info(err, ui_log=ui_log)1418def QA_SU_save_etf_min(client=DATABASE, ui_log=None, ui_progress=None):1419    """save etf_min1420    Keyword Arguments:1421        client {[type]} -- [description] (default: {DATABASE})1422    """1423    __index_list = QA_fetch_get_stock_list('etf')1424    coll = client.index_min1425    coll.create_index(1426        [1427            ('code',1428             pymongo.ASCENDING),1429            ('time_stamp',1430             pymongo.ASCENDING),1431            ('date_stamp',1432             pymongo.ASCENDING)1433        ]1434    )1435    err = []1436    def __saving_work(code, coll):1437        QA_util_log_info(1438            '##JOB07 Now Saving ETF_MIN ==== {}'.format(str(code)),1439            ui_log=ui_log1440        )1441        try:1442            for type in ['1min', '5min', '15min', '30min', '60min']:1443                ref_ = coll.find({'code': str(code)[0:6], 'type': type})1444                end_time = str(now_time())[0:19]1445                if ref_.count() > 0:1446                    start_time = ref_[ref_.count() - 1]['datetime']1447                    QA_util_log_info(1448                        '##JOB07.{} Now Saving {} from {} to {} =={} '.format(1449                            ['1min',1450                             '5min',1451                             '15min',1452                             '30min',1453                             '60min'].index(type),1454                            str(code),1455                            start_time,1456                            end_time,1457                            type1458                        ),1459                        ui_log=ui_log1460                    )1461                    if start_time != end_time:1462                        __data = QA_fetch_get_index_min(1463                            str(code),1464                            start_time,1465                            end_time,1466                            type1467                        )1468                        if len(__data) > 1:1469                            coll.insert_many(1470                                QA_util_to_json_from_pandas(__data[1::])1471                            )1472                else:1473                    start_time = '2015-01-01'1474                    QA_util_log_info(1475                        '##JOB07.{} Now Saving {} from {} to {} =={} '.format(1476                            ['1min',1477                             '5min',1478                             '15min',1479                             '30min',1480                             '60min'].index(type),1481                            str(code),1482                            start_time,1483                            end_time,1484                            type1485                        ),1486                        ui_log=ui_log1487                    )1488                    if start_time != end_time:1489                        __data = QA_fetch_get_index_min(1490                            str(code),1491                            start_time,1492                            end_time,1493                            type1494                        )1495                        if len(__data) > 1:1496                            coll.insert_many(1497                                QA_util_to_json_from_pandas(__data)1498                            )1499        except:1500            err.append(code)1501    executor = ThreadPoolExecutor(max_workers=4)1502    res = {1503        executor.submit(__saving_work,1504                        __index_list.index[i_][0],1505                        coll)1506        for i_ in range(len(__index_list))1507    }  # multi index ./.1508    count = 11509    for i_ in concurrent.futures.as_completed(res):1510        QA_util_log_info(1511            'The {} of Total {}'.format(count,1512                                        len(__index_list)),1513            ui_log=ui_log1514        )1515        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(1516            str(float(count / len(__index_list) * 100))[0:4] + '%'1517        )1518        intLogProgress = int(float(count / len(__index_list) * 10000.0))1519        QA_util_log_info(1520            strLogProgress,1521            ui_log=ui_log,1522            ui_progress=ui_progress,1523            ui_progress_int_value=intLogProgress1524        )1525        count = count + 11526    if len(err) < 1:1527        QA_util_log_info('SUCCESS', ui_log=ui_log)1528    else:1529        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)1530        QA_util_log_info(err, ui_log=ui_log)1531def QA_SU_save_single_etf_min(code : str, client=DATABASE, ui_log=None, ui_progress=None):1532    """save single etf_min1533    Keyword Arguments:1534        client {[type]} -- [description] (default: {DATABASE})1535    """1536    #__index_list = QA_fetch_get_stock_list('etf')1537    __index_list = [code]1538    coll = client.index_min1539    coll.create_index(1540        [1541            ('code',1542             pymongo.ASCENDING),1543            ('time_stamp',1544             pymongo.ASCENDING),1545            ('date_stamp',1546             pymongo.ASCENDING)1547        ]1548    )1549    err = []1550    def __saving_work(code, coll):1551        QA_util_log_info(1552            '##JOB07 Now Saving ETF_MIN ==== {}'.format(str(code)),1553            ui_log=ui_log1554        )1555        try:1556            for type in ['1min', '5min', '15min', '30min', '60min']:1557                ref_ = coll.find({'code': str(code)[0:6], 'type': type})1558                end_time = str(now_time())[0:19]1559                if ref_.count() > 0:1560                    start_time = ref_[ref_.count() - 1]['datetime']1561                    QA_util_log_info(1562                        '##JOB07.{} Now Saving {} from {} to {} =={} '.format(1563                            ['1min',1564                             '5min',1565                             '15min',1566                             '30min',1567                             '60min'].index(type),1568                            str(code),1569                            start_time,1570                            end_time,1571                            type1572                        ),1573                        ui_log=ui_log1574                    )1575                    if start_time != end_time:1576                        __data = QA_fetch_get_index_min(1577                            str(code),1578                            start_time,1579                            end_time,1580                            type1581                        )1582                        if len(__data) > 1:1583                            coll.insert_many(1584                                QA_util_to_json_from_pandas(__data[1::])1585                            )1586                else:1587                    start_time = '2015-01-01'1588                    QA_util_log_info(1589                        '##JOB07.{} Now Saving {} from {} to {} =={} '.format(1590                            ['1min',1591                             '5min',1592                             '15min',1593                             '30min',1594                             '60min'].index(type),1595                            str(code),1596                            start_time,1597                            end_time,1598                            type1599                        ),1600                        ui_log=ui_log1601                    )1602                    if start_time != end_time:1603                        __data = QA_fetch_get_index_min(1604                            str(code),1605                            start_time,1606                            end_time,1607                            type1608                        )1609                        if len(__data) > 1:1610                            coll.insert_many(1611                                QA_util_to_json_from_pandas(__data)1612                            )1613        except:1614            err.append(code)1615    executor = ThreadPoolExecutor(max_workers=4)1616    res = {1617        executor.submit(__saving_work,1618                        __index_list[i_],1619                        coll)1620        for i_ in range(len(__index_list))1621    }  # multi index ./.1622    count = 11623    for i_ in concurrent.futures.as_completed(res):1624        QA_util_log_info(1625            'The {} of Total {}'.format(count,1626                                        len(__index_list)),1627            ui_log=ui_log1628        )1629        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(1630            str(float(count / len(__index_list) * 100))[0:4] + '%'1631        )1632        intLogProgress = int(float(count / len(__index_list) * 10000.0))1633        QA_util_log_info(1634            strLogProgress,1635            ui_log=ui_log,1636            ui_progress=ui_progress,1637            ui_progress_int_value=intLogProgress1638        )1639        count = count + 11640    if len(err) < 1:1641        QA_util_log_info('SUCCESS', ui_log=ui_log)1642    else:1643        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)1644        QA_util_log_info(err, ui_log=ui_log)1645def QA_SU_save_stock_list(client=DATABASE, ui_log=None, ui_progress=None):1646    """save stock_list1647    Keyword Arguments:1648        client {[type]} -- [description] (default: {DATABASE})1649    """1650    client.drop_collection('stock_list')1651    coll = client.stock_list1652    coll.create_index('code')1653    try:1654        # ð todo è¿ä¸ªåºè¯¥æ¯ç¬¬ä¸ä¸ªä»»å¡ JOB01ï¼ å
æ´æ°è¡ç¥¨å表ï¼ï¼1655        QA_util_log_info(1656            '##JOB08 Now Saving STOCK_LIST ====',1657            ui_log=ui_log,1658            ui_progress=ui_progress,1659            ui_progress_int_value=50001660        )1661        stock_list_from_tdx = QA_fetch_get_stock_list()1662        pandas_data = QA_util_to_json_from_pandas(stock_list_from_tdx)1663        coll.insert_many(pandas_data)1664        QA_util_log_info(1665            "宿è¡ç¥¨å表è·å",1666            ui_log=ui_log,1667            ui_progress=ui_progress,1668            ui_progress_int_value=100001669        )1670    except Exception as e:1671        QA_util_log_info(e, ui_log=ui_log)1672        print(" Error save_tdx.QA_SU_save_stock_list exception!")1673        pass1674def QA_SU_save_etf_list(client=DATABASE, ui_log=None, ui_progress=None):1675    """save etf_list1676    Keyword Arguments:1677        client {[type]} -- [description] (default: {DATABASE})1678    """1679    try:1680        QA_util_log_info(1681            '##JOB16 Now Saving ETF_LIST ====',1682            ui_log=ui_log,1683            ui_progress=ui_progress,1684            ui_progress_int_value=50001685        )1686        etf_list_from_tdx = QA_fetch_get_stock_list(type_="etf")1687        pandas_data = QA_util_to_json_from_pandas(etf_list_from_tdx)1688        if len(pandas_data) > 0:1689            # è·åå°æ°æ®åæè¿è¡drop collection æä½1690            client.drop_collection('etf_list')1691            coll = client.etf_list1692            coll.create_index('code')1693            coll.insert_many(pandas_data)1694        QA_util_log_info(1695            "宿ETFå表è·å",1696            ui_log=ui_log,1697            ui_progress=ui_progress,1698            ui_progress_int_value=100001699        )1700    except Exception as e:1701        QA_util_log_info(e, ui_log=ui_log)1702        print(" Error save_tdx.QA_SU_save_etf_list exception!")1703        pass1704def QA_SU_save_stock_block(client=DATABASE, ui_log=None, ui_progress=None):1705    """save stock_block1706    Keyword Arguments:1707        client {[type]} -- [description] (default: {DATABASE})1708    """1709    client.drop_collection('stock_block')1710    coll = client.stock_block1711    coll.create_index('code')1712    try:1713        QA_util_log_info(1714            '##JOB09 Now Saving STOCK_BlOCK ====',1715            ui_log=ui_log,1716            ui_progress=ui_progress,1717            ui_progress_int_value=50001718        )1719        coll.insert_many(1720            QA_util_to_json_from_pandas(QA_fetch_get_stock_block('tdx'))1721        )1722        QA_util_log_info(1723            'tdx Block ====',1724            ui_log=ui_log,1725            ui_progress=ui_progress,1726            ui_progress_int_value=50001727        )1728        # # ð todo fixhere here è·ååè±é¡ºæ¿åï¼ è¿æ¯è°ç¨tdxç1729        # coll.insert_many(1730        #     QA_util_to_json_from_pandas(QA_fetch_get_stock_block('ths'))1731        # )1732        # QA_util_log_info(1733        #     'ths Block ====',1734        #     ui_log=ui_log,1735        #     ui_progress=ui_progress,1736        #     ui_progress_int_value=80001737        # )1738        # tushare çæ¿åæ°æ®æä¸è¯500æåï¼å¢å è·åä¸è¯500æå ââé¿è´¢1739        coll.insert_many(1740            QA_util_to_json_from_pandas(QA_fetch_get_stock_block('tushare'))1741        )1742        QA_util_log_info(1743            'tushare Block ====',1744            ui_log=ui_log,1745            ui_progress=ui_progress,1746            ui_progress_int_value=90001747        )1748        QA_util_log_info(1749            '宿è¡ç¥¨æ¿åè·å=',1750            ui_log=ui_log,1751            ui_progress=ui_progress,1752            ui_progress_int_value=100001753        )1754        # coll.insert_many(1755        #     QA_util_to_json_from_pandas(QA_fetch_get_stock_block('QA'))1756        # )1757        # QA_util_log_info(1758        #     'QA_Select Block ====',1759        #     ui_log=ui_log,1760        #     ui_progress=ui_progress,1761        #     ui_progress_int_value=80001762        # )1763        QA_util_log_info(1764            '宿è¡ç¥¨æ¿åè·å=',1765            ui_log=ui_log,1766            ui_progress=ui_progress,1767            ui_progress_int_value=100001768        )1769    except Exception as e:1770        QA_util_log_info(e, ui_log=ui_log)1771        print(" Error save_tdx.QA_SU_save_stock_block exception!")1772        pass1773def QA_SU_save_stock_info(client=DATABASE, ui_log=None, ui_progress=None):1774    """save stock_info1775    Keyword Arguments:1776        client {[type]} -- [description] (default: {DATABASE})1777    """1778    client.drop_collection('stock_info')1779    stock_list = QA_fetch_get_stock_list().code.unique().tolist()1780    coll = client.stock_info1781    coll.create_index('code')1782    err = []1783    def __saving_work(code, coll):1784        QA_util_log_info(1785            '##JOB10 Now Saving STOCK INFO ==== {}'.format(str(code)),1786            ui_log=ui_log1787        )1788        try:1789            coll.insert_many(1790                QA_util_to_json_from_pandas(QA_fetch_get_stock_info(str(code)))1791            )1792        except:1793            err.append(str(code))1794    for i_ in range(len(stock_list)):1795        # __saving_work('000001')1796        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(1797            str(float(i_ / len(stock_list) * 100))[0:4] + '%'1798        )1799        intLogProgress = int(float(i_ / len(stock_list) * 10000.0))1800        QA_util_log_info('The {} of Total {}'.format(i_, len(stock_list)))1801        QA_util_log_info(1802            strLogProgress,1803            ui_log=ui_log,1804            ui_progress=ui_progress,1805            ui_progress_int_value=intLogProgress1806        )1807        __saving_work(stock_list[i_], coll)1808    if len(err) < 1:1809        QA_util_log_info('SUCCESS', ui_log=ui_log)1810    else:1811        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)1812        QA_util_log_info(err, ui_log=ui_log)1813def QA_SU_save_stock_transaction(1814        client=DATABASE,1815        ui_log=None,1816        ui_progress=None1817):1818    """save stock_transaction1819    Keyword Arguments:1820        client {[type]} -- [description] (default: {DATABASE})1821    """1822    stock_list = QA_fetch_get_stock_list().code.unique().tolist()1823    coll = client.stock_transaction1824    coll.create_index(1825        [1826            ('code',1827             pymongo.ASCENDING),1828            ('time_stamp',1829             pymongo.ASCENDING),1830            ('date_stamp',1831             pymongo.ASCENDING)1832        ]1833    )1834    err = []1835    def __saving_work(code):1836        QA_util_log_info(1837            '##JOB11 Now Saving STOCK_TRANSACTION ==== {}'.format(str(code)),1838            ui_log=ui_log1839        )1840        try:1841            coll.insert_many(1842                QA_util_to_json_from_pandas(1843                    # ð todo  str(stock_list[code]) åæ°ä¸å¯¹ï¼1844                    QA_fetch_get_stock_transaction(1845                        str(code),1846                        '2019-01-01',1847                        str(now_time())[0:10]1848                    )1849                )1850            )1851        except:1852            err.append(str(code))1853    for i_ in range(len(stock_list)):1854        # __saving_work('000001')1855        QA_util_log_info(1856            'The {} of Total {}'.format(i_,1857                                        len(stock_list)),1858            ui_log=ui_log1859        )1860        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(1861            str(float(i_ / len(stock_list) * 100))[0:4] + '%'1862        )1863        intLogProgress = int(float(i_ / len(stock_list) * 10000.0))1864        QA_util_log_info(1865            strLogProgress,1866            ui_log=ui_log,1867            ui_progress=ui_progress,1868            ui_progress_int_value=intLogProgress1869        )1870        __saving_work(stock_list[i_])1871    if len(err) < 1:1872        QA_util_log_info('SUCCESS', ui_log=ui_log)1873    else:1874        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)1875        QA_util_log_info(err, ui_log=ui_log)1876def QA_SU_save_index_transaction(1877        client=DATABASE,1878        ui_log=None,1879        ui_progress=None1880):1881    """save index_transaction1882    Keyword Arguments:1883        client {[type]} -- [description] (default: {DATABASE})1884    """1885    index_list = QA_fetch_get_index_list().code.unique().tolist()1886    coll = client.index_transaction1887    coll.create_index(1888        [1889            ('code',1890             pymongo.ASCENDING),1891            ('time_stamp',1892             pymongo.ASCENDING),1893            ('date_stamp',1894             pymongo.ASCENDING)1895        ]1896    )1897    err = []1898    def __saving_work(code):1899        QA_util_log_info(1900            '##JOB11 Now Saving INDEX_TRANSACTION ==== {}'.format(str(code)),1901            ui_log=ui_log1902        )1903        try:1904            coll.insert_many(1905                QA_util_to_json_from_pandas(1906                    # ð todo  str(stock_list[code]) åæ°ä¸å¯¹ï¼1907                    QA_fetch_get_index_transaction(1908                        str(code),1909                        '2019-01-01',1910                        str(now_time())[0:10]1911                    )1912                )1913            )1914        except:1915            err.append(str(code))1916    for i_ in range(len(index_list)):1917        # __saving_work('000001')1918        QA_util_log_info(1919            'The {} of Total {}'.format(i_,1920                                        len(index_list)),1921            ui_log=ui_log1922        )1923        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(1924            str(float(i_ / len(index_list) * 100))[0:4] + '%'1925        )1926        intLogProgress = int(float(i_ / len(index_list) * 10000.0))1927        QA_util_log_info(1928            strLogProgress,1929            ui_log=ui_log,1930            ui_progress=ui_progress,1931            ui_progress_int_value=intLogProgress1932        )1933        __saving_work(index_list[i_])1934    if len(err) < 1:1935        QA_util_log_info('SUCCESS', ui_log=ui_log)1936    else:1937        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)1938        QA_util_log_info(err, ui_log=ui_log)1939########################################################################################################1940def _save_option_commodity_ru_day(1941        client=DATABASE,1942        ui_log=None,1943        ui_progress=None1944):1945    ##################### ru å¤©ç¶æ©¡è¶ ############################################################################1946    option_ru_contract_list = QA_fetch_get_commodity_option_RU_contract_time_to_market()1947    coll_option_commodity_ru_day = client.option_commodity_ru_day1948    coll_option_commodity_ru_day.create_index(1949        [("code",1950          pymongo.ASCENDING),1951         ("date_stamp",1952          pymongo.ASCENDING)]1953    )1954    err = []1955    def __saving_work(code, coll_option_commodity_ru_day):1956        try:1957            QA_util_log_info(1958                '##JOB12 Now Saving OPTION_DAY_COMMODITY_RU å¤©ç¶æ©¡è¶ ==== {}'.format(1959                    str(code)1960                ),1961                ui_log=ui_log1962            )1963            # é¦éæ¥æ¾æ°æ®åº æ¯å¦ æ è¿ä¸ªä»£ç çæ°æ®1964            ref = coll_option_commodity_ru_day.find({'code': str(code)[0:8]})1965            end_date = str(now_time())[0:10]1966            # å½åæ°æ®åºå·²ç»å
å«äºè¿ä¸ªä»£ç çæ°æ®ï¼ ç»§ç»å¢éæ´æ°1967            # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦ææ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°1968            if ref.count() > 0:1969                # æ¥ç䏿¬¡è·åçæ¥æç»§ç»æ´æ°1970                start_date = ref[ref.count() - 1]['date']1971                QA_util_log_info(1972                    ' 䏿¬¡è·å ææru å¤©ç¶æ©¡è¶ æ¥çº¿æ°æ®çæåæ¥ææ¯ {}'.format(start_date),1973                    ui_log=ui_log1974                )1975                QA_util_log_info(1976                    'UPDATE_OPTION_RU_DAY \n ä»ä¸ä¸æ¬¡ä¸è½½æ°æ®å¼å§ç»§ç» Trying update {} from {} to {}'1977                        .format(code,1978                                start_date,1979                                end_date),1980                    ui_log=ui_log1981                )1982                if start_date != end_date:1983                    start_date0 = QA_util_get_next_day(start_date)1984                    df0 = QA_fetch_get_option_day(1985                        code=code,1986                        start_date=start_date0,1987                        end_date=end_date,1988                        frequence='day',1989                        ip=None,1990                        port=None1991                    )1992                    retCount = df0.iloc[:, 0].size1993                    QA_util_log_info(1994                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è¿åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº".format(1995                            start_date0,1996                            end_date,1997                            code,1998                            retCount1999                        ),2000                        ui_log=ui_log2001                    )2002                    coll_option_commodity_ru_day.insert_many(2003                        QA_util_to_json_from_pandas(df0)2004                    )2005                else:2006                    QA_util_log_info(2007                        "^å·²ç»è·åè¿è¿å¤©çæ°æ®äº^ {}".format(start_date),2008                        ui_log=ui_log2009                    )2010            else:2011                start_date = '1990-01-01'2012                QA_util_log_info(2013                    'UPDATE_M_OPTION_DAY \n 仿°å¼å§ä¸è½½æ°æ® Trying update {} from {} to {}'2014                        .format(code,2015                                start_date,2016                                end_date),2017                    ui_log=ui_log2018                )2019                if start_date != end_date:2020                    df0 = QA_fetch_get_option_day(2021                        code=code,2022                        start_date=start_date,2023                        end_date=end_date,2024                        frequence='day',2025                        ip=None,2026                        port=None2027                    )2028                    retCount = df0.iloc[:, 0].size2029                    QA_util_log_info(2030                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è·åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº^_^ ".format(2031                            start_date,2032                            end_date,2033                            code,2034                            retCount2035                        ),2036                        ui_log=ui_log2037                    )2038                    coll_option_commodity_ru_day.insert_many(2039                        QA_util_to_json_from_pandas(df0)2040                    )2041                else:2042                    QA_util_log_info(2043                        "*å·²ç»è·åè¿è¿å¤©çæ°æ®äº* {}".format(start_date),2044                        ui_log=ui_log2045                    )2046        except Exception as error0:2047            print(error0)2048            err.append(str(code))2049    for item in range(len(option_ru_contract_list)):2050        QA_util_log_info(2051            'The {} of Total {}'.format(item,2052                                        len(option_ru_contract_list)),2053            ui_log=ui_log2054        )2055        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(2056            str(float(item / len(option_ru_contract_list) * 100))[0:4] + '%'2057        )2058        intLogProgress = int(2059            float(item / len(option_ru_contract_list) * 10000.0)2060        )2061        QA_util_log_info(2062            strLogProgress,2063            ui_log=ui_log,2064            ui_progress=ui_progress,2065            ui_progress_int_value=intLogProgress2066        )2067        __saving_work(2068            option_ru_contract_list[item].code,2069            coll_option_commodity_ru_day2070        )2071    if len(err) < 1:2072        QA_util_log_info('SUCCESS save option ru day ^_^ ', ui_log=ui_log)2073    else:2074        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)2075        QA_util_log_info(err, ui_log=ui_log)2076def _save_option_commodity_c_day(2077        client=DATABASE,2078        ui_log=None,2079        ui_progress=None,2080):2081    ##################### c  çç±³ ############################################################################2082    option_c_contract_list = QA_fetch_get_commodity_option_C_contract_time_to_market()2083    coll_option_commodity_c_day = client.option_commodity_c_day2084    coll_option_commodity_c_day.create_index(2085        [("code",2086          pymongo.ASCENDING),2087         ("date_stamp",2088          pymongo.ASCENDING)]2089    )2090    err = []2091    def __saving_work(code, coll_option_commodity_c_day):2092        try:2093            QA_util_log_info(2094                '##JOB12 Now Saving OPTION_DAY_COMMODITY_C çç±³ ==== {}'.format(2095                    str(code)2096                ),2097                ui_log=ui_log2098            )2099            # é¦éæ¥æ¾æ°æ®åº æ¯å¦ æ è¿ä¸ªä»£ç çæ°æ®2100            ref = coll_option_commodity_c_day.find({'code': str(code)[0:8]})2101            end_date = str(now_time())[0:10]2102            # å½åæ°æ®åºå·²ç»å
å«äºè¿ä¸ªä»£ç çæ°æ®ï¼ ç»§ç»å¢éæ´æ°2103            # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦ææ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°2104            if ref.count() > 0:2105                # æ¥ç䏿¬¡è·åçæ¥æç»§ç»æ´æ°2106                start_date = ref[ref.count() - 1]['date']2107                QA_util_log_info(2108                    ' 䏿¬¡è·å çç±³C å¤©ç¶æ©¡è¶ æ¥çº¿æ°æ®çæåæ¥ææ¯ {}'.format(start_date),2109                    ui_log=ui_log2110                )2111                QA_util_log_info(2112                    'UPDATE_OPTION_C_DAY \n ä»ä¸ä¸æ¬¡ä¸è½½æ°æ®å¼å§ç»§ç» Trying update {} from {} to {}'2113                        .format(code,2114                                start_date,2115                                end_date),2116                    ui_log=ui_log2117                )2118                if start_date != end_date:2119                    start_date0 = QA_util_get_next_day(start_date)2120                    df0 = QA_fetch_get_option_day(2121                        code=code,2122                        start_date=start_date0,2123                        end_date=end_date,2124                        frequence='day',2125                        ip=None,2126                        port=None2127                    )2128                    retCount = df0.iloc[:, 0].size2129                    QA_util_log_info(2130                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è¿åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº".format(2131                            start_date0,2132                            end_date,2133                            code,2134                            retCount2135                        ),2136                        ui_log=ui_log2137                    )2138                    coll_option_commodity_c_day.insert_many(2139                        QA_util_to_json_from_pandas(df0)2140                    )2141                else:2142                    QA_util_log_info(2143                        "^å·²ç»è·åè¿è¿å¤©çæ°æ®äº^ {}".format(start_date),2144                        ui_log=ui_log2145                    )2146            else:2147                start_date = '1990-01-01'2148                QA_util_log_info(2149                    'UPDATE_C_OPTION_DAY \n 仿°å¼å§ä¸è½½æ°æ® Trying update {} from {} to {}'2150                        .format(code,2151                                start_date,2152                                end_date),2153                    ui_log=ui_log2154                )2155                if start_date != end_date:2156                    df0 = QA_fetch_get_option_day(2157                        code=code,2158                        start_date=start_date,2159                        end_date=end_date,2160                        frequence='day',2161                        ip=None,2162                        port=None2163                    )2164                    retCount = df0.iloc[:, 0].size2165                    QA_util_log_info(2166                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è·åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº^_^ ".format(2167                            start_date,2168                            end_date,2169                            code,2170                            retCount2171                        ),2172                        ui_log=ui_log2173                    )2174                    coll_option_commodity_c_day.insert_many(2175                        QA_util_to_json_from_pandas(df0)2176                    )2177                else:2178                    QA_util_log_info(2179                        "*å·²ç»è·åè¿è¿å¤©çæ°æ®äº* {}".format(start_date),2180                        ui_log=ui_log2181                    )2182        except Exception as error0:2183            print(error0)2184            err.append(str(code))2185    for item in range(len(option_c_contract_list)):2186        QA_util_log_info(2187            'The {} of Total {}'.format(item,2188                                        len(option_c_contract_list)),2189            ui_log=ui_log2190        )2191        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(2192            str(float(item / len(option_c_contract_list) * 100))[0:4] + '%'2193        )2194        intLogProgress = int(2195            float(item / len(option_c_contract_list) * 10000.0)2196        )2197        QA_util_log_info(2198            strLogProgress,2199            ui_log=ui_log,2200            ui_progress=ui_progress,2201            ui_progress_int_value=intLogProgress2202        )2203        __saving_work(2204            option_c_contract_list[item].code,2205            coll_option_commodity_c_day2206        )2207    if len(err) < 1:2208        QA_util_log_info('SUCCESS save option ru day ^_^ ', ui_log=ui_log)2209    else:2210        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)2211        QA_util_log_info(err, ui_log=ui_log)2212def _save_option_commodity_cf_day(2213        client=DATABASE,2214        ui_log=None,2215        ui_progress=None2216):2217    ##################### cf  æ£è± ############################################################################2218    option_cf_contract_list = QA_fetch_get_commodity_option_CF_contract_time_to_market()2219    coll_option_commodity_cf_day = client.option_commodity_cf_day2220    coll_option_commodity_cf_day.create_index(2221        [("code",2222          pymongo.ASCENDING),2223         ("date_stamp",2224          pymongo.ASCENDING)]2225    )2226    err = []2227    def __saving_work(code, coll_option_commodity_cf_day):2228        try:2229            QA_util_log_info(2230                '##JOB12 Now Saving OPTION_DAY_COMMODITY_CF æ£è± ==== {}'.format(2231                    str(code)2232                ),2233                ui_log=ui_log2234            )2235            # é¦éæ¥æ¾æ°æ®åº æ¯å¦ æ è¿ä¸ªä»£ç çæ°æ®2236            ref = coll_option_commodity_cf_day.find({'code': str(code)[0:8]})2237            end_date = str(now_time())[0:10]2238            # å½åæ°æ®åºå·²ç»å
å«äºè¿ä¸ªä»£ç çæ°æ®ï¼ ç»§ç»å¢éæ´æ°2239            # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦ææ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°2240            if ref.count() > 0:2241                # æ¥ç䏿¬¡è·åçæ¥æç»§ç»æ´æ°2242                start_date = ref[ref.count() - 1]['date']2243                QA_util_log_info(2244                    ' 䏿¬¡è·å ææru å¤©ç¶æ©¡è¶ æ¥çº¿æ°æ®çæåæ¥ææ¯ {}'.format(start_date),2245                    ui_log=ui_log2246                )2247                QA_util_log_info(2248                    'UPDATE_OPTION_CF_DAY \n ä»ä¸ä¸æ¬¡ä¸è½½æ°æ®å¼å§ç»§ç» Trying update {} from {} to {}'2249                        .format(code,2250                                start_date,2251                                end_date),2252                    ui_log=ui_log2253                )2254                if start_date != end_date:2255                    start_date0 = QA_util_get_next_day(start_date)2256                    df0 = QA_fetch_get_option_day(2257                        code=code,2258                        start_date=start_date0,2259                        end_date=end_date,2260                        frequence='day',2261                        ip=None,2262                        port=None2263                    )2264                    retCount = df0.iloc[:, 0].size2265                    QA_util_log_info(2266                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è¿åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº".format(2267                            start_date0,2268                            end_date,2269                            code,2270                            retCount2271                        ),2272                        ui_log=ui_log2273                    )2274                    coll_option_commodity_cf_day.insert_many(2275                        QA_util_to_json_from_pandas(df0)2276                    )2277                else:2278                    QA_util_log_info(2279                        "^å·²ç»è·åè¿è¿å¤©çæ°æ®äº^ {}".format(start_date),2280                        ui_log=ui_log2281                    )2282            else:2283                start_date = '1990-01-01'2284                QA_util_log_info(2285                    'UPDATE_M_OPTION_DAY \n 仿°å¼å§ä¸è½½æ°æ® Trying update {} from {} to {}'2286                        .format(code,2287                                start_date,2288                                end_date),2289                    ui_log=ui_log2290                )2291                if start_date != end_date:2292                    df0 = QA_fetch_get_option_day(2293                        code=code,2294                        start_date=start_date,2295                        end_date=end_date,2296                        frequence='day',2297                        ip=None,2298                        port=None2299                    )2300                    retCount = df0.iloc[:, 0].size2301                    QA_util_log_info(2302                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è·åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº^_^ ".format(2303                            start_date,2304                            end_date,2305                            code,2306                            retCount2307                        ),2308                        ui_log=ui_log2309                    )2310                    coll_option_commodity_cf_day.insert_many(2311                        QA_util_to_json_from_pandas(df0)2312                    )2313                else:2314                    QA_util_log_info(2315                        "*å·²ç»è·åè¿è¿å¤©çæ°æ®äº* {}".format(start_date),2316                        ui_log=ui_log2317                    )2318        except Exception as error0:2319            print(error0)2320            err.append(str(code))2321    for item in range(len(option_cf_contract_list)):2322        QA_util_log_info(2323            'The {} of Total {}'.format(item,2324                                        len(option_cf_contract_list)),2325            ui_log=ui_log2326        )2327        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(2328            str(float(item / len(option_cf_contract_list) * 100))[0:4] + '%'2329        )2330        intLogProgress = int(2331            float(item / len(option_cf_contract_list) * 10000.0)2332        )2333        QA_util_log_info(2334            strLogProgress,2335            ui_log=ui_log,2336            ui_progress=ui_progress,2337            ui_progress_int_value=intLogProgress2338        )2339        __saving_work(2340            option_cf_contract_list[item].code,2341            coll_option_commodity_cf_day2342        )2343    if len(err) < 1:2344        QA_util_log_info('SUCCESS save option ru day ^_^ ', ui_log=ui_log)2345    else:2346        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)2347        QA_util_log_info(err, ui_log=ui_log)2348def _save_option_commodity_sr_day(2349        client=DATABASE,2350        ui_log=None,2351        ui_progress=None2352):2353    ##################### sr ç½ç³ ############################################################################2354    option_sr_contract_list = QA_fetch_get_commodity_option_SR_contract_time_to_market(2355    )2356    coll_option_commodity_sr_day = client.option_commodity_sr_day2357    coll_option_commodity_sr_day.create_index(2358        [("code",2359          pymongo.ASCENDING),2360         ("date_stamp",2361          pymongo.ASCENDING)]2362    )2363    err = []2364    def __saving_work(code, coll_option_commodity_sr_day):2365        try:2366            QA_util_log_info(2367                '##JOB12 Now Saving OPTION_DAY_COMMODITY_SR ç½ç³ ==== {}'.format(2368                    str(code)2369                ),2370                ui_log=ui_log2371            )2372            # é¦éæ¥æ¾æ°æ®åº æ¯å¦ æ è¿ä¸ªä»£ç çæ°æ®2373            ref = coll_option_commodity_sr_day.find({'code': str(code)[0:8]})2374            end_date = str(now_time())[0:10]2375            # å½åæ°æ®åºå·²ç»å
å«äºè¿ä¸ªä»£ç çæ°æ®ï¼ ç»§ç»å¢éæ´æ°2376            # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦ææ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°2377            if ref.count() > 0:2378                # æ¥ç䏿¬¡è·åçæ¥æç»§ç»æ´æ°2379                start_date = ref[ref.count() - 1]['date']2380                QA_util_log_info(2381                    ' 䏿¬¡è·åææsrç½ç³æ¥çº¿æ°æ®çæåæ¥ææ¯ {}'.format(start_date),2382                    ui_log=ui_log2383                )2384                QA_util_log_info(2385                    'UPDATE_OPTION_M_DAY \n ä»ä¸ä¸æ¬¡ä¸è½½æ°æ®å¼å§ç»§ç» Trying update {} from {} to {}'2386                        .format(code,2387                                start_date,2388                                end_date),2389                    ui_log=ui_log2390                )2391                if start_date != end_date:2392                    start_date0 = QA_util_get_next_day(start_date)2393                    df0 = QA_fetch_get_option_day(2394                        code=code,2395                        start_date=start_date0,2396                        end_date=end_date,2397                        frequence='day',2398                        ip=None,2399                        port=None2400                    )2401                    retCount = df0.iloc[:, 0].size2402                    QA_util_log_info(2403                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è¿åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº".format(2404                            start_date0,2405                            end_date,2406                            code,2407                            retCount2408                        ),2409                        ui_log=ui_log2410                    )2411                    coll_option_commodity_sr_day.insert_many(2412                        QA_util_to_json_from_pandas(df0)2413                    )2414                else:2415                    QA_util_log_info(2416                        "^å·²ç»è·åè¿è¿å¤©çæ°æ®äº^ {}".format(start_date),2417                        ui_log=ui_log2418                    )2419            else:2420                start_date = '1990-01-01'2421                QA_util_log_info(2422                    'UPDATE_M_OPTION_DAY \n 仿°å¼å§ä¸è½½æ°æ® Trying update {} from {} to {}'2423                        .format(code,2424                                start_date,2425                                end_date),2426                    ui_log=ui_log2427                )2428                if start_date != end_date:2429                    df0 = QA_fetch_get_option_day(2430                        code=code,2431                        start_date=start_date,2432                        end_date=end_date,2433                        frequence='day',2434                        ip=None,2435                        port=None2436                    )2437                    retCount = df0.iloc[:, 0].size2438                    QA_util_log_info(2439                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è·åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº^_^ ".format(2440                            start_date,2441                            end_date,2442                            code,2443                            retCount2444                        ),2445                        ui_log=ui_log2446                    )2447                    coll_option_commodity_sr_day.insert_many(2448                        QA_util_to_json_from_pandas(df0)2449                    )2450                else:2451                    QA_util_log_info(2452                        "*å·²ç»è·åè¿è¿å¤©çæ°æ®äº* {}".format(start_date),2453                        ui_log=ui_log2454                    )2455        except Exception as error0:2456            print(error0)2457            err.append(str(code))2458    for item in range(len(option_sr_contract_list)):2459        QA_util_log_info(2460            'The {} of Total {}'.format(item,2461                                        len(option_sr_contract_list)),2462            ui_log=ui_log2463        )2464        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(2465            str(float(item / len(option_sr_contract_list) * 100))[0:4] + '%'2466        )2467        intLogProgress = int(2468            float(item / len(option_sr_contract_list) * 10000.0)2469        )2470        QA_util_log_info(2471            strLogProgress,2472            ui_log=ui_log,2473            ui_progress=ui_progress,2474            ui_progress_int_value=intLogProgress2475        )2476        __saving_work(2477            option_sr_contract_list[item].code,2478            coll_option_commodity_sr_day2479        )2480    if len(err) < 1:2481        QA_util_log_info('SUCCESS save option sr day ^_^ ', ui_log=ui_log)2482    else:2483        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)2484        QA_util_log_info(err, ui_log=ui_log)2485def _save_option_commodity_m_day(2486        client=DATABASE,2487        ui_log=None,2488        ui_progress=None2489):2490    ##################### M è±ç² ############################################################################2491    option_m_contract_list = QA_fetch_get_commodity_option_M_contract_time_to_market(2492    )2493    coll_option_commodity_m_day = client.option_commodity_m_day2494    coll_option_commodity_m_day.create_index(2495        [("code",2496          pymongo.ASCENDING),2497         ("date_stamp",2498          pymongo.ASCENDING)]2499    )2500    err = []2501    def __saving_work(code, coll_option_commodity_m_day):2502        try:2503            QA_util_log_info(2504                '##JOB12 Now Saving OPTION_DAY_COMMODITY_M è±ç² ==== {}'.format(2505                    str(code)2506                ),2507                ui_log=ui_log2508            )2509            # é¦éæ¥æ¾æ°æ®åº æ¯å¦ æ è¿ä¸ªä»£ç çæ°æ®2510            # M XXXXXX ç¼ç æ ¼å¼2511            ref = coll_option_commodity_m_day.find({'code': str(code)[0:8]})2512            end_date = str(now_time())[0:10]2513            # å½åæ°æ®åºå·²ç»å
å«äºè¿ä¸ªä»£ç çæ°æ®ï¼ ç»§ç»å¢éæ´æ°2514            # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦ææ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°2515            if ref.count() > 0:2516                # æ¥ç䏿¬¡è·åçæ¥æç»§ç»æ´æ°2517                start_date = ref[ref.count() - 1]['date']2518                QA_util_log_info(2519                    ' 䏿¬¡è·åææMè±ç²æ¥çº¿æ°æ®çæåæ¥ææ¯ {}'.format(start_date),2520                    ui_log=ui_log2521                )2522                QA_util_log_info(2523                    'UPDATE_OPTION_M_DAY \n ä»ä¸ä¸æ¬¡ä¸è½½æ°æ®å¼å§ç»§ç» Trying update {} from {} to {}'2524                        .format(code,2525                                start_date,2526                                end_date),2527                    ui_log=ui_log2528                )2529                if start_date != end_date:2530                    start_date0 = QA_util_get_next_day(start_date)2531                    df0 = QA_fetch_get_option_day(2532                        code=code,2533                        start_date=start_date0,2534                        end_date=end_date,2535                        frequence='day',2536                        ip=None,2537                        port=None2538                    )2539                    retCount = df0.iloc[:, 0].size2540                    QA_util_log_info(2541                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è¿åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº".format(2542                            start_date0,2543                            end_date,2544                            code,2545                            retCount2546                        ),2547                        ui_log=ui_log2548                    )2549                    coll_option_commodity_m_day.insert_many(2550                        QA_util_to_json_from_pandas(df0)2551                    )2552                else:2553                    QA_util_log_info(2554                        "^å·²ç»è·åè¿è¿å¤©çæ°æ®äº^ {}".format(start_date),2555                        ui_log=ui_log2556                    )2557            else:2558                start_date = '1990-01-01'2559                QA_util_log_info(2560                    'UPDATE_M_OPTION_DAY \n 仿°å¼å§ä¸è½½æ°æ® Trying update {} from {} to {}'2561                        .format(code,2562                                start_date,2563                                end_date),2564                    ui_log=ui_log2565                )2566                if start_date != end_date:2567                    df0 = QA_fetch_get_option_day(2568                        code=code,2569                        start_date=start_date,2570                        end_date=end_date,2571                        frequence='day',2572                        ip=None,2573                        port=None2574                    )2575                    retCount = df0.iloc[:, 0].size2576                    QA_util_log_info(2577                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è·åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº^_^ ".format(2578                            start_date,2579                            end_date,2580                            code,2581                            retCount2582                        ),2583                        ui_log=ui_log2584                    )2585                    coll_option_commodity_m_day.insert_many(2586                        QA_util_to_json_from_pandas(df0)2587                    )2588                else:2589                    QA_util_log_info(2590                        "*å·²ç»è·åè¿è¿å¤©çæ°æ®äº* {}".format(start_date),2591                        ui_log=ui_log2592                    )2593        except Exception as error0:2594            print(error0)2595            err.append(str(code))2596    for item in range(len(option_m_contract_list)):2597        QA_util_log_info(2598            'The {} of Total {}'.format(item,2599                                        len(option_m_contract_list)),2600            ui_log=ui_log2601        )2602        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(2603            str(float(item / len(option_m_contract_list) * 100))[0:4] + '%'2604        )2605        intLogProgress = int(2606            float(item / len(option_m_contract_list) * 10000.0)2607        )2608        QA_util_log_info(2609            strLogProgress,2610            ui_log=ui_log,2611            ui_progress=ui_progress,2612            ui_progress_int_value=intLogProgress2613        )2614        __saving_work(2615            option_m_contract_list[item].code,2616            coll_option_commodity_m_day2617        )2618    if len(err) < 1:2619        QA_util_log_info('SUCCESS save option m day ^_^ ', ui_log=ui_log)2620    else:2621        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)2622        QA_util_log_info(err, ui_log=ui_log)2623def _save_option_commodity_al_day(client=DATABASE,ui_log=None,ui_progress=None):2624    ##################### Al é ############################################################################2625    option_al_contract_list = QA_fetch_get_commodity_option_AL_contract_time_to_market()2626    coll_option_commodity_al_day = client.option_commodity_al_day2627    coll_option_commodity_al_day.create_index(2628        [("code",2629          pymongo.ASCENDING),2630         ("date_stamp",2631          pymongo.ASCENDING)]2632    )2633    err = []2634    def __saving_work(code, coll_option_commodity_al_day):2635        try:2636            QA_util_log_info(2637                '##JOB13 Now Saving OPTION_DAY_COMMODITY_AL é ==== {}'.format(2638                    str(code)2639                ),2640                ui_log=ui_log2641            )2642            # é¦éæ¥æ¾æ°æ®åº æ¯å¦ æ è¿ä¸ªä»£ç çæ°æ®2643            # ææä»£ç  ä» 10000001 å¼å§ç¼ç   100012282644            ref = coll_option_commodity_al_day.find({'code': str(code)[0:8]})2645            end_date = str(now_time())[0:10]2646            # å½åæ°æ®åºå·²ç»å
å«äºè¿ä¸ªä»£ç çæ°æ®ï¼ ç»§ç»å¢éæ´æ°2647            # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦ææ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°2648            if ref.count() > 0:2649                # æ¥ç䏿¬¡è·åçæ¥æç»§ç»æ´æ°2650                start_date = ref[ref.count() - 1]['date']2651                QA_util_log_info(2652                    ' 䏿¬¡è·åææAUæ¥çº¿æ°æ®çæåæ¥ææ¯ {}'.format(start_date),2653                    ui_log=ui_log2654                )2655                QA_util_log_info(2656                    'UPDATE_OPTION_AU_DAY \n ä»ä¸ä¸æ¬¡ä¸è½½æ°æ®å¼å§ç»§ç» Trying update {} from {} to {}'2657                        .format(code,2658                                start_date,2659                                end_date),2660                    ui_log=ui_log2661                )2662                if start_date != end_date:2663                    start_date0 = QA_util_get_next_day(start_date)2664                    df0 = QA_fetch_get_option_day(2665                        code=code,2666                        start_date=start_date0,2667                        end_date=end_date,2668                        frequence='day',2669                        ip=None,2670                        port=None2671                    )2672                    retCount = df0.iloc[:, 0].size2673                    QA_util_log_info(2674                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è¿åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº".format(2675                            start_date0,2676                            end_date,2677                            code,2678                            retCount2679                        ),2680                        ui_log=ui_log2681                    )2682                    coll_option_commodity_al_day.insert_many(2683                        QA_util_to_json_from_pandas(df0)2684                    )2685                else:2686                    QA_util_log_info(2687                        "^å·²ç»è·åè¿è¿å¤©çæ°æ®äº^ {}".format(start_date),2688                        ui_log=ui_log2689                    )2690            else:2691                start_date = '1990-01-01'2692                QA_util_log_info(2693                    'UPDATE_AU_OPTION_DAY \n 仿°å¼å§ä¸è½½æ°æ® Trying update {} from {} to {}'2694                        .format(code,2695                                start_date,2696                                end_date),2697                    ui_log=ui_log2698                )2699                if start_date != end_date:2700                    df0 = QA_fetch_get_option_day(2701                        code=code,2702                        start_date=start_date,2703                        end_date=end_date,2704                        frequence='day',2705                        ip=None,2706                        port=None2707                    )2708                    retCount = df0.iloc[:, 0].size2709                    QA_util_log_info(2710                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è·åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº^_^ ".format(2711                            start_date,2712                            end_date,2713                            code,2714                            retCount2715                        ),2716                        ui_log=ui_log2717                    )2718                    coll_option_commodity_al_day.insert_many(2719                        QA_util_to_json_from_pandas(df0)2720                    )2721                else:2722                    QA_util_log_info(2723                        "*å·²ç»è·åè¿è¿å¤©çæ°æ®äº* {}".format(start_date),2724                        ui_log=ui_log2725                    )2726        except Exception as error0:2727            print(error0)2728            err.append(str(code))2729    for item in range(len(option_al_contract_list)):2730        QA_util_log_info(2731            'The {} of Total {}'.format(item, len(option_al_contract_list)),2732            ui_log=ui_log2733        )2734        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(2735            str(float(item / len(option_al_contract_list) * 100))[0:4] + '%'2736        )2737        intLogProgress = int(2738            float(item / len(option_al_contract_list) * 10000.0)2739        )2740        QA_util_log_info(2741            strLogProgress,2742            ui_log=ui_log,2743            ui_progress=ui_progress,2744            ui_progress_int_value=intLogProgress2745        )2746        __saving_work(2747            option_al_contract_list[item].code,2748            coll_option_commodity_al_day2749        )2750    if len(err) < 1:2751        QA_util_log_info('SUCCESS save option au day ^_^ ', ui_log=ui_log)2752    else:2753        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)2754        QA_util_log_info(err, ui_log=ui_log)2755def _save_option_commodity_cu_day(2756        client=DATABASE,2757        ui_log=None,2758        ui_progress=None2759):2760    ##################### CU é ############################################################################2761    option_cu_contract_list = QA_fetch_get_commodity_option_CU_contract_time_to_market(2762    )2763    coll_option_commodity_cu_day = client.option_commodity_cu_day2764    coll_option_commodity_cu_day.create_index(2765        [("code",2766          pymongo.ASCENDING),2767         ("date_stamp",2768          pymongo.ASCENDING)]2769    )2770    err = []2771    def __saving_work(code, coll_option_commodity_cu_day):2772        try:2773            QA_util_log_info(2774                '##JOB12 Now Saving OPTION_DAY_COMMODITY_CU é ==== {}'.format(2775                    str(code)2776                ),2777                ui_log=ui_log2778            )2779            # é¦éæ¥æ¾æ°æ®åº æ¯å¦ æ è¿ä¸ªä»£ç çæ°æ®2780            # ææä»£ç  ä» 10000001 å¼å§ç¼ç   100012282781            ref = coll_option_commodity_cu_day.find({'code': str(code)[0:8]})2782            end_date = str(now_time())[0:10]2783            # å½åæ°æ®åºå·²ç»å
å«äºè¿ä¸ªä»£ç çæ°æ®ï¼ ç»§ç»å¢éæ´æ°2784            # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦ææ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°2785            if ref.count() > 0:2786                # æ¥ç䏿¬¡è·åçæ¥æç»§ç»æ´æ°2787                start_date = ref[ref.count() - 1]['date']2788                QA_util_log_info(2789                    ' 䏿¬¡è·åææCUæ¥çº¿æ°æ®çæåæ¥ææ¯ {}'.format(start_date),2790                    ui_log=ui_log2791                )2792                QA_util_log_info(2793                    'UPDATE_OPTION_CU_DAY \n ä»ä¸ä¸æ¬¡ä¸è½½æ°æ®å¼å§ç»§ç» Trying update {} from {} to {}'2794                        .format(code,2795                                start_date,2796                                end_date),2797                    ui_log=ui_log2798                )2799                if start_date != end_date:2800                    start_date0 = QA_util_get_next_day(start_date)2801                    df0 = QA_fetch_get_option_day(2802                        code=code,2803                        start_date=start_date0,2804                        end_date=end_date,2805                        frequence='day',2806                        ip=None,2807                        port=None2808                    )2809                    retCount = df0.iloc[:, 0].size2810                    QA_util_log_info(2811                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è¿åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº".format(2812                            start_date0,2813                            end_date,2814                            code,2815                            retCount2816                        ),2817                        ui_log=ui_log2818                    )2819                    coll_option_commodity_cu_day.insert_many(2820                        QA_util_to_json_from_pandas(df0)2821                    )2822                else:2823                    QA_util_log_info(2824                        "^å·²ç»è·åè¿è¿å¤©çæ°æ®äº^ {}".format(start_date),2825                        ui_log=ui_log2826                    )2827            else:2828                start_date = '1990-01-01'2829                QA_util_log_info(2830                    'UPDATE_CU_OPTION_DAY \n 仿°å¼å§ä¸è½½æ°æ® Trying update {} from {} to {}'2831                        .format(code,2832                                start_date,2833                                end_date),2834                    ui_log=ui_log2835                )2836                if start_date != end_date:2837                    df0 = QA_fetch_get_option_day(2838                        code=code,2839                        start_date=start_date,2840                        end_date=end_date,2841                        frequence='day',2842                        ip=None,2843                        port=None2844                    )2845                    retCount = df0.iloc[:, 0].size2846                    QA_util_log_info(2847                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è·åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº^_^ ".format(2848                            start_date,2849                            end_date,2850                            code,2851                            retCount2852                        ),2853                        ui_log=ui_log2854                    )2855                    coll_option_commodity_cu_day.insert_many(2856                        QA_util_to_json_from_pandas(df0)2857                    )2858                else:2859                    QA_util_log_info(2860                        "*å·²ç»è·åè¿è¿å¤©çæ°æ®äº* {}".format(start_date),2861                        ui_log=ui_log2862                    )2863        except Exception as error0:2864            print(error0)2865            err.append(str(code))2866    for item in range(len(option_cu_contract_list)):2867        QA_util_log_info(2868            'The {} of Total {}'.format(item,2869                                        len(option_cu_contract_list)),2870            ui_log=ui_log2871        )2872        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(2873            str(float(item / len(option_cu_contract_list) * 100))[0:4] + '%'2874        )2875        intLogProgress = int(2876            float(item / len(option_cu_contract_list) * 10000.0)2877        )2878        QA_util_log_info(2879            strLogProgress,2880            ui_log=ui_log,2881            ui_progress=ui_progress,2882            ui_progress_int_value=intLogProgress2883        )2884        __saving_work(2885            option_cu_contract_list[item].code,2886            coll_option_commodity_cu_day2887        )2888    if len(err) < 1:2889        QA_util_log_info('SUCCESS save option cu day ^_^ ', ui_log=ui_log)2890    else:2891        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)2892        QA_util_log_info(err, ui_log=ui_log)2893def _save_option_commodity_au_day(client=DATABASE,ui_log=None,ui_progress=None):2894    ##################### Au é ############################################################################2895    option_au_contract_list = QA_fetch_get_commodity_option_AU_contract_time_to_market()2896    coll_option_commodity_au_day = client.option_commodity_au_day2897    coll_option_commodity_au_day.create_index(2898        [("code",2899          pymongo.ASCENDING),2900         ("date_stamp",2901          pymongo.ASCENDING)]2902    )2903    err = []2904    def __saving_work(code, coll_option_commodity_au_day):2905        try:2906            QA_util_log_info(2907                '##JOB13 Now Saving OPTION_DAY_COMMODITY_AU é ==== {}'.format(2908                    str(code)2909                ),2910                ui_log=ui_log2911            )2912            # é¦éæ¥æ¾æ°æ®åº æ¯å¦ æ è¿ä¸ªä»£ç çæ°æ®2913            # ææä»£ç  ä» 10000001 å¼å§ç¼ç   100012282914            ref = coll_option_commodity_au_day.find({'code': str(code)[0:8]})2915            end_date = str(now_time())[0:10]2916            # å½åæ°æ®åºå·²ç»å
å«äºè¿ä¸ªä»£ç çæ°æ®ï¼ ç»§ç»å¢éæ´æ°2917            # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦ææ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°2918            if ref.count() > 0:2919                # æ¥ç䏿¬¡è·åçæ¥æç»§ç»æ´æ°2920                start_date = ref[ref.count() - 1]['date']2921                QA_util_log_info(2922                    ' 䏿¬¡è·åææAUæ¥çº¿æ°æ®çæåæ¥ææ¯ {}'.format(start_date),2923                    ui_log=ui_log2924                )2925                QA_util_log_info(2926                    'UPDATE_OPTION_AU_DAY \n ä»ä¸ä¸æ¬¡ä¸è½½æ°æ®å¼å§ç»§ç» Trying update {} from {} to {}'2927                        .format(code,2928                                start_date,2929                                end_date),2930                    ui_log=ui_log2931                )2932                if start_date != end_date:2933                    start_date0 = QA_util_get_next_day(start_date)2934                    df0 = QA_fetch_get_option_day(2935                        code=code,2936                        start_date=start_date0,2937                        end_date=end_date,2938                        frequence='day',2939                        ip=None,2940                        port=None2941                    )2942                    retCount = df0.iloc[:, 0].size2943                    QA_util_log_info(2944                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è¿åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº".format(2945                            start_date0,2946                            end_date,2947                            code,2948                            retCount2949                        ),2950                        ui_log=ui_log2951                    )2952                    coll_option_commodity_au_day.insert_many(2953                        QA_util_to_json_from_pandas(df0)2954                    )2955                else:2956                    QA_util_log_info(2957                        "^å·²ç»è·åè¿è¿å¤©çæ°æ®äº^ {}".format(start_date),2958                        ui_log=ui_log2959                    )2960            else:2961                start_date = '1990-01-01'2962                QA_util_log_info(2963                    'UPDATE_AU_OPTION_DAY \n 仿°å¼å§ä¸è½½æ°æ® Trying update {} from {} to {}'2964                        .format(code,2965                                start_date,2966                                end_date),2967                    ui_log=ui_log2968                )2969                if start_date != end_date:2970                    df0 = QA_fetch_get_option_day(2971                        code=code,2972                        start_date=start_date,2973                        end_date=end_date,2974                        frequence='day',2975                        ip=None,2976                        port=None2977                    )2978                    retCount = df0.iloc[:, 0].size2979                    QA_util_log_info(2980                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è·åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº^_^ ".format(2981                            start_date,2982                            end_date,2983                            code,2984                            retCount2985                        ),2986                        ui_log=ui_log2987                    )2988                    coll_option_commodity_au_day.insert_many(2989                        QA_util_to_json_from_pandas(df0)2990                    )2991                else:2992                    QA_util_log_info(2993                        "*å·²ç»è·åè¿è¿å¤©çæ°æ®äº* {}".format(start_date),2994                        ui_log=ui_log2995                    )2996        except Exception as error0:2997            print(error0)2998            err.append(str(code))2999    for item in range(len(option_au_contract_list)):3000        QA_util_log_info(3001            'The {} of Total {}'.format(item,3002                                        len(option_au_contract_list)),3003            ui_log=ui_log3004        )3005        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(3006            str(float(item / len(option_au_contract_list) * 100))[0:4] + '%'3007        )3008        intLogProgress = int(3009            float(item / len(option_au_contract_list) * 10000.0)3010        )3011        QA_util_log_info(3012            strLogProgress,3013            ui_log=ui_log,3014            ui_progress=ui_progress,3015            ui_progress_int_value=intLogProgress3016        )3017        __saving_work(3018            option_au_contract_list[item].code,3019            coll_option_commodity_au_day3020        )3021    if len(err) < 1:3022        QA_util_log_info('SUCCESS save option au day ^_^ ', ui_log=ui_log)3023    else:3024        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)3025        QA_util_log_info(err, ui_log=ui_log)3026def QA_SU_save_option_commodity_day(3027        client=DATABASE,3028        ui_log=None,3029        ui_progress=None3030):3031    '''3032        :param client:3033        :return:3034    '''3035    _save_option_commodity_cu_day(3036        client=client,3037        ui_log=ui_log,3038        ui_progress=ui_progress,3039    )3040    _save_option_commodity_m_day(3041        client=client,3042        ui_log=ui_log,3043        ui_progress=ui_progress3044    )3045    _save_option_commodity_sr_day(3046        client=client,3047        ui_log=ui_log,3048        ui_progress=ui_progress3049    )3050    _save_option_commodity_ru_day(3051        client=client,3052        ui_log=ui_log,3053        ui_progress=ui_progress3054    )3055    _save_option_commodity_cf_day(3056        client=client,3057        ui_log=ui_log,3058        ui_progress=ui_progress3059    )3060    _save_option_commodity_c_day(3061        client=client,3062        ui_log=ui_log,3063        ui_progress=ui_progress3064    )3065    _save_option_commodity_au_day(3066        client=client,3067        ui_log=ui_log,3068        ui_progress=ui_progress3069    )3070    _save_option_commodity_al_day(3071        client=client,3072        ui_log=ui_log,3073        ui_progress=ui_progress3074    )3075'''3076ææåé线3077todo: 代ç éè¦éæ ï¼ æéå¤ç代ç åå¹¶å¨ä¸èµ·3078'''3079def _save_option_commodity_ru_min(3080        client=DATABASE,3081        ui_log=None,3082        ui_progress=None3083):3084    '''3085    :param client:3086    :param ui_log:3087    :param ui_progress:3088    :return:3089    '''3090    '''3091        :param client:3092        :return:3093        '''3094    option_contract_list = QA_fetch_get_commodity_option_C_contract_time_to_market()3095    coll_option_min = client.option_commodity_ru_min3096    coll_option_min.create_index(3097        [("code",3098          pymongo.ASCENDING),3099         ("date_stamp",3100          pymongo.ASCENDING)]3101    )3102    err = []3103    # ç´¢å¼ code3104    err = []3105    def __saving_work(code, coll):3106        QA_util_log_info(3107            '##JOB13 Now Saving Option RU æ£è± MIN ==== {}'.format(str(code)),3108            ui_log=ui_log3109        )3110        try:3111            for type in ['1min', '5min', '15min', '30min', '60min']:3112                ref_ = coll.find({'code': str(code)[0:8], 'type': type})3113                end_time = str(now_time())[0:19]3114                if ref_.count() > 0:3115                    start_time = ref_[ref_.count() - 1]['datetime']3116                    QA_util_log_info(3117                        '##JOB13.{} Now Saving Option RU å¤©ç¶æ©¡è¶ {} from {} to {} =={} '3118                            .format(3119                            ['1min',3120                             '5min',3121                             '15min',3122                             '30min',3123                             '60min'].index(type),3124                            str(code),3125                            start_time,3126                            end_time,3127                            type3128                        ),3129                        ui_log=ui_log3130                    )3131                    if start_time != end_time:3132                        __data = QA_fetch_get_future_min(3133                            str(code),3134                            start_time,3135                            end_time,3136                            type3137                        )3138                        if len(__data) > 1:3139                            QA_util_log_info(3140                                " åå
¥ æ°å¢åå²åçº¦è®°å½æ° {} ".format(len(__data))3141                            )3142                            coll.insert_many(3143                                QA_util_to_json_from_pandas(__data[1::])3144                            )3145                else:3146                    start_time = '2015-01-01'3147                    QA_util_log_info(3148                        '##JOB13.{} Now Option RU å¤©ç¶æ©¡è¶ {} from {} to {} =={} '3149                            .format(3150                            ['1min',3151                             '5min',3152                             '15min',3153                             '30min',3154                             '60min'].index(type),3155                            str(code),3156                            start_time,3157                            end_time,3158                            type3159                        ),3160                        ui_log=ui_log3161                    )3162                    if start_time != end_time:3163                        __data = QA_fetch_get_future_min(3164                            str(code),3165                            start_time,3166                            end_time,3167                            type3168                        )3169                        if len(__data) > 1:3170                            QA_util_log_info(3171                                " åå
¥ æ°å¢åçº¦è®°å½æ° {} ".format(len(__data))3172                            )3173                            coll.insert_many(3174                                QA_util_to_json_from_pandas(__data)3175                            )3176        except:3177            err.append(code)3178    executor = ThreadPoolExecutor(max_workers=4)3179    res = {3180        executor.submit(3181            __saving_work,3182            option_contract_list[i_]["code"],3183            coll_option_min3184        )3185        for i_ in range(len(option_contract_list))3186    }  # multi index ./.3187    count = 03188    for i_ in concurrent.futures.as_completed(res):3189        QA_util_log_info(3190            'The {} of Total {}'.format(count,3191                                        len(option_contract_list)),3192            ui_log=ui_log3193        )3194        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(3195            str(float(count / len(option_contract_list) * 100))[0:4] + '%'3196        )3197        intLogProgress = int(float(count / len(option_contract_list) * 10000.0))3198        QA_util_log_info(3199            strLogProgress,3200            ui_log=ui_log,3201            ui_progress=ui_progress,3202            ui_progress_int_value=intLogProgress3203        )3204        count = count + 13205    if len(err) < 1:3206        QA_util_log_info('SUCCESS', ui_log=ui_log)3207    else:3208        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)3209        QA_util_log_info(err, ui_log=ui_log)3210    pass3211def _save_option_commodity_c_min(3212        client=DATABASE,3213        ui_log=None,3214        ui_progress=None3215):3216    '''3217    :param client:3218    :param ui_log:3219    :param ui_progress:3220    :return:3221    '''3222    '''3223        :param client:3224        :return:3225        '''3226    option_contract_list = QA_fetch_get_commodity_option_C_contract_time_to_market()3227    coll_option_min = client.option_commodity_c_min3228    coll_option_min.create_index(3229        [("code",3230          pymongo.ASCENDING),3231         ("date_stamp",3232          pymongo.ASCENDING)]3233    )3234    err = []3235    # ç´¢å¼ code3236    err = []3237    def __saving_work(code, coll):3238        QA_util_log_info(3239            '##JOB13 Now Saving Option C çç±³ MIN ==== {}'.format(str(code)),3240            ui_log=ui_log3241        )3242        try:3243            for type in ['1min', '5min', '15min', '30min', '60min']:3244                ref_ = coll.find({'code': str(code)[0:8], 'type': type})3245                end_time = str(now_time())[0:19]3246                if ref_.count() > 0:3247                    start_time = ref_[ref_.count() - 1]['datetime']3248                    QA_util_log_info(3249                        '##JOB13.{} Now Saving Option C çç±³ {} from {} to {} =={} '3250                            .format(3251                            ['1min',3252                             '5min',3253                             '15min',3254                             '30min',3255                             '60min'].index(type),3256                            str(code),3257                            start_time,3258                            end_time,3259                            type3260                        ),3261                        ui_log=ui_log3262                    )3263                    if start_time != end_time:3264                        __data = QA_fetch_get_future_min(3265                            str(code),3266                            start_time,3267                            end_time,3268                            type3269                        )3270                        if len(__data) > 1:3271                            QA_util_log_info(3272                                " åå
¥ æ°å¢åå²åçº¦è®°å½æ° {} ".format(len(__data))3273                            )3274                            coll.insert_many(3275                                QA_util_to_json_from_pandas(__data[1::])3276                            )3277                else:3278                    start_time = '2015-01-01'3279                    QA_util_log_info(3280                        '##JOB13.{} Now Option C çç±³ {} from {} to {} =={} '3281                            .format(3282                            ['1min',3283                             '5min',3284                             '15min',3285                             '30min',3286                             '60min'].index(type),3287                            str(code),3288                            start_time,3289                            end_time,3290                            type3291                        ),3292                        ui_log=ui_log3293                    )3294                    if start_time != end_time:3295                        __data = QA_fetch_get_future_min(3296                            str(code),3297                            start_time,3298                            end_time,3299                            type3300                        )3301                        if len(__data) > 1:3302                            QA_util_log_info(3303                                " åå
¥ æ°å¢åçº¦è®°å½æ° {} ".format(len(__data))3304                            )3305                            coll.insert_many(3306                                QA_util_to_json_from_pandas(__data)3307                            )3308        except:3309            err.append(code)3310    executor = ThreadPoolExecutor(max_workers=4)3311    res = {3312        executor.submit(3313            __saving_work,3314            option_contract_list[i_]["code"],3315            coll_option_min3316        )3317        for i_ in range(len(option_contract_list))3318    }  # multi index ./.3319    count = 03320    for i_ in concurrent.futures.as_completed(res):3321        QA_util_log_info(3322            'The {} of Total {}'.format(count,3323                                        len(option_contract_list)),3324            ui_log=ui_log3325        )3326        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(3327            str(float(count / len(option_contract_list) * 100))[0:4] + '%'3328        )3329        intLogProgress = int(float(count / len(option_contract_list) * 10000.0))3330        QA_util_log_info(3331            strLogProgress,3332            ui_log=ui_log,3333            ui_progress=ui_progress,3334            ui_progress_int_value=intLogProgress3335        )3336        count = count + 13337    if len(err) < 1:3338        QA_util_log_info('SUCCESS', ui_log=ui_log)3339    else:3340        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)3341        QA_util_log_info(err, ui_log=ui_log)3342    pass3343def _save_option_commodity_cf_min(3344        client=DATABASE,3345        ui_log=None,3346        ui_progress=None3347):3348    '''3349    :param client:3350    :param ui_log:3351    :param ui_progress:3352    :return:3353    '''3354    '''3355        :param client:3356        :return:3357        '''3358    option_contract_list = QA_fetch_get_commodity_option_CF_contract_time_to_market()3359    coll_option_min = client.option_commodity_cf_min3360    coll_option_min.create_index(3361        [("code",3362          pymongo.ASCENDING),3363         ("date_stamp",3364          pymongo.ASCENDING)]3365    )3366    err = []3367    # ç´¢å¼ code3368    err = []3369    def __saving_work(code, coll):3370        QA_util_log_info(3371            '##JOB13 Now Saving Option CF æ£è± MIN ==== {}'.format(str(code)),3372            ui_log=ui_log3373        )3374        try:3375            for type in ['1min', '5min', '15min', '30min', '60min']:3376                ref_ = coll.find({'code': str(code)[0:8], 'type': type})3377                end_time = str(now_time())[0:19]3378                if ref_.count() > 0:3379                    start_time = ref_[ref_.count() - 1]['datetime']3380                    QA_util_log_info(3381                        '##JOB13.{} Now Saving Option CF æ£è± {} from {} to {} =={} '3382                            .format(3383                            ['1min',3384                             '5min',3385                             '15min',3386                             '30min',3387                             '60min'].index(type),3388                            str(code),3389                            start_time,3390                            end_time,3391                            type3392                        ),3393                        ui_log=ui_log3394                    )3395                    if start_time != end_time:3396                        __data = QA_fetch_get_future_min(3397                            str(code),3398                            start_time,3399                            end_time,3400                            type3401                        )3402                        if len(__data) > 1:3403                            QA_util_log_info(3404                                " åå
¥ æ°å¢åå²åçº¦è®°å½æ° {} ".format(len(__data))3405                            )3406                            coll.insert_many(3407                                QA_util_to_json_from_pandas(__data[1::])3408                            )3409                else:3410                    start_time = '2015-01-01'3411                    QA_util_log_info(3412                        '##JOB13.{} Now Option CF æ£è± {} from {} to {} =={} '3413                            .format(3414                            ['1min',3415                             '5min',3416                             '15min',3417                             '30min',3418                             '60min'].index(type),3419                            str(code),3420                            start_time,3421                            end_time,3422                            type3423                        ),3424                        ui_log=ui_log3425                    )3426                    if start_time != end_time:3427                        __data = QA_fetch_get_future_min(3428                            str(code),3429                            start_time,3430                            end_time,3431                            type3432                        )3433                        if len(__data) > 1:3434                            QA_util_log_info(3435                                " åå
¥ æ°å¢åçº¦è®°å½æ° {} ".format(len(__data))3436                            )3437                            coll.insert_many(3438                                QA_util_to_json_from_pandas(__data)3439                            )3440        except:3441            err.append(code)3442    executor = ThreadPoolExecutor(max_workers=4)3443    res = {3444        executor.submit(3445            __saving_work,3446            option_contract_list[i_]["code"],3447            coll_option_min3448        )3449        for i_ in range(len(option_contract_list))3450    }  # multi index ./.3451    count = 03452    for i_ in concurrent.futures.as_completed(res):3453        QA_util_log_info(3454            'The {} of Total {}'.format(count,3455                                        len(option_contract_list)),3456            ui_log=ui_log3457        )3458        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(3459            str(float(count / len(option_contract_list) * 100))[0:4] + '%'3460        )3461        intLogProgress = int(float(count / len(option_contract_list) * 10000.0))3462        QA_util_log_info(3463            strLogProgress,3464            ui_log=ui_log,3465            ui_progress=ui_progress,3466            ui_progress_int_value=intLogProgress3467        )3468        count = count + 13469    if len(err) < 1:3470        QA_util_log_info('SUCCESS', ui_log=ui_log)3471    else:3472        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)3473        QA_util_log_info(err, ui_log=ui_log)3474    pass3475def _save_option_commodity_ru_min(3476        client=DATABASE,3477        ui_log=None,3478        ui_progress=None3479):3480    '''3481    :param client:3482    :param ui_log:3483    :param ui_progress:3484    :return:3485    '''3486    '''3487        :param client:3488        :return:3489        '''3490    option_contract_list = QA_fetch_get_commodity_option_RU_contract_time_to_market(3491    )3492    coll_option_min = client.option_commodity_ru_min3493    coll_option_min.create_index(3494        [("code",3495          pymongo.ASCENDING),3496         ("date_stamp",3497          pymongo.ASCENDING)]3498    )3499    err = []3500    # ç´¢å¼ code3501    err = []3502    def __saving_work(code, coll):3503        QA_util_log_info(3504            '##JOB13 Now Saving Option RU å¤©ç¶æ©¡è¶ MIN ==== {}'.format(str(code)),3505            ui_log=ui_log3506        )3507        try:3508            for type in ['1min', '5min', '15min', '30min', '60min']:3509                ref_ = coll.find({'code': str(code)[0:8], 'type': type})3510                end_time = str(now_time())[0:19]3511                if ref_.count() > 0:3512                    start_time = ref_[ref_.count() - 1]['datetime']3513                    QA_util_log_info(3514                        '##JOB13.{} Now Saving Option RU å¤©ç¶æ©¡è¶ {} from {} to {} =={} '3515                            .format(3516                            ['1min',3517                             '5min',3518                             '15min',3519                             '30min',3520                             '60min'].index(type),3521                            str(code),3522                            start_time,3523                            end_time,3524                            type3525                        ),3526                        ui_log=ui_log3527                    )3528                    if start_time != end_time:3529                        __data = QA_fetch_get_future_min(3530                            str(code),3531                            start_time,3532                            end_time,3533                            type3534                        )3535                        if len(__data) > 1:3536                            QA_util_log_info(3537                                " åå
¥ æ°å¢åå²åçº¦è®°å½æ° {} ".format(len(__data))3538                            )3539                            coll.insert_many(3540                                QA_util_to_json_from_pandas(__data[1::])3541                            )3542                else:3543                    start_time = '2015-01-01'3544                    QA_util_log_info(3545                        '##JOB13.{} Now Option RU å¤©ç¶æ©¡è¶ {} from {} to {} =={} '3546                            .format(3547                            ['1min',3548                             '5min',3549                             '15min',3550                             '30min',3551                             '60min'].index(type),3552                            str(code),3553                            start_time,3554                            end_time,3555                            type3556                        ),3557                        ui_log=ui_log3558                    )3559                    if start_time != end_time:3560                        __data = QA_fetch_get_future_min(3561                            str(code),3562                            start_time,3563                            end_time,3564                            type3565                        )3566                        if len(__data) > 1:3567                            QA_util_log_info(3568                                " åå
¥ æ°å¢åçº¦è®°å½æ° {} ".format(len(__data))3569                            )3570                            coll.insert_many(3571                                QA_util_to_json_from_pandas(__data)3572                            )3573        except:3574            err.append(code)3575    executor = ThreadPoolExecutor(max_workers=4)3576    res = {3577        executor.submit(3578            __saving_work,3579            option_contract_list[i_]["code"],3580            coll_option_min3581        )3582        for i_ in range(len(option_contract_list))3583    }  # multi index ./.3584    count = 03585    for i_ in concurrent.futures.as_completed(res):3586        QA_util_log_info(3587            'The {} of Total {}'.format(count,3588                                        len(option_contract_list)),3589            ui_log=ui_log3590        )3591        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(3592            str(float(count / len(option_contract_list) * 100))[0:4] + '%'3593        )3594        intLogProgress = int(float(count / len(option_contract_list) * 10000.0))3595        QA_util_log_info(3596            strLogProgress,3597            ui_log=ui_log,3598            ui_progress=ui_progress,3599            ui_progress_int_value=intLogProgress3600        )3601        count = count + 13602    if len(err) < 1:3603        QA_util_log_info('SUCCESS', ui_log=ui_log)3604    else:3605        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)3606        QA_util_log_info(err, ui_log=ui_log)3607    pass3608def _save_option_commodity_cu_min(3609        client=DATABASE,3610        ui_log=None,3611        ui_progress=None3612):3613    '''3614    :param client:3615    :param ui_log:3616    :param ui_progress:3617    :return:3618    '''3619    '''3620        :param client:3621        :return:3622        '''3623    option_contract_list = QA_fetch_get_commodity_option_CU_contract_time_to_market(3624    )3625    coll_option_min = client.option_commodity_cu_min3626    coll_option_min.create_index(3627        [("code",3628          pymongo.ASCENDING),3629         ("date_stamp",3630          pymongo.ASCENDING)]3631    )3632    err = []3633    # ç´¢å¼ code3634    err = []3635    def __saving_work(code, coll):3636        QA_util_log_info(3637            '##JOB13 Now Saving Option CU é MIN ==== {}'.format(str(code)),3638            ui_log=ui_log3639        )3640        try:3641            for type in ['1min', '5min', '15min', '30min', '60min']:3642                ref_ = coll.find({'code': str(code)[0:8], 'type': type})3643                end_time = str(now_time())[0:19]3644                if ref_.count() > 0:3645                    start_time = ref_[ref_.count() - 1]['datetime']3646                    QA_util_log_info(3647                        '##JOB13.{} Now Saving Option CU é {} from {} to {} =={} '3648                            .format(3649                            ['1min',3650                             '5min',3651                             '15min',3652                             '30min',3653                             '60min'].index(type),3654                            str(code),3655                            start_time,3656                            end_time,3657                            type3658                        ),3659                        ui_log=ui_log3660                    )3661                    if start_time != end_time:3662                        __data = QA_fetch_get_future_min(3663                            str(code),3664                            start_time,3665                            end_time,3666                            type3667                        )3668                        if len(__data) > 1:3669                            QA_util_log_info(3670                                " åå
¥ æ°å¢åå²åçº¦è®°å½æ° {} ".format(len(__data))3671                            )3672                            coll.insert_many(3673                                QA_util_to_json_from_pandas(__data[1::])3674                            )3675                else:3676                    start_time = '2015-01-01'3677                    QA_util_log_info(3678                        '##JOB13.{} Now Option CU é {} from {} to {} =={} '3679                            .format(3680                            ['1min',3681                             '5min',3682                             '15min',3683                             '30min',3684                             '60min'].index(type),3685                            str(code),3686                            start_time,3687                            end_time,3688                            type3689                        ),3690                        ui_log=ui_log3691                    )3692                    if start_time != end_time:3693                        __data = QA_fetch_get_future_min(3694                            str(code),3695                            start_time,3696                            end_time,3697                            type3698                        )3699                        if len(__data) > 1:3700                            QA_util_log_info(3701                                " åå
¥ æ°å¢åçº¦è®°å½æ° {} ".format(len(__data))3702                            )3703                            coll.insert_many(3704                                QA_util_to_json_from_pandas(__data)3705                            )3706        except:3707            err.append(code)3708    executor = ThreadPoolExecutor(max_workers=4)3709    res = {3710        executor.submit(3711            __saving_work,3712            option_contract_list[i_]["code"],3713            coll_option_min3714        )3715        for i_ in range(len(option_contract_list))3716    }  # multi index ./.3717    count = 03718    for i_ in concurrent.futures.as_completed(res):3719        QA_util_log_info(3720            'The {} of Total {}'.format(count,3721                                        len(option_contract_list)),3722            ui_log=ui_log3723        )3724        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(3725            str(float(count / len(option_contract_list) * 100))[0:4] + '%'3726        )3727        intLogProgress = int(float(count / len(option_contract_list) * 10000.0))3728        QA_util_log_info(3729            strLogProgress,3730            ui_log=ui_log,3731            ui_progress=ui_progress,3732            ui_progress_int_value=intLogProgress3733        )3734        count = count + 13735    if len(err) < 1:3736        QA_util_log_info('SUCCESS', ui_log=ui_log)3737    else:3738        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)3739        QA_util_log_info(err, ui_log=ui_log)3740    pass3741def _save_option_commodity_au_min(3742        client=DATABASE,3743        ui_log=None,3744        ui_progress=None3745):3746    '''3747    :param client:3748    :param ui_log:3749    :param ui_progress:3750    :return:3751    '''3752    '''3753        :param client:3754        :return:3755        '''3756    option_contract_list = QA_fetch_get_commodity_option_AU_contract_time_to_market(3757    )3758    coll_option_min = client.option_commodity_au_min3759    coll_option_min.create_index(3760        [("code",3761          pymongo.ASCENDING),3762         ("date_stamp",3763          pymongo.ASCENDING)]3764    )3765    err = []3766    # ç´¢å¼ code3767    err = []3768    def __saving_work(code, coll):3769        QA_util_log_info(3770            '##JOB13 Now Saving Option AU é MIN ==== {}'.format(str(code)),3771            ui_log=ui_log3772        )3773        try:3774            for type in ['1min', '5min', '15min', '30min', '60min']:3775                ref_ = coll.find({'code': str(code)[0:8], 'type': type})3776                end_time = str(now_time())[0:19]3777                if ref_.count() > 0:3778                    start_time = ref_[ref_.count() - 1]['datetime']3779                    QA_util_log_info(3780                        '##JOB13.{} Now Saving Option AU é {} from {} to {} =={} '3781                            .format(3782                            ['1min',3783                             '5min',3784                             '15min',3785                             '30min',3786                             '60min'].index(type),3787                            str(code),3788                            start_time,3789                            end_time,3790                            type3791                        ),3792                        ui_log=ui_log3793                    )3794                    if start_time != end_time:3795                        __data = QA_fetch_get_future_min(3796                            str(code),3797                            start_time,3798                            end_time,3799                            type3800                        )3801                        if len(__data) > 1:3802                            QA_util_log_info(3803                                " åå
¥ æ°å¢åå²åçº¦è®°å½æ° {} ".format(len(__data))3804                            )3805                            coll.insert_many(3806                                QA_util_to_json_from_pandas(__data[1::])3807                            )3808                else:3809                    start_time = '2015-01-01'3810                    QA_util_log_info(3811                        '##JOB13.{} Now Option AU é {} from {} to {} =={} '3812                            .format(3813                            ['1min',3814                             '5min',3815                             '15min',3816                             '30min',3817                             '60min'].index(type),3818                            str(code),3819                            start_time,3820                            end_time,3821                            type3822                        ),3823                        ui_log=ui_log3824                    )3825                    if start_time != end_time:3826                        __data = QA_fetch_get_future_min(3827                            str(code),3828                            start_time,3829                            end_time,3830                            type3831                        )3832                        if len(__data) > 1:3833                            QA_util_log_info(3834                                " åå
¥ æ°å¢åçº¦è®°å½æ° {} ".format(len(__data))3835                            )3836                            coll.insert_many(3837                                QA_util_to_json_from_pandas(__data)3838                            )3839        except:3840            err.append(code)3841    executor = ThreadPoolExecutor(max_workers=4)3842    res = {3843        executor.submit(3844            __saving_work,3845            option_contract_list[i_]["code"],3846            coll_option_min3847        )3848        for i_ in range(len(option_contract_list))3849    }  # multi index ./.3850    count = 03851    for i_ in concurrent.futures.as_completed(res):3852        QA_util_log_info(3853            'The {} of Total {}'.format(count,3854                                        len(option_contract_list)),3855            ui_log=ui_log3856        )3857        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(3858            str(float(count / len(option_contract_list) * 100))[0:4] + '%'3859        )3860        intLogProgress = int(float(count / len(option_contract_list) * 10000.0))3861        QA_util_log_info(3862            strLogProgress,3863            ui_log=ui_log,3864            ui_progress=ui_progress,3865            ui_progress_int_value=intLogProgress3866        )3867        count = count + 13868    if len(err) < 1:3869        QA_util_log_info('SUCCESS', ui_log=ui_log)3870    else:3871        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)3872        QA_util_log_info(err, ui_log=ui_log)3873    pass3874def _save_option_commodity_al_min(3875        client=DATABASE,3876        ui_log=None,3877        ui_progress=None3878):3879    '''3880    :param client:3881    :param ui_log:3882    :param ui_progress:3883    :return:3884    '''3885    '''3886        :param client:3887        :return:3888        '''3889    option_contract_list = QA_fetch_get_commodity_option_AL_contract_time_to_market()3890    coll_option_min = client.option_commodity_al_min3891    coll_option_min.create_index(3892        [("code",3893          pymongo.ASCENDING),3894         ("date_stamp",3895          pymongo.ASCENDING)]3896    )3897    err = []3898    # ç´¢å¼ code3899    err = []3900    def __saving_work(code, coll):3901        QA_util_log_info(3902            '##JOB20 Now Saving Option AL é MIN ==== {}'.format(str(code)),3903            ui_log=ui_log3904        )3905        try:3906            for type in ['1min', '5min', '15min', '30min', '60min']:3907                ref_ = coll.find({'code': str(code)[0:8], 'type': type})3908                end_time = str(now_time())[0:19]3909                if ref_.count() > 0:3910                    start_time = ref_[ref_.count() - 1]['datetime']3911                    QA_util_log_info(3912                        '##JOB20.{} Now Saving Option AL é {} from {} to {} =={} '3913                            .format(3914                            ['1min',3915                             '5min',3916                             '15min',3917                             '30min',3918                             '60min'].index(type),3919                            str(code),3920                            start_time,3921                            end_time,3922                            type3923                        ),3924                        ui_log=ui_log3925                    )3926                    if start_time != end_time:3927                        __data = QA_fetch_get_future_min(3928                            str(code),3929                            start_time,3930                            end_time,3931                            type3932                        )3933                        if len(__data) > 1:3934                            QA_util_log_info(3935                                " åå
¥ æ°å¢åå²åçº¦è®°å½æ° {} ".format(len(__data))3936                            )3937                            coll.insert_many(3938                                QA_util_to_json_from_pandas(__data[1::])3939                            )3940                else:3941                    start_time = '2015-01-01'3942                    QA_util_log_info(3943                        '##JOB20.{} Now Option AL é {} from {} to {} =={} '3944                            .format(3945                            ['1min',3946                             '5min',3947                             '15min',3948                             '30min',3949                             '60min'].index(type),3950                            str(code),3951                            start_time,3952                            end_time,3953                            type3954                        ),3955                        ui_log=ui_log3956                    )3957                    if start_time != end_time:3958                        __data = QA_fetch_get_future_min(3959                            str(code),3960                            start_time,3961                            end_time,3962                            type3963                        )3964                        if len(__data) > 1:3965                            QA_util_log_info(3966                                " åå
¥ æ°å¢åçº¦è®°å½æ° {} ".format(len(__data))3967                            )3968                            coll.insert_many(3969                                QA_util_to_json_from_pandas(__data)3970                            )3971        except:3972            err.append(code)3973    executor = ThreadPoolExecutor(max_workers=4)3974    res = {3975        executor.submit(3976            __saving_work,3977            option_contract_list[i_]["code"],3978            coll_option_min3979        )3980        for i_ in range(len(option_contract_list))3981    }  # multi index ./.3982    count = 03983    for i_ in concurrent.futures.as_completed(res):3984        QA_util_log_info(3985            'The {} of Total {}'.format(count,3986                                        len(option_contract_list)),3987            ui_log=ui_log3988        )3989        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(3990            str(float(count / len(option_contract_list) * 100))[0:4] + '%'3991        )3992        intLogProgress = int(float(count / len(option_contract_list) * 10000.0))3993        QA_util_log_info(3994            strLogProgress,3995            ui_log=ui_log,3996            ui_progress=ui_progress,3997            ui_progress_int_value=intLogProgress3998        )3999        count = count + 14000    if len(err) < 1:4001        QA_util_log_info('SUCCESS', ui_log=ui_log)4002    else:4003        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)4004        QA_util_log_info(err, ui_log=ui_log)4005    pass4006def _save_option_commodity_sr_min(4007        client=DATABASE,4008        ui_log=None,4009        ui_progress=None4010):4011    '''4012    :param client:4013    :param ui_log:4014    :param ui_progress:4015    :return:4016    '''4017    '''4018        :param client:4019        :return:4020        '''4021    option_contract_list = QA_fetch_get_commodity_option_SR_contract_time_to_market(4022    )4023    coll_option_min = client.option_commodity_sr_min4024    coll_option_min.create_index(4025        [("code",4026          pymongo.ASCENDING),4027         ("date_stamp",4028          pymongo.ASCENDING)]4029    )4030    err = []4031    # ç´¢å¼ code4032    err = []4033    def __saving_work(code, coll):4034        QA_util_log_info(4035            '##JOB13 Now Saving Option SR ç½ç³ ==== {}'.format(str(code)),4036            ui_log=ui_log4037        )4038        try:4039            for type in ['1min', '5min', '15min', '30min', '60min']:4040                ref_ = coll.find({'code': str(code)[0:8], 'type': type})4041                end_time = str(now_time())[0:19]4042                if ref_.count() > 0:4043                    start_time = ref_[ref_.count() - 1]['datetime']4044                    QA_util_log_info(4045                        '##JOB13.{} Now Saving Option SR ç½ç³ {} from {} to {} =={} '4046                            .format(4047                            ['1min',4048                             '5min',4049                             '15min',4050                             '30min',4051                             '60min'].index(type),4052                            str(code),4053                            start_time,4054                            end_time,4055                            type4056                        ),4057                        ui_log=ui_log4058                    )4059                    if start_time != end_time:4060                        __data = QA_fetch_get_future_min(4061                            str(code),4062                            start_time,4063                            end_time,4064                            type4065                        )4066                        if len(__data) > 1:4067                            QA_util_log_info(4068                                " åå
¥ æ°å¢åå²åçº¦è®°å½æ° {} ".format(len(__data))4069                            )4070                            coll.insert_many(4071                                QA_util_to_json_from_pandas(__data[1::])4072                            )4073                else:4074                    start_time = '2015-01-01'4075                    QA_util_log_info(4076                        '##JOB13.{} Now Option SR ç½ç³ {} from {} to {} =={} '4077                            .format(4078                            ['1min',4079                             '5min',4080                             '15min',4081                             '30min',4082                             '60min'].index(type),4083                            str(code),4084                            start_time,4085                            end_time,4086                            type4087                        ),4088                        ui_log=ui_log4089                    )4090                    if start_time != end_time:4091                        __data = QA_fetch_get_future_min(4092                            str(code),4093                            start_time,4094                            end_time,4095                            type4096                        )4097                        if len(__data) > 1:4098                            QA_util_log_info(4099                                " åå
¥ æ°å¢åçº¦è®°å½æ° {} ".format(len(__data))4100                            )4101                            coll.insert_many(4102                                QA_util_to_json_from_pandas(__data)4103                            )4104        except:4105            err.append(code)4106    executor = ThreadPoolExecutor(max_workers=4)4107    res = {4108        executor.submit(4109            __saving_work,4110            option_contract_list[i_]["code"],4111            coll_option_min4112        )4113        for i_ in range(len(option_contract_list))4114    }  # multi index ./.4115    count = 04116    for i_ in concurrent.futures.as_completed(res):4117        QA_util_log_info(4118            'The {} of Total {}'.format(count,4119                                        len(option_contract_list)),4120            ui_log=ui_log4121        )4122        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(4123            str(float(count / len(option_contract_list) * 100))[0:4] + '%'4124        )4125        intLogProgress = int(float(count / len(option_contract_list) * 10000.0))4126        QA_util_log_info(4127            strLogProgress,4128            ui_log=ui_log,4129            ui_progress=ui_progress,4130            ui_progress_int_value=intLogProgress4131        )4132        count = count + 14133    if len(err) < 1:4134        QA_util_log_info('SUCCESS', ui_log=ui_log)4135    else:4136        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)4137        QA_util_log_info(err, ui_log=ui_log)4138    pass4139def _save_option_commodity_m_min(4140        client=DATABASE,4141        ui_log=None,4142        ui_progress=None4143):4144    '''4145    :param client:4146    :param ui_log:4147    :param ui_progress:4148    :return:4149    '''4150    option_contract_list = QA_fetch_get_commodity_option_M_contract_time_to_market(4151    )4152    coll_option_min = client.option_commodity_m_min4153    coll_option_min.create_index(4154        [("code",4155          pymongo.ASCENDING),4156         ("date_stamp",4157          pymongo.ASCENDING)]4158    )4159    err = []4160    # ç´¢å¼ code4161    err = []4162    def __saving_work(code, coll):4163        QA_util_log_info(4164            '##JOB13 Now Saving Option M è±ç² ==== {}'.format(str(code)),4165            ui_log=ui_log4166        )4167        try:4168            for type in ['1min', '5min', '15min', '30min', '60min']:4169                ref_ = coll.find({'code': str(code)[0:8], 'type': type})4170                end_time = str(now_time())[0:19]4171                if ref_.count() > 0:4172                    start_time = ref_[ref_.count() - 1]['datetime']4173                    QA_util_log_info(4174                        '##JOB13.{} Now Saving Option M è±ç²  {} from {} to {} =={} '4175                            .format(4176                            ['1min',4177                             '5min',4178                             '15min',4179                             '30min',4180                             '60min'].index(type),4181                            str(code),4182                            start_time,4183                            end_time,4184                            type4185                        ),4186                        ui_log=ui_log4187                    )4188                    if start_time != end_time:4189                        __data = QA_fetch_get_future_min(4190                            str(code),4191                            start_time,4192                            end_time,4193                            type4194                        )4195                        if len(__data) > 1:4196                            QA_util_log_info(4197                                " åå
¥ æ°å¢åå²åçº¦è®°å½æ° {} ".format(len(__data))4198                            )4199                            coll.insert_many(4200                                QA_util_to_json_from_pandas(__data[1::])4201                            )4202                else:4203                    start_time = '2015-01-01'4204                    QA_util_log_info(4205                        '##JOB13.{} Now Option M è±ç² {} from {} to {} =={} '4206                            .format(4207                            ['1min',4208                             '5min',4209                             '15min',4210                             '30min',4211                             '60min'].index(type),4212                            str(code),4213                            start_time,4214                            end_time,4215                            type4216                        ),4217                        ui_log=ui_log4218                    )4219                    if start_time != end_time:4220                        __data = QA_fetch_get_future_min(4221                            str(code),4222                            start_time,4223                            end_time,4224                            type4225                        )4226                        if len(__data) > 1:4227                            QA_util_log_info(4228                                " åå
¥ æ°å¢åçº¦è®°å½æ° {} ".format(len(__data))4229                            )4230                            coll.insert_many(4231                                QA_util_to_json_from_pandas(__data)4232                            )4233        except:4234            err.append(code)4235    executor = ThreadPoolExecutor(max_workers=4)4236    res = {4237        executor.submit(4238            __saving_work,4239            option_contract_list[i_]["code"],4240            coll_option_min4241        )4242        for i_ in range(len(option_contract_list))4243    }  # multi index ./.4244    count = 04245    for i_ in concurrent.futures.as_completed(res):4246        QA_util_log_info(4247            'The {} of Total {}'.format(count,4248                                        len(option_contract_list)),4249            ui_log=ui_log4250        )4251        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(4252            str(float(count / len(option_contract_list) * 100))[0:4] + '%'4253        )4254        intLogProgress = int(float(count / len(option_contract_list) * 10000.0))4255        QA_util_log_info(4256            strLogProgress,4257            ui_log=ui_log,4258            ui_progress=ui_progress,4259            ui_progress_int_value=intLogProgress4260        )4261        count = count + 14262    if len(err) < 1:4263        QA_util_log_info('SUCCESS', ui_log=ui_log)4264    else:4265        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)4266        QA_util_log_info(err, ui_log=ui_log)4267    pass4268def QA_SU_save_option_commodity_min(4269        client=DATABASE,4270        ui_log=None,4271        ui_progress=None4272):4273    '''4274        :param client:4275        :return:4276    '''4277    # æµè¯ä¸åç°ï¼ ä¸èµ·åå»ï¼å®¹æåºç°éè¯¯ï¼æ¯æ¬¡è·åä¸ä¸ªåç§å ï¼æ´æ¢æå¡ipç»§ç»è·å ï¼4278    _save_option_commodity_cu_min(4279        client=client,4280        ui_log=ui_log,4281        ui_progress=ui_progress4282    )4283    _save_option_commodity_sr_min(4284        client=client,4285        ui_log=ui_log,4286        ui_progress=ui_progress4287    )4288    _save_option_commodity_m_min(4289        client=client,4290        ui_log=ui_log,4291        ui_progress=ui_progress4292    )4293    _save_option_commodity_ru_min(4294        client=client,4295        ui_log=ui_log,4296        ui_progress=ui_progress4297    )4298    _save_option_commodity_cf_min(4299        client=client,4300        ui_log=ui_log,4301        ui_progress=ui_progress4302    )4303    _save_option_commodity_c_min(4304        client=client,4305        ui_log=ui_log,4306        ui_progress=ui_progress4307    )4308    _save_option_commodity_au_min(4309        client=client,4310        ui_log=ui_log,4311        ui_progress=ui_progress4312    )4313    _save_option_commodity_al_min(4314        client=client,4315        ui_log=ui_log,4316        ui_progress=ui_progress4317    )4318def QA_SU_save_option_50etf_min(client=DATABASE, ui_log=None, ui_progress=None):4319    '''4320    :param client:4321    :return:4322    '''4323    option_contract_list = QA_fetch_get_option_50etf_contract_time_to_market()4324    coll_option_min = client.option_day_min4325    coll_option_min.create_index(4326        [("code",4327          pymongo.ASCENDING),4328         ("date_stamp",4329          pymongo.ASCENDING)]4330    )4331    err = []4332    # ç´¢å¼ code4333    err = []4334    def __saving_work(code, coll):4335        QA_util_log_info(4336            '##JOB13 Now Saving Option 50ETF MIN ==== {}'.format(str(code)),4337            ui_log=ui_log4338        )4339        try:4340            for type in ['1min', '5min', '15min', '30min', '60min']:4341                ref_ = coll.find({'code': str(code)[0:8], 'type': type})4342                end_time = str(now_time())[0:19]4343                if ref_.count() > 0:4344                    start_time = ref_[ref_.count() - 1]['datetime']4345                    QA_util_log_info(4346                        '##JOB13.{} Now Saving Option 50ETF {} from {} to {} =={} '4347                            .format(4348                            ['1min',4349                             '5min',4350                             '15min',4351                             '30min',4352                             '60min'].index(type),4353                            str(code),4354                            start_time,4355                            end_time,4356                            type4357                        ),4358                        ui_log=ui_log4359                    )4360                    if start_time != end_time:4361                        __data = QA_fetch_get_future_min(4362                            str(code),4363                            start_time,4364                            end_time,4365                            type4366                        )4367                        if len(__data) > 1:4368                            QA_util_log_info(4369                                " åå
¥ æ°å¢åå²åçº¦è®°å½æ° {} ".format(len(__data))4370                            )4371                            coll.insert_many(4372                                QA_util_to_json_from_pandas(__data[1::])4373                            )4374                else:4375                    start_time = '2015-01-01'4376                    QA_util_log_info(4377                        '##JOB13.{} Now Option 50ETF {} from {} to {} =={} '4378                            .format(4379                            ['1min',4380                             '5min',4381                             '15min',4382                             '30min',4383                             '60min'].index(type),4384                            str(code),4385                            start_time,4386                            end_time,4387                            type4388                        ),4389                        ui_log=ui_log4390                    )4391                    if start_time != end_time:4392                        __data = QA_fetch_get_future_min(4393                            str(code),4394                            start_time,4395                            end_time,4396                            type4397                        )4398                        if len(__data) > 1:4399                            QA_util_log_info(4400                                " åå
¥ æ°å¢åçº¦è®°å½æ° {} ".format(len(__data))4401                            )4402                            coll.insert_many(4403                                QA_util_to_json_from_pandas(__data)4404                            )4405        except:4406            err.append(code)4407    executor = ThreadPoolExecutor(max_workers=4)4408    res = {4409        executor.submit(4410            __saving_work,4411            option_contract_list[i_]["code"],4412            coll_option_min4413        )4414        for i_ in range(len(option_contract_list))4415    }  # multi index ./.4416    count = 04417    for i_ in concurrent.futures.as_completed(res):4418        QA_util_log_info(4419            'The {} of Total {}'.format(count,4420                                        len(option_contract_list)),4421            ui_log=ui_log4422        )4423        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(4424            str(float(count / len(option_contract_list) * 100))[0:4] + '%'4425        )4426        intLogProgress = int(float(count / len(option_contract_list) * 10000.0))4427        QA_util_log_info(4428            strLogProgress,4429            ui_log=ui_log,4430            ui_progress=ui_progress,4431            ui_progress_int_value=intLogProgress4432        )4433        count = count + 14434    if len(err) < 1:4435        QA_util_log_info('SUCCESS', ui_log=ui_log)4436    else:4437        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)4438        QA_util_log_info(err, ui_log=ui_log)4439def QA_SU_save_option_50etf_day(client=DATABASE, ui_log=None, ui_progress=None):4440    '''4441    :param client:4442    :return:4443    '''4444    option_contract_list = QA_fetch_get_option_50etf_contract_time_to_market()4445    coll_option_day = client.option_day4446    coll_option_day.create_index(4447        [("code",4448          pymongo.ASCENDING),4449         ("date_stamp",4450          pymongo.ASCENDING)]4451    )4452    err = []4453    # ç´¢å¼ code4454    def __saving_work(code, coll_option_day):4455        try:4456            QA_util_log_info(4457                '##JOB12 Now Saving OPTION_DAY==== {}'.format(str(code)),4458                ui_log=ui_log4459            )4460            # é¦éæ¥æ¾æ°æ®åº æ¯å¦ æ è¿ä¸ªä»£ç çæ°æ®4461            # ææä»£ç  ä» 10000001 å¼å§ç¼ç   100012284462            ref = coll_option_day.find({'code': str(code)[0:8]})4463            end_date = str(now_time())[0:10]4464            # å½åæ°æ®åºå·²ç»å
å«äºè¿ä¸ªä»£ç çæ°æ®ï¼ ç»§ç»å¢éæ´æ°4465            # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦ææ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°4466            if ref.count() > 0:4467                # æ¥ç䏿¬¡è·åçæ¥æç»§ç»æ´æ°4468                start_date = ref[ref.count() - 1]['date']4469                QA_util_log_info(4470                    ' 䏿¬¡è·åæææ¥çº¿æ°æ®çæåæ¥ææ¯ {}'.format(start_date),4471                    ui_log=ui_log4472                )4473                QA_util_log_info(4474                    'UPDATE_OPTION_DAY \n ä»ä¸ä¸æ¬¡ä¸è½½æ°æ®å¼å§ç»§ç» Trying update {} from {} to {}'4475                        .format(code,4476                                start_date,4477                                end_date),4478                    ui_log=ui_log4479                )4480                if start_date != end_date:4481                    start_date0 = QA_util_get_next_day(start_date)4482                    df0 = QA_fetch_get_option_day(4483                        code=code,4484                        start_date=start_date0,4485                        end_date=end_date,4486                        frequence='day',4487                        ip=None,4488                        port=None4489                    )4490                    retCount = df0.iloc[:, 0].size4491                    QA_util_log_info(4492                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è¿åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº".format(4493                            start_date0,4494                            end_date,4495                            code,4496                            retCount4497                        ),4498                        ui_log=ui_log4499                    )4500                    coll_option_day.insert_many(4501                        QA_util_to_json_from_pandas(df0)4502                    )4503                else:4504                    QA_util_log_info(4505                        "^å·²ç»è·åè¿è¿å¤©çæ°æ®äº^ {}".format(start_date),4506                        ui_log=ui_log4507                    )4508            else:4509                start_date = '1990-01-01'4510                QA_util_log_info(4511                    'UPDATE_OPTION_DAY \n 仿°å¼å§ä¸è½½æ°æ® Trying update {} from {} to {}'4512                        .format(code,4513                                start_date,4514                                end_date),4515                    ui_log=ui_log4516                )4517                if start_date != end_date:4518                    df0 = QA_fetch_get_option_day(4519                        code=code,4520                        start_date=start_date,4521                        end_date=end_date,4522                        frequence='day',4523                        ip=None,4524                        port=None4525                    )4526                    retCount = df0.iloc[:, 0].size4527                    QA_util_log_info(4528                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è·åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº^_^ ".format(4529                            start_date,4530                            end_date,4531                            code,4532                            retCount4533                        ),4534                        ui_log=ui_log4535                    )4536                    coll_option_day.insert_many(4537                        QA_util_to_json_from_pandas(df0)4538                    )4539                else:4540                    QA_util_log_info(4541                        "*å·²ç»è·åè¿è¿å¤©çæ°æ®äº* {}".format(start_date),4542                        ui_log=ui_log4543                    )4544        except Exception as error0:4545            print(error0)4546            err.append(str(code))4547    for item in range(len(option_contract_list)):4548        QA_util_log_info(4549            'The {} of Total {}'.format(item,4550                                        len(option_contract_list)),4551            ui_log=ui_log4552        )4553        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(4554            str(float(item / len(option_contract_list) * 100))[0:4] + '%'4555        )4556        intLogProgress = int(float(item / len(option_contract_list) * 10000.0))4557        QA_util_log_info(4558            strLogProgress,4559            ui_log=ui_log,4560            ui_progress=ui_progress,4561            ui_progress_int_value=intLogProgress4562        )4563        __saving_work(option_contract_list[item].code, coll_option_day)4564    if len(err) < 1:4565        QA_util_log_info('SUCCESS save option day ^_^ ', ui_log=ui_log)4566    else:4567        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)4568        QA_util_log_info(err, ui_log=ui_log)4569def QA_SU_save_option_300etf_min(client=DATABASE, ui_log=None, ui_progress=None):4570    '''4571    :param client:4572    :return:4573    '''4574    option_contract_list = QA_fetch_get_option_300etf_contract_time_to_market()4575    coll_option_min = client.option_day_min4576    coll_option_min.create_index(4577        [("code",4578          pymongo.ASCENDING),4579         ("date_stamp",4580          pymongo.ASCENDING)]4581    )4582    err = []4583    # ç´¢å¼ code4584    err = []4585    def __saving_work(code, coll):4586        QA_util_log_info(4587            '##JOB13 Now Saving Option shanghai sse 300 ETF MIN ==== {}'.format(str(code)),4588            ui_log=ui_log4589        )4590        try:4591            for type in ['1min', '5min', '15min', '30min', '60min']:4592                ref_ = coll.find({'code': str(code)[0:8], 'type': type})4593                end_time = str(now_time())[0:19]4594                if ref_.count() > 0:4595                    start_time = ref_[ref_.count() - 1]['datetime']4596                    QA_util_log_info(4597                        '##JOB13.{} Now Saving Option shanghai 300ETF {} from {} to {} =={} '4598                            .format(4599                            ['1min',4600                             '5min',4601                             '15min',4602                             '30min',4603                             '60min'].index(type),4604                            str(code),4605                            start_time,4606                            end_time,4607                            type4608                        ),4609                        ui_log=ui_log4610                    )4611                    if start_time != end_time:4612                        __data = QA_fetch_get_future_min(4613                            str(code),4614                            start_time,4615                            end_time,4616                            type4617                        )4618                        if len(__data) > 1:4619                            QA_util_log_info(4620                                " åå
¥ æ°å¢åå²åçº¦è®°å½æ° {} ".format(len(__data))4621                            )4622                            coll.insert_many(4623                                QA_util_to_json_from_pandas(__data[1::])4624                            )4625                else:4626                    start_time = '2015-01-01'4627                    QA_util_log_info(4628                        '##JOB13.{} Now Option shanghai sse 300ETF {} from {} to {} =={} '4629                            .format(4630                            ['1min',4631                             '5min',4632                             '15min',4633                             '30min',4634                             '60min'].index(type),4635                            str(code),4636                            start_time,4637                            end_time,4638                            type4639                        ),4640                        ui_log=ui_log4641                    )4642                    if start_time != end_time:4643                        __data = QA_fetch_get_future_min(4644                            str(code),4645                            start_time,4646                            end_time,4647                            type4648                        )4649                        if len(__data) > 1:4650                            QA_util_log_info(4651                                " åå
¥ æ°å¢åçº¦è®°å½æ° {} ".format(len(__data))4652                            )4653                            coll.insert_many(4654                                QA_util_to_json_from_pandas(__data)4655                            )4656        except:4657            err.append(code)4658    executor = ThreadPoolExecutor(max_workers=4)4659    res = {4660        executor.submit(4661            __saving_work,4662            option_contract_list[i_]["code"],4663            coll_option_min4664        )4665        for i_ in range(len(option_contract_list))4666    }  # multi index ./.4667    count = 04668    for i_ in concurrent.futures.as_completed(res):4669        QA_util_log_info(4670            'The {} of Total {}'.format(count,4671                                        len(option_contract_list)),4672            ui_log=ui_log4673        )4674        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(4675            str(float(count / len(option_contract_list) * 100))[0:4] + '%'4676        )4677        intLogProgress = int(float(count / len(option_contract_list) * 10000.0))4678        QA_util_log_info(4679            strLogProgress,4680            ui_log=ui_log,4681            ui_progress=ui_progress,4682            ui_progress_int_value=intLogProgress4683        )4684        count = count + 14685    if len(err) < 1:4686        QA_util_log_info('SUCCESS', ui_log=ui_log)4687    else:4688        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)4689        QA_util_log_info(err, ui_log=ui_log)4690def QA_SU_save_option_300etf_day(client=DATABASE, ui_log=None, ui_progress=None):4691    '''4692    :param client:4693    :return:4694    '''4695    option_contract_list = QA_fetch_get_option_300etf_contract_time_to_market()4696    coll_option_day = client.option_day4697    coll_option_day.create_index(4698        [("code",4699          pymongo.ASCENDING),4700         ("date_stamp",4701          pymongo.ASCENDING)]4702    )4703    err = []4704    # ç´¢å¼ code4705    def __saving_work(code, coll_option_day):4706        try:4707            QA_util_log_info(4708                '##JOB12 Now Saving shanghai sse 300 etf OPTION_DAY==== {}'.format(str(code)),4709                ui_log=ui_log4710            )4711            # é¦éæ¥æ¾æ°æ®åº æ¯å¦ æ è¿ä¸ªä»£ç çæ°æ®4712            # ææä»£ç  ä» 10000001 å¼å§ç¼ç   100012284713            ref = coll_option_day.find({'code': str(code)[0:8]})4714            end_date = str(now_time())[0:10]4715            # å½åæ°æ®åºå·²ç»å
å«äºè¿ä¸ªä»£ç çæ°æ®ï¼ ç»§ç»å¢éæ´æ°4716            # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦ææ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°4717            if ref.count() > 0:4718                # æ¥ç䏿¬¡è·åçæ¥æç»§ç»æ´æ°4719                start_date = ref[ref.count() - 1]['date']4720                QA_util_log_info(4721                    ' 䏿¬¡è·åæææ¥çº¿æ°æ®çæåæ¥ææ¯ {}'.format(start_date),4722                    ui_log=ui_log4723                )4724                QA_util_log_info(4725                    'UPDATE_OPTION_DAY shanghai sse 300 etf \n ä»ä¸ä¸æ¬¡ä¸è½½æ°æ®å¼å§ç»§ç» Trying update {} from {} to {}'4726                        .format(code,4727                                start_date,4728                                end_date),4729                    ui_log=ui_log4730                )4731                if start_date != end_date:4732                    start_date0 = QA_util_get_next_day(start_date)4733                    df0 = QA_fetch_get_option_day(4734                        code=code,4735                        start_date=start_date0,4736                        end_date=end_date,4737                        frequence='day',4738                        ip=None,4739                        port=None4740                    )4741                    retCount = df0.iloc[:, 0].size4742                    QA_util_log_info(4743                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è¿åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº".format(4744                            start_date0,4745                            end_date,4746                            code,4747                            retCount4748                        ),4749                        ui_log=ui_log4750                    )4751                    coll_option_day.insert_many(4752                        QA_util_to_json_from_pandas(df0)4753                    )4754                else:4755                    QA_util_log_info(4756                        "^å·²ç»è·åè¿è¿å¤©çæ°æ®äº^ {}".format(start_date),4757                        ui_log=ui_log4758                    )4759            else:4760                start_date = '1990-01-01'4761                QA_util_log_info(4762                    'UPDATE_OPTION_DAY shanghai sse 300 etf \n 仿°å¼å§ä¸è½½æ°æ® Trying update {} from {} to {}'4763                        .format(code,4764                                start_date,4765                                end_date),4766                    ui_log=ui_log4767                )4768                if start_date != end_date:4769                    df0 = QA_fetch_get_option_day(4770                        code=code,4771                        start_date=start_date,4772                        end_date=end_date,4773                        frequence='day',4774                        ip=None,4775                        port=None4776                    )4777                    retCount = df0.iloc[:, 0].size4778                    QA_util_log_info(4779                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è·åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº^_^ ".format(4780                            start_date,4781                            end_date,4782                            code,4783                            retCount4784                        ),4785                        ui_log=ui_log4786                    )4787                    coll_option_day.insert_many(4788                        QA_util_to_json_from_pandas(df0)4789                    )4790                else:4791                    QA_util_log_info(4792                        "*å·²ç»è·åè¿è¿å¤©çæ°æ®äº* {}".format(start_date),4793                        ui_log=ui_log4794                    )4795        except Exception as error0:4796            print(error0)4797            err.append(str(code))4798    for item in range(len(option_contract_list)):4799        QA_util_log_info(4800            'The {} of Total {}'.format(item,4801                                        len(option_contract_list)),4802            ui_log=ui_log4803        )4804        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(4805            str(float(item / len(option_contract_list) * 100))[0:4] + '%'4806        )4807        intLogProgress = int(float(item / len(option_contract_list) * 10000.0))4808        QA_util_log_info(4809            strLogProgress,4810            ui_log=ui_log,4811            ui_progress=ui_progress,4812            ui_progress_int_value=intLogProgress4813        )4814        __saving_work(option_contract_list[item].code, coll_option_day)4815    if len(err) < 1:4816        QA_util_log_info('SUCCESS save option day ^_^ ', ui_log=ui_log)4817    else:4818        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)4819        QA_util_log_info(err, ui_log=ui_log)4820def QA_SU_save_option_contract_list(4821        client=DATABASE,4822        ui_log=None,4823        ui_progress=None):4824    rows_of_option = QA_fetch_get_option_all_contract_time_to_market()4825    # rows_cu = QA_fetch_get_commodity_option_CU_contract_time_to_market()4826    # rows_m = QA_fetch_get_commodity_option_M_contract_time_to_market()4827    # rows_sr = QA_fetch_get_commodity_option_SR_contract_time_to_market()4828    # rows_cf = QA_fetch_get_commodity_option_CF_contract_time_to_market()4829    # rows_ru = QA_fetch_get_commodity_option_RU_contract_time_to_market()4830    # rows_c = QA_fetch_get_commodity_option_C_contract_time_to_market()4831    try:4832        # ð todo è¿ä¸ªåºè¯¥æ¯ç¬¬ä¸ä¸ªä»»å¡ JOB01ï¼ å
æ´æ°è¡ç¥¨å表ï¼ï¼4833        QA_util_log_info(4834            '##JOB15 Now Saving OPTION_CONTRACT_LIST ====',4835            ui_log=ui_log,4836            ui_progress=ui_progress,4837            ui_progress_int_value=50004838        )4839        coll = client.option_contract_list4840        coll.create_index([('desc', pymongo.ASCENDING)], unique=True)4841        # todo fixhere4842        # from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict4843        try:4844            df = pd.DataFrame.from_items([(s.desc, s) for s in rows_of_option])4845            df = (df.T)4846            js = QA_util_to_json_from_pandas(df)4847            # result0 = coll.insert_many(js)4848            for a_js_row in js:4849                # print(a_js_row)4850                akey = a_js_row['desc']4851                id0 = coll.find_one({'desc': akey})4852                if id0 is None:4853                    coll.insert(a_js_row)4854            # print(result0)4855        except pymongo.errors.BulkWriteError as e:4856            # https://ask.helplib.com/python/post_127405304857            panic = filter(4858                lambda x: x['code'] != 11000,4859                e.details['writeErrors']4860            )4861            # if len(panic) > 0:4862            #     print4863            #     "really panic"4864        QA_util_log_info(4865            "宿å约åè¡¨æ´æ°",4866            ui_log=ui_log,4867            ui_progress=ui_progress,4868            ui_progress_int_value=100004869        )4870    except Exception as e:4871        QA_util_log_info(e, ui_log=ui_log)4872        print(" Error save_tdx.QA_SU_save_option_contract_list exception!")4873def QA_SU_save_option_day_all(client=DATABASE,ui_log=None,ui_progress=None):4874    option_contract_list = QA_fetch_get_option_all_contract_time_to_market()4875    coll_option_day = client.option_day_all4876    coll_option_day.create_index(4877        [("code",4878          pymongo.ASCENDING),4879         ("date_stamp",4880          pymongo.ASCENDING)]4881    )4882    err = []4883    # ç´¢å¼ code4884    def __saving_work(code, coll_option_day):4885        try:4886            QA_util_log_info(4887                '##JOB12 Now Saving OPTION_DAY ALL ==== {}'.format(str(code)),4888                ui_log=ui_log4889            )4890            # é¦éæ¥æ¾æ°æ®åº æ¯å¦ æ è¿ä¸ªä»£ç çæ°æ®4891            # ææä»£ç  ä» 10000001 å¼å§ç¼ç   100012284892            ref = coll_option_day.find({'code': str(code)[0:8]})4893            end_date = str(now_time())[0:10]4894            # å½åæ°æ®åºå·²ç»å
å«äºè¿ä¸ªä»£ç çæ°æ®ï¼ ç»§ç»å¢éæ´æ°4895            # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦ææ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°4896            if ref.count() > 0:4897                # æ¥ç䏿¬¡è·åçæ¥æç»§ç»æ´æ°4898                start_date = ref[ref.count() - 1]['date']4899                QA_util_log_info(4900                    ' 䏿¬¡è·åæææ¥çº¿æ°æ®çæåæ¥ææ¯ {}'.format(start_date),4901                    ui_log=ui_log4902                )4903                QA_util_log_info(4904                    'UPDATE_OPTION_DAY \n ä»ä¸ä¸æ¬¡ä¸è½½æ°æ®å¼å§ç»§ç» Trying update {} from {} to {}'4905                        .format(code,4906                                start_date,4907                                end_date),4908                    ui_log=ui_log4909                )4910                if start_date != end_date:4911                    start_date0 = QA_util_get_next_day(start_date)4912                    df0 = QA_fetch_get_option_day(4913                        code=code,4914                        start_date=start_date0,4915                        end_date=end_date,4916                        frequence='day',4917                        ip=None,4918                        port=None4919                    )4920                    retCount = df0.iloc[:, 0].size4921                    QA_util_log_info(4922                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è¿åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº".format(4923                            start_date0,4924                            end_date,4925                            code,4926                            retCount4927                        ),4928                        ui_log=ui_log4929                    )4930                    coll_option_day.insert_many(4931                        QA_util_to_json_from_pandas(df0)4932                    )4933                else:4934                    QA_util_log_info(4935                        "^å·²ç»è·åè¿è¿å¤©çæ°æ®äº^ {}".format(start_date),4936                        ui_log=ui_log4937                    )4938            else:4939                start_date = '1990-01-01'4940                QA_util_log_info(4941                    'UPDATE_OPTION_DAY \n 仿°å¼å§ä¸è½½æ°æ® Trying update {} from {} to {}'4942                        .format(code,4943                                start_date,4944                                end_date),4945                    ui_log=ui_log4946                )4947                if start_date != end_date:4948                    df0 = QA_fetch_get_option_day(4949                        code=code,4950                        start_date=start_date,4951                        end_date=end_date,4952                        frequence='day',4953                        ip=None,4954                        port=None4955                    )4956                    retCount = df0.iloc[:, 0].size4957                    QA_util_log_info(4958                        "æ¥æä»å¼å§{}-ç»æ{} , å约代ç {} , è·åäº{}æ¡è®°å½ , åå¤åå
¥æ°æ®åº^_^ ".format(4959                            start_date,4960                            end_date,4961                            code,4962                            retCount4963                        ),4964                        ui_log=ui_log4965                    )4966                    coll_option_day.insert_many(4967                        QA_util_to_json_from_pandas(df0)4968                    )4969                else:4970                    QA_util_log_info(4971                        "*å·²ç»è·åè¿è¿å¤©çæ°æ®äº* {}".format(start_date),4972                        ui_log=ui_log4973                    )4974        except Exception as error0:4975            print(error0)4976            err.append(str(code))4977    for item in range(len(option_contract_list)):4978        QA_util_log_info(4979            'The {} of Total {}'.format(item,4980                                        len(option_contract_list)),4981            ui_log=ui_log4982        )4983        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(4984            str(float(item / len(option_contract_list) * 100))[0:4] + '%'4985        )4986        intLogProgress = int(float(item / len(option_contract_list) * 10000.0))4987        QA_util_log_info(4988            strLogProgress,4989            ui_log=ui_log,4990            ui_progress=ui_progress,4991            ui_progress_int_value=intLogProgress4992        )4993        __saving_work(option_contract_list[item].code, coll_option_day)4994    if len(err) < 1:4995        QA_util_log_info('SUCCESS save option day all contract ^_^ ', ui_log=ui_log)4996    else:4997        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)4998        QA_util_log_info(err, ui_log=ui_log)4999def QA_SU_save_option_min_all(client=DATABASE, ui_log=None, ui_progress=None):5000    '''5001    :param client:5002    :return:5003    '''5004    option_contract_list = QA_fetch_get_option_all_contract_time_to_market()5005    coll_option_min = client.option_min_all5006    coll_option_min.create_index(5007        [("code",5008          pymongo.ASCENDING),5009         ("date_stamp",5010          pymongo.ASCENDING)]5011    )5012    err = []5013    # ç´¢å¼ code5014    err = []5015    def __saving_work(code, coll):5016        QA_util_log_info(5017            '##JOB15 Now Saving Option ALL MIN ==== {}'.format(str(code)),5018            ui_log=ui_log5019        )5020        try:5021            for type in ['1min', '5min', '15min', '30min', '60min']:5022                ref_ = coll.find({'code': str(code)[0:8], 'type': type})5023                end_time = str(now_time())[0:19]5024                if ref_.count() > 0:5025                    start_time = ref_[ref_.count() - 1]['datetime']5026                    QA_util_log_info(5027                        '##JOB99.{} Now Saving Option ALL MIN {} from {} to {} =={} '5028                            .format(5029                            ['1min',5030                             '5min',5031                             '15min',5032                             '30min',5033                             '60min'].index(type),5034                            str(code),5035                            start_time,5036                            end_time,5037                            type5038                        ),5039                        ui_log=ui_log5040                    )5041                    if start_time != end_time:5042                        __data = QA_fetch_get_future_min(5043                            str(code),5044                            start_time,5045                            end_time,5046                            type5047                        )5048                        if len(__data) > 1:5049                            QA_util_log_info(5050                                " åå
¥ æ°å¢åå²åçº¦è®°å½æ° {} ".format(len(__data))5051                            )5052                            coll.insert_many(5053                                QA_util_to_json_from_pandas(__data[1::])5054                            )5055                else:5056                    start_time = '2015-01-01'5057                    QA_util_log_info(5058                        '##JOB15.{} Now Option ALL MIN {} from {} to {} =={} '5059                            .format(5060                            ['1min',5061                             '5min',5062                             '15min',5063                             '30min',5064                             '60min'].index(type),5065                            str(code),5066                            start_time,5067                            end_time,5068                            type5069                        ),5070                        ui_log=ui_log5071                    )5072                    if start_time != end_time:5073                        __data = QA_fetch_get_future_min(5074                            str(code),5075                            start_time,5076                            end_time,5077                            type5078                        )5079                        if len(__data) > 1:5080                            QA_util_log_info(5081                                " åå
¥ æ°å¢åçº¦è®°å½æ° {} ".format(len(__data))5082                            )5083                            coll.insert_many(5084                                QA_util_to_json_from_pandas(__data)5085                            )5086        except:5087            err.append(code)5088    executor = ThreadPoolExecutor(max_workers=4)5089    res = {5090        executor.submit(5091            __saving_work,5092            option_contract_list[i_]["code"],5093            coll_option_min5094        )5095        for i_ in range(len(option_contract_list))5096    }  # multi index ./.5097    count = 05098    for i_ in concurrent.futures.as_completed(res):5099        QA_util_log_info(5100            'The {} of Total {}'.format(count,5101                                        len(option_contract_list)),5102            ui_log=ui_log5103        )5104        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(5105            str(float(count / len(option_contract_list) * 100))[0:4] + '%'5106        )5107        intLogProgress = int(float(count / len(option_contract_list) * 10000.0))5108        QA_util_log_info(5109            strLogProgress,5110            ui_log=ui_log,5111            ui_progress=ui_progress,5112            ui_progress_int_value=intLogProgress5113        )5114        count = count + 15115    if len(err) < 1:5116        QA_util_log_info('SUCCESS', ui_log=ui_log)5117    else:5118        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)5119        QA_util_log_info(err, ui_log=ui_log)5120#######################################################################################5121def QA_SU_save_future_list(client=DATABASE, ui_log=None, ui_progress=None):5122    future_list = QA_fetch_get_future_list()5123    coll_future_list = client.future_list5124    coll_future_list.create_index("code", unique=True)5125    try:5126        coll_future_list.insert_many(5127            QA_util_to_json_from_pandas(future_list),5128            ordered=False5129        )5130    except:5131        pass5132def QA_SU_save_index_list(client=DATABASE, ui_log=None, ui_progress=None):5133    index_list = QA_fetch_get_index_list()5134    coll_index_list = client.index_list5135    coll_index_list.create_index("code", unique=True)5136    try:5137        coll_index_list.insert_many(5138            QA_util_to_json_from_pandas(index_list),5139            ordered=False5140        )5141    except:5142        pass5143def QA_SU_save_single_future_day(code : str, client=DATABASE, ui_log=None, ui_progress=None):5144    '''5145     save single_future_day5146    ä¿åå个æè´§æ°æ®æ¥çº¿æ°æ®5147    :param client:5148    :param ui_log:  ç»GUI qt çé¢ä½¿ç¨5149    :param ui_progress: ç»GUI qt çé¢ä½¿ç¨5150    :param ui_progress_int_value: ç»GUI qt çé¢ä½¿ç¨5151    :return:5152    '''5153    coll_future_day = client.future_day5154    coll_future_day.create_index(5155        [("code",5156          pymongo.ASCENDING),5157         ("date_stamp",5158          pymongo.ASCENDING)]5159    )5160    err = []5161    def __saving_work(code, coll_future_day):5162        try:5163            QA_util_log_info(5164                '##JOB12 Now Saving Future_DAY==== {}'.format(str(code)),5165                ui_log5166            )5167            # é¦éæ¥æ¾æ°æ®åº æ¯å¦ æ è¿ä¸ªä»£ç çæ°æ®5168            ref = coll_future_day.find({'code': str(code)[0:4]})5169            end_date = str(now_time())[0:10]5170            # å½åæ°æ®åºå·²ç»å
å«äºè¿ä¸ªä»£ç çæ°æ®ï¼ ç»§ç»å¢éæ´æ°5171            # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦æè¡ç¥¨æ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°5172            if ref.count() > 0:5173                # æ¥ç䏿¬¡è·åçæ¥æç»§ç»æ´æ°5174                start_date = ref[ref.count() - 1]['date']5175                QA_util_log_info(5176                    'UPDATE_Future_DAY \n Trying updating {} from {} to {}'5177                        .format(code,5178                                start_date,5179                                end_date),5180                    ui_log5181                )5182                if start_date != end_date:5183                    coll_future_day.insert_many(5184                        QA_util_to_json_from_pandas(5185                            QA_fetch_get_future_day(5186                                str(code),5187                                QA_util_get_next_day(start_date),5188                                end_date5189                            )5190                        )5191                    )5192            # å½åæ°æ®åºä¸æ²¡æè¿ä¸ªä»£ç çè¡ç¥¨æ°æ®ï¼ ä»1990-01-01 å¼å§ä¸è½½ææçæ°æ®5193            else:5194                start_date = '2001-01-01'5195                QA_util_log_info(5196                    'UPDATE_Future_DAY \n Trying updating {} from {} to {}'5197                        .format(code,5198                                start_date,5199                                end_date),5200                    ui_log5201                )5202                if start_date != end_date:5203                    coll_future_day.insert_many(5204                        QA_util_to_json_from_pandas(5205                            QA_fetch_get_future_day(5206                                str(code),5207                                start_date,5208                                end_date5209                            )5210                        )5211                    )5212        except Exception as error0:5213            print(error0)5214            err.append(str(code))5215    __saving_work(code, coll_future_day)5216    if len(err) < 1:5217        QA_util_log_info('SUCCESS save future day ^_^', ui_log)5218    else:5219        QA_util_log_info(' ERROR CODE \n ', ui_log)5220        QA_util_log_info(err, ui_log)5221def QA_SU_save_future_day(client=DATABASE, ui_log=None, ui_progress=None):5222    '''5223     save future_day5224    ä¿åæ¥çº¿æ°æ®5225    :param client:5226    :param ui_log:  ç»GUI qt çé¢ä½¿ç¨5227    :param ui_progress: ç»GUI qt çé¢ä½¿ç¨5228    :param ui_progress_int_value: ç»GUI qt çé¢ä½¿ç¨5229    :return:5230    '''5231    future_list = [5232        item for item in QA_fetch_get_future_list().code.unique().tolist()5233        if str(item)[-2:] in ['L8',5234                              'L9']5235    ]5236    coll_future_day = client.future_day5237    coll_future_day.create_index(5238        [("code",5239          pymongo.ASCENDING),5240         ("date_stamp",5241          pymongo.ASCENDING)]5242    )5243    err = []5244    def __saving_work(code, coll_future_day):5245        try:5246            QA_util_log_info(5247                '##JOB12 Now Saving Future_DAY==== {}'.format(str(code)),5248                ui_log5249            )5250            # é¦éæ¥æ¾æ°æ®åº æ¯å¦ æ è¿ä¸ªä»£ç çæ°æ®5251            ref = coll_future_day.find({'code': str(code)[0:4]})5252            end_date = str(now_time())[0:10]5253            # å½åæ°æ®åºå·²ç»å
å«äºè¿ä¸ªä»£ç çæ°æ®ï¼ ç»§ç»å¢éæ´æ°5254            # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦æè¡ç¥¨æ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°5255            if ref.count() > 0:5256                # æ¥ç䏿¬¡è·åçæ¥æç»§ç»æ´æ°5257                start_date = ref[ref.count() - 1]['date']5258                QA_util_log_info(5259                    'UPDATE_Future_DAY \n Trying updating {} from {} to {}'5260                        .format(code,5261                                start_date,5262                                end_date),5263                    ui_log5264                )5265                if start_date != end_date:5266                    coll_future_day.insert_many(5267                        QA_util_to_json_from_pandas(5268                            QA_fetch_get_future_day(5269                                str(code),5270                                QA_util_get_next_day(start_date),5271                                end_date5272                            )5273                        )5274                    )5275            # å½åæ°æ®åºä¸æ²¡æè¿ä¸ªä»£ç çè¡ç¥¨æ°æ®ï¼ ä»1990-01-01 å¼å§ä¸è½½ææçæ°æ®5276            else:5277                start_date = '2001-01-01'5278                QA_util_log_info(5279                    'UPDATE_Future_DAY \n Trying updating {} from {} to {}'5280                        .format(code,5281                                start_date,5282                                end_date),5283                    ui_log5284                )5285                if start_date != end_date:5286                    coll_future_day.insert_many(5287                        QA_util_to_json_from_pandas(5288                            QA_fetch_get_future_day(5289                                str(code),5290                                start_date,5291                                end_date5292                            )5293                        )5294                    )5295        except Exception as error0:5296            print(error0)5297            err.append(str(code))5298    for item in range(len(future_list)):5299        QA_util_log_info('The {} of Total {}'.format(item, len(future_list)))5300        strProgressToLog = 'DOWNLOAD PROGRESS {} {}'.format(5301            str(float(item / len(future_list) * 100))[0:4] + '%',5302            ui_log5303        )5304        intProgressToLog = int(float(item / len(future_list) * 100))5305        QA_util_log_info(5306            strProgressToLog,5307            ui_log=ui_log,5308            ui_progress=ui_progress,5309            ui_progress_int_value=intProgressToLog5310        )5311        __saving_work(future_list[item], coll_future_day)5312    if len(err) < 1:5313        QA_util_log_info('SUCCESS save future day ^_^', ui_log)5314    else:5315        QA_util_log_info(' ERROR CODE \n ', ui_log)5316        QA_util_log_info(err, ui_log)5317def QA_SU_save_future_day_all(client=DATABASE, ui_log=None, ui_progress=None):5318    '''5319     save future_day_all5320    ä¿åæ¥çº¿æ°æ®(å
¨é¨, å
å«åæå约)5321    :param client:5322    :param ui_log:  ç»GUI qt çé¢ä½¿ç¨5323    :param ui_progress: ç»GUI qt çé¢ä½¿ç¨5324    :param ui_progress_int_value: ç»GUI qt çé¢ä½¿ç¨5325    :return:5326    '''5327    future_list = QA_fetch_get_future_list().code.unique().tolist()5328    coll_future_day = client.future_day5329    coll_future_day.create_index(5330        [("code",5331          pymongo.ASCENDING),5332         ("date_stamp",5333          pymongo.ASCENDING)]5334    )5335    err = []5336    def __saving_work(code, coll_future_day):5337        try:5338            QA_util_log_info(5339                '##JOB12 Now Saving Future_DAY==== {}'.format(str(code)),5340                ui_log5341            )5342            # é¦éæ¥æ¾æ°æ®åº æ¯å¦ æ è¿ä¸ªä»£ç çæ°æ®5343            ref = coll_future_day.find({'code': str(code)[0:6]})5344            end_date = str(now_time())[0:10]5345            # å½åæ°æ®åºå·²ç»å
å«äºè¿ä¸ªä»£ç çæ°æ®ï¼ ç»§ç»å¢éæ´æ°5346            # å å
¥è¿ä¸ªå¤æçåå æ¯å ä¸ºå¦æè¡ç¥¨æ¯åä¸å¸ç æ°æ®åºä¼æ²¡ææ°æ® æä»¥ä¼æè´ç´¢å¼é®é¢åºç°5347            if ref.count() > 0:5348                # æ¥ç䏿¬¡è·åçæ¥æç»§ç»æ´æ°5349                start_date = ref[ref.count() - 1]['date']5350                QA_util_log_info(5351                    'UPDATE_Future_DAY \n Trying updating {} from {} to {}'5352                        .format(code,5353                                start_date,5354                                end_date),5355                    ui_log5356                )5357                if start_date != end_date:5358                    coll_future_day.insert_many(5359                        QA_util_to_json_from_pandas(5360                            QA_fetch_get_future_day(5361                                str(code),5362                                QA_util_get_next_day(start_date),5363                                end_date5364                            )5365                        )5366                    )5367            # å½åæ°æ®åºä¸æ²¡æè¿ä¸ªä»£ç çè¡ç¥¨æ°æ®ï¼ ä»1990-01-01 å¼å§ä¸è½½ææçæ°æ®5368            else:5369                start_date = '2001-01-01'5370                QA_util_log_info(5371                    'UPDATE_Future_DAY \n Trying updating {} from {} to {}'5372                        .format(code,5373                                start_date,5374                                end_date),5375                    ui_log5376                )5377                if start_date != end_date:5378                    coll_future_day.insert_many(5379                        QA_util_to_json_from_pandas(5380                            QA_fetch_get_future_day(5381                                str(code),5382                                start_date,5383                                end_date5384                            )5385                        )5386                    )5387        except Exception as error0:5388            print(error0)5389            err.append(str(code))5390    for item in range(len(future_list)):5391        QA_util_log_info('The {} of Total {}'.format(item, len(future_list)))5392        strProgressToLog = 'DOWNLOAD PROGRESS {} {}'.format(5393            str(float(item / len(future_list) * 100))[0:4] + '%',5394            ui_log5395        )5396        intProgressToLog = int(float(item / len(future_list) * 100))5397        QA_util_log_info(5398            strProgressToLog,5399            ui_log=ui_log,5400            ui_progress=ui_progress,5401            ui_progress_int_value=intProgressToLog5402        )5403        __saving_work(future_list[item], coll_future_day)5404    if len(err) < 1:5405        QA_util_log_info('SUCCESS save future day ^_^', ui_log)5406    else:5407        QA_util_log_info(' ERROR CODE \n ', ui_log)5408        QA_util_log_info(err, ui_log)5409def QA_SU_save_single_future_min(code : str, client=DATABASE, ui_log=None, ui_progress=None):5410    """save single_future_min5411    Keyword Arguments:5412        client {[type]} -- [description] (default: {DATABASE})5413    """5414    coll = client.future_min5415    coll.create_index(5416        [5417            ('code',5418             pymongo.ASCENDING),5419            ('time_stamp',5420             pymongo.ASCENDING),5421            ('date_stamp',5422             pymongo.ASCENDING)5423        ]5424    )5425    err = []5426    def __saving_work(code, coll):5427        QA_util_log_info(5428            '##JOB13 Now Saving Future_MIN ==== {}'.format(str(code)),5429            ui_log=ui_log5430        )5431        try:5432            for type in ['1min', '5min', '15min', '30min', '60min']:5433                ref_ = coll.find({'code': str(code)[0:6], 'type': type})5434                end_time = str(now_time())[0:19]5435                if ref_.count() > 0:5436                    start_time = ref_[ref_.count() - 1]['datetime']5437                    QA_util_log_info(5438                        '##JOB13.{} Now Saving Future {} from {} to {} =={} '5439                            .format(5440                            ['1min',5441                             '5min',5442                             '15min',5443                             '30min',5444                             '60min'].index(type),5445                            str(code),5446                            start_time,5447                            end_time,5448                            type5449                        ),5450                        ui_log=ui_log5451                    )5452                    if start_time != end_time:5453                        __data = QA_fetch_get_future_min(5454                            str(code),5455                            start_time,5456                            end_time,5457                            type5458                        )5459                        if len(__data) > 1:5460                            coll.insert_many(5461                                QA_util_to_json_from_pandas(__data[1::])5462                            )5463                else:5464                    start_time = '2015-01-01'5465                    QA_util_log_info(5466                        '##JOB13.{} Now Saving Future {} from {} to {} =={} '5467                            .format(5468                            ['1min',5469                             '5min',5470                             '15min',5471                             '30min',5472                             '60min'].index(type),5473                            str(code),5474                            start_time,5475                            end_time,5476                            type5477                        ),5478                        ui_log=ui_log5479                    )5480                    if start_time != end_time:5481                        __data = QA_fetch_get_future_min(5482                            str(code),5483                            start_time,5484                            end_time,5485                            type5486                        )5487                        if len(__data) > 1:5488                            coll.insert_many(5489                                QA_util_to_json_from_pandas(__data)5490                            )5491        except:5492            err.append(code)5493    __saving_work(code, coll)5494    if len(err) < 1:5495        QA_util_log_info('SUCCESS', ui_log=ui_log)5496    else:5497        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)5498        QA_util_log_info(err, ui_log=ui_log)5499def QA_SU_save_future_min(client=DATABASE, ui_log=None, ui_progress=None):5500    """save future_min5501    Keyword Arguments:5502        client {[type]} -- [description] (default: {DATABASE})5503    """5504    future_list = [5505        item for item in QA_fetch_get_future_list().code.unique().tolist()5506        if str(item)[-2:] in ['L8',5507                              'L9']5508    ]5509    coll = client.future_min5510    coll.create_index(5511        [5512            ('code',5513             pymongo.ASCENDING),5514            ('time_stamp',5515             pymongo.ASCENDING),5516            ('date_stamp',5517             pymongo.ASCENDING)5518        ]5519    )5520    err = []5521    def __saving_work(code, coll):5522        QA_util_log_info(5523            '##JOB13 Now Saving Future_MIN ==== {}'.format(str(code)),5524            ui_log=ui_log5525        )5526        try:5527            for type in ['1min', '5min', '15min', '30min', '60min']:5528                ref_ = coll.find({'code': str(code)[0:6], 'type': type})5529                end_time = str(now_time())[0:19]5530                if ref_.count() > 0:5531                    start_time = ref_[ref_.count() - 1]['datetime']5532                    QA_util_log_info(5533                        '##JOB13.{} Now Saving Future {} from {} to {} =={} '5534                            .format(5535                            ['1min',5536                             '5min',5537                             '15min',5538                             '30min',5539                             '60min'].index(type),5540                            str(code),5541                            start_time,5542                            end_time,5543                            type5544                        ),5545                        ui_log=ui_log5546                    )5547                    if start_time != end_time:5548                        __data = QA_fetch_get_future_min(5549                            str(code),5550                            start_time,5551                            end_time,5552                            type5553                        )5554                        if len(__data) > 1:5555                            coll.insert_many(5556                                QA_util_to_json_from_pandas(__data[1::])5557                            )5558                else:5559                    start_time = '2015-01-01'5560                    QA_util_log_info(5561                        '##JOB13.{} Now Saving Future {} from {} to {} =={} '5562                            .format(5563                            ['1min',5564                             '5min',5565                             '15min',5566                             '30min',5567                             '60min'].index(type),5568                            str(code),5569                            start_time,5570                            end_time,5571                            type5572                        ),5573                        ui_log=ui_log5574                    )5575                    if start_time != end_time:5576                        __data = QA_fetch_get_future_min(5577                            str(code),5578                            start_time,5579                            end_time,5580                            type5581                        )5582                        if len(__data) > 1:5583                            coll.insert_many(5584                                QA_util_to_json_from_pandas(__data)5585                            )5586        except:5587            err.append(code)5588    executor = ThreadPoolExecutor(max_workers=4)5589    res = {5590        executor.submit(__saving_work,5591                        future_list[i_],5592                        coll)5593        for i_ in range(len(future_list))5594    }  # multi index ./.5595    count = 05596    for i_ in concurrent.futures.as_completed(res):5597        QA_util_log_info(5598            'The {} of Total {}'.format(count,5599                                        len(future_list)),5600            ui_log=ui_log5601        )5602        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(5603            str(float(count / len(future_list) * 100))[0:4] + '%'5604        )5605        intLogProgress = int(float(count / len(future_list) * 10000.0))5606        QA_util_log_info(5607            strLogProgress,5608            ui_log=ui_log,5609            ui_progress=ui_progress,5610            ui_progress_int_value=intLogProgress5611        )5612        count = count + 15613    if len(err) < 1:5614        QA_util_log_info('SUCCESS', ui_log=ui_log)5615    else:5616        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)5617        QA_util_log_info(err, ui_log=ui_log)5618def QA_SU_save_future_min_all(client=DATABASE, ui_log=None, ui_progress=None):5619    """save future_min_all  (å
¨é¨, å
å«åæå约)5620    Keyword Arguments:5621        client {[type]} -- [description] (default: {DATABASE})5622    """5623    future_list = QA_fetch_get_future_list().code.unique().tolist()5624    coll = client.future_min5625    coll.create_index(5626        [5627            ('code',5628             pymongo.ASCENDING),5629            ('time_stamp',5630             pymongo.ASCENDING),5631            ('date_stamp',5632             pymongo.ASCENDING)5633        ]5634    )5635    err = []5636    def __saving_work(code, coll):5637        QA_util_log_info(5638            '##JOB13 Now Saving Future_MIN ==== {}'.format(str(code)),5639            ui_log=ui_log5640        )5641        try:5642            for type in ['1min', '5min', '15min', '30min', '60min']:5643                ref_ = coll.find({'code': str(code)[0:6], 'type': type})5644                end_time = str(now_time())[0:19]5645                if ref_.count() > 0:5646                    start_time = ref_[ref_.count() - 1]['datetime']5647                    QA_util_log_info(5648                        '##JOB13.{} Now Saving Future {} from {} to {} =={} '5649                            .format(5650                            ['1min',5651                             '5min',5652                             '15min',5653                             '30min',5654                             '60min'].index(type),5655                            str(code),5656                            start_time,5657                            end_time,5658                            type5659                        ),5660                        ui_log=ui_log5661                    )5662                    if start_time != end_time:5663                        __data = QA_fetch_get_future_min(5664                            str(code),5665                            start_time,5666                            end_time,5667                            type5668                        )5669                        if len(__data) > 1:5670                            coll.insert_many(5671                                QA_util_to_json_from_pandas(__data[1::])5672                            )5673                else:5674                    start_time = '2015-01-01'5675                    QA_util_log_info(5676                        '##JOB13.{} Now Saving Future {} from {} to {} =={} '5677                            .format(5678                            ['1min',5679                             '5min',5680                             '15min',5681                             '30min',5682                             '60min'].index(type),5683                            str(code),5684                            start_time,5685                            end_time,5686                            type5687                        ),5688                        ui_log=ui_log5689                    )5690                    if start_time != end_time:5691                        __data = QA_fetch_get_future_min(5692                            str(code),5693                            start_time,5694                            end_time,5695                            type5696                        )5697                        if len(__data) > 1:5698                            coll.insert_many(5699                                QA_util_to_json_from_pandas(__data)5700                            )5701        except:5702            err.append(code)5703    executor = ThreadPoolExecutor(max_workers=4)5704    res = {5705        executor.submit(__saving_work,5706                        future_list[i_],5707                        coll)5708        for i_ in range(len(future_list))5709    }  # multi index ./.5710    count = 05711    for i_ in concurrent.futures.as_completed(res):5712        QA_util_log_info(5713            'The {} of Total {}'.format(count,5714                                        len(future_list)),5715            ui_log=ui_log5716        )5717        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(5718            str(float(count / len(future_list) * 100))[0:4] + '%'5719        )5720        intLogProgress = int(float(count / len(future_list) * 10000.0))5721        QA_util_log_info(5722            strLogProgress,5723            ui_log=ui_log,5724            ui_progress=ui_progress,5725            ui_progress_int_value=intLogProgress5726        )5727        count = count + 15728    if len(err) < 1:5729        QA_util_log_info('SUCCESS', ui_log=ui_log)5730    else:5731        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)5732        QA_util_log_info(err, ui_log=ui_log)5733def QA_SU_save_single_bond_day(code : str, client=DATABASE, ui_log=None):5734    """save bond_day5735    Keyword Arguments:5736        code : single bond code5737        client {[type]} -- [description] (default: {DATABASE})5738    """5739    #__bond_list = QA_fetch_get_stock_list('bond')5740    coll = client.bond_day5741    coll.create_index(5742        [('code',5743          pymongo.ASCENDING),5744         ('date_stamp',5745          pymongo.ASCENDING)]5746    )5747    err = []5748    def __saving_work(code, coll):5749        try:5750            ref_ = coll.find({'code': str(code)[0:6]})5751            end_time = str(now_time())[0:10]5752            if ref_.count() > 0:5753                start_time = ref_[ref_.count() - 1]['date']5754                QA_util_log_info(5755                    '##JOB06 Now Saving BOND_DAY==== \n Trying updating {} from {} to {}'5756                        .format(code,5757                                start_time,5758                                end_time),5759                    ui_log=ui_log5760                )5761                if start_time != end_time:5762                    coll.insert_many(5763                        QA_util_to_json_from_pandas(5764                            QA_fetch_get_bond_day(5765                                str(code),5766                                QA_util_get_next_day(start_time),5767                                end_time5768                            )5769                        )5770                    )5771            else:5772                start_time = '1990-01-01'5773                QA_util_log_info(5774                    '##JOB06 Now Saving BOND_DAY==== \n Trying updating {} from {} to {}'5775                        .format(code,5776                                start_time,5777                                end_time),5778                    ui_log=ui_log5779                )5780                if start_time != end_time:5781                    coll.insert_many(5782                        QA_util_to_json_from_pandas(5783                            QA_fetch_get_bond_day(5784                                str(code),5785                                start_time,5786                                end_time5787                            )5788                        )5789                    )5790        except:5791            err.append(str(code))5792    __saving_work(code, coll)5793    if len(err) < 1:5794        QA_util_log_info('SUCCESS', ui_log=ui_log)5795    else:5796        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)5797        QA_util_log_info(err, ui_log=ui_log)5798def QA_SU_save_bond_day(client=DATABASE, ui_log=None, ui_progress=None):5799    """save bond_day5800    Keyword Arguments:5801        client {[type]} -- [description] (default: {DATABASE})5802    """5803    __bond_list = QA_fetch_get_bond_list()5804    coll = client.bond_day5805    coll.create_index(5806        [('code',5807          pymongo.ASCENDING),5808         ('date_stamp',5809          pymongo.ASCENDING)]5810    )5811    err = []5812    def __saving_work(code, coll):5813        try:5814            ref_ = coll.find({'code': str(code)[0:6]})5815            end_time = str(now_time())[0:10]5816            if ref_.count() > 0:5817                start_time = ref_[ref_.count() - 1]['date']5818                QA_util_log_info(5819                    '##JOB06 Now Saving BOND_DAY==== \n Trying updating {} from {} to {}'5820                        .format(code,5821                                start_time,5822                                end_time),5823                    ui_log=ui_log5824                )5825                if start_time != end_time:5826                    coll.insert_many(5827                        QA_util_to_json_from_pandas(5828                            QA_fetch_get_bond_day(5829                                str(code),5830                                QA_util_get_next_day(start_time),5831                                end_time5832                            )5833                        )5834                    )5835            else:5836                start_time = '1990-01-01'5837                QA_util_log_info(5838                    '##JOB06 Now Saving BOND_DAY==== \n Trying updating {} from {} to {}'5839                        .format(code,5840                                start_time,5841                                end_time),5842                    ui_log=ui_log5843                )5844                if start_time != end_time:5845                    coll.insert_many(5846                        QA_util_to_json_from_pandas(5847                            QA_fetch_get_bond_day(5848                                str(code),5849                                start_time,5850                                end_time5851                            )5852                        )5853                    )5854        except:5855            err.append(str(code))5856    for i_ in range(len(__bond_list)):5857        # __saving_work('000001')5858        QA_util_log_info(5859            'The {} of Total {}'.format(i_,5860                                        len(__bond_list)),5861            ui_log=ui_log5862        )5863        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(5864            str(float(i_ / len(__bond_list) * 100))[0:4] + '%'5865        )5866        intLogProgress = int(float(i_ / len(__bond_list) * 10000.0))5867        QA_util_log_info(5868            strLogProgress,5869            ui_log=ui_log,5870            ui_progress=ui_progress,5871            ui_progress_int_value=intLogProgress5872        )5873        __saving_work(__bond_list.index[i_][0], coll)5874    if len(err) < 1:5875        QA_util_log_info('SUCCESS', ui_log=ui_log)5876    else:5877        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)5878        QA_util_log_info(err, ui_log=ui_log)5879def QA_SU_save_bond_min(client=DATABASE, ui_log=None, ui_progress=None):5880    """save bond_min5881    Keyword Arguments:5882        client {[type]} -- [description] (default: {DATABASE})5883    """5884    __bond_list = QA_fetch_get_bond_list()5885    coll = client.bond_min5886    coll.create_index(5887        [5888            ('code',5889             pymongo.ASCENDING),5890            ('time_stamp',5891             pymongo.ASCENDING),5892            ('date_stamp',5893             pymongo.ASCENDING)5894        ]5895    )5896    err = []5897    def __saving_work(code, coll):5898        QA_util_log_info(5899            '##JOB07 Now Saving BOND_MIN ==== {}'.format(str(code)),5900            ui_log=ui_log5901        )5902        try:5903            for type in ['1min', '5min', '15min', '30min', '60min']:5904                ref_ = coll.find({'code': str(code)[0:6], 'type': type})5905                end_time = str(now_time())[0:19]5906                if ref_.count() > 0:5907                    start_time = ref_[ref_.count() - 1]['datetime']5908                    QA_util_log_info(5909                        '##JOB07.{} Now Saving {} from {} to {} =={} '.format(5910                            ['1min',5911                             '5min',5912                             '15min',5913                             '30min',5914                             '60min'].index(type),5915                            str(code),5916                            start_time,5917                            end_time,5918                            type5919                        ),5920                        ui_log=ui_log5921                    )5922                    if start_time != end_time:5923                        __data = QA_fetch_get_bond_min(5924                            str(code),5925                            start_time,5926                            end_time,5927                            type5928                        )5929                        if len(__data) > 1:5930                            coll.insert_many(5931                                QA_util_to_json_from_pandas(__data[1::])5932                            )5933                else:5934                    start_time = '2015-01-01'5935                    QA_util_log_info(5936                        '##JOB07.{} Now Saving {} from {} to {} =={} '.format(5937                            ['1min',5938                             '5min',5939                             '15min',5940                             '30min',5941                             '60min'].index(type),5942                            str(code),5943                            start_time,5944                            end_time,5945                            type5946                        ),5947                        ui_log=ui_log5948                    )5949                    if start_time != end_time:5950                        __data = QA_fetch_get_bond_min(5951                            str(code),5952                            start_time,5953                            end_time,5954                            type5955                        )5956                        if len(__data) > 1:5957                            coll.insert_many(5958                                QA_util_to_json_from_pandas(__data)5959                            )5960        except:5961            err.append(code)5962    executor = ThreadPoolExecutor(max_workers=4)5963    res = {5964        executor.submit(__saving_work,5965                        __bond_list.index[i_][0],5966                        coll)5967        for i_ in range(len(__bond_list))5968    }  # multi bond ./.5969    count = 15970    for _ in concurrent.futures.as_completed(res):5971        QA_util_log_info(5972            'The {} of Total {}'.format(count,5973                                        len(__bond_list)),5974            ui_log=ui_log5975        )5976        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(5977            str(float(count / len(__bond_list) * 100))[0:4] + '%'5978        )5979        intLogProgress = int(float(count / len(__bond_list) * 10000.0))5980        QA_util_log_info(5981            strLogProgress,5982            ui_log=ui_log,5983            ui_progress=ui_progress,5984            ui_progress_int_value=intLogProgress5985        )5986        count = count + 15987    if len(err) < 1:5988        QA_util_log_info('SUCCESS', ui_log=ui_log)5989    else:5990        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)5991        QA_util_log_info(err, ui_log=ui_log)5992def QA_SU_save_single_bond_min(code : str, client=DATABASE, ui_log=None, ui_progress=None):5993    """save single bond_min5994    Keyword Arguments:5995        client {[type]} -- [description] (default: {DATABASE})5996    """5997    #__bond_list = QA_fetch_get_stock_list('bond')5998    __bond_list = [code]5999    coll = client.bond_min6000    coll.create_index(6001        [6002            ('code',6003             pymongo.ASCENDING),6004            ('time_stamp',6005             pymongo.ASCENDING),6006            ('date_stamp',6007             pymongo.ASCENDING)6008        ]6009    )6010    err = []6011    def __saving_work(code, coll):6012        QA_util_log_info(6013            '##JOB07 Now Saving BOND_MIN ==== {}'.format(str(code)),6014            ui_log=ui_log6015        )6016        try:6017            for type in ['1min', '5min', '15min', '30min', '60min']:6018                ref_ = coll.find({'code': str(code)[0:6], 'type': type})6019                end_time = str(now_time())[0:19]6020                if ref_.count() > 0:6021                    start_time = ref_[ref_.count() - 1]['datetime']6022                    QA_util_log_info(6023                        '##JOB07.{} Now Saving {} from {} to {} =={} '.format(6024                            ['1min',6025                             '5min',6026                             '15min',6027                             '30min',6028                             '60min'].index(type),6029                            str(code),6030                            start_time,6031                            end_time,6032                            type6033                        ),6034                        ui_log=ui_log6035                    )6036                    if start_time != end_time:6037                        __data = QA_fetch_get_bond_min(6038                            str(code),6039                            start_time,6040                            end_time,6041                            type6042                        )6043                        if len(__data) > 1:6044                            coll.insert_many(6045                                QA_util_to_json_from_pandas(__data[1::])6046                            )6047                else:6048                    start_time = '2015-01-01'6049                    QA_util_log_info(6050                        '##JOB07.{} Now Saving {} from {} to {} =={} '.format(6051                            ['1min',6052                             '5min',6053                             '15min',6054                             '30min',6055                             '60min'].index(type),6056                            str(code),6057                            start_time,6058                            end_time,6059                            type6060                        ),6061                        ui_log=ui_log6062                    )6063                    if start_time != end_time:6064                        __data = QA_fetch_get_bond_min(6065                            str(code),6066                            start_time,6067                            end_time,6068                            type6069                        )6070                        if len(__data) > 1:6071                            coll.insert_many(6072                                QA_util_to_json_from_pandas(__data)6073                            )6074        except:6075            err.append(code)6076    executor = ThreadPoolExecutor(max_workers=4)6077    res = {6078        executor.submit(__saving_work,6079                        __bond_list[i_],6080                        coll)6081        for i_ in range(len(__bond_list))6082    }  # multi bond ./.6083    count = 16084    for _ in concurrent.futures.as_completed(res):6085        QA_util_log_info(6086            'The {} of Total {}'.format(count,6087                                        len(__bond_list)),6088            ui_log=ui_log6089        )6090        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(6091            str(float(count / len(__bond_list) * 100))[0:4] + '%'6092        )6093        intLogProgress = int(float(count / len(__bond_list) * 10000.0))6094        QA_util_log_info(6095            strLogProgress,6096            ui_log=ui_log,6097            ui_progress=ui_progress,6098            ui_progress_int_value=intLogProgress6099        )6100        count = count + 16101    if len(err) < 1:6102        QA_util_log_info('SUCCESS', ui_log=ui_log)6103    else:6104        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)6105        QA_util_log_info(err, ui_log=ui_log)6106def QA_SU_save_bond_list(client=DATABASE, ui_log=None, ui_progress=None):6107    """save bond_list6108    Keyword Arguments:6109        client {[type]} -- [description] (default: {DATABASE})6110    """6111    try:6112        QA_util_log_info(6113            '##JOB16 Now Saving BOND_LIST ====',6114            ui_log=ui_log,6115            ui_progress=ui_progress,6116            ui_progress_int_value=50006117        )6118        bond_list_from_tdx = QA_fetch_get_bond_list()6119        pandas_data = QA_util_to_json_from_pandas(bond_list_from_tdx)6120        if len(pandas_data) > 0:6121            # è·åå°æ°æ®åæè¿è¡drop collection æä½6122            client.drop_collection('bond_list')6123            coll = client.bond_list6124            coll.create_index('code')6125            coll.insert_many(pandas_data)6126        QA_util_log_info(6127            "宿bondå表è·å",6128            ui_log=ui_log,6129            ui_progress=ui_progress,6130            ui_progress_int_value=100006131        )6132    except Exception as e:6133        QA_util_log_info(e, ui_log=ui_log)6134        print(" Error save_tdx.QA_SU_save_bond_list exception!")6135        pass6136###############################################################6137# HKSTOCK6138###############################################################6139def QA_SU_save_single_hkstock_day(code : str, client=DATABASE, ui_log=None):6140    """save bond_day6141    Keyword Arguments:6142        code : single hkstock code6143        client {[type]} -- [description] (default: {DATABASE})6144    """6145    #__hkstock_list = QA_fetch_get_hkstock_list()6146    coll = client.hkstock_day6147    coll.create_index(6148        [('code',6149          pymongo.ASCENDING),6150         ('date_stamp',6151          pymongo.ASCENDING)]6152    )6153    err = []6154    def __saving_work(code, coll):6155        try:6156            ref_ = coll.find({'code': str(code)[0:6]})6157            end_time = str(now_time())[0:10]6158            if ref_.count() > 0:6159                start_time = ref_[ref_.count() - 1]['date']6160                QA_util_log_info(6161                    '##JOB06 Now Saving HKSTOCK_DAY==== \n Trying updating {} from {} to {}'6162                        .format(code,6163                                start_time,6164                                end_time),6165                    ui_log=ui_log6166                )6167                if start_time != end_time:6168                    coll.insert_many(6169                        QA_util_to_json_from_pandas(6170                            QA_fetch_get_hkstock_day(6171                                str(code),6172                                QA_util_get_next_day(start_time),6173                                end_time6174                            )6175                        )6176                    )6177            else:6178                start_time = '1990-01-01'6179                QA_util_log_info(6180                    '##JOB06 Now Saving HKSTOCK_DAY==== \n Trying updating {} from {} to {}'6181                        .format(code,6182                                start_time,6183                                end_time),6184                    ui_log=ui_log6185                )6186                if start_time != end_time:6187                    coll.insert_many(6188                        QA_util_to_json_from_pandas(6189                            QA_fetch_get_hkstock_day(6190                                str(code),6191                                start_time,6192                                end_time6193                            )6194                        )6195                    )6196        except:6197            err.append(str(code))6198    __saving_work(code, coll)6199    if len(err) < 1:6200        QA_util_log_info('SUCCESS', ui_log=ui_log)6201    else:6202        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)6203        QA_util_log_info(err, ui_log=ui_log)6204def QA_SU_save_hkstock_day(client=DATABASE, ui_log=None, ui_progress=None):6205    """save hkstock_day6206    Keyword Arguments:6207        client {[type]} -- [description] (default: {DATABASE})6208    """6209    __hkstock_list = QA_fetch_get_hkstock_list().code.unique().tolist()6210    coll = client.hkstock_day6211    coll.create_index(6212        [('code',6213          pymongo.ASCENDING),6214         ('date_stamp',6215          pymongo.ASCENDING)]6216    )6217    err = []6218    def __saving_work(code, coll):6219        try:6220            ref_ = coll.find({'code': str(code)[0:6]})6221            end_time = str(now_time())[0:10]6222            if ref_.count() > 0:6223                start_time = ref_[ref_.count() - 1]['date']6224                QA_util_log_info(6225                    '##JOB06 Now Saving HKSTOCK_DAY==== \n Trying updating {} from {} to {}'6226                        .format(code,6227                                start_time,6228                                end_time),6229                    ui_log=ui_log6230                )6231                if start_time != end_time:6232                    coll.insert_many(6233                        QA_util_to_json_from_pandas(6234                            QA_fetch_get_hkstock_day(6235                                str(code),6236                                QA_util_get_next_day(start_time),6237                                end_time6238                            )6239                        )6240                    )6241            else:6242                start_time = '1990-01-01'6243                QA_util_log_info(6244                    '##JOB06 Now Saving HKSTOCK_DAY==== \n Trying updating {} from {} to {}'6245                        .format(code,6246                                start_time,6247                                end_time),6248                    ui_log=ui_log6249                )6250                if start_time != end_time:6251                    coll.insert_many(6252                        QA_util_to_json_from_pandas(6253                            QA_fetch_get_hkstock_day(6254                                str(code),6255                                start_time,6256                                end_time6257                            )6258                        )6259                    )6260        except:6261            err.append(str(code))6262    for i_ in range(len(__hkstock_list)):6263        # __saving_work('000001')6264        QA_util_log_info(6265            'The {} of Total {}'.format(i_,6266                                        len(__hkstock_list)),6267            ui_log=ui_log6268        )6269        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(6270            str(float(i_ / len(__hkstock_list) * 100))[0:4] + '%'6271        )6272        intLogProgress = int(float(i_ / len(__hkstock_list) * 10000.0))6273        QA_util_log_info(6274            strLogProgress,6275            ui_log=ui_log,6276            ui_progress=ui_progress,6277            ui_progress_int_value=intLogProgress6278        )6279        __saving_work(__hkstock_list[i_], coll)6280    if len(err) < 1:6281        QA_util_log_info('SUCCESS', ui_log=ui_log)6282    else:6283        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)6284        QA_util_log_info(err, ui_log=ui_log)6285def QA_SU_save_hkstock_min(client=DATABASE, ui_log=None, ui_progress=None):6286    """save hkstock_min6287    Keyword Arguments:6288        client {[type]} -- [description] (default: {DATABASE})6289    """6290    __hkstock_list = QA_fetch_get_hkstock_list().code.unique().tolist()6291    coll = client.hkstock_min6292    coll.create_index(6293        [6294            ('code',6295             pymongo.ASCENDING),6296            ('time_stamp',6297             pymongo.ASCENDING),6298            ('date_stamp',6299             pymongo.ASCENDING)6300        ]6301    )6302    err = []6303    def __saving_work(code, coll):6304        QA_util_log_info(6305            '##JOB07 Now Saving HKSTOCK_MIN ==== {}'.format(str(code)),6306            ui_log=ui_log6307        )6308        try:6309            for type in ['1min', '5min', '15min', '30min', '60min']:6310                ref_ = coll.find({'code': str(code)[0:6], 'type': type})6311                end_time = str(now_time())[0:19]6312                if ref_.count() > 0:6313                    start_time = ref_[ref_.count() - 1]['datetime']6314                    QA_util_log_info(6315                        '##JOB07.{} Now Saving {} from {} to {} =={} '.format(6316                            ['1min',6317                             '5min',6318                             '15min',6319                             '30min',6320                             '60min'].index(type),6321                            str(code),6322                            start_time,6323                            end_time,6324                            type6325                        ),6326                        ui_log=ui_log6327                    )6328                    if start_time != end_time:6329                        __data = QA_fetch_get_hkstock_min(6330                            str(code),6331                            start_time,6332                            end_time,6333                            type6334                        )6335                        if len(__data) > 1:6336                            coll.insert_many(6337                                QA_util_to_json_from_pandas(__data[1::])6338                            )6339                else:6340                    start_time = '2015-01-01'6341                    QA_util_log_info(6342                        '##JOB07.{} Now Saving {} from {} to {} =={} '.format(6343                            ['1min',6344                             '5min',6345                             '15min',6346                             '30min',6347                             '60min'].index(type),6348                            str(code),6349                            start_time,6350                            end_time,6351                            type6352                        ),6353                        ui_log=ui_log6354                    )6355                    if start_time != end_time:6356                        __data = QA_fetch_get_hkstock_min(6357                            str(code),6358                            start_time,6359                            end_time,6360                            type6361                        )6362                        if len(__data) > 1:6363                            coll.insert_many(6364                                QA_util_to_json_from_pandas(__data)6365                            )6366        except:6367            err.append(code)6368    executor = ThreadPoolExecutor(max_workers=4)6369    res = {6370        executor.submit(__saving_work,6371                        __hkstock_list[i_],6372                        coll)6373        for i_ in range(len(__hkstock_list))6374    }  # multi bond ./.6375    count = 16376    for _ in concurrent.futures.as_completed(res):6377        QA_util_log_info(6378            'The {} of Total {}'.format(count,6379                                        len(__hkstock_list)),6380            ui_log=ui_log6381        )6382        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(6383            str(float(count / len(__hkstock_list) * 100))[0:4] + '%'6384        )6385        intLogProgress = int(float(count / len(__hkstock_list) * 10000.0))6386        QA_util_log_info(6387            strLogProgress,6388            ui_log=ui_log,6389            ui_progress=ui_progress,6390            ui_progress_int_value=intLogProgress6391        )6392        count = count + 16393    if len(err) < 1:6394        QA_util_log_info('SUCCESS', ui_log=ui_log)6395    else:6396        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)6397        QA_util_log_info(err, ui_log=ui_log)6398def QA_SU_save_single_hkstock_min(code : str, client=DATABASE, ui_log=None, ui_progress=None):6399    """save single hkstock_min6400    Keyword Arguments:6401        client {[type]} -- [description] (default: {DATABASE})6402    """6403    #__bond_list = QA_fetch_get_stock_list('bond')6404    __hkstock_list = [code]6405    coll = client.hkstock_min6406    coll.create_index(6407        [6408            ('code',6409             pymongo.ASCENDING),6410            ('time_stamp',6411             pymongo.ASCENDING),6412            ('date_stamp',6413             pymongo.ASCENDING)6414        ]6415    )6416    err = []6417    def __saving_work(code, coll):6418        QA_util_log_info(6419            '##JOB07 Now Saving HKSTOCK_MIN ==== {}'.format(str(code)),6420            ui_log=ui_log6421        )6422        try:6423            for type in ['1min', '5min', '15min', '30min', '60min']:6424                ref_ = coll.find({'code': str(code)[0:6], 'type': type})6425                end_time = str(now_time())[0:19]6426                if ref_.count() > 0:6427                    start_time = ref_[ref_.count() - 1]['datetime']6428                    QA_util_log_info(6429                        '##JOB07.{} Now Saving {} from {} to {} =={} '.format(6430                            ['1min',6431                             '5min',6432                             '15min',6433                             '30min',6434                             '60min'].index(type),6435                            str(code),6436                            start_time,6437                            end_time,6438                            type6439                        ),6440                        ui_log=ui_log6441                    )6442                    if start_time != end_time:6443                        __data = QA_fetch_get_hkstock_min(6444                            str(code),6445                            start_time,6446                            end_time,6447                            type6448                        )6449                        if len(__data) > 1:6450                            coll.insert_many(6451                                QA_util_to_json_from_pandas(__data[1::])6452                            )6453                else:6454                    start_time = '2015-01-01'6455                    QA_util_log_info(6456                        '##JOB07.{} Now Saving {} from {} to {} =={} '.format(6457                            ['1min',6458                             '5min',6459                             '15min',6460                             '30min',6461                             '60min'].index(type),6462                            str(code),6463                            start_time,6464                            end_time,6465                            type6466                        ),6467                        ui_log=ui_log6468                    )6469                    if start_time != end_time:6470                        __data = QA_fetch_get_hkstock_min(6471                            str(code),6472                            start_time,6473                            end_time,6474                            type6475                        )6476                        if len(__data) > 1:6477                            coll.insert_many(6478                                QA_util_to_json_from_pandas(__data)6479                            )6480        except:6481            err.append(code)6482    executor = ThreadPoolExecutor(max_workers=4)6483    res = {6484        executor.submit(__saving_work,6485                        __hkstock_list[i_],6486                        coll)6487        for i_ in range(len(__hkstock_list))6488    }  # multi bond ./.6489    count = 16490    for _ in concurrent.futures.as_completed(res):6491        QA_util_log_info(6492            'The {} of Total {}'.format(count,6493                                        len(__hkstock_list)),6494            ui_log=ui_log6495        )6496        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(6497            str(float(count / len(__hkstock_list) * 100))[0:4] + '%'6498        )6499        intLogProgress = int(float(count / len(__hkstock_list) * 10000.0))6500        QA_util_log_info(6501            strLogProgress,6502            ui_log=ui_log,6503            ui_progress=ui_progress,6504            ui_progress_int_value=intLogProgress6505        )6506        count = count + 16507    if len(err) < 1:6508        QA_util_log_info('SUCCESS', ui_log=ui_log)6509    else:6510        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)6511        QA_util_log_info(err, ui_log=ui_log)6512def QA_SU_save_hkstock_list(client=DATABASE, ui_log=None, ui_progress=None):6513    """save hkstock_list6514    Keyword Arguments:6515        client {[type]} -- [description] (default: {DATABASE})6516    """6517    try:6518        QA_util_log_info(6519            '##JOB16 Now Saving HKSTOCK_LIST ====',6520            ui_log=ui_log,6521            ui_progress=ui_progress,6522            ui_progress_int_value=50006523        )6524        hkstock_list_from_tdx = QA_fetch_get_hkstock_list()6525        pandas_data = QA_util_to_json_from_pandas(hkstock_list_from_tdx)6526        if len(pandas_data) > 0:6527            # è·åå°æ°æ®åæè¿è¡drop collection æä½6528            client.drop_collection('hkstock_list')6529            coll = client.hkstock_list6530            coll.create_index('code')6531            coll.insert_many(pandas_data)6532        QA_util_log_info(6533            "宿HKSTOCKå表è·å",6534            ui_log=ui_log,6535            ui_progress=ui_progress,6536            ui_progress_int_value=100006537        )6538    except Exception as e:6539        QA_util_log_info(e, ui_log=ui_log)6540        print(" Error save_tdx.QA_SU_save_hkstock_list exception!")6541        pass6542###############################################################6543# USSTOCK6544###############################################################6545def QA_SU_save_single_usstock_day(code : str, client=DATABASE, ui_log=None):6546    """save usstock_day6547    Keyword Arguments:6548        code : single usstock code6549        client {[type]} -- [description] (default: {DATABASE})6550    """6551    #__hkstock_list = QA_fetch_get_hkstock_list()6552    coll = client.usstock_day6553    coll.create_index(6554        [('code',6555          pymongo.ASCENDING),6556         ('date_stamp',6557          pymongo.ASCENDING)]6558    )6559    err = []6560    def __saving_work(code, coll):6561        try:6562            # ç®åç¾è¡åè¡¨ä¸æé¿çåæ®µæ¯7个6563            ref_ = coll.find({'code': str(code)[0:7]})6564            end_time = str(now_time())[0:10]6565            if ref_.count() > 0:6566                start_time = ref_[ref_.count() - 1]['date']6567                QA_util_log_info(6568                    '##JOB08 Now Saving USSTOCK_DAY==== \n Trying updating {} from {} to {}'6569                        .format(code,6570                                start_time,6571                                end_time),6572                    ui_log=ui_log6573                )6574                if start_time != end_time:6575                    coll.insert_many(6576                        QA_util_to_json_from_pandas(6577                            QA_fetch_get_usstock_day(6578                                str(code),6579                                QA_util_get_next_day(start_time),6580                                end_time6581                            )6582                        )6583                    )6584            else:6585                start_time = '1990-01-01'6586                QA_util_log_info(6587                    '##JOB08 Now Saving USSTOCK_DAY==== \n Trying updating {} from {} to {}'6588                        .format(code,6589                                start_time,6590                                end_time),6591                    ui_log=ui_log6592                )6593                if start_time != end_time:6594                    coll.insert_many(6595                        QA_util_to_json_from_pandas(6596                            QA_fetch_get_usstock_day(6597                                str(code),6598                                start_time,6599                                end_time6600                            )6601                        )6602                    )6603        except:6604            err.append(str(code))6605    __saving_work(code, coll)6606    if len(err) < 1:6607        QA_util_log_info('SUCCESS', ui_log=ui_log)6608    else:6609        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)6610        QA_util_log_info(err, ui_log=ui_log)6611def QA_SU_save_usstock_day(client=DATABASE, ui_log=None, ui_progress=None):6612    """save usstock_day6613    Keyword Arguments:6614        client {[type]} -- [description] (default: {DATABASE})6615    """6616    __usstock_list = QA_fetch_get_usstock_list().code.unique().tolist()6617    coll = client.usstock_day6618    coll.create_index(6619        [('code',6620          pymongo.ASCENDING),6621         ('date_stamp',6622          pymongo.ASCENDING)]6623    )6624    err = []6625    def __saving_work(code, coll):6626        try:6627            # ç®åç¾è¡åè¡¨ä¸æé¿çåæ®µæ¯7个6628            ref_ = coll.find({'code': str(code)[0:7]})6629            end_time = str(now_time())[0:10]6630            if ref_.count() > 0:6631                start_time = ref_[ref_.count() - 1]['date']6632                QA_util_log_info(6633                    '##JOB08 Now Saving USSTOCK_DAY==== \n Trying updating {} from {} to {}'6634                        .format(code,6635                                start_time,6636                                end_time),6637                    ui_log=ui_log6638                )6639                if start_time != end_time:6640                    coll.insert_many(6641                        QA_util_to_json_from_pandas(6642                            QA_fetch_get_usstock_day(6643                                str(code),6644                                QA_util_get_next_day(start_time),6645                                end_time6646                            )6647                        )6648                    )6649            else:6650                start_time = '1990-01-01'6651                QA_util_log_info(6652                    '##JOB08 Now Saving USSTOCK_DAY==== \n Trying updating {} from {} to {}'6653                        .format(code,6654                                start_time,6655                                end_time),6656                    ui_log=ui_log6657                )6658                if start_time != end_time:6659                    coll.insert_many(6660                        QA_util_to_json_from_pandas(6661                            QA_fetch_get_usstock_day(6662                                str(code),6663                                start_time,6664                                end_time6665                            )6666                        )6667                    )6668        except:6669            err.append(str(code))6670    for i_ in range(len(__usstock_list)):6671        # __saving_work('000001')6672        QA_util_log_info(6673            'The {} of Total {}'.format(i_,6674                                        len(__usstock_list)),6675            ui_log=ui_log6676        )6677        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(6678            str(float(i_ / len(__usstock_list) * 100))[0:4] + '%'6679        )6680        intLogProgress = int(float(i_ / len(__usstock_list) * 10000.0))6681        QA_util_log_info(6682            strLogProgress,6683            ui_log=ui_log,6684            ui_progress=ui_progress,6685            ui_progress_int_value=intLogProgress6686        )6687        __saving_work(__usstock_list[i_], coll)6688    if len(err) < 1:6689        QA_util_log_info('SUCCESS', ui_log=ui_log)6690    else:6691        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)6692        QA_util_log_info(err, ui_log=ui_log)6693def QA_SU_save_usstock_min(client=DATABASE, ui_log=None, ui_progress=None):6694    """save usstock_min6695    Keyword Arguments:6696        client {[type]} -- [description] (default: {DATABASE})6697    """6698    __usstock_list = QA_fetch_get_usstock_list().code.unique().tolist()6699    coll = client.usstock_min6700    coll.create_index(6701        [6702            ('code',6703             pymongo.ASCENDING),6704            ('time_stamp',6705             pymongo.ASCENDING),6706            ('date_stamp',6707             pymongo.ASCENDING)6708        ]6709    )6710    err = []6711    def __saving_work(code, coll):6712        QA_util_log_info(6713            '##JOB09 Now Saving USSTOCK_MIN ==== {}'.format(str(code)),6714            ui_log=ui_log6715        )6716        try:6717            for type in ['1min', '5min', '15min', '30min', '60min']:6718                ref_ = coll.find({'code': str(code)[0:6], 'type': type})6719                end_time = str(now_time())[0:19]6720                if ref_.count() > 0:6721                    start_time = ref_[ref_.count() - 1]['datetime']6722                    QA_util_log_info(6723                        '##JOB09.{} Now Saving {} from {} to {} =={} '.format(6724                            ['1min',6725                             '5min',6726                             '15min',6727                             '30min',6728                             '60min'].index(type),6729                            str(code),6730                            start_time,6731                            end_time,6732                            type6733                        ),6734                        ui_log=ui_log6735                    )6736                    if start_time != end_time:6737                        __data = QA_fetch_get_usstock_min(6738                            str(code),6739                            start_time,6740                            end_time,6741                            type6742                        )6743                        if len(__data) > 1:6744                            coll.insert_many(6745                                QA_util_to_json_from_pandas(__data[1::])6746                            )6747                else:6748                    start_time = '2015-01-01'6749                    QA_util_log_info(6750                        '##JOB09.{} Now Saving {} from {} to {} =={} '.format(6751                            ['1min',6752                             '5min',6753                             '15min',6754                             '30min',6755                             '60min'].index(type),6756                            str(code),6757                            start_time,6758                            end_time,6759                            type6760                        ),6761                        ui_log=ui_log6762                    )6763                    if start_time != end_time:6764                        __data = QA_fetch_get_usstock_min(6765                            str(code),6766                            start_time,6767                            end_time,6768                            type6769                        )6770                        if len(__data) > 1:6771                            coll.insert_many(6772                                QA_util_to_json_from_pandas(__data)6773                            )6774        except:6775            err.append(code)6776    executor = ThreadPoolExecutor(max_workers=4)6777    res = {6778        executor.submit(__saving_work,6779                        __usstock_list[i_],6780                        coll)6781        for i_ in range(len(__usstock_list))6782    }  # multi bond ./.6783    count = 16784    for _ in concurrent.futures.as_completed(res):6785        QA_util_log_info(6786            'The {} of Total {}'.format(count,6787                                        len(__usstock_list)),6788            ui_log=ui_log6789        )6790        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(6791            str(float(count / len(__usstock_list) * 100))[0:4] + '%'6792        )6793        intLogProgress = int(float(count / len(__usstock_list) * 10000.0))6794        QA_util_log_info(6795            strLogProgress,6796            ui_log=ui_log,6797            ui_progress=ui_progress,6798            ui_progress_int_value=intLogProgress6799        )6800        count = count + 16801    if len(err) < 1:6802        QA_util_log_info('SUCCESS', ui_log=ui_log)6803    else:6804        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)6805        QA_util_log_info(err, ui_log=ui_log)6806def QA_SU_save_single_usstock_min(code : str, client=DATABASE, ui_log=None, ui_progress=None):6807    """save single usstock_min6808    Keyword Arguments:6809        client {[type]} -- [description] (default: {DATABASE})6810    """6811    #__bond_list = QA_fetch_get_stock_list('bond')6812    __usstock_list = [code]6813    coll = client.usstock_min6814    coll.create_index(6815        [6816            ('code',6817             pymongo.ASCENDING),6818            ('time_stamp',6819             pymongo.ASCENDING),6820            ('date_stamp',6821             pymongo.ASCENDING)6822        ]6823    )6824    err = []6825    def __saving_work(code, coll):6826        QA_util_log_info(6827            '##JOB07 Now Saving USSTOCK_MIN ==== {}'.format(str(code)),6828            ui_log=ui_log6829        )6830        try:6831            for type in ['1min', '5min', '15min', '30min', '60min']:6832                ref_ = coll.find({'code': str(code)[0:6], 'type': type})6833                end_time = str(now_time())[0:19]6834                if ref_.count() > 0:6835                    start_time = ref_[ref_.count() - 1]['datetime']6836                    QA_util_log_info(6837                        '##JOB09.{} Now Saving {} from {} to {} =={} '.format(6838                            ['1min',6839                             '5min',6840                             '15min',6841                             '30min',6842                             '60min'].index(type),6843                            str(code),6844                            start_time,6845                            end_time,6846                            type6847                        ),6848                        ui_log=ui_log6849                    )6850                    if start_time != end_time:6851                        __data = QA_fetch_get_usstock_min(6852                            str(code),6853                            start_time,6854                            end_time,6855                            type6856                        )6857                        if len(__data) > 1:6858                            coll.insert_many(6859                                QA_util_to_json_from_pandas(__data[1::])6860                            )6861                else:6862                    start_time = '2015-01-01'6863                    QA_util_log_info(6864                        '##JOB09.{} Now Saving {} from {} to {} =={} '.format(6865                            ['1min',6866                             '5min',6867                             '15min',6868                             '30min',6869                             '60min'].index(type),6870                            str(code),6871                            start_time,6872                            end_time,6873                            type6874                        ),6875                        ui_log=ui_log6876                    )6877                    if start_time != end_time:6878                        __data = QA_fetch_get_usstock_min(6879                            str(code),6880                            start_time,6881                            end_time,6882                            type6883                        )6884                        if len(__data) > 1:6885                            coll.insert_many(6886                                QA_util_to_json_from_pandas(__data)6887                            )6888        except:6889            err.append(code)6890    executor = ThreadPoolExecutor(max_workers=4)6891    res = {6892        executor.submit(__saving_work,6893                        __usstock_list[i_],6894                        coll)6895        for i_ in range(len(__usstock_list))6896    }  # multi bond ./.6897    count = 16898    for _ in concurrent.futures.as_completed(res):6899        QA_util_log_info(6900            'The {} of Total {}'.format(count,6901                                        len(__usstock_list)),6902            ui_log=ui_log6903        )6904        strLogProgress = 'DOWNLOAD PROGRESS {} '.format(6905            str(float(count / len(__usstock_list) * 100))[0:4] + '%'6906        )6907        intLogProgress = int(float(count / len(__usstock_list) * 10000.0))6908        QA_util_log_info(6909            strLogProgress,6910            ui_log=ui_log,6911            ui_progress=ui_progress,6912            ui_progress_int_value=intLogProgress6913        )6914        count = count + 16915    if len(err) < 1:6916        QA_util_log_info('SUCCESS', ui_log=ui_log)6917    else:6918        QA_util_log_info(' ERROR CODE \n ', ui_log=ui_log)6919        QA_util_log_info(err, ui_log=ui_log)6920def QA_SU_save_usstock_list(client=DATABASE, ui_log=None, ui_progress=None):6921    """save usstock_list6922    Keyword Arguments:6923        client {[type]} -- [description] (default: {DATABASE})6924    """6925    try:6926        QA_util_log_info(6927            '##JOB16 Now Saving USSTOCK_LIST ====',6928            ui_log=ui_log,6929            ui_progress=ui_progress,6930            ui_progress_int_value=50006931        )6932        usstock_list_from_tdx = QA_fetch_get_usstock_list()6933        pandas_data = QA_util_to_json_from_pandas(usstock_list_from_tdx)6934        if len(pandas_data) > 0:6935            # è·åå°æ°æ®åæè¿è¡drop collection æä½6936            client.drop_collection('usstock_list')6937            coll = client.usstock_list6938            coll.create_index('code')6939            coll.insert_many(pandas_data)6940        QA_util_log_info(6941            "宿USSTOCKå表è·å",6942            ui_log=ui_log,6943            ui_progress=ui_progress,6944            ui_progress_int_value=100006945        )6946    except Exception as e:6947        QA_util_log_info(e, ui_log=ui_log)6948        print(" Error save_tdx.QA_SU_save_usstock_list exception!")6949        pass6950if __name__ == '__main__':6951    # QA_SU_save_stock_day()6952    # QA_SU_save_stock_xdxr()6953    # QA_SU_save_stock_min()6954    # QA_SU_save_stock_transaction()6955    # QA_SU_save_index_day()6956    # QA_SU_save_stock_list()6957    # QA_SU_save_index_min()6958    # QA_SU_save_index_list()6959    # QA_SU_save_future_list()6960    #QA_SU_save_future_day()6961    #QA_SU_save_future_min()6962    # QA_SU_save_hkstock_list()6963    # QA_SU_save_hkstock_day()6964    #QA_SU_save_hkstock_min()6965    #QA_SU_save_single_hkstock_min(code="00338")6966    # QA_SU_save_usstock_list()6967    # QA_SU_save_single_usstock_day(code ='YDEC')6968    # QA_SU_save_usstock_day()...bounds.py
Source:bounds.py  
...59      tf.summary.scalar("weight_entropy/%d" % t, weight_entropy)60    log_weights.append(log_weight_acc)61  # Compute the lower bound on the log evidence.62  log_p_hat = (tf.reduce_logsumexp(log_weight_acc, axis=0) -63               tf.log(tf.cast(num_samples, observation.dtype))) / num_timesteps64  loss = -tf.reduce_mean(log_p_hat)65  losses = [Loss("log_p_hat", loss)]66  # we clip off the initial state before returning.67  # there are no emas for iwae, so we return a noop for that68  return log_p_hat, losses, tf.no_op(), states[1:], log_weights69def multinomial_resampling(log_weights, states, n, b):70  """Resample states with multinomial resampling.71  Args:72    log_weights: A (n x b) Tensor representing a batch of b logits for n-ary73      Categorical distribution.74    states: A list of (b*n x d) Tensors that will be resample in from the groups75     of every n-th row.76  Returns:77    resampled_states: A list of (b*n x d) Tensors resampled via stratified sampling.78    log_probs: A (n x b) Tensor of the log probabilities of the ancestry decisions.79    resampling_parameters: The Tensor of parameters of the resampling distribution.80    ancestors: An (n x b) Tensor of integral indices representing the ancestry decisions.81    resampling_dist: The distribution object for resampling.82  """83  log_weights = tf.convert_to_tensor(log_weights)84  states = [tf.convert_to_tensor(state) for state in states]85  resampling_parameters = tf.transpose(log_weights, perm=[1,0])86  resampling_dist = tf.contrib.distributions.Categorical(logits=resampling_parameters)87  ancestors = tf.stop_gradient(88      resampling_dist.sample(sample_shape=n))89  log_probs = resampling_dist.log_prob(ancestors)90  offset = tf.expand_dims(tf.range(b), 0)91  ancestor_inds = tf.reshape(ancestors * b + offset, [-1])92  resampled_states = []93  for state in states:94    resampled_states.append(tf.gather(state, ancestor_inds))95  return resampled_states, log_probs, resampling_parameters, ancestors, resampling_dist96def stratified_resampling(log_weights, states, n, b):97  """Resample states with straitified resampling.98  Args:99    log_weights: A (n x b) Tensor representing a batch of b logits for n-ary100      Categorical distribution.101    states: A list of (b*n x d) Tensors that will be resample in from the groups102     of every n-th row.103  Returns:104    resampled_states: A list of (b*n x d) Tensors resampled via stratified sampling.105    log_probs: A (n x b) Tensor of the log probabilities of the ancestry decisions.106    resampling_parameters: The Tensor of parameters of the resampling distribution.107    ancestors: An (n x b) Tensor of integral indices representing the ancestry decisions.108    resampling_dist: The distribution object for resampling.109  """110  log_weights = tf.convert_to_tensor(log_weights)111  states = [tf.convert_to_tensor(state) for state in states]112  log_weights = tf.transpose(log_weights, perm=[1,0])113  probs = tf.nn.softmax(114            tf.tile(tf.expand_dims(log_weights, axis=1),115                    [1, n, 1])116  )117  cdfs = tf.concat([tf.zeros((b,n,1), dtype=probs.dtype), tf.cumsum(probs, axis=2)], 2)118  bins = tf.range(n, dtype=probs.dtype) / n119  bins = tf.tile(tf.reshape(bins, [1,-1,1]), [b,1,n+1])120  strat_cdfs = tf.minimum(tf.maximum((cdfs - bins) * n, 0.0), 1.0)121  resampling_parameters = strat_cdfs[:,:,1:] - strat_cdfs[:,:,:-1]122  resampling_dist = tf.contrib.distributions.Categorical(123      probs = resampling_parameters,124      allow_nan_stats=False)125  ancestors = tf.stop_gradient(126      resampling_dist.sample())127  log_probs = resampling_dist.log_prob(ancestors)128  ancestors = tf.transpose(ancestors, perm=[1,0])129  log_probs = tf.transpose(log_probs, perm=[1,0])130  offset = tf.expand_dims(tf.range(b), 0)131  ancestor_inds = tf.reshape(ancestors * b + offset, [-1])132  resampled_states = []133  for state in states:134    resampled_states.append(tf.gather(state, ancestor_inds))135  return resampled_states, log_probs, resampling_parameters, ancestors, resampling_dist136def systematic_resampling(log_weights, states, n, b):137  """Resample states with systematic resampling.138  Args:139    log_weights: A (n x b) Tensor representing a batch of b logits for n-ary140      Categorical distribution.141    states: A list of (b*n x d) Tensors that will be resample in from the groups142     of every n-th row.143  Returns:144    resampled_states: A list of (b*n x d) Tensors resampled via stratified sampling.145    log_probs: A (n x b) Tensor of the log probabilities of the ancestry decisions.146    resampling_parameters: The Tensor of parameters of the resampling distribution.147    ancestors: An (n x b) Tensor of integral indices representing the ancestry decisions.148    resampling_dist: The distribution object for resampling.149  """150  log_weights = tf.convert_to_tensor(log_weights)151  states = [tf.convert_to_tensor(state) for state in states]152  log_weights = tf.transpose(log_weights, perm=[1,0])153  probs = tf.nn.softmax(154            tf.tile(tf.expand_dims(log_weights, axis=1),155                    [1, n, 1])156  )157  cdfs = tf.concat([tf.zeros((b,n,1), dtype=probs.dtype), tf.cumsum(probs, axis=2)], 2)158  bins = tf.range(n, dtype=probs.dtype) / n159  bins = tf.tile(tf.reshape(bins, [1,-1,1]), [b,1,n+1])160  strat_cdfs = tf.minimum(tf.maximum((cdfs - bins) * n, 0.0), 1.0)161  resampling_parameters = strat_cdfs[:,:,1:] - strat_cdfs[:,:,:-1]162  resampling_dist = tf.contrib.distributions.Categorical(163      probs=resampling_parameters,164      allow_nan_stats=True)165  U = tf.random_uniform((b, 1, 1), dtype=probs.dtype)166  ancestors = tf.stop_gradient(tf.reduce_sum(tf.to_float(U > strat_cdfs[:,:,1:]), axis=-1))167  log_probs = resampling_dist.log_prob(ancestors)168  ancestors = tf.transpose(ancestors, perm=[1,0])169  log_probs = tf.transpose(log_probs, perm=[1,0])170  offset = tf.expand_dims(tf.range(b, dtype=probs.dtype), 0)171  ancestor_inds = tf.reshape(ancestors * b + offset, [-1])172  resampled_states = []173  for state in states:174    resampled_states.append(tf.gather(state, ancestor_inds))175  return resampled_states, log_probs, resampling_parameters, ancestors, resampling_dist176def log_blend(inputs, weights):177  """Blends state in the log space.178  Args:179    inputs: A set of scalar states, one for each particle in each particle filter.180      Should be [num_samples, batch_size].181    weights: A set of weights used to blend the state. Each set of weights182      should be of dimension [num_samples] (one weight for each previous particle).183      There should be one set of weights for each new particle in each particle filter.184      Thus the shape should be [num_samples, batch_size, num_samples] where185      the first axis indexes new particle and the last axis indexes old particles.186  Returns:187    blended: The blended states, a tensor of shape [num_samples, batch_size].188  """189  raw_max = tf.reduce_max(inputs, axis=0, keepdims=True)190  my_max = tf.stop_gradient(191      tf.where(tf.is_finite(raw_max), raw_max, tf.zeros_like(raw_max))192  )193  # Don't ask.194  blended = tf.log(tf.einsum("ijk,kj->ij", weights, tf.exp(inputs - raw_max))) + my_max195  return blended196def relaxed_resampling(log_weights, states, num_samples, batch_size,197                       log_r_x=None, blend_type="log", temperature=0.5,198                       straight_through=False):199  """Resample states with relaxed resampling.200  Args:201    log_weights: A (n x b) Tensor representing a batch of b logits for n-ary202      Categorical distribution.203    states: A list of (b*n x d) Tensors that will be resample in from the groups204     of every n-th row.205  Returns:206    resampled_states: A list of (b*n x d) Tensors resampled via stratified sampling.207    log_probs: A (n x b) Tensor of the log probabilities of the ancestry decisions.208    resampling_parameters: The Tensor of parameters of the resampling distribution.209    ancestors: An (n x b x n) Tensor of relaxed one hot representations of the ancestry decisions.210    resampling_dist: The distribution object for resampling.211  """212  assert blend_type in ["log", "linear"], "Blend type must be 'log' or 'linear'."213  log_weights = tf.convert_to_tensor(log_weights)214  states = [tf.convert_to_tensor(state) for state in states]215  state_dim = states[0].get_shape().as_list()[-1]216  # weights are num_samples by batch_size, so we transpose to get a217  # set of batch_size distributions over [0,num_samples).218  resampling_parameters = tf.transpose(log_weights, perm=[1, 0])219  resampling_dist = tf.contrib.distributions.RelaxedOneHotCategorical(220      temperature,221      logits=resampling_parameters)222  # sample num_samples samples from the distribution, resulting in a223  # [num_samples, batch_size, num_samples] Tensor that represents a set of224  # [num_samples, batch_size] blending weights. The dimensions represent225  # [sample index, batch index, blending weight index]226  ancestors = resampling_dist.sample(sample_shape=num_samples)227  if straight_through:228    # Forward pass discrete choices, backwards pass soft choices229    hard_ancestor_indices = tf.argmax(ancestors, axis=-1)230    hard_ancestors = tf.one_hot(hard_ancestor_indices, num_samples,231                                dtype=ancestors.dtype)232    ancestors = tf.stop_gradient(hard_ancestors - ancestors) + ancestors233  log_probs = resampling_dist.log_prob(ancestors)234  if log_r_x is not None and blend_type == "log":235    log_r_x = tf.reshape(log_r_x, [num_samples, batch_size])236    log_r_x = log_blend(log_r_x, ancestors)237    log_r_x = tf.reshape(log_r_x, [num_samples*batch_size])238  elif log_r_x is not None and blend_type == "linear":239    # If blend type is linear just add log_r to the states that will be blended240    # linearly.241    states.append(log_r_x)242  # transpose the 'indices' to be [batch_index, blending weight index, sample index]243  ancestor_inds = tf.transpose(ancestors, perm=[1, 2, 0])244  resampled_states = []245  for state in states:246    # state is currently [num_samples * batch_size, state_dim] so we reshape247    # to [num_samples, batch_size, state_dim] and then transpose to248    # [batch_size, state_size, num_samples]249    state = tf.transpose(tf.reshape(state, [num_samples, batch_size, -1]), perm=[1, 2, 0])250    # state is now (batch_size, state_size, num_samples)251    # and ancestor is (batch index, blending weight index, sample index)252    # multiplying these gives a matrix of size [batch_size, state_size, num_samples]253    next_state = tf.matmul(state, ancestor_inds)254    # transpose the state to be [num_samples, batch_size, state_size]255    # and then reshape it to match the state format.256    next_state = tf.reshape(tf.transpose(next_state, perm=[2,0,1]), [num_samples*batch_size, state_dim])257    resampled_states.append(next_state)258  new_dist = tf.contrib.distributions.Categorical(259      logits=resampling_parameters)260  if log_r_x is not None and blend_type == "linear":261    # If blend type is linear pop off log_r that we added to the states.262    log_r_x = tf.squeeze(resampled_states[-1])263    resampled_states = resampled_states[:-1]264  return resampled_states, log_probs, log_r_x, resampling_parameters, ancestors, new_dist265def fivo(model,266         observation,267         num_timesteps,268         resampling_schedule,269         num_samples=1,270         use_resampling_grads=True,271         resampling_type="multinomial",272         resampling_temperature=0.5,273         aux=True,274         summarize=False):275  """Compute the FIVO evidence lower bound.276  Args:277    model: A callable that computes one timestep of the model.278    observation: A shape [batch_size*num_samples, state_size] Tensor279      containing z_n, the observation for each sequence in the batch.280    num_timesteps: The number of timesteps in each sequence, an integer.281    resampling_schedule: A list of booleans of length num_timesteps, contains282      True if a resampling should occur on a specific timestep.283    num_samples: The number of samples to use to compute the IWAE bound.284    use_resampling_grads: Whether or not to include the resampling gradients285      in loss.286    resampling type: The type of resampling, one of "multinomial", "stratified",287      "relaxed-logblend", "relaxed-linearblend", "relaxed-stateblend", or288      "systematic".289    resampling_temperature: A positive temperature only used for relaxed290      resampling.291    aux: If true, compute the FIVO-AUX bound.292  Returns:293    log_p_hat: The IWAE estimator of the lower bound on the log marginal.294    loss: A tensor that you can perform gradient descent on to optimize the295      bound.296    maintain_ema_op: An op to update the baseline ema used for the resampling297      gradients.298    states: The sequence of states sampled.299  """300  # Initialization301  num_instances = tf.cast(tf.shape(observation)[0], tf.int32)302  batch_size = tf.cast(num_instances / num_samples, tf.int32)303  states = [model.zero_state(num_instances)]304  prev_state = states[0]305  log_weight_acc = tf.zeros(shape=[num_samples, batch_size], dtype=observation.dtype)306  prev_log_r_zt = tf.zeros([num_instances], dtype=observation.dtype)307  log_weights = []308  log_weights_all = []309  log_p_hats = []310  resampling_log_probs = []311  for t in xrange(num_timesteps):312    # run the model for one timestep313    (zt, log_q_zt, log_p_zt, log_p_x_given_z, log_r_zt) = model(314        prev_state, observation, t)315    # update accumulators316    states.append(zt)317    log_weight = log_p_zt + log_p_x_given_z - log_q_zt318    if aux:319      if t == num_timesteps - 1:320        log_weight -= prev_log_r_zt321      else:322        log_weight += log_r_zt - prev_log_r_zt323      prev_log_r_zt = log_r_zt324    log_weight_acc += tf.reshape(log_weight, [num_samples, batch_size])325    log_weights_all.append(log_weight_acc)326    if resampling_schedule[t]:327      # These objects will be resampled328      to_resample = [states[-1]]329      if aux and "relaxed" not in resampling_type:330        to_resample.append(prev_log_r_zt)331      # do the resampling332      if resampling_type == "multinomial":333        (resampled,334         resampling_log_prob,335         _, _, _) = multinomial_resampling(log_weight_acc,336                                           to_resample,337                                           num_samples,338                                           batch_size)339      elif resampling_type == "stratified":340        (resampled,341         resampling_log_prob,342         _, _, _) = stratified_resampling(log_weight_acc,343                                          to_resample,344                                          num_samples,345                                          batch_size)346      elif resampling_type == "systematic":347        (resampled,348         resampling_log_prob,349         _, _, _) = systematic_resampling(log_weight_acc,350                                          to_resample,351                                          num_samples,352                                          batch_size)353      elif "relaxed" in resampling_type:354        if aux:355          if resampling_type == "relaxed-logblend":356            (resampled,357             resampling_log_prob,358             prev_log_r_zt,359             _, _, _) = relaxed_resampling(log_weight_acc,360                                           to_resample,361                                           num_samples,362                                           batch_size,363                                           temperature=resampling_temperature,364                                           log_r_x=prev_log_r_zt,365                                           blend_type="log")366          elif resampling_type == "relaxed-linearblend":367            (resampled,368             resampling_log_prob,369             prev_log_r_zt,370             _, _, _) = relaxed_resampling(log_weight_acc,371                                           to_resample,372                                           num_samples,373                                           batch_size,374                                           temperature=resampling_temperature,375                                           log_r_x=prev_log_r_zt,376                                           blend_type="linear")377          elif resampling_type == "relaxed-stateblend":378            (resampled,379             resampling_log_prob,380             _, _, _, _) = relaxed_resampling(log_weight_acc,381                                              to_resample,382                                              num_samples,383                                              batch_size,384                                              temperature=resampling_temperature)385            # Calculate prev_log_r_zt from the post-resampling state386            prev_r_zt = model.r.r_xn(resampled[0], t)387            prev_log_r_zt = tf.reduce_sum(388                prev_r_zt.log_prob(observation), axis=[1])389          elif resampling_type == "relaxed-stateblend-st":390            (resampled,391             resampling_log_prob,392             _, _, _, _) = relaxed_resampling(log_weight_acc,393                                              to_resample,394                                              num_samples,395                                              batch_size,396                                              temperature=resampling_temperature,397                                              straight_through=True)398            # Calculate prev_log_r_zt from the post-resampling state399            prev_r_zt = model.r.r_xn(resampled[0], t)400            prev_log_r_zt = tf.reduce_sum(401                prev_r_zt.log_prob(observation), axis=[1])402        else:403          (resampled,404           resampling_log_prob,405           _, _, _, _) = relaxed_resampling(log_weight_acc,406                                            to_resample,407                                            num_samples,408                                            batch_size,409                                            temperature=resampling_temperature)410      #if summarize:411      #  resampling_entropy = resampling_dist.entropy()412      #  resampling_entropy = tf.reduce_mean(resampling_entropy)413      #  tf.summary.scalar("weight_entropy/%d" % t, resampling_entropy)414      resampling_log_probs.append(tf.reduce_sum(resampling_log_prob, axis=0))415      prev_state = resampled[0]416      if aux and "relaxed" not in resampling_type:417        # Squeeze out the extra dim potentially added by resampling.418        # prev_log_r_zt should always be [num_instances]419        prev_log_r_zt = tf.squeeze(resampled[1])420      # Update the log p hat estimate, taking a log sum exp over the sample421      # dimension. The appended tensor is [batch_size].422      log_p_hats.append(423          tf.reduce_logsumexp(log_weight_acc, axis=0) - tf.log(424              tf.cast(num_samples, dtype=observation.dtype)))425      # reset the weights426      log_weights.append(log_weight_acc)427      log_weight_acc = tf.zeros_like(log_weight_acc)428    else:429      prev_state = states[-1]430  # Compute the final weight update. If we just resampled this will be zero.431  final_update = (tf.reduce_logsumexp(log_weight_acc, axis=0) -432                  tf.log(tf.cast(num_samples, dtype=observation.dtype)))433  # If we ever resampled, then sum up the previous log p hat terms434  if len(log_p_hats) > 0:435    log_p_hat = tf.reduce_sum(log_p_hats, axis=0) + final_update436  else:  # otherwise, log_p_hat only comes from the final update437    log_p_hat = final_update438  if use_resampling_grads and any(resampling_schedule):439    # compute the rewards440    # cumsum([a, b, c]) => [a, a+b, a+b+c]441    # learning signal at timestep t is442    #   [sum from i=t+1 to T of log_p_hat_i for t=1:T]443    # so we will compute (sum from i=1 to T of log_p_hat_i)444    # and at timestep t will subtract off (sum from i=1 to t of log_p_hat_i)445    # rewards is a [num_resampling_events, batch_size] Tensor446    rewards = tf.stop_gradient(447        tf.expand_dims(log_p_hat, 0) - tf.cumsum(log_p_hats, axis=0))448    batch_avg_rewards = tf.reduce_mean(rewards, axis=1)449    # compute ema baseline.450    # centered_rewards is [num_resampling_events, batch_size]451    baseline_ema = tf.train.ExponentialMovingAverage(decay=0.94)452    maintain_baseline_op = baseline_ema.apply([batch_avg_rewards])453    baseline = tf.expand_dims(baseline_ema.average(batch_avg_rewards), 1)454    centered_rewards = rewards - baseline455    if summarize:456      summ.summarize_learning_signal(rewards, "rewards")457      summ.summarize_learning_signal(centered_rewards, "centered_rewards")458    # compute the loss tensor.459    resampling_grads = tf.reduce_sum(460        tf.stop_gradient(centered_rewards) * resampling_log_probs, axis=0)461    losses = [Loss("log_p_hat", -tf.reduce_mean(log_p_hat)/num_timesteps),462              Loss("resampling_grads", -tf.reduce_mean(resampling_grads)/num_timesteps)]463  else:464    losses = [Loss("log_p_hat", -tf.reduce_mean(log_p_hat)/num_timesteps)]465    maintain_baseline_op = tf.no_op()466  log_p_hat /= num_timesteps467  # we clip off the initial state before returning.468  return log_p_hat, losses, maintain_baseline_op, states[1:], log_weights_all469def fivo_aux_td(470    model,471    observation,472    num_timesteps,473    resampling_schedule,474    num_samples=1,475    summarize=False):476  """Compute the FIVO_AUX evidence lower bound."""477  # Initialization478  num_instances = tf.cast(tf.shape(observation)[0], tf.int32)479  batch_size = tf.cast(num_instances / num_samples, tf.int32)480  states = [model.zero_state(num_instances)]481  prev_state = states[0]482  log_weight_acc = tf.zeros(shape=[num_samples, batch_size], dtype=observation.dtype)483  prev_log_r = tf.zeros([num_instances], dtype=observation.dtype)484  # must be pre-resampling485  log_rs = []486  # must be post-resampling487  r_tilde_params = [model.r_tilde.r_zt(states[0], observation, 0)]488  log_r_tildes = []489  log_p_xs = []490  # contains the weight at each timestep before resampling only on resampling timesteps491  log_weights = []492  # contains weight at each timestep before resampling493  log_weights_all = []494  log_p_hats = []495  for t in xrange(num_timesteps):496    # run the model for one timestep497    # zt is state, [num_instances, state_dim]498    # log_q_zt, log_p_x_given_z is [num_instances]499    # r_tilde_mu, r_tilde_sigma is [num_instances, state_dim]500    # p_ztplus1 is a normal distribution on [num_instances, state_dim]501    (zt, log_q_zt, log_p_zt, log_p_x_given_z,502     r_tilde_mu, r_tilde_sigma_sq, p_ztplus1) = model(prev_state, observation, t)503    # Compute the log weight without log r.504    log_weight = log_p_zt + log_p_x_given_z - log_q_zt505    # Compute log r.506    if t == num_timesteps - 1:507      log_r = tf.zeros_like(prev_log_r)508    else:509      p_mu = p_ztplus1.mean()510      p_sigma_sq = p_ztplus1.variance()511      log_r = (tf.log(r_tilde_sigma_sq) -512               tf.log(r_tilde_sigma_sq + p_sigma_sq) -513               tf.square(r_tilde_mu - p_mu)/(r_tilde_sigma_sq + p_sigma_sq))514      log_r = 0.5*tf.reduce_sum(log_r, axis=-1)515    #log_weight += tf.stop_gradient(log_r - prev_log_r)516    log_weight += log_r - prev_log_r517    log_weight_acc += tf.reshape(log_weight, [num_samples, batch_size])518    # Update accumulators519    states.append(zt)520    log_weights_all.append(log_weight_acc)521    log_p_xs.append(log_p_x_given_z)522    log_rs.append(log_r)523    # Compute log_r_tilde as [num_instances] Tensor.524    prev_r_tilde_mu, prev_r_tilde_sigma_sq = r_tilde_params[-1]525    prev_log_r_tilde = -0.5*tf.reduce_sum(526        tf.square(zt - prev_r_tilde_mu)/prev_r_tilde_sigma_sq, axis=-1)527        #tf.square(tf.stop_gradient(zt) - r_tilde_mu)/r_tilde_sigma_sq, axis=-1)528        #tf.square(zt - r_tilde_mu)/r_tilde_sigma_sq, axis=-1)529    log_r_tildes.append(prev_log_r_tilde)530    # optionally resample531    if resampling_schedule[t]:532      # These objects will be resampled533      if t < num_timesteps - 1:534        to_resample = [zt, log_r, r_tilde_mu, r_tilde_sigma_sq]535      else:536        to_resample = [zt, log_r]537      (resampled,538       _, _, _, _) = multinomial_resampling(log_weight_acc,539                                            to_resample,540                                            num_samples,541                                            batch_size)542      prev_state = resampled[0]543      # Squeeze out the extra dim potentially added by resampling.544      # prev_log_r_zt and log_r_tilde should always be [num_instances]545      prev_log_r = tf.squeeze(resampled[1])546      if t < num_timesteps -1:547        r_tilde_params.append((resampled[2], resampled[3]))548      # Update the log p hat estimate, taking a log sum exp over the sample549      # dimension. The appended tensor is [batch_size].550      log_p_hats.append(551          tf.reduce_logsumexp(log_weight_acc, axis=0) - tf.log(552              tf.cast(num_samples, dtype=observation.dtype)))553      # reset the weights554      log_weights.append(log_weight_acc)555      log_weight_acc = tf.zeros_like(log_weight_acc)556    else:557      prev_state = zt558      prev_log_r = log_r559      if t < num_timesteps - 1:560        r_tilde_params.append((r_tilde_mu, r_tilde_sigma_sq))561  # Compute the final weight update. If we just resampled this will be zero.562  final_update = (tf.reduce_logsumexp(log_weight_acc, axis=0) -563                  tf.log(tf.cast(num_samples, dtype=observation.dtype)))564  # If we ever resampled, then sum up the previous log p hat terms565  if len(log_p_hats) > 0:566    log_p_hat = tf.reduce_sum(log_p_hats, axis=0) + final_update567  else:  # otherwise, log_p_hat only comes from the final update568    log_p_hat = final_update569  # Compute the bellman loss.570  # Will remove the first timestep as it is not used.571  # log p(x_t|z_t) is in row t-1.572  log_p_x = tf.reshape(tf.stack(log_p_xs),573                       [num_timesteps, num_samples, batch_size])574  # log r_t is contained in row t-1.575  # last column is zeros (because at timestep T (num_timesteps) r is 1.576  log_r = tf.reshape(tf.stack(log_rs),577                     [num_timesteps, num_samples, batch_size])...log_stream_test.py
Source:log_stream_test.py  
1#!/usr/bin/env python32#3#   Copyright 2018 - The Android Open Source Project4#5#   Licensed under the Apache License, Version 2.0 (the "License");6#   you may not use this file except in compliance with the License.7#   You may obtain a copy of the License at8#9#       http://www.apache.org/licenses/LICENSE-2.010#11#   Unless required by applicable law or agreed to in writing, software12#   distributed under the License is distributed on an "AS IS" BASIS,13#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.14#   See the License for the specific language governing permissions and15#   limitations under the License.16import logging17import os18import unittest19import mock20from acts import context21from acts.libs.logging import log_stream22from acts.libs.logging.log_stream import AlsoToLogHandler23from acts.libs.logging.log_stream import InvalidStyleSetError24from acts.libs.logging.log_stream import LogStyles25from acts.libs.logging.log_stream import _LogStream26class TestClass(object):27    """Dummy class for TestEvents"""28    def __init__(self):29        self.test_name = self.test_case.__name__30    def test_case(self):31        """Dummy test case for test events."""32class LogStreamTest(unittest.TestCase):33    """Tests the _LogStream class in acts.libs.logging.log_stream."""34    @staticmethod35    def patch(imported_name, *args, **kwargs):36        return mock.patch('acts.libs.logging.log_stream.%s' % imported_name,37                          *args, **kwargs)38    @classmethod39    def setUpClass(cls):40        # logging.log_path only exists if logger._setup_test_logger is called.41        # Here we set it to a value that is likely to not exist so file IO is42        # not executed (an error is raised instead of creating the file).43        logging.log_path = '/f/a/i/l/p/a/t/h'44    def setUp(self):45        log_stream._log_streams = dict()46    # __init__47    @mock.patch('os.makedirs')48    def test_init_adds_null_handler(self, *_):49        """Tests that a NullHandler is added to the logger upon initialization.50        This ensures that no log output is generated when a test class is not51        running.52        """53        debug_monolith_log = LogStyles.LOG_DEBUG | LogStyles.MONOLITH_LOG54        with self.patch('MovableFileHandler'):55            log = log_stream.create_logger(self._testMethodName,56                                           log_styles=debug_monolith_log)57        self.assertTrue(isinstance(log.handlers[0], logging.NullHandler))58    # __validate_style59    @mock.patch('os.makedirs')60    def test_validate_styles_raises_when_same_location_set_multiple_times(61            self, *_):62        """Tests that a style is invalid if it sets the same handler twice.63        If the error is NOT raised, then a LogStream can create a Logger that64        has multiple LogHandlers trying to write to the same file.65        """66        with self.assertRaises(InvalidStyleSetError) as catch:67            log_stream.create_logger(68                self._testMethodName,69                log_styles=[LogStyles.LOG_DEBUG | LogStyles.MONOLITH_LOG,70                            LogStyles.LOG_DEBUG | LogStyles.MONOLITH_LOG])71        self.assertTrue(72            'has been set multiple' in catch.exception.args[0],73            msg='__validate_styles did not raise the expected error message')74    @mock.patch('os.makedirs')75    def test_validate_styles_raises_when_multiple_file_outputs_set(self, *_):76        """Tests that a style is invalid if more than one of MONOLITH_LOG,77        TESTCLASS_LOG, and TESTCASE_LOG is set for the same log level.78        If the error is NOT raised, then a LogStream can create a Logger that79        has multiple LogHandlers trying to write to the same file.80        """81        with self.assertRaises(InvalidStyleSetError) as catch:82            log_stream.create_logger(83                self._testMethodName,84                log_styles=[LogStyles.LOG_DEBUG | LogStyles.TESTCASE_LOG,85                            LogStyles.LOG_DEBUG | LogStyles.TESTCLASS_LOG])86        self.assertTrue(87            'More than one of' in catch.exception.args[0],88            msg='__validate_styles did not raise the expected error message')89        with self.assertRaises(InvalidStyleSetError) as catch:90            log_stream.create_logger(91                self._testMethodName,92                log_styles=[LogStyles.LOG_DEBUG | LogStyles.TESTCASE_LOG,93                            LogStyles.LOG_DEBUG | LogStyles.MONOLITH_LOG])94        self.assertTrue(95            'More than one of' in catch.exception.args[0],96            msg='__validate_styles did not raise the expected error message')97        with self.assertRaises(InvalidStyleSetError) as catch:98            log_stream.create_logger(99                self._testMethodName,100                log_styles=[LogStyles.LOG_DEBUG | LogStyles.TESTCASE_LOG,101                            LogStyles.LOG_DEBUG | LogStyles.TESTCLASS_LOG,102                            LogStyles.LOG_DEBUG | LogStyles.MONOLITH_LOG])103        self.assertTrue(104            'More than one of' in catch.exception.args[0],105            msg='__validate_styles did not raise the expected error message')106    @mock.patch('os.makedirs')107    def test_validate_styles_raises_when_no_level_exists(self, *_):108        """Tests that a style is invalid if it does not contain a log level.109        If the style does not contain a log level, then there is no way to110        pass the information coming from the logger to the correct file.111        """112        with self.assertRaises(InvalidStyleSetError) as catch:113            log_stream.create_logger(self._testMethodName,114                                     log_styles=[LogStyles.MONOLITH_LOG])115        self.assertTrue(116            'log level' in catch.exception.args[0],117            msg='__validate_styles did not raise the expected error message')118    @mock.patch('os.makedirs')119    def test_validate_styles_raises_when_no_location_exists(self, *_):120        """Tests that a style is invalid if it does not contain a log level.121        If the style does not contain a log level, then there is no way to122        pass the information coming from the logger to the correct file.123        """124        with self.assertRaises(InvalidStyleSetError) as catch:125            log_stream.create_logger(self._testMethodName,126                                     log_styles=[LogStyles.LOG_INFO])127        self.assertTrue(128            'log location' in catch.exception.args[0],129            msg='__validate_styles did not raise the expected error message')130    @mock.patch('os.makedirs')131    def test_validate_styles_raises_when_rotate_logs_no_file_handler(self, *_):132        """Tests that a LogStyle cannot set ROTATE_LOGS without *_LOG flag.133        If the LogStyle contains ROTATE_LOGS, it must be associated with a log134        that is rotatable. TO_ACTS_LOG and TO_STDOUT are not rotatable logs,135        since those are both controlled by another object/process. The user136        must specify MONOLITHIC_LOG or TESTCASE_LOG.137        """138        with self.assertRaises(InvalidStyleSetError) as catch:139            log_stream.create_logger(140                self._testMethodName,141                # Added LOG_DEBUG here to prevent the no_level_exists raise from142                # occurring.143                log_styles=[LogStyles.LOG_DEBUG + LogStyles.ROTATE_LOGS])144        self.assertTrue(145            'log type' in catch.exception.args[0],146            msg='__validate_styles did not raise the expected error message')147    # __handle_style148    @mock.patch('os.makedirs')149    def test_handle_style_to_acts_log_creates_handler(self, *_):150        """Tests that using the flag TO_ACTS_LOG creates an AlsoToLogHandler."""151        info_acts_log = LogStyles.LOG_INFO + LogStyles.TO_ACTS_LOG152        log = log_stream.create_logger(self._testMethodName,153                                       log_styles=info_acts_log)154        self.assertTrue(isinstance(log.handlers[1], AlsoToLogHandler))155    @mock.patch('os.makedirs')156    def test_handle_style_to_acts_log_creates_handler_is_lowest_level(self, *_):157        """Tests that using the flag TO_ACTS_LOG creates an AlsoToLogHandler158        that is set to the lowest LogStyles level."""159        info_acts_log = (LogStyles.LOG_DEBUG + LogStyles.LOG_INFO +160                         LogStyles.TO_ACTS_LOG)161        log = log_stream.create_logger(self._testMethodName,162                                       log_styles=info_acts_log)163        self.assertTrue(isinstance(log.handlers[1], AlsoToLogHandler))164        self.assertEqual(log.handlers[1].level, logging.DEBUG)165    @mock.patch('os.makedirs')166    def test_handle_style_to_stdout_creates_stream_handler(self, *_):167        """Tests that using the flag TO_STDOUT creates a StreamHandler."""168        info_acts_log = LogStyles.LOG_INFO + LogStyles.TO_STDOUT169        log = log_stream.create_logger(self._testMethodName,170                                       log_styles=info_acts_log)171        self.assertTrue(isinstance(log.handlers[1], logging.StreamHandler))172    @mock.patch('os.makedirs')173    def test_handle_style_creates_file_handler(self, *_):174        """Tests handle_style creates a MovableFileHandler for the MONOLITH_LOG."""175        info_acts_log = LogStyles.LOG_INFO + LogStyles.MONOLITH_LOG176        expected = mock.MagicMock()177        with self.patch('MovableFileHandler', return_value=expected):178            log = log_stream.create_logger(self._testMethodName,179                                           log_styles=info_acts_log)180        self.assertEqual(log.handlers[1], expected)181    @mock.patch('os.makedirs')182    def test_handle_style_creates_rotating_file_handler(self, *_):183        """Tests handle_style creates a MovableFileHandler for the ROTATE_LOGS."""184        info_acts_log = (LogStyles.LOG_INFO + LogStyles.ROTATE_LOGS +185                         LogStyles.MONOLITH_LOG)186        expected = mock.MagicMock()187        with self.patch('MovableRotatingFileHandler', return_value=expected):188            log = log_stream.create_logger(self._testMethodName,189                                           log_styles=info_acts_log)190        self.assertEqual(log.handlers[1], expected)191    # __create_rotating_file_handler192    def test_create_rotating_file_handler_does_what_it_says_it_does(self):193        """Tests that __create_rotating_file_handler does exactly that."""194        expected = mock.MagicMock()195        with self.patch('MovableRotatingFileHandler', return_value=expected):196            # Through name-mangling, this function is automatically renamed. See197            # https://docs.python.org/3/tutorial/classes.html#private-variables198            fh = _LogStream._LogStream__create_rotating_file_handler('')199        self.assertEqual(expected, fh,200                         'The function did not return a MovableRotatingFileHandler.')201    # __get_file_handler_creator202    def test_get_file_handler_creator_returns_rotating_file_handler(self):203        """Tests the function returns a MovableRotatingFileHandler when the log_style204        has LogStyle.ROTATE_LOGS."""205        expected = mock.MagicMock()206        with self.patch('_LogStream._LogStream__create_rotating_file_handler',207                        return_value=expected):208            # Through name-mangling, this function is automatically renamed. See209            # https://docs.python.org/3/tutorial/classes.html#private-variables210            fh_creator = _LogStream._LogStream__get_file_handler_creator(211                LogStyles.ROTATE_LOGS)212        self.assertEqual(expected, fh_creator('/d/u/m/m/y/p/a/t/h'),213                         'The function did not return a MovableRotatingFileHandler.')214    def test_get_file_handler_creator_returns_file_handler(self):215        """Tests the function returns a MovableFileHandler when the log_style does NOT216        have LogStyle.ROTATE_LOGS."""217        expected = mock.MagicMock()218        with self.patch('MovableFileHandler', return_value=expected):219            # Through name-mangling, this function is automatically renamed. See220            # https://docs.python.org/3/tutorial/classes.html#private-variables221            handler = _LogStream._LogStream__get_file_handler_creator(222                LogStyles.NONE)()223        self.assertTrue(isinstance(handler, mock.Mock))224    # __get_lowest_log_level225    def test_get_lowest_level_gets_lowest_level(self):226        """Tests __get_lowest_level returns the lowest LogStyle level given."""227        level = _LogStream._LogStream__get_lowest_log_level(228            LogStyles.ALL_LEVELS)229        self.assertEqual(level, LogStyles.LOG_DEBUG)230    # __get_current_output_dir231    @mock.patch('os.makedirs')232    def test_get_current_output_dir_gets_correct_path(self, *_):233        """Tests __get_current_output_dir gets the correct path from the context234        """235        info_monolith_log = LogStyles.LOG_INFO + LogStyles.MONOLITH_LOG236        base_path = "BASEPATH"237        subcontext = "SUBCONTEXT"238        with self.patch('MovableFileHandler'):239            logstream = log_stream._LogStream(240                self._testMethodName, log_styles=info_monolith_log,241                base_path=base_path, subcontext=subcontext)242        expected = os.path.join(base_path, subcontext)243        self.assertEqual(244            logstream._LogStream__get_current_output_dir(), expected)245    # __create_handler246    @mock.patch('os.makedirs')247    def test_create_handler_creates_handler_at_correct_path(self, *_):248        """Tests that __create_handler calls the handler creator with the249        correct absolute path to the log file.250        """251        info_monolith_log = LogStyles.LOG_INFO + LogStyles.MONOLITH_LOG252        base_path = 'BASEPATH'253        with self.patch('MovableFileHandler') as file_handler:254            log_stream.create_logger(255                self._testMethodName, log_styles=info_monolith_log,256                base_path=base_path)257            expected = os.path.join(258                base_path, '%s_%s.txt' % (self._testMethodName, 'info'))259            file_handler.assert_called_with(expected)260    # __remove_handler261    @mock.patch('os.makedirs')262    def test_remove_handler_removes_a_handler(self, *_):263        """Tests that __remove_handler removes the handler from the logger and264        closes the handler.265        """266        dummy_obj = mock.Mock()267        dummy_obj.logger = mock.Mock()268        handler = mock.Mock()269        _LogStream._LogStream__remove_handler(dummy_obj, handler)270        self.assertTrue(dummy_obj.logger.removeHandler.called)271        self.assertTrue(handler.close.called)272    # update_handlers273    @mock.patch('os.makedirs')274    def test_update_handlers_updates_filehandler_target(self, _):275        """Tests that update_handlers invokes the underlying276        MovableFileHandler.set_file method on the correct path.277        """278        info_testclass_log = LogStyles.LOG_INFO + LogStyles.TESTCLASS_LOG279        file_name = 'FILENAME'280        with self.patch('MovableFileHandler'):281            log = log_stream.create_logger(282                self._testMethodName, log_styles=info_testclass_log)283            handler = log.handlers[-1]284            handler.baseFilename = file_name285            stream = log_stream._log_streams[log.name]286            stream._LogStream__get_current_output_dir = (287                lambda: 'BASEPATH/TestClass'288            )289            stream.update_handlers(context.NewTestClassContextEvent())290            handler.set_file.assert_called_with('BASEPATH/TestClass/FILENAME')291    # cleanup292    @mock.patch('os.makedirs')293    def test_cleanup_removes_all_handlers(self, *_):294        """ Tests that cleanup removes all handlers in the logger, except295        the NullHandler.296        """297        info_testcase_log = LogStyles.LOG_INFO + LogStyles.MONOLITH_LOG298        with self.patch('MovableFileHandler'):299            log_stream.create_logger(self._testMethodName,300                                     log_styles=info_testcase_log)301        created_log_stream = log_stream._log_streams[self._testMethodName]302        created_log_stream.cleanup()303        self.assertEqual(len(created_log_stream.logger.handlers), 1)304class LogStreamModuleTests(unittest.TestCase):305    @classmethod306    def setUpClass(cls):307        # logging.log_path only exists if logger._setup_test_logger is called.308        # Here we set it to a value that is likely to not exist so file IO is309        # not executed (an error is raised instead of creating the file).310        logging.log_path = '/f/a/i/l/p/a/t/h'311    def setUp(self):312        log_stream._log_streams = {}313    # _update_handlers314    @staticmethod315    def create_new_context_event():316        return context.NewContextEvent()317    def test_update_handlers_delegates_calls_to_log_streams(self):318        """Tests _update_handlers calls update_handlers on each log_stream.319        """320        log_stream._log_streams = {321            'a': mock.Mock(),322            'b': mock.Mock()323        }324        log_stream._update_handlers(self.create_new_context_event())325        self.assertTrue(log_stream._log_streams['a'].update_handlers.called)326        self.assertTrue(log_stream._log_streams['b'].update_handlers.called)327    # _set_logger328    def test_set_logger_overwrites_previous_logger(self):329        """Tests that calling set_logger overwrites the previous logger within330        log_stream._log_streams.331        """332        previous = mock.Mock()333        log_stream._log_streams = {334            'a': previous335        }336        expected = mock.Mock()337        expected.name = 'a'338        log_stream._set_logger(expected)339        self.assertEqual(log_stream._log_streams['a'], expected)340if __name__ == '__main__':...log_stream.py
Source:log_stream.py  
...121    def __init__(self, to_logger=None, *args, **kwargs):122        super().__init__(*args, **kwargs)123        self._log = logging.getLogger(to_logger)124    def emit(self, record):125        self._log.log(record.levelno, record.getMessage())126class MovableFileHandler(FileHandler):127    """FileHandler implementation that allows the output file to be changed128    during operation.129    """130    def set_file(self, file_name):131        """Set the target output file to file_name.132        Args:133            file_name: path to the new output file134        """135        self.baseFilename = os.path.abspath(file_name)136        if self.stream is not None:137            new_stream = self._open()138            # An atomic operation redirects the output and closes the old file139            os.dup2(new_stream.fileno(), self.stream.fileno())...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
