import pandas as pd import plotly.graph_objects as go from PIL import Image def sankey(input): file_path = './sankeyData/TDCS_M06A_20240523_090000.csv' data = pd.read_csv(file_path)#, nrows=200) # 確認欄位名稱 data.columns = ['VehicleType', 'DetectionTime_O', 'GantryID_O', 'DetectionTime_D', 'GantryID_D', 'TripLength', 'TripEnd', 'TripInformation'] # 轉換時間格式 data['DetectionTime_O'] = pd.to_datetime(data['DetectionTime_O']) data['DetectionTime_D'] = pd.to_datetime(data['DetectionTime_D']) # 只取GantryID_O開頭是01結尾是S的資料 # data = data[data['GantryID_O'].str.startswith('01')] data = data[data['GantryID_O'].str.endswith('S')] data = data[data['GantryID_D'].str.endswith('S')] # 移除重複記錄 data_cleaned = data.drop_duplicates() # 提取站點流動信息 flows = [] for trip_info in data_cleaned['TripInformation']: stations = trip_info.split('; ') for i in range(len(stations) - 1): source = stations[i].split('+')[1] target = stations[i + 1].split('+')[1] flows.append((source, target)) # 構建 Sankey 圖所需數據 sources = [] targets = [] values = [] flow_dict = {} for source, target in flows: if (source, target) in flow_dict: flow_dict[(source, target)] += 1 else: flow_dict[(source, target)] = 1 for key, value in flow_dict.items(): sources.append(key[0]) targets.append(key[1]) values.append(value) # 創建節點列表 all_nodes = list(set(sources + targets)) node_indices = {node: idx for idx, node in enumerate(all_nodes)} # 創建 Sankey 圖 fig = go.Figure(data=[go.Sankey( node=dict( pad=15, thickness=20, line=dict(color="black", width=0.5), label=all_nodes, ), link=dict( source=[node_indices[source] for source in sources], target=[node_indices[target] for target in targets], value=values, ))]) fig.update_layout(title_text="車輛在不同站點之間的流動 Sankey 圖", font_size=10) fig.write_image("./sankeyData/sankey.png") fig.write_html("./sankeyData/sankey.html") return Image.open("./sankeyData/sankey.png")