Open roberthsu2003 opened 3 months ago
# 台積電,聯電,聯發科,鴻海,2024年,(平均,中位數,最高價,最低價,最高價日期,最低價的日期)
import os
import pandas as pd
import pandas_datareader.data as pdr
import yfinance as yf
from datetime import date
def _float_format(v): return "{:.2f}".format(v)
def _export_to_html_part(data:pd.DataFrame, title:str=None, first:int=5, last:int=5, append:bool=True): mode = 'a' if append else 'w' fpath = os.path.basename(file).replace('py', 'html') with open(fpath, mode) as f:
if title:
f.write(title)
# Check for add head data
if first > 0:
f.write(data.iloc[:first,:].to_html(float_format=_float_format))
f.write(".....")
f.write(data.iloc[-last:,:].to_html(float_format=_float_format))
f.write("<br>")
def _export_to_html_all(data:pd.DataFrame, title:str=None, append:bool=True): _export_to_html_part(data, title=title, first=0, last=0, append=append)
ticker_name:list = []
def _index_date_list(df:pd.DataFrame) -> list: lst:list = [] for d in df.index: lst.append(d.date().isoformat()) return lst
def _parse_data(data:pd.DataFrame) -> pd.Series: max_price = data.max() max_date = ",".join(_index_date_list(data[data == max_price])) min_price = data.min() min_date = ",".join(_index_date_list(data[data == min_price])) mean = data.mean() median = data.median() return pd.Series( [mean, median, max_price, min_price, max_date, min_date], index=['平均', '中位數', '最高價', '最低價', '最高價日期', '最低價日期'])
def _get_for_date(data:pd.DataFrame, date_lst:list) -> pd.DataFrame: global ticker_name
# 為維持 column 順序,create DataFrame 時指定 column 順序
df_nu = pd.DataFrame(columns=ticker_name, copy=False)
for idx in data.index.tolist():
if idx.date().isoformat() in date_lst:
df = data[data.index == idx]
df_nu = df_nu.add(df, fill_value=0)
return df_nu
def _main(): global ticker_name
ticker_map:dict = {'2330.TW':'臺積電', '2303.TW':'聯電', '2454.TW':'聯發科', '2317.TW':'鴻海'}
# Generate ticker list from ticker name mapping table
ticker_lst:list = ticker_map.keys()
ticker_name = ticker_map.values()
# 直接指定要擷取的資料年份,以減少資料大小和處理程序
# Set the start and end date
get_year = 2024
start = date(get_year, 1, 1)
end = date(get_year, 12, 31)
# Get stock data from Yahoo
# 注意: yfinance 和 pandas_datareader 的說明文件不甚詳盡,使用時要特別小心
# NOTE: Don't forget call yf.pdr_override() first
yf.pdr_override()
all_data:dict = {ticker:pdr.get_data_yahoo(ticker, start=start, end=end) for ticker in ticker_lst}
# Convert stock data (dict) to Pandas DataFrame, change the column name and drop null data
df_year:pd.DataFrame = pd.DataFrame({k:v['Adj Close'] for k,v in all_data.items()}).rename(columns=ticker_map).dropna()
_export_to_html_part(df_year, title="2024 全年股票資料(共 {} 筆,僅顯示部分)".format(len(df_year)), append=False)
df_parsed = df_year.apply(_parse_data)
_export_to_html_all(df_parsed, title="分析後的 2024 全年股票資訊")
# 列出最高價和最低價的資料
chk_lst:list = ['最高價', '最低價']
for chk in chk_lst:
# Generate date list
date_lst:list = []
chk_col:str = chk+'日期'
for v in df_parsed.loc[chk_col].values:
date_lst += v.split(',')
df_chk = _get_for_date(df_year, date_lst)
_export_to_html_all(df_chk, title="{}資料有 {} 筆".format(chk, len(df_chk)))
#df_max = df_parsed.apply()
if name == "main": _main()
---
## Result
![image](https://github.com/roberthsu2003/__2024_05_05_sunday__/assets/11495716/a87a199f-9780-4de7-8a24-07ad5efc4937)
import pandas_datareader.data as pdr
import yfinance as yf
import pandas as pd
def format_date(date):
return date.strftime('%Y-%m-%d')
yf.pdr_override()
all_data = {ticker:pdr.get_data_yahoo(ticker) for ticker in ['2330.TW','2303.TW','2454.TW','2317.TW']}
adj_date = pd.DataFrame({ticker: dataFrame['Adj Close'] for ticker, dataFrame in all_data.items()})
rename_data = adj_date.rename(columns={'2330.TW': '台積電', '2303.TW': '聯電', '2454.TW': '聯發科', '2317.TW': '鴻海'})
clear_data = rename_data.dropna()
data2024 = clear_data.loc['2024']
data2024
final_data = pd.DataFrame(columns=['台積電', '聯電', '聯發科', '鴻海'],
index=['平均價格', '中位數', '最高價', '最低價', '最高價日期', '最低價日期'])
final_data.loc['平均價格'] = data2024.mean()
final_data.loc['中位數'] = data2024.median()
final_data.loc['最高價'] = data2024.max()
final_data.loc['最低價'] = data2024.min()
final_data.loc['最高價日期'] = data2024.idxmax().apply(format_date)
final_data.loc['最低價日期'] = data2024.idxmin().apply(format_date)
final_data
import pandas as pd
import pandas_datareader.data as pdr
import yfinance as yf
yf.pdr_override()
tickers = ['2330.TW', '2303.TW', '2454.TW', '2317.TW']
start_date = '2024-01-01'
end_date = '2024-06-30'
all_data = {ticker: pdr.get_data_yahoo(ticker, start=start_date, end=end_date) for ticker in tickers}
all_data
df1 = pd.DataFrame({ticker:dataFrame['Adj Close'] for ticker,dataFrame in all_data.items()})
df2 = df1.rename(columns={'2330.TW':'台積電','2303.TW':'聯電','2454.TW':'聯發科','2317.TW':'鴻海'})
def stocks(s) -> pd.Series: #return series
max_name = s[s == s.max()].index.tolist()[0]
min_name = s[s == s.min()].index.tolist()[0]
return pd.Series([s.mean(),s.median(),f'{max_name}({s.max()})',f'{min_name}({s.min()})'],
index=["平均","中位數","最高價","最低價"])
df2.apply(stocks)
import pandas_datareader.data as pdr
import yfinance as yf
import pandas as pd
from datetime import datetime, date
yf.pdr_override()
# 獲取股票數據
tickers = ['2330.TW', '2303.TW', '2454.TW', '2317.TW']
all_data = {ticker: pdr.get_data_yahoo(ticker, start="2024-01-01", end=date.today()) for ticker in tickers}
print(all_data)
df1 = pd.DataFrame(index=['平均', '中位數', '最高值', '最低值', '最高值日期', '最低值日期'])
for column, ticker in zip(['臺積電', '聯電', '聯發科', '鴻海'], tickers):
data = all_data[ticker]['Adj Close']
df1[column] = [
data.mean(),
data.median(),
data.max(),
data.min(),
data.idxmax(),
data.idxmin()
]
def format_value(value):
if isinstance(value, (int, float)):
return f"{value:.2f}"
elif isinstance(value, pd.Timestamp):
return value.strftime('%Y-%m-%d')
return value
styled_result = df1.style.format(format_value)
# 表格樣式
styled_result = styled_result.set_properties(**{
'text-align': 'center',
'font-size': '11pt',
'border-color': 'black',
'border-style': 'solid',
'border-width': '1px',
'padding': '3px'
})
# 表頭樣式
styled_result = styled_result.set_table_styles([{
'selector': 'th',
'props': [('background-color', '#613030'),
('text-align', 'center'),
('font-weight', 'bold'),
('border', '1px solid black'),
('padding', '3px')]
}])
# 顯示結果
display(styled_result)
import pandas_datareader.data as pdr
import yfinance as yf
import pandas as pd
from datetime import datetime, date
# 使用 format_date 函数格式化日期
def format_date(date):
return date.strftime('%Y-%m-%d')
# 覆盖 pandas_datareader 的 get_data_yahoo 函数
yf.pdr_override()
tickers = {'2330.TW', '2303.TW', '2454.TW','2317.TW'}
# 从 Yahoo Finance 获取股票数据 # 定义要查询的股票代码
all_data = {ticker:pdr.get_data_yahoo(ticker) for ticker in ['2330.TW','2303.TW','2454.TW','2317.TW']}
# 创建包含所有股票调整后收盘价的 DataFrame
Closedprice_date = pd.DataFrame({ticker:dataFrame['Adj Close'] for ticker,dataFrame in all_data.items()})
#print(all_data)
rename_data = Closedprice_date.rename(columns={'2330.TW':'台積電','2303.TW':'聯電','2454.TW':'聯發科','2317.TW':'鴻海'})#名稱變更
clear_numvalue = rename_data.dropna()
date2024_ts = clear_numvalue.loc['2024']#數值就會出來
date2024_ts
# 创建一个 DataFrame,命名列为 '臺積電', '聯電', '聯發科', '鴻海'
# 命名行索引为 '平均', '中位數', '最高值', '最低值', '最高值日期', '最低值日期'
tickers_date = pd.DataFrame(columns=['台積電', '聯電', '聯發科', '鴻海'],index=['平均', '中位數', '最高價', '最低價', '最高價日期', '最低價日期'])
tickers_date.loc['平均'] = date2024_ts.mean().round(2)# 计算并赋值平均值,使用 round将 DataFrame 中的数值到小数点后两位。
tickers_date.loc['中位數'] = date2024_ts.median().round(2)# 计算并赋值中位數,使用 round将 DataFrame 中的数值到小数点后两位。
tickers_date.loc['最高價'] = date2024_ts.max().round(2)# 计算并赋值最高價,可以使用 round将 DataFrame 中的数值到小数点后两位。
tickers_date.loc['最低價'] = date2024_ts.min().round(2)# 计算并赋值最低價,使用 round将 DataFrame 中的数值到小数点后两位。
tickers_date.loc['最高價日期'] = date2024_ts.idxmax().apply(format_date)# 计算并赋值最高價日期
tickers_date.loc['最低價日期'] = date2024_ts.idxmin().apply(format_date)# 计算并赋值最低價日期
tickers_date