temperature_vs_particle_count.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import pandas as pd
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. import matplotlib.dates as mdates
  5. #======================================================
  6. # == SCRIPT PARAMETERS ==
  7. #======================================================
  8. # === CSV Parameters ===
  9. CSV_FILENAME = r"c:\Users\ranny\Downloads\week_2025_41_data.csv"
  10. CSV_SEPARATOR = ","
  11. COL_DIAMETER = "Diameter1 [mm]"
  12. COL_VELOCITY = "Velocity [m/s]"
  13. COL_TEMPERATURE = "Temperature [C]"
  14. FIG_TITLE = f"Rain activity of week 41 of 2025"
  15. FIG_GRID_STYLE = ":"
  16. # === Limits for Velocity & Diameter Filtering ===
  17. LIM_VELOCITY_MIN = 0.2 # m/s
  18. LIM_DIAMETER_MIN = 0.16 # mm
  19. LIM_DIAMETER_MAX = 8.0 # mm
  20. # === Figure Parameters ===
  21. FIG_WIDTH = 9
  22. FIG_HEIGHT = 6
  23. FIG_DATA_ALPHA = 0.6
  24. FIG_DATA_SIZE = 35
  25. # === Load CSV ===
  26. df = pd.read_csv(CSV_FILENAME, sep=CSV_SEPARATOR)
  27. # === Clean column names ===
  28. df.columns = [col.strip() for col in df.columns]
  29. print(df.columns)
  30. # === Drop missing data & provide filtering ===
  31. df = df.dropna(subset=[COL_DIAMETER, COL_VELOCITY, COL_TEMPERATURE])
  32. df = df[df[COL_VELOCITY] >= LIM_VELOCITY_MIN]
  33. df = df[(df[COL_DIAMETER] >= LIM_DIAMETER_MIN) & (df[COL_DIAMETER] <= LIM_DIAMETER_MAX)]
  34. # Convert timestamp
  35. df['Timestamp'] = pd.to_datetime(df['Timestamp'])
  36. df = df.set_index('Timestamp')
  37. # === Hourly resampling ===
  38. hourly = (
  39. df
  40. .resample("1h")
  41. .agg({
  42. COL_TEMPERATURE: "mean",
  43. COL_DIAMETER: "count"
  44. })
  45. .rename(columns={COL_DIAMETER: "Particle Count"})
  46. )
  47. hourly['Temperature [C]'] = hourly['Temperature [C]'].interpolate(method='linear')
  48. # =====================================
  49. # 📈 Create the plot (temperature + particles)
  50. # =====================================
  51. fig, ax1 = plt.subplots(figsize=(9, 6))
  52. ax2 = ax1.twinx()
  53. ax1.plot(hourly.index, hourly['Temperature [C]'], color='tab:red', label='Temperature [°C]', linewidth=2)
  54. ax1.set_ylabel('Temperature [°C]', color='tab:red')
  55. ax1.tick_params(axis='y', labelcolor='tab:red')
  56. ax2.bar(hourly.index, hourly['Particle Count'], width=0.03, alpha=0.4, color='tab:blue', label='Particles per hour')
  57. ax2.set_ylabel('Particle count per hour', color='tab:blue')
  58. ax2.tick_params(axis='y', labelcolor='tab:blue')
  59. # === Formátovanie timestamp na dd.mm.yyyy ===
  60. ax1.xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.%Y'))
  61. fig.autofmt_xdate() # otočí dátumy, aby sa neprekrývali
  62. plt.title(FIG_TITLE)
  63. # === ZDIEĽANÁ LEGENDA ===
  64. lines1, labels1 = ax1.get_legend_handles_labels()
  65. lines2, labels2 = ax2.get_legend_handles_labels()
  66. ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper left', frameon=True)
  67. plt.grid(True, linestyle=FIG_GRID_STYLE)
  68. plt.tight_layout()
  69. plt.show()