Best Python code snippet using playwright-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())...
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!