Python Dataframe 使用 window 创建列表列的滚动聚合
Python Dataframe Create a rolling aggregate of list column with a window
我有一个 df,其中有一列列表。
import pandas as pd
import numpy as np
# Get some time series data
df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/timeseries.csv")
input_cols = ['A', 'B']
df['single_input_vector'] = df[input_cols].apply(tuple, axis=1).apply(list)
我想知道是否有办法为给定的 window 创建 'single_input_vector' 列的滚动聚合。我查看了以下 SO link,但它没有提供包含 window 的方法。在我的例子中,window 为 3 所需的输出列为:
Row1: [[24.68, 164.93]]
Row2: [[24.68, 164.93], [24.18, 164.89]]
Row3: [[24.68, 164.93], [24.18, 164.89], [23.99, 164.63]]
Row4: [[24.18, 164.89], [23.99, 164.63], [24.14, 163.92]]
等等。
我想不出更有效的方法来做到这一点,所以虽然这确实有效,但在海量数据集上可能会受到性能限制。
我们基本上是使用滚动计数来创建一组 start:stop 切片索引。
import pandas as pd
import numpy as np
# Get some time series data
df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/timeseries.csv")
input_cols = ['A', 'B']
df['single_input_vector'] = df[input_cols].apply(tuple, axis=1).apply(list)
window = 3
df['len'] = df['A'].rolling(window=window).count()
df['vector_list'] = df.apply(lambda x: df['single_input_vector'][max(0,x.name-(window-1)):int(x.name)+1].values, axis=1)
我有一个 df,其中有一列列表。
import pandas as pd
import numpy as np
# Get some time series data
df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/timeseries.csv")
input_cols = ['A', 'B']
df['single_input_vector'] = df[input_cols].apply(tuple, axis=1).apply(list)
我想知道是否有办法为给定的 window 创建 'single_input_vector' 列的滚动聚合。我查看了以下 SO link,但它没有提供包含 window 的方法。在我的例子中,window 为 3 所需的输出列为:
Row1: [[24.68, 164.93]]
Row2: [[24.68, 164.93], [24.18, 164.89]]
Row3: [[24.68, 164.93], [24.18, 164.89], [23.99, 164.63]]
Row4: [[24.18, 164.89], [23.99, 164.63], [24.14, 163.92]]
等等。
我想不出更有效的方法来做到这一点,所以虽然这确实有效,但在海量数据集上可能会受到性能限制。
我们基本上是使用滚动计数来创建一组 start:stop 切片索引。
import pandas as pd
import numpy as np
# Get some time series data
df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/timeseries.csv")
input_cols = ['A', 'B']
df['single_input_vector'] = df[input_cols].apply(tuple, axis=1).apply(list)
window = 3
df['len'] = df['A'].rolling(window=window).count()
df['vector_list'] = df.apply(lambda x: df['single_input_vector'][max(0,x.name-(window-1)):int(x.name)+1].values, axis=1)