diff --git a/src/fund_statistic.py b/src/fund_statistic.py index 093fbc5..bb6fb83 100644 --- a/src/fund_statistic.py +++ b/src/fund_statistic.py @@ -11,11 +11,12 @@ Copyright (c) 2020 Camel Lu ''' import re import decimal +from functools import cmp_to_key from pprint import pprint import pandas as pd import numpy as np from fund_info.statistic import FundStatistic -from utils.index import get_last_quarter_str, get_stock_market, find_from_list_of_dict, update_xlsx_file +from utils.index import get_last_quarter_str, get_stock_market, find_from_list_of_dict, update_xlsx_file, update_xlsx_file_with_sorted from utils.file_op import read_dir_all_file @@ -399,11 +400,25 @@ def get_special_fund_code_holder_stock_detail(each_statistic=None, quarter_index update_xlsx_file(path, df_a_list, sheet_name='十大持仓明细--' + quarter_index) - +def compare(item1, item2): + year1 = int(item1[0:4]) + quarter_index1 = int(item1[6:7]) + year2 = int(item2[0:4]) + quarter_index2 = int(item2[6:7]) + if year2 < year1 or (year2 == year1 and quarter_index2 < quarter_index1): + return -1 + elif year2 > year1 or (year2 == year1 and quarter_index2 > quarter_index1): + return 1 + else: + return 0 + +# Calling +# list.sort(key=compare) def calculate_quarter_fund_count(): stock_markets = ['A股/上证主板', 'A股/创业板', 'A股/科创板', 'A股/深证主板', 'A股/北交所', '港股', '其他'] for market in stock_markets: dir_path = './outcome/数据整理/stocks/' + market + '/' + # dir_path = './outcome/数据整理/stocks/' + 'A股/北交所' + '/' files = read_dir_all_file(dir_path) print(market, "files", len(files)) for file_path in files: @@ -411,9 +426,15 @@ def calculate_quarter_fund_count(): xls = pd.ExcelFile(path, engine='openpyxl') quarter_list = [] sum_column_name = '总计' - for sheet_name in reversed(xls.sheet_names): - if sheet_name == '总计': - continue + sheet_names = [] + for sheet_name in xls.sheet_names: + if sheet_name == sum_column_name: + continue + sheet_names.append(sheet_name) + sheet_names.sort(key=cmp_to_key(compare)) + for sheet_name in sheet_names: + # if sheet_name == '总计': + # continue item_quarter_data = [sheet_name] df_cur_sheet = xls.parse(sheet_name) item_quarter_data.append(len(df_cur_sheet)) @@ -422,7 +443,7 @@ def calculate_quarter_fund_count(): quarter_list.append(item_quarter_data) columns = ["日期", "持有数量(只)", '持有市值(亿元)'] df_quarter_list = pd.DataFrame(quarter_list, columns=columns) - update_xlsx_file(path, df_quarter_list, sum_column_name) + update_xlsx_file_with_sorted(path, df_quarter_list, sum_column_name, sheet_names) if __name__ == '__main__': @@ -436,7 +457,7 @@ if __name__ == '__main__': # t100_stocks_rank(each_statistic=each_statistic) # 获取某些基金的十大持仓股票信息 - get_special_fund_code_holder_stock_detail() + # get_special_fund_code_holder_stock_detail() - # calculate_quarter_fund_count() - select_condition_stocks_rank() + calculate_quarter_fund_count() + # select_condition_stocks_rank() diff --git a/src/utils/index.py b/src/utils/index.py index 4a44c32..8af783f 100644 --- a/src/utils/index.py +++ b/src/utils/index.py @@ -197,7 +197,7 @@ def get_stock_market(stock_code): return '其他' -def update_xlsx_file(path, df_data, sheet_name): +def update_xlsx_file(path, df_data, sheet_name, sorted_worksheets = []): try: if os.path.exists(path): writer = pd.ExcelWriter(path, engine='openpyxl') @@ -211,16 +211,43 @@ def update_xlsx_file(path, df_data, sheet_name): return else: writer.book = book - df_data.to_excel( + df_data.to_excel( writer, sheet_name=sheet_name) + writer.save() writer.close() else: df_data.to_excel( path, sheet_name=sheet_name) - except: + except BaseException: print("path", path) - + raise BaseException('更新excel失败') + + +def update_xlsx_file_with_sorted(path, df_data, sheet_name, sorted_sheetnames = []): + try: + if os.path.exists(path): + writer = pd.ExcelWriter(path, engine='openpyxl') + workbook = load_workbook(path) + writer.book = workbook + writer.sheets = {ws.title:ws for ws in workbook.worksheets} + for sheet_item in sorted_sheetnames: + del workbook[sheet_item] + df_data.to_excel( + writer, sheet_name=sheet_name) + workbook = writer.book + for worksheet in sorted_sheetnames: + workbook._add_sheet(writer.sheets.get(worksheet)) + writer.book = workbook + + writer.save() + writer.close() + else: + df_data.to_excel( + path, sheet_name=sheet_name) + except BaseException: + print("path", path) + raise BaseException('更新excel失败') def bootstrap_thread(target_fn, total, thread_count=2):