根据滚动时间窗口分配组号 - 熊猫



>我有一个股票价格的数据框:

Dates       Price
2019-02-01     52
2019-02-02     51
2019-02-03     53
2019-02-04     55
...            ...
2019-08-01     49
2019-08-02     48
2019-08-03     52

现在我想创建新列,该列基本上每 6 个月分配或更新一次组值。所需数据帧:

Dates       Price    Group
2019-02-01     52        1
2019-02-02     51        1
2019-02-03     53        1
2019-02-04     55        1
...           ...       ...
2019-08-01     49        2
2019-08-02     48        2
2019-08-03     52        2

group列的值需要基于数据帧的第一个月值。因此,如果第一行的月份是 04,则组 1 将是 04-09 个月,10-03 应该是第 2 组,依此类推。我希望根据 6 个月的时间窗口间隔更新值。还没有找到解决方案。

附言我想要小组号。增加而不是重复,例如:

Dates        Price    group
2018-08-01    50        1
...          ...       ...
2019-01-01    55        1
...          ...       ...
2019-02-01    60        2
...          ...       ...
2019-07-01    56        2
2019-08-01    57        3
...          ...       ...

如果您有连续每天的每日数据,则可以使用to_periodfactorize和整数除法:

# If necessary
# df['Dates'] = pd.to_datetime(df['Dates'])
df['group'] = (df['Dates'].dt.to_period('M').factorize()[0] // 6) + 1

否则,您可以先使用pandas.period_range创建组,然后再使用Series.map创建组。

periods = pd.period_range(df['Dates'].min(), df['Dates'].max(), freq='M')
period_groups = pd.Series((pd.factorize(periods)[0] // 6 + 1), index=periods)
df['group'] = df['Dates'].dt.to_period('M').map(period_groups)

df = pd.DataFrame({'Dates': ['2018-08-01', '2019-01-01', '2019-02-01', '2019-07-01', '2019-08-01'], 'Price': [50, 55, 60, 56, 57], 'group': [1, 1, 2, 2, 3]})
df['Dates'] = pd.to_datetime(df['Dates'])
periods = pd.period_range(df['Dates'].min(), df['Dates'].max(), freq='M')
period_groups = pd.Series((pd.factorize(periods)[0] // 6 + 1), index=periods)
df['group_2'] = df['Dates'].dt.to_period('M').map(period_groups)

[出]

Dates  Price  group  group_2
0 2018-08-01     50      1        1
1 2019-01-01     55      1        1
2 2019-02-01     60      2        2
3 2019-07-01     56      2        2
4 2019-08-01     57      3        3

最新更新