ziyuzhou02's picture
Deploy GitHub main 3feb6cda1511
e317359 verified
Raw
History Blame Contribute Delete
4.99 kB
import matplotlib.pyplot as plt
import numpy as np
import os
def normalize_data(mean, std):
"""
Normalize the data using Min-Max Scaling to bring the mean and standard deviation between 0 and 1.
Parameters:
- mean: The mean values of the data.
- std: The standard deviation values of the data.
Returns:
- Tuple of normalized mean and standard deviation.
"""
# Apply Min-Max Scaling to normalize the data between 0 and 1
mean_normalized = (mean - mean.min()) / (mean.max() - mean.min())
# Normalize std by the same range for consistency
std_normalized = std / (mean.max() - mean.min())
return mean_normalized, std_normalized
def plot_radar_chart(df, output_dir):
"""
Plot a radar chart for the given DataFrame and save it to the specified output directory.
Parameters:
- df: DataFrame containing the data to plot.
- output_dir: Directory where the radar chart will be saved.
"""
# Calculate mean and std across rows for each column
mean = df.mean()
std = df.std()
# Normalize data
mean_normalized, std_normalized = normalize_data(mean, std)
# Number of variables we're plotting.
num_vars = len(df.columns)
# Split the circle into even parts and save angles so we know where to put each axis.
angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False).tolist()
# Complete the loop for the plot
angles += angles[:1]
mean_normalized = mean_normalized.tolist() + mean_normalized.tolist()[:1]
std_normalized = std_normalized.tolist() + std_normalized.tolist()[:1]
# Draw the plot
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
ax.fill(angles, mean_normalized, color='red', alpha=0.25)
ax.plot(angles, mean_normalized, color='red', label='Mean')
# Draw error bars
for angle, mean, error in zip(angles, mean_normalized, std_normalized):
ax.errorbar(angle, mean, yerr=error, color='black', capsize=3)
ax.set_ylim(0, 1)
# Labels for each feature
labels = df.columns.tolist()
ax.set_xticks(angles[:-1])
ax.set_xticklabels(labels, size=12)
# Title and legend
plt.title('Time Series Benchmark Features (Normalized)',
size=15, color='red', y=1.1)
ax.legend(loc='upper right', bbox_to_anchor=(1.1, 1.1))
# Save the figure
plt.savefig(os.path.join(output_dir, 'character_radar.png'))
plt.close()
def persist_analysis(features_df, output_dir):
"""
Persist the analysis results by saving the features DataFrame and its description to CSV files.
Parameters:
- features_df: DataFrame containing the features to be saved.
- output_dir: Directory where the CSV files will be saved.
"""
features_df.to_csv(f"{output_dir}/features.csv")
features_df.describe().to_csv(f"{output_dir}/features_description.csv")
# Create histograms of each characteristic
for column in features_df.columns:
plot_feature_histogram(features_df, column, output_dir)
# Create a ring plot showing the mean and std of some key features, trend and seasonality should be there for sure.
plot_radar_chart(features_df, output_dir)
def plot_histogram(freq_distribution_dict, name, output_dir):
"""
Plot the histogram for the given frequency distribution dictionary and save it to the output directory.
Parameters:
- freq_distribution_dict: Dictionary with frequency strings as keys and counts as values.
- name: Name of the frequency distribution.
- output_dir: Directory where the histogram will be saved.
"""
fig, ax = plt.subplots()
ax.bar(freq_distribution_dict.keys(), freq_distribution_dict.values())
ax.set_xlabel(f"Frequency of {name}")
ax.set_ylabel("Count")
ax.set_title(f"Distribution of {name} frequencies")
plt.savefig(f"{output_dir}/{name}_frequency_distribution.png")
plt.close()
def plot_feature_histogram(dataframe, column_name, output_directory):
"""
Plot a histogram for the given column in the DataFrame and save it to the specified output directory.
Parameters:
- dataframe: The DataFrame containing the data.
- column_name: The column name for which to plot the histogram.
- output_directory: The directory where the plot will be saved.
"""
# Check if the column exists in the dataframe
if column_name not in dataframe.columns:
raise ValueError(
f"Column '{column_name}' does not exist in the dataframe.")
# Drop rows with NA values in the specified column
clean_data = dataframe[column_name].dropna()
# Plot the histogram
plt.figure(figsize=(10, 6))
plt.hist(clean_data, bins=10, edgecolor='black')
plt.title(f'Histogram of {column_name}')
plt.xlabel(column_name)
plt.ylabel('Frequency')
# Save the plot
plot_filename = os.path.join(
output_directory, f"{column_name}_histogram.png")
plt.savefig(plot_filename)
plt.close()