[导入]Actual Windows Manager 3.7

ActualWindows可对Windows窗口进行改变,在窗口标题列添加实用按键,能让窗口保持在桌面最上方,还可将窗口最小化到桌面。此外,它能增加任何窗口的透明度,包括软件、开始选单和Windows原有工具栏等,使整个桌面呈现透明效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    ActualWindows可以替Windows窗口做些改变,包括在原来的窗口标题列最大化和最小化按键旁加入两个好用的按键,可让任何想要的窗口保持在桌面最上方,或是当窗口最小化时若工具列已经塞满了,就能最小化于桌面上,另外有了它也能让任何窗口增加透明度,包括任何软件或开始选单、Windows原有工具栏等等,整个桌面都将呈现透明。
文章来源: http://dl.163.com/html/47/47985.html

转载于:https://www.cnblogs.com/ue/articles/206632.html

软件介绍: Actual Window Manager是一款专业的窗口管理软件,它能够管理WIN窗口的所有属性。屏保程序保存空间屏幕说明:如果您使用 Windows 7 或更高版本,不喜欢在关掉某个显示器后,对多显示器桌面做出不需要的自动重新配置,使用这个功能在目前未使用的显示器上运行屏幕保护程序。不同于往常的系统屏幕保护程序,此功能激活的屏幕保护程序,在您使用鼠标或键盘时不会关闭。可以手动或自动激活屏幕保护程序。自动保持窗口布局在您经常改变屏幕分辨率时非常有用。例如,当您在本地操纵机器和通过远程桌面客户端连接操纵机器,或者在多台显示器及一台显示器之间切换时,本功能可为您节省来去调整窗口尺寸、位置的时间。窗口缩略图说明:在鼠标移到如下对象时,以提示信息的方式显示窗口缩略图:- 任务栏的按钮;- 程序窗口特殊最小化后缩小到桌面的图标;- 卷起窗口的标题栏;- 虚拟桌面切换器图标。注意:启用了窗口缩略图功能后,Actual Window Manager 将监视屏幕上可见窗口并为其截图。监视和截图功能将需要额外消耗一些内存,并可能略微降低系统性能。此选项仅在使用 Windows 7 Vista Aero 以外主题的时候才有效。在启用了 Vista Aero 主题时,系统自动提供窗口缩略图的功能,因此,无论是否选中此选项均会显示窗口缩略预览图像。安装说明:安装后不要立即运行Actual Window Manager,复制CK文件夹内的2个文件到C:\Program Files\Actual Window Manager目录下,覆盖原来的文件即可。
如何将以下代码改写为几个代码文件,简单且运行结果一样import math from datetime import datetime import numpy as np import os import matplotlib.pyplot as plt import matplotlib.font_manager as fm from collections import Counter # --- 字体和样式配置 --- def configure_fonts_and_styles(): chinese_font_name = None try: if os.name == &#39;nt&#39;: test_font = &#39;SimSun&#39; try: fm.FontProperties(family=test_font).get_name(); chinese_font_name = test_font except RuntimeError: print(f"警告:Windows系统中未直接找到 {test_font} 字体,尝试 &#39;Microsoft YaHei&#39; 或 &#39;SimHei&#39;。") fallback_fonts = [&#39;Microsoft YaHei&#39;, &#39;SimHei&#39;] for f_name in fallback_fonts: try: fm.FontProperties(family=f_name).get_name(); chinese_font_name = f_name; break except RuntimeError: continue elif os.name == &#39;posix&#39;: common_fonts = [&#39;SimSun&#39;, &#39;Songti SC&#39;, &#39;STSong&#39;, &#39;WenQuanYi Micro Hei&#39;, &#39;Noto Serif CJK SC&#39;, &#39;Noto Sans CJK SC&#39;] for f_name in common_fonts: try: if fm.FontProperties(family=f_name).get_name(): chinese_font_name = f_name; break except RuntimeError: continue if chinese_font_name: plt.rcParams[&#39;font.family&#39;] = chinese_font_name print(f"中文字体尝试设置为: {chinese_font_name}") else: print("警告:未能自动配置一个特定的中文字体 (如 SimSun - 宋体)。中文可能无法正确显示。") except Exception as e: print(f"设置中文字体时出错: {e}") try: current_serif = plt.rcParams.get(&#39;font.serif&#39;, []) if &#39;Times New Roman&#39; not in current_serif: try: fm.FontProperties(family=&#39;Times New Roman&#39;).get_name() plt.rcParams[&#39;font.serif&#39;] = [&#39;Times New Roman&#39;] + current_serif print(f"英文衬线字体 (serif) 将优先尝试: Times New Roman") except RuntimeError: print("警告:系统中未找到 &#39;Times New Roman&#39; 字体。英文衬线字体可能使用默认设置。") except Exception as e: print(f"设置Times New Roman时出错: {e}") font_size = 14 plt.rcParams[&#39;font.size&#39;] = font_size; plt.rcParams[&#39;axes.titlesize&#39;] = font_size + 4 plt.rcParams[&#39;axes.labelsize&#39;] = font_size + 2; plt.rcParams[&#39;xtick.labelsize&#39;] = font_size plt.rcParams[&#39;ytick.labelsize&#39;] = font_size; plt.rcParams[&#39;legend.fontsize&#39;] = font_size # Adjusted legend fontsize plt.rcParams[&#39;figure.titlesize&#39;] = font_size + 6; plt.rcParams[&#39;axes.unicode_minus&#39;] = False print(f"全局字体大小已设置为基础: {font_size}pt") # --- 配置项 --- BASE_FILE_PATH = r"C:\Users\byx\Desktop\Dataset\Dataset" CHARGING_DATA_FILE = os.path.join(BASE_FILE_PATH, "Charging_Data.csv") OUTPUT_DIR = "visualizations_layout_adjusted" # 新的输出文件夹 if not os.path.exists(OUTPUT_DIR): os.makedirs(OUTPUT_DIR) CHARGING_COLUMN_MAPPINGS = { &#39;power&#39;: &#39;Transaction power/kwh&#39;, &#39;start_time&#39;: &#39;Start Time&#39;, &#39;end_time&#39;: &#39;End Time&#39;, &#39;service_fee&#39;: &#39;Service charge/Yuan&#39;, &#39;end_cause&#39;: &#39;end_cause&#39;, &#39;temperature_direct&#39;: &#39;Temperature(℃)&#39;, &#39;district_charging&#39;: &#39;District Name&#39; } # --- CSV读取与解析辅助函数 --- def read_csv(filepath, column_selection_map=None): data = []; header = [] try: with open(filepath, &#39;r&#39;, encoding=&#39;utf-8-sig&#39;) as f: lines = f.readlines() if not lines: return [], [] header = [h.strip().replace(&#39;"&#39;, &#39;&#39;) for h in lines[0].strip().split(&#39;,&#39;)] col_indices = {internal_key: header.index(actual_col_name) if actual_col_name in header else -1 for internal_key, actual_col_name in column_selection_map.items()} if column_selection_map else \ {h: i for i, h in enumerate(header)} for line in lines[1:]: if not line.strip(): continue values = [v.strip().replace(&#39;"&#39;, &#39;&#39;) for v in line.split(&#39;,&#39;)] if len(values) != len(header): continue row_dict = {internal_key: values[idx] if idx != -1 and idx < len(values) else None for internal_key, idx in col_indices.items()} data.append(row_dict) except FileNotFoundError: print(f"错误:文件 {filepath} 未找到。"); return [], [] except Exception as e: print(f"读取CSV文件 {filepath} 时发生错误: {e}"); return [], [] return data, header def parse_datetime_custom(dt_str, context=""): if not dt_str: return None dt_str_cleaned = dt_str.strip() formats = ["%Y-%m-%d %H:%M:%S", "%Y/%m/%d %H:%M", "%m/%d/%Y %H:%M", "%Y-%m-%d %H:%M", "%Y/%m/%d %H:%M:%S", "%Y%m%d", "%Y-%m-%d"] for fmt in formats: try: return datetime.strptime(dt_str_cleaned, fmt) except ValueError: continue return None # --- 统计计算辅助函数 --- def calculate_mean(data_list): valid_data = [x for x in data_list if x is not None and isinstance(x, (int, float))] if not valid_data: return 0.0 return sum(valid_data) / len(valid_data) def calculate_std_dev(data_list, ddof=1): valid_data_float = [] for x in data_list: if x is not None: try: valid_data_float.append(float(x)) except ValueError: pass if len(valid_data_float) < max(2, ddof): return 0.0 mean = calculate_mean(valid_data_float) variance = sum([(x - mean) ** 2 for x in valid_data_float]) / (len(valid_data_float) - ddof) return math.sqrt(variance) def calculate_median(data_list): valid_data = [x for x in data_list if x is not None and isinstance(x, (int, float))] if not valid_data: return 0.0 sorted_list = sorted(valid_data) n = len(sorted_list) mid = n // 2 if n % 2 == 1: return sorted_list[mid] else: return (sorted_list[mid - 1] + sorted_list[mid]) / 2.0 def calculate_pearson_correlation(list1, list2): paired_values = [] for x, y in zip(list1, list2): if x is not None and y is not None: try: val_x = float(x); val_y = float(y) paired_values.append((val_x, val_y)) except ValueError: continue if len(paired_values) < 2: return 0.0 x_vals = [p[0] for p in paired_values]; y_vals = [p[1] for p in paired_values] n = len(x_vals) if n == 0 : return 0.0 mean1, mean2 = calculate_mean(x_vals), calculate_mean(y_vals) numerator = sum([(x - mean1) * (y - mean2) for x, y in zip(x_vals, y_vals)]) sum_sq_diff1 = sum([(x - mean1) ** 2 for x in x_vals]) sum_sq_diff2 = sum([(y - mean2) ** 2 for y in y_vals]) denominator = math.sqrt(sum_sq_diff1 * sum_sq_diff2) if denominator == 0: return 0.0 return numerator / denominator # --- 手动KDE相关函数 --- def gaussian_kernel(u): return (1 / np.sqrt(2 * np.pi)) * np.exp(-0.5 * u**2) def calculate_kde_bandwidth(data_points_np): n = len(data_points_np) if n == 0: return 0.1 std_dev = calculate_std_dev(list(data_points_np), ddof=1) if std_dev == 0: q75, q25 = np.percentile(data_points_np, [75, 25]) iqr = q75 - q25 A = iqr / 1.349 if iqr > 0 else ( (0.01 * (data_points_np.max() - data_points_np.min())) if data_points_np.max() != data_points_np.min() else 0.01 ) if A <= 1e-5 : A = 0.01 return 0.9 * A * (n ** (-0.2)) return 1.06 * std_dev * (n ** (-0.2)) def manual_kde(data_points_np, x_eval_points_np, bandwidth): n_data = len(data_points_np) if n_data == 0 or bandwidth <= 1e-6: return np.zeros_like(x_eval_points_np) data_points_np = np.asarray(data_points_np).reshape(-1, 1) x_eval_points_np = np.asarray(x_eval_points_np).reshape(1, -1) u = (x_eval_points_np - data_points_np) / bandwidth kernel_values = gaussian_kernel(u) kde_y = np.sum(kernel_values, axis=0) / (n_data * bandwidth) return kde_y # --- 数据处理主函数 --- def process_data(): print("--- 正在加载和处理数据 ---") charging_data_raw, _ = read_csv(CHARGING_DATA_FILE, CHARGING_COLUMN_MAPPINGS) if not charging_data_raw: print("错误:充电数据未能加载或为空。"); return [], {} num_raw_charging_records = len(charging_data_raw) cleaned_data = [] power_zero_skipped = 0; parse_errors_time_start = 0; parse_errors_time_end = 0 value_errors_power = 0; time_logic_errors = 0; missing_power=0; missing_start_time=0; missing_end_time=0 value_errors_fee=0; temp_parse_errors=0 for record in charging_data_raw: power_str = record.get(&#39;power&#39;); start_time_str = record.get(&#39;start_time&#39;); end_time_str = record.get(&#39;end_time&#39;) service_fee_str = record.get(&#39;service_fee&#39;); end_cause_val = record.get(&#39;end_cause&#39;, "未知原因") temp_direct_str = record.get(&#39;temperature_direct&#39;); district_name_val = record.get(&#39;district_charging&#39;, "未知区域") if power_str is None: missing_power+=1; continue if start_time_str is None: missing_start_time+=1; continue if end_time_str is None: missing_end_time+=1; continue try: transaction_power = float(power_str) except (ValueError, TypeError): value_errors_power+=1; continue if transaction_power == 0: power_zero_skipped += 1; continue start_time = parse_datetime_custom(start_time_str) if not start_time: parse_errors_time_start+=1; continue end_time = parse_datetime_custom(end_time_str) if not end_time: parse_errors_time_end+=1; continue if end_time < start_time: time_logic_errors+=1; continue duration_hours = (end_time - start_time).total_seconds() / 3600.0 try: service_fee = float(service_fee_str) if service_fee_str else 0.0 except (ValueError, TypeError): service_fee = 0.0; value_errors_fee+=1 final_temperature = None if temp_direct_str is not None and temp_direct_str != "": try: final_temperature = float(temp_direct_str) except (ValueError, TypeError): temp_parse_errors+=1 cleaned_data.append({ &#39;transaction_power&#39;: transaction_power, &#39;duration_hours&#39;: duration_hours, &#39;district_name&#39;: district_name_val, &#39;service_fee&#39;: service_fee, &#39;end_cause&#39;: end_cause_val, &#39;temperature&#39;: final_temperature }) print(f"\n数据清洗和转换完成。原始充电记录: {num_raw_charging_records}") if missing_power > 0: print(f" - 因缺少功率数据跳过: {missing_power} 条") print(f" - 因功率为0跳过: {power_zero_skipped} 条") # ... (可以添加其他错误计数打印) print(f"最终得到 {len(cleaned_data)} 条有效记录用于分析。") district_stats_aggregated = {} temp_district_data = {} for record in cleaned_data: district = record[&#39;district_name&#39;] if district not in temp_district_data: temp_district_data[district] = {&#39;powers&#39;: [], &#39;durations&#39;: [], &#39;service_fees&#39;: []} if record[&#39;transaction_power&#39;] is not None: temp_district_data[district][&#39;powers&#39;].append(record[&#39;transaction_power&#39;]) if record[&#39;duration_hours&#39;] is not None: temp_district_data[district][&#39;durations&#39;].append(record[&#39;duration_hours&#39;]) if record[&#39;service_fee&#39;] is not None: temp_district_data[district][&#39;service_fees&#39;].append(record[&#39;service_fee&#39;]) for district, data in temp_district_data.items(): district_stats_aggregated[district] = { &#39;avg_power&#39;: calculate_mean(data[&#39;powers&#39;]), &#39;std_dev_duration&#39;: calculate_std_dev(data[&#39;durations&#39;]), &#39;median_service_fee&#39;: calculate_median(data[&#39;service_fees&#39;]), &#39;count&#39;: len(data[&#39;powers&#39;]) } return cleaned_data, district_stats_aggregated # --- 可视化函数 --- def plot_transaction_power_distribution(cleaned_data, output_dir): if not cleaned_data: return transaction_powers_list = [r[&#39;transaction_power&#39;] for r in cleaned_data if r[&#39;transaction_power&#39;] is not None and r[&#39;transaction_power&#39;] > 0] if not transaction_powers_list: print("无有效的正充电量数据用于绘制分布图。"); return transaction_powers_np = np.array(transaction_powers_list) fig, axes = plt.subplots(1, 2, figsize=(16, 7)) # 略微调整figsize # 子图1: 密度直方图与KDE曲线 ax = axes[0] ax.hist(transaction_powers_np, bins=50, density=True, alpha=0.6, color=&#39;skyblue&#39;, edgecolor=&#39;gray&#39;, label=&#39;密度直方图&#39;) if len(transaction_powers_np) > 1: bandwidth = calculate_kde_bandwidth(transaction_powers_np) if bandwidth > 1e-5 : plot_min = transaction_powers_np.min() - 1 * bandwidth plot_max = transaction_powers_np.max() + 1 * bandwidth x_range = np.linspace(max(0, plot_min), plot_max, 500) kde_y = manual_kde(transaction_powers_np, x_range, bandwidth) ax.plot(x_range, kde_y, color=&#39;darkviolet&#39;, linewidth=2.5, label=&#39;KDE曲线&#39;) ax.set_title(&#39;充电量分布 (直方图与KDE)&#39;); ax.set_xlabel(&#39;充电量 (kWh)&#39;); ax.set_ylabel(&#39;密度&#39;) ax.legend(); ax.grid(axis=&#39;y&#39;, alpha=0.75); ax.set_xlim(left=0) # 子图2: 箱线图 ax = axes[1] bp = ax.boxplot(transaction_powers_np, vert=False, widths=0.7, patch_artist=True, boxprops=dict(facecolor=&#39;lightgreen&#39;, color=&#39;black&#39;), medianprops=dict(color=&#39;red&#39;, linewidth=2)) ax.set_title(&#39;充电量分布 (箱线图)&#39;); ax.set_xlabel(&#39;充电量 (kWh)&#39;); ax.set_yticklabels([]) ax.grid(axis=&#39;x&#39;, alpha=0.75); ax.set_xlim(left=0) fig.suptitle(&#39;充电量 Transaction Power 分布概览&#39;, fontweight=&#39;bold&#39;) fig.tight_layout(rect=[0, 0.05, 1, 0.93]) # rect=[left, bottom, right, top] save_path = os.path.join(output_dir, "transaction_power_distribution_kde.png") plt.savefig(save_path); print(f"充电量分布图 (含KDE) 已保存至: {save_path}") def plot_power_by_end_cause(cleaned_data, output_dir, top_n=5): if not cleaned_data: return end_cause_data = {} for record in cleaned_data: cause = record[&#39;end_cause&#39;] if record[&#39;end_cause&#39;] else "未知"; power = record[&#39;transaction_power&#39;] if power is None: continue if cause not in end_cause_data: end_cause_data[cause] = [] end_cause_data[cause].append(power) if not end_cause_data: print("无有效的充电终止原因数据用于绘图。"); return cause_counts = Counter({cause: len(powers) for cause, powers in end_cause_data.items()}) common_causes_original = [cause for cause, count in cause_counts.most_common(top_n)] # 确保标签不会过长 common_causes = [ (c[:30] + &#39;...&#39; if len(c) > 30 else c) for c in common_causes_original] plot_data = [end_cause_data[cause_orig] for cause_orig in common_causes_original if cause_orig in end_cause_data] # Use original cause for data lookup if not plot_data: print(f"筛选后(前{top_n}个)无充电终止原因数据用于绘图。"); return fig, ax = plt.subplots(figsize=(max(12, top_n * 1.5), 10)) # 动态宽度,增加高度 bp = ax.boxplot(plot_data, vert=True, patch_artist=True, labels=common_causes, widths=0.6) try: # Matplotlib 3.7+ cmap = plt.colormaps.get_cmap(&#39;Pastel2&#39;) color_list = cmap(np.linspace(0, 1, len(plot_data))) except AttributeError: # Fallback for older Matplotlib cmap = plt.cm.get_cmap(&#39;Pastel2&#39;, len(plot_data)) color_list = cmap.colors if hasattr(cmap, &#39;colors&#39;) else [cmap(i) for i in np.linspace(0, 1, len(plot_data))] for patch, color in zip(bp[&#39;boxes&#39;], color_list): patch.set_facecolor(color) for median in bp[&#39;medians&#39;]: median.set_color(&#39;black&#39;); median.set_linewidth(2) ax.set_title(f&#39;不同充电终止原因下的充电量分布 (Top {top_n})&#39;, fontweight=&#39;bold&#39;) ax.set_ylabel(&#39;充电量 (kWh)&#39;); ax.set_xlabel(&#39;充电终止原因&#39;) tick_label_fontsize = plt.rcParams[&#39;xtick.labelsize&#39;] - (2 if top_n > 5 else 0) # 如果类别多,稍微减小字号 if tick_label_fontsize < 8: tick_label_fontsize = 8 # 最小字号 plt.setp(ax.get_xticklabels(), rotation=30, ha="right", fontsize=tick_label_fontsize) ax.grid(axis=&#39;y&#39;, linestyle=&#39;--&#39;, alpha=0.7) # 调整 rect 的 bottom 值,给 x 轴标签更多空间 fig.tight_layout(rect=[0, 0.20 if top_n > 3 else 0.1, 1, 0.95]) # 如果标签多,底部空间给大一点 save_path = os.path.join(output_dir, f"power_by_end_cause_top{top_n}.png") plt.savefig(save_path); print(f"按终止原因分布的充电量图 (Top {top_n}) 已保存至: {save_path}") def plot_temp_vs_power_scatter(cleaned_data, output_dir): if not cleaned_data: return temperatures = [r[&#39;temperature&#39;] for r in cleaned_data if r[&#39;temperature&#39;] is not None and r[&#39;transaction_power&#39;] is not None] powers = [r[&#39;transaction_power&#39;] for r in cleaned_data if r[&#39;temperature&#39;] is not None and r[&#39;transaction_power&#39;] is not None] if not temperatures or not powers or len(temperatures) < 2: print("无足够的有效温度和充电量数据用于绘制散点图。"); return fig, ax = plt.subplots(figsize=(12, 7)) ax.scatter(temperatures, powers, alpha=0.4, edgecolors=&#39;w&#39;, s=40, c=&#39;steelblue&#39;) ax.set_title(&#39;温度与充电量关系散点图&#39;, fontweight=&#39;bold&#39;); ax.set_xlabel(&#39;温度 (℃)&#39;); ax.set_ylabel(&#39;充电量 (kWh)&#39;) ax.grid(True, linestyle=&#39;--&#39;, alpha=0.7); fig.tight_layout() save_path = os.path.join(output_dir, "temperature_vs_power_scatter.png") plt.savefig(save_path); print(f"温度与充电量散点图已保存至: {save_path}") def plot_district_statistics(district_stats, output_dir): if not district_stats: print("无有效的区域统计数据用于绘图。"); return sorted_districts_items = sorted(district_stats.items()) if not sorted_districts_items: print("排序后无区域数据用于绘图。"); return districts = [item[0] for item in sorted_districts_items] avg_powers = [item[1][&#39;avg_power&#39;] for item in sorted_districts_items] std_dev_durations = [item[1][&#39;std_dev_duration&#39;] for item in sorted_districts_items] median_service_fees = [item[1][&#39;median_service_fee&#39;] for item in sorted_districts_items] x = np.arange(len(districts)); width = 0.35 fig_base_width = 8 fig_width = max(fig_base_width, len(districts) * 1.5 + 2) # 动态计算宽度 fig_height = 8 # 增加默认高度 def _plot_bar_chart(ax, x_data, y_data, width, label_text, color, y_label_text, title_text, districts_labels, bar_label_padding=5): rects = ax.bar(x_data, y_data, width, label=label_text, color=color) ax.set_ylabel(y_label_text); ax.set_title(title_text, fontweight=&#39;bold&#39;) ax.set_xticks(x_data); ax.set_xticklabels(districts_labels, rotation=45, ha="right") ax.legend(loc=&#39;upper right&#39;); ax.bar_label(rects, padding=bar_label_padding, fmt=&#39;%.2f&#39;) # 自动调整y轴上限以确保标签可见 if y_data: max_val_with_label = max(y_data) * 1.15 # 假设标签不会超出bar高度的15% current_top = ax.get_ylim()[1] ax.set_ylim(top=max(current_top, max_val_with_label)) # 图1: 平均充电量 fig1, ax1 = plt.subplots(figsize=(fig_width, fig_height)); _plot_bar_chart(ax1, x, avg_powers, width, &#39;平均充电量&#39;, &#39;cornflowerblue&#39;, &#39;平均充电量 (kWh)&#39;, &#39;各区域平均充电量&#39;, districts) fig1.tight_layout(rect=[0, 0.25, 1, 0.93]) # 增加底部和顶部边距 save_path1 = os.path.join(output_dir, "district_avg_power.png"); plt.savefig(save_path1); print(f"区域平均充电量图已保存至: {save_path1}") # 图2: 充电时长标准差 fig2, ax2 = plt.subplots(figsize=(fig_width, fig_height)); _plot_bar_chart(ax2, x, std_dev_durations, width, &#39;充电时长标准差&#39;, &#39;lightcoral&#39;, &#39;充电时长标准差 (小时)&#39;, &#39;各区域充电时长标准差&#39;, districts) fig2.tight_layout(rect=[0, 0.25, 1, 0.93]) save_path2 = os.path.join(output_dir, "district_duration_stddev.png"); plt.savefig(save_path2); print(f"区域充电时长标准差图已保存至: {save_path2}") # 图3: 服务费中位数 fig3, ax3 = plt.subplots(figsize=(fig_width, fig_height)); _plot_bar_chart(ax3, x, median_service_fees, width, &#39;服务费中位数&#39;, &#39;mediumseagreen&#39;, &#39;服务费中位数 (元)&#39;, &#39;各区域服务费中位数&#39;, districts) fig3.tight_layout(rect=[0, 0.25, 1, 0.93]) save_path3 = os.path.join(output_dir, "district_median_service_fee.png"); plt.savefig(save_path3); print(f"区域服务费中位数图已保存至: {save_path3}") # --- 主函数 --- if __name__ == &#39;__main__&#39;: configure_fonts_and_styles() cleaned_data, district_stats_aggregated = process_data() if cleaned_data: print("\n--- 开始生成可视化图表与分析 ---") print("\n--- Pearson 相关系数计算 ---") temperatures_for_corr = [r[&#39;temperature&#39;] for r in cleaned_data] powers_for_corr = [r[&#39;transaction_power&#39;] for r in cleaned_data] pearson_corr = calculate_pearson_correlation(temperatures_for_corr, powers_for_corr) valid_pairs_count = len([1 for t, p in zip(temperatures_for_corr, powers_for_corr) if t is not None and p is not None and isinstance(t, (int,float)) and isinstance(p, (int,float))]) if valid_pairs_count > 1: print(f"Temperature与Transaction power的Pearson相关系数: {pearson_corr:.4f} (基于 {valid_pairs_count} 个有效数据点对)") else: print("没有足够的有效数据来计算Temperature与Transaction power的Pearson相关系数。") print("\n--- 生成图表 ---") plot_transaction_power_distribution(cleaned_data, OUTPUT_DIR) plot_power_by_end_cause(cleaned_data, OUTPUT_DIR, top_n=5) plot_temp_vs_power_scatter(cleaned_data, OUTPUT_DIR) if district_stats_aggregated: plot_district_statistics(district_stats_aggregated, OUTPUT_DIR) else: print("无区域统计数据,跳过相关图表绘制。") print(f"\n所有图表已尝试保存到 &#39;{OUTPUT_DIR}&#39; 文件夹中。") print("正在尝试显示所有图表...") plt.show() print("所有图表窗口已尝试显示完毕。") else: print("没有清洗后的数据可用于可视化。") print("\n可视化任务结束。")
最新发布
06-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值