在非数字的滚动 window 中取第一个值
Taking first value in a rolling window that is not numeric
这个问题是在我之前问过的一个问题之后 ,这个问题是针对数值回答的。
我现在提出第二个相对于 Period 类型的数据。
虽然下面给出的示例看起来很简单,但实际上我有 windows 个 可变大小 。对 windows 的第一行感兴趣,我正在寻找使用此定义的技术。
import pandas as pd
from random import seed, randint
# DataFrame
pi1h = pd.period_range(start='2020-01-01 00:00+00:00', end='2020-01-02 00:00+00:00', freq='1h')
seed(1)
values = [randint(0, 10) for ts in pi1h]
df = pd.DataFrame({'Values' : values, 'Period' : pi1h}, index=pi1h)
# This works (numeric type)
df['first'] = df['Values'].rolling(3).agg(lambda rows: rows[0])
# This doesn't (Period type)
df['OpeningPeriod'] = df['Period'].rolling(3).agg(lambda rows: rows[0])
第二条命令的结果
DataError: No numeric types to aggregate
拜托,有什么想法吗?谢谢你的帮助!最佳,
第一行滚动 window 大小 3
表示行,比当前行高 2 行 - 只需使用 pd.Series.shift(2)
:
df['OpeningPeriod'] = df['Period'].shift(2)
对于可变大小(为了示例 - 我将 Values
列作为此变量大小):
import numpy as np
x=(np.arange(len(df))-df['Values'])
df['OpeningPeriod'] = np.where(x.ge(0), df.loc[df.index[x.tolist()], 'Period'], np.nan)
将您的 period[H]
转换为 float
# convert to float
df['Period1'] = df['Period'].dt.to_timestamp().values.astype(float)
# rolling and convert back to period
df['OpeningPeriod'] = pd.to_datetime(df['Period1'].rolling(3)\
.agg(lambda rows: rows[0])).dt.to_period('1h')
# drop column
df = df.drop(columns='Period1')
这个问题是在我之前问过的一个问题之后
我现在提出第二个相对于 Period 类型的数据。
虽然下面给出的示例看起来很简单,但实际上我有 windows 个 可变大小 。对 windows 的第一行感兴趣,我正在寻找使用此定义的技术。
import pandas as pd
from random import seed, randint
# DataFrame
pi1h = pd.period_range(start='2020-01-01 00:00+00:00', end='2020-01-02 00:00+00:00', freq='1h')
seed(1)
values = [randint(0, 10) for ts in pi1h]
df = pd.DataFrame({'Values' : values, 'Period' : pi1h}, index=pi1h)
# This works (numeric type)
df['first'] = df['Values'].rolling(3).agg(lambda rows: rows[0])
# This doesn't (Period type)
df['OpeningPeriod'] = df['Period'].rolling(3).agg(lambda rows: rows[0])
第二条命令的结果
DataError: No numeric types to aggregate
拜托,有什么想法吗?谢谢你的帮助!最佳,
第一行滚动 window 大小 3
表示行,比当前行高 2 行 - 只需使用 pd.Series.shift(2)
:
df['OpeningPeriod'] = df['Period'].shift(2)
对于可变大小(为了示例 - 我将 Values
列作为此变量大小):
import numpy as np
x=(np.arange(len(df))-df['Values'])
df['OpeningPeriod'] = np.where(x.ge(0), df.loc[df.index[x.tolist()], 'Period'], np.nan)
将您的 period[H]
转换为 float
# convert to float
df['Period1'] = df['Period'].dt.to_timestamp().values.astype(float)
# rolling and convert back to period
df['OpeningPeriod'] = pd.to_datetime(df['Period1'].rolling(3)\
.agg(lambda rows: rows[0])).dt.to_period('1h')
# drop column
df = df.drop(columns='Period1')