| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- import pandas as pd
- import matplotlib.pyplot as plt
- import numpy as np
- #======================================================
- # == SCRIPT PARAMETERS ==
- #======================================================
- # === CSV Parameters ===
- CSV_FILENAME = r"c:\Users\ranny\Downloads\week_2025_41_data.csv"
- CSV_SEPARATOR = ","
- COL_DIAMETER = "Diameter1 [mm]"
- COL_VELOCITY = "Velocity [m/s]"
- COL_TEMPERATURE = "Temperature [C]"
- COL_TEMP_GROUPED = "TempGrouped" # column added by script
- # === Limits for Velocity & Diameter Filtering ===
- LIM_VELOCITY_MIN = 0.2 # m/s
- LIM_DIAMETER_MIN = 0.7 # mm
- LIM_DIAMETER_MAX = 5.0 # mm
- # === Data Analysis Parameters ===
- TEMP_BIN_SIZE = 2 # split by 2 degrees
- FIT_SAMPLE_COUNT = 100
- # === Figure Parameters ===
- FIG_WIDTH = 9
- FIG_HEIGHT = 6
- FIG_DATA_ALPHA = 0.6
- FIG_DATA_SIZE = 35
- FIG_TR_COLOR = "black" # trendline color
- FIG_TR_SIZE = 2
- FIG_LEGEND_TITLE = "Teplotné Skupiny [°C]"
- FIG_LEGEND_SIZE = 8
- FIG_LEGEND_COLS = 2
- FIG_TITLE = f"Závislosť Rýchlosť a Priemeru Častíc Zoskupené po {TEMP_BIN_SIZE}°C Teplotných Skupinách"
- FIG_X_LABEL = "Priemer Častice [mm]"
- FIG_Y_LABEL = "Rýchlosť Častice [m/s]"
- FIG_GRID_STYLE = ":"
- #======================================================
- # == SCRIPT COMMANDS ==
- #======================================================
- # === Load CSV ===
- df = pd.read_csv(CSV_FILENAME, sep=CSV_SEPARATOR)
- # === Clean column names ===
- df.columns = [col.strip() for col in df.columns]
- # === Drop missing data & provide filtering ===
- df = df.dropna(subset=[COL_DIAMETER, COL_VELOCITY, COL_TEMPERATURE])
- df = df[df[COL_VELOCITY] >= LIM_VELOCITY_MIN]
- df = df[(df[COL_DIAMETER] >= LIM_DIAMETER_MIN) & (df[COL_DIAMETER] <= LIM_DIAMETER_MAX)]
- # === Group temperatures by 2°C bins ===
- df[COL_TEMP_GROUPED] = (df[COL_TEMPERATURE] // TEMP_BIN_SIZE * TEMP_BIN_SIZE).astype(int)
- # Find most frequent temperature group
- most_common_temp = df[COL_TEMP_GROUPED].value_counts().idxmax()
- count = df[COL_TEMP_GROUPED].value_counts().max()
- print(f"The most frequent temperature group is {most_common_temp}–{most_common_temp+1}°C with {count} samples.")
- # === Prepare plot ===
- plt.figure(figsize=(FIG_WIDTH, FIG_HEIGHT))
- unique_temps = sorted(df[COL_TEMP_GROUPED].unique())
- colors = plt.cm.plasma(np.linspace(0, 1, len(unique_temps)))
- # === Scatter + power fit for each temperature group ===
- trendline_handle = None
- for color, temp in zip(colors, unique_temps):
- group = df[df[COL_TEMP_GROUPED] == temp]
- plt.scatter(group[COL_DIAMETER], group[COL_VELOCITY],
- color=color, label=f"{temp}-{temp+1} °C", alpha=FIG_DATA_ALPHA, s=FIG_DATA_SIZE)
- # Power-law fit only for the most frequent group
- if temp == most_common_temp and len(group) >= 2:
- x = group[COL_DIAMETER].values
- y = group[COL_VELOCITY].values
- coeffs = np.polyfit(np.log(x), np.log(y), 1)
- b = coeffs[0]
- a = np.exp(coeffs[1])
- xfit = np.linspace(x.min(), x.max(), FIT_SAMPLE_COUNT)
- yfit = a * xfit ** b
- trendline_handle, = plt.plot(xfit, yfit, color=FIG_TR_COLOR, linewidth=FIG_TR_SIZE,
- label=f"Mocninová Aproximácia {temp}-{temp+1} °C")
- print(f"Power fit @ {temp}-{temp+1}°C: v = {a:.4e} * d^{b:.4f}")
- plt.title(FIG_TITLE)
- plt.xlabel(FIG_X_LABEL)
- plt.ylabel(FIG_Y_LABEL)
- plt.legend(title=FIG_LEGEND_TITLE, fontsize=FIG_LEGEND_SIZE, ncol=FIG_LEGEND_COLS)
- plt.grid(True, linestyle=FIG_GRID_STYLE)
- plt.tight_layout()
- plt.show()
|