# Path: fooltrader/api/technical.py
# def get_security_list(security_type='stock', exchanges=None, start_code=None, end_code=None,
#                       mode='simple', start_list_date=None, codes=None):
#     """
#     get security list.
# 
#     Parameters
#     ----------
#     security_type : str
#         {‘stock’, 'future'},default: stock
#     exchanges : str or list
#         ['sh', 'sz','nasdaq','nyse','amex','shfe','dce','zce'],default: ['sh','sz']
#     start_code : str
#         the start code,work with end,default:None
#         if using codes,it would be ignored
#     end_code : str
#         the end code,works with start,default:None
#         if using codes,it would be ignored
#     mode : str
#         whether parse more security info,{'simple','es'},default:'simple'
#     start_list_date : Timestamp str or Timestamp
#         the filter for start list date,default:None
#     codes : list
#         the exact codes to query,default:None
# 
#     Returns
#     -------
#     DataFrame
#         the security list
# 
#     """
#     df = pd.DataFrame()
#     if type(exchanges) == str:
#         exchanges = [exchanges]
# 
#     if not exchanges:
#         exchanges = SECURITY_TYPE_MAP_EXCHANGES[security_type]
# 
#     if security_type == 'index':
#         df = df.append(pd.DataFrame(CHINA_STOCK_SH_INDEX), ignore_index=True)
#         df = df.append(pd.DataFrame(CHINA_STOCK_SZ_INDEX), ignore_index=True)
#         df = df.append(pd.DataFrame(USA_STOCK_NASDAQ_INDEX), ignore_index=True)
#     else:
#         for exchange in exchanges:
#             the_path = get_security_list_path(security_type, exchange)
#             if os.path.exists(the_path):
#                 converters = None
# 
#                 if mode == 'es' and security_type == 'stock':
#                     converters = {'code': str,
#                                   'sinaIndustry': convert_to_list_if_need,
#                                   'sinaConcept': convert_to_list_if_need,
#                                   'sinaArea': convert_to_list_if_need}
#                 if converters:
#                     df = df.append(pd.read_csv(the_path, converters=converters), ignore_index=True)
#                 else:
#                     df = df.append(pd.read_csv(the_path, dtype=str), ignore_index=True)
# 
#     if not df.empty > 0:
#         df = df_for_date_range(df, start_date=start_list_date)
# 
#         df = df.set_index(df['code'], drop=False)
#         df = df.sort_index()
# 
#         if codes:
#             df = df[df["code"].isin(codes)]
#         elif start_code and end_code:
#             df = df[(df["code"] >= start_code) & (df["code"] <= end_code)]
# 
#         if security_type != 'cryptocurrency':
#             df = df.drop_duplicates(subset='code', keep='last')
# 
#     return df
# 
# Path: fooltrader/contract/files_contract.py
# def get_finance_path(item):
#     return os.path.join(get_finance_dir(item), "finance.csv")
# 
# Path: fooltrader/utils/utils.py
# def index_df_with_time(df, index='timestamp'):
#     df = df.set_index(df[index], drop=False)
#     df.index = pd.to_datetime(df.index)
#     df = df.sort_index()
#     return df


import io
import pandas as pd
import scrapy
from scrapy import Request
from scrapy import signals
from fooltrader.api.technical import get_security_list
from fooltrader.contract.files_contract import get_finance_path
from fooltrader.utils.utils import index_df_with_time
                "shares",
                "sharesAdjusted",
                "factor",
                "totalAssets",
                "totalCurrentAssets",
                "totalLiabilities",
                "totalCurrentLiabilities",
                "bookValue",
                "minorityBookValue",
                "preferredEquity",
                "goodwill",
                "longTermBorrowing",
                "operatingRevenue",
                "netProfit",
                "netProfitAttributedToParentCompanyOwner",
                "EPS",
                "dilutedEPS",
                "DPS",
                "netCashFlowsFromOperatingActivities",
                "netCashFlowsFromInvesting",
                "netCashFlowsFromFinancingActivities",
                "cashChange",
                "cashAtTheEndOfPeriod",
                "capitalExpenditures",
                "price",
                "priceHigh",
                "priceLow",
                "ROE",
                "ROA",
                "BVPS",

