roberthsu2003 / __2024_05_05_sunday__

AI 人工智慧開發入門_python
30 stars 3 forks source link

台積電,聯電,聯發科,鴻海,2024年,(平均,中位數,最高價,最低價,最高價日期,最低價的日期) #20

Open roberthsu2003 opened 3 months ago

roberthsu2003 commented 3 months ago
截圖 2024-06-30 下午4 55 18
jonathan-sean commented 3 months ago

Python code

----------------------------------------------------------

For store result to HTML file

----------------------------------------------------------

def _float_format(v): return "{:.2f}".format(v)

_export_to_html_part

把部分 Pandas DataFrame 資料寫入 HTML file

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:

Check for add title

    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>")

_export_to_html_all

把所有 Pandas DataFrame 資料寫入 HTML file

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)

----------------------------------------------------------

給擷取最高最低價資料時,維持 column 順序用

ticker_name:list = []

_index_date_list

1. 從 DataFrame index 取得日期

2. 調整日期格式為 ISO format(%Y-%m-%d)

Input:

1. df: Pandas DataFrame

Return: date list

def _index_date_list(df:pd.DataFrame) -> list: lst:list = [] for d in df.index: lst.append(d.date().isoformat()) return lst

_parse_data

1. 解析出平均價, 中位數, 最高價, 最低價, 最高價日期和最低價日期資訊

2. 列出所有的最高價日期和最低價日期,用逗號區隔

Input:

1. data: Pandas DataFrame

Return: Pandas series data

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=['平均', '中位數', '最高價', '最低價', '最高價日期', '最低價日期'])

_get_for_date

依據指定的 date 來擷取 dataFrame

Input

1. data: Pandas DataFrame

2. date_lst: expected date list

Return: pd.DataFrame

def _get_for_date(data:pd.DataFrame, date_lst:list) -> pd.DataFrame: global ticker_name

add DataFrame 後會有 column 順序改變情形

# 為維持 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

Set mapping table of ticker and 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)
charlywang11 commented 3 months ago

台積電,聯電,聯發科,鴻海,2024年,(平均,中位數,最高價,最低價,最高價日期,最低價的日期)

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

image

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

image

mimionana commented 3 months ago
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)
螢幕擷取畫面 2024-07-06 185929
OrbAkatsuki commented 3 months ago

2024年至今,【台積電,聯電,聯發科,鴻海】 的股票資訊統整

(平均,中位數,最高價,最低價,最高價日期,最低價的日期)

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)

image

shadow40744398 commented 3 months ago
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

image