chat1
import polars as plfrom datetime import timedelta
def propagate_indicator(df): # EnsureSample the dataframe is sorted by timestampDataFrame df = df.sort('timestamp'pl.DataFrame({
"stuff": [None, None, 1, 1, 1, None, None, 1, 1, None, 1, None, 1, 1, 1, 1]
})
# Create a helperforward-looking column to trackcompare with the current 'stuff' column
df = df.with_column(
pl.col("stuff").shift(-1).alias("next_stuff")
)
# Identify rows where indicatora ischange from 1 to None or None to 1 will occur df = df.with_column(
(pl.col('indicator'"stuff") != pl.col("next_stuff")).alias("will_change")
)
# Count the number of changes from 1 to None, indicating the end of a group of 1s
count_groups = df.filter((pl.col("stuff") == 1) & (pl.col("next_stuff").alias('start_indicator'is_null() )).count()
print("Number of #contiguous Calculategroups theof timestamp up to which the value 1 should be propagated df = df.with_column( pl.when(pl.col('start_indicator')) .then(pl.col('timestamp') + timedelta(seconds=30)) .otherwise(None) .alias('propagate_until') )
# Forward fill the 'propagate_until' to get the maximum propagate time df = df.with_column( pl.col('propagate_until').fill_null('forward').alias('propagation_time') )
# Use a window function to propagate the indicator df = df.with_columns( pl.when(pl.col('timestamp') <= pl.col('propagation_time')) .then(1) .otherwise(pl.col('indicator')) .alias('indicator_propagated') )
# Drop helper columns df = df.drop(['start_indicator'1s:", 'propagate_until', 'propagation_time'])
return df
# Example DataFramedata = { 'timestamp': [pl.datetime("2023-01-01 00:00:00") + timedelta(seconds=i) for i in range(120)], 'indicator': [1 if i in [0, 50, 70, 100] else None for i in range(120)]}df = pl.DataFrame(data)
# Apply the functionresult_df = propagate_indicator(df)print(result_df)count_groups)