# Path: fooltrader/api/technical.py
# def get_security_list(security_type='stock', exchanges=None, start_code=None, end_code=None,
#                       mode='simple', start_list_date=None, codes=None):
#     """
#     get security list.
# 
#     Parameters
#     ----------
#     security_type : str
#         {‘stock’, 'future'},default: stock
#     exchanges : str or list
#         ['sh', 'sz','nasdaq','nyse','amex','shfe','dce','zce'],default: ['sh','sz']
#     start_code : str
#         the start code,work with end,default:None
#         if using codes,it would be ignored
#     end_code : str
#         the end code,works with start,default:None
#         if using codes,it would be ignored
#     mode : str
#         whether parse more security info,{'simple','es'},default:'simple'
#     start_list_date : Timestamp str or Timestamp
#         the filter for start list date,default:None
#     codes : list
#         the exact codes to query,default:None
# 
#     Returns
#     -------
#     DataFrame
#         the security list
# 
#     """
#     df = pd.DataFrame()
#     if type(exchanges) == str:
#         exchanges = [exchanges]
# 
#     if not exchanges:
#         exchanges = SECURITY_TYPE_MAP_EXCHANGES[security_type]
# 
#     if security_type == 'index':
#         df = df.append(pd.DataFrame(CHINA_STOCK_SH_INDEX), ignore_index=True)
#         df = df.append(pd.DataFrame(CHINA_STOCK_SZ_INDEX), ignore_index=True)
#         df = df.append(pd.DataFrame(USA_STOCK_NASDAQ_INDEX), ignore_index=True)
#     else:
#         for exchange in exchanges:
#             the_path = get_security_list_path(security_type, exchange)
#             if os.path.exists(the_path):
#                 converters = None
# 
#                 if mode == 'es' and security_type == 'stock':
#                     converters = {'code': str,
#                                   'sinaIndustry': convert_to_list_if_need,
#                                   'sinaConcept': convert_to_list_if_need,
#                                   'sinaArea': convert_to_list_if_need}
#                 if converters:
#                     df = df.append(pd.read_csv(the_path, converters=converters), ignore_index=True)
#                 else:
#                     df = df.append(pd.read_csv(the_path, dtype=str), ignore_index=True)
# 
#     if not df.empty > 0:
#         df = df_for_date_range(df, start_date=start_list_date)
# 
#         df = df.set_index(df['code'], drop=False)
#         df = df.sort_index()
# 
#         if codes:
#             df = df[df["code"].isin(codes)]
#         elif start_code and end_code:
#             df = df[(df["code"] >= start_code) & (df["code"] <= end_code)]
# 
#         if security_type != 'cryptocurrency':
#             df = df.drop_duplicates(subset='code', keep='last')
# 
#     return df
# 
# Path: fooltrader/contract/files_contract.py
# def get_finance_path(item):
#     return os.path.join(get_finance_dir(item), "finance.csv")
# 
# Path: fooltrader/utils/utils.py
# def index_df_with_time(df, index='timestamp'):
#     df = df.set_index(df[index], drop=False)
#     df.index = pd.to_datetime(df.index)
#     df = df.sort_index()
#     return df


# Path: fooltrader/spiders/america/america_stock_finance_spider.py
import io
import pandas as pd
import scrapy
from scrapy import Request
from scrapy import signals
from fooltrader.api.technical import get_security_list
from fooltrader.contract.files_contract import get_finance_path
from fooltrader.utils.utils import index_df_with_time

                "shares",
                "sharesAdjusted",
                "factor",
                "totalAssets",
                "totalCurrentAssets",
                "totalLiabilities",
                "totalCurrentLiabilities",
                "bookValue",
                "minorityBookValue",
                "preferredEquity",
                "goodwill",
                "longTermBorrowing",
                "operatingRevenue",
                "netProfit",
                "netProfitAttributedToParentCompanyOwner",
                "EPS",
                "dilutedEPS",
                "DPS",
                "netCashFlowsFromOperatingActivities",
                "netCashFlowsFromInvesting",
                "netCashFlowsFromFinancingActivities",
                "cashChange",
                "cashAtTheEndOfPeriod",
                "capitalExpenditures",
                "price",
                "priceHigh",
                "priceLow",
                "ROE",
                "ROA",
                "BVPS",

                "PB",