def craw(date: str) -> pd.DataFrame: d = get_dict(date) if 'stat' in d and d['stat'] == '很抱歉,沒有符合條件的資料!': raise crawler.NoData('很抱歉,沒有符合條件的資料!') data = d['data1'] fields = d['fields1'] date = d['date'][0:4] + '-' + d['date'][4:6] + '-' + d['date'][6:] df = pd.DataFrame(data, columns=fields).replace(',', '', regex=True).replace( '--', np.nan) df.insert(0, '年月日', date) df['年月日'] = pd.to_datetime(df['年月日']).astype(str) df['漲跌(+/-)'] = df['漲跌(+/-)'].replace( "<p style= color:red>+</p>", 1).replace("<p style= color:green>-</p>", -1).replace('X', np.nan).replace(' ', 0) df['牛熊證觸及限制價格'] = df['牛熊證觸及限制價格'].replace('', 0).replace('*', 1).replace( '*', 1).fillna(np.nan) df['本益比'] = df['本益比'].replace('', np.nan).fillna(np.nan) intColumns = ['成交股數', '成交筆數', '最後揭示買量', '最後揭示賣量'] floatColumns = [ '成交金額', '開盤價', '最高價', '最低價', '收盤價', '漲跌(+/-)', '漲跌價差', '最後揭示買價', '最後揭示賣價', '本益比', '牛熊證觸及限制價格', '標的證券收盤價/指數' ] floatColumns = [col for col in floatColumns if col in list(df)] df[intColumns + floatColumns] = df[intColumns + floatColumns].replace( '', 0).fillna(np.nan) df = ast.to_int(intColumns, df) df = ast.to_float(floatColumns, df) return df
def extendedCallableBear(date: str, fields: List[str], data: List[List[str]]) -> None: date = date[0:4] + '-' + date[4:6] + '-' + date[6:] df = pd.DataFrame(data, columns=fields).replace(',', '', regex=True).replace( '--', np.nan) df.insert(0, '年月日', date) df['年月日'] = pd.to_datetime(df['年月日']).astype(str) df['漲跌(+/-)'] = df['漲跌(+/-)'].replace( "<p style= color:red>+</p>", 1).replace("<p style= color:green>-</p>", -1).replace('X', np.nan).replace(' ', 0).replace( '<p> </p>', 0).replace('<p>X</p>', np.nan) df['牛熊證觸及限制價格'] = df['牛熊證觸及限制價格'].replace('', 0).replace('*', 1).replace( '*', 1).fillna(np.nan) df['本益比'] = df['本益比'].replace('', np.nan).fillna(np.nan) intColumns = ['成交股數', '成交筆數', '最後揭示買量', '最後揭示賣量'] floatColumns = [ '成交金額', '開盤價', '最高價', '最低價', '收盤價', '漲跌(+/-)', '漲跌價差', '最後揭示買價', '最後揭示賣價', '本益比', '牛熊證觸及限制價格', '標的證券收盤價/指數' ] floatColumns = [col for col in floatColumns if col in list(df)] df[intColumns + floatColumns] = df[intColumns + floatColumns].replace( '', 0).fillna(np.nan) df = ast.to_int(intColumns, df) df = ast.to_float(floatColumns, df) saver.lite('可展延牛證', df)
def composite(date: str, fields: List[str], data: List[List[str]]) -> None: date = date[0:4] + '-' + date[4:6] + '-' + date[6:] df = pd.DataFrame(data, columns=fields).replace(',', '', regex=True).replace( '--', np.nan) df.insert(0, '年月日', date) df['年月日'] = pd.to_datetime(df['年月日']).astype(str) floatColumns = ['成交金額(元)', '成交股數(股)', '成交筆數'] df = ast.to_float(floatColumns, df) saver.lite('大盤成交統計', df)
def craw(date: str) -> pd.DataFrame: d = get_dict(date) if 'stat' in d and d['stat'] == '很抱歉,沒有符合條件的資料!': raise crawler.NoData('很抱歉,沒有符合條件的資料!') data = d['data3'] fields = d['fields3'] date = d['date'][0:4] + '-' + d['date'][4:6] + '-' + d['date'][6:] df = pd.DataFrame(data, columns=fields).replace(',', '', regex=True).replace( '--', np.nan) df.insert(0, '年月日', date) df['年月日'] = pd.to_datetime(df['年月日']).astype(str) floatColumns = ['成交金額(元)', '成交股數(股)', '成交筆數'] df = ast.to_float(floatColumns, df) return df
def market(date: str, fields: List[str], data: List[List[str]]) -> None: date = date[0:4] + '-' + date[4:6] + '-' + date[6:] df = pd.DataFrame(data, columns=fields).replace(',', '', regex=True).replace( '--', np.nan).replace('---', np.nan) df['漲跌(+/-)'] = df['漲跌(+/-)'].replace( "<p style ='color:red'>+</p>", 1).replace("<p style ='color:green'>-</p>", -1).replace('X', 0).replace(' ', 0).replace('', 0) df.insert(0, '年月日', date) df['年月日'] = pd.to_datetime(df['年月日']).astype(str) floatColumns = ['收盤指數', '漲跌(+/-)', '漲跌點數', '漲跌百分比(%)'] df = ast.to_float(floatColumns, df) saver.lite('大盤統計資訊', df)
def craw(date: str) -> pd.DataFrame: d = get_dict(date) if 'stat' in d and d['stat'] == '很抱歉,沒有符合條件的資料!': raise crawler.NoData('很抱歉,沒有符合條件的資料!') data = d['data2'] fields = d['fields2'] date = d['date'][0:4] + '-' + d['date'][4:6] + '-' + d['date'][6:] df = pd.DataFrame(data, columns=fields).replace(',', '', regex=True).replace( '--', np.nan) df['漲跌(+/-)'] = df['漲跌(+/-)'].replace( "<p style ='color:red'>+</p>", 1).replace("<p style ='color:green'>-</p>", -1).replace('X', 0).replace(' ', 0) df.insert(0, '年月日', date) df = df.rename(columns={'報酬指數': '指數'}) df['年月日'] = pd.to_datetime(df['年月日']).astype(str) floatColumns = ['收盤指數', '漲跌(+/-)', '漲跌點數', '漲跌百分比(%)'] df = ast.to_float(floatColumns, df) return df
def close(date: str, fields: List[str], data: List[List[str]]) -> None: date = date[0:4] + '-' + date[4:6] + '-' + date[6:] df = pd.DataFrame(data, columns=fields).replace(',', '', regex=True).replace( '--', np.nan).replace('', np.nan) df['漲跌(+/-)'] = df['漲跌(+/-)'].replace( '<p style= color:red>+</p>', 1).replace('<p style= color:green>-</p>', -1).replace('X', 0).replace( ' ', 0).replace('<p> </p>', 0).replace('<p>X</p>', np.nan) df.insert(0, '年月日', date) df['年月日'] = pd.to_datetime(df['年月日']).astype(str) floatColumns = [ '成交股數', '成交筆數', '成交金額', '開盤價', '最高價', '最低價', '收盤價', '漲跌(+/-)', '漲跌價差', '最後揭示買價', '最後揭示買量', '最後揭示賣價', '最後揭示賣量', '本益比' ] df = ast.to_float(floatColumns, df) saver.lite('每日收盤行情(全部(不含權證、牛熊證))', df)
def craw(date: str) -> pd.DataFrame: d = get_dict(date) if 'stat' in d and d['stat'] == '很抱歉,沒有符合條件的資料!': raise crawler.NoData('很抱歉,沒有符合條件的資料!') data = d['data5'] fields = d['fields5'] date = d['date'][0:4] + '-' + d['date'][4:6] + '-' + d['date'][6:] df = pd.DataFrame(data, columns=fields).replace(',', '', regex=True).replace( '--', np.nan).replace('', np.nan) df['漲跌(+/-)'] = df['漲跌(+/-)'].replace( '<p style= color:red>+</p>', 1).replace('<p style= color:green>-</p>', -1).replace('X', 0).replace(' ', 0) df.insert(0, '年月日', date) df['年月日'] = pd.to_datetime(df['年月日']).astype(str) floatColumns = [ '成交股數', '成交筆數', '成交金額', '開盤價', '最高價', '最低價', '收盤價', '漲跌(+/-)', '漲跌價差', '最後揭示買價', '最後揭示買量', '最後揭示賣價', '最後揭示賣量', '本益比' ] df = ast.to_float(floatColumns, df) return df
# --財務分析-- # read from sqlite tablename = '財務分析' sql = "SELECT * FROM '{}'" ac = pd.read_sql_query(sql.format(tablename), conn_lite).replace( '--', np.nan).replace('NA', np.nan).replace('None', np.nan).replace('*****', np.nan).fillna(np.nan) ac.dtypes columns = list(ac) varcharColumns = ['年', '公司代號', '公司簡稱'] realColumns = list(filter(lambda x: x not in varcharColumns, columns)) dtypes = {'str': varcharColumns, 'float': realColumns} ast.to_float(realColumns, ac) ac = ast.as_type(dtypes, ac) cols = varcharColumns + realColumns # create table if mode == 'create': fieldTypes = ['varchar' for col in varcharColumns] + ['real' for col in realColumns] primaryKeys = ['年', '公司代號', '公司簡稱'] sqlc.createTablePostgre(tablename, cols, fieldTypes, primaryKeys, conn_pg) # insert data dftosql.i_pg(conn_pg, tablename, ac[cols])