gpt4 book ai didi

python - 在 Pandas MultiIndex 中移动 DateTime 索引

转载 作者:行者123 更新时间:2023-12-04 10:11:54 25 4
gpt4 key购买 nike

我有一个加载它时看起来像这样的 csv 文件:

# generate example data
users = ['A', 'B', 'C', 'D']
#dates = pd.date_range("2020-02-01 00:00:00", "2020-04-04 20:00:00", freq="H")
dates = pd.date_range("2020-02-01 00:00:00", "2020-02-04 20:00:00", freq="H")
idx = pd.MultiIndex.from_product([users, dates])
idx.names = ["user", "datehour"]
y = pd.Series(np.random.choice(a=[0, 1], size=len(idx)), index=idx).rename('y')

# write to csv and reload (turns out this matters)
y.to_csv('reprod_example.csv')
y = pd.read_csv('reprod_example.csv', parse_dates=['datehour'])
y = y.set_index(['user', 'datehour']).y

>>> y.head()
user datehour
A 2020-02-01 00:00:00 0
2020-02-01 01:00:00 0
2020-02-01 02:00:00 1
2020-02-01 03:00:00 0
2020-02-01 04:00:00 0
Name: y, dtype: int64
我有以下函数来创建索引级别的滞后特征:
def shift_index(a, dt_idx_name, lag_freq, lag):

# get datetime index of relevant level
ac = a.copy()
dti = ac.index.get_level_values(dt_idx_name)

# shift it
dti_shifted = dti.shift(lag, freq=lag_freq)

# put it back where you found it
ac.index.set_levels(dti_shifted, level=dt_idx_name, inplace=True)

return ac
但是当我运行时: y_lag = shift_index(y, 'datehour', 'H', 1) ,我收到以下错误: ValueError: Level values must be unique...(我实际上可以通过添加 verify_integrity=False 来抑制这个错误
.index.set_levels...在函数中,但这(可预测)会导致问题)
这是奇怪的部分。如果您运行上面的示例但没有从 csv 保存/重新加载,它就可以工作。我认为原因似乎是 y.index.get_level_value('datehour')显示 freq='H'属性在创建后立即生效,但 freq=None一旦它从 csv 重新加载。
这是有道理的,csv 显然不保存元数据。但是我发现为 MultiIndexed 系列设置 freq 属性非常困难。例如,这什么也没做。 df.index.freq = pd.tseries.frequencies.to_offset("H") .和 this answer也不适用于我的 MultiIndex。
所以我想如果我能够设置 freq 就可以解决这个问题。我的 MultiIndex 的 DateTime 组件的属性。但我的最终目标是创建一个版本的 y带有偏移的 DateTime MultiIndex 组件的数据,例如我的 shift_index以上功能。由于我通过 csv 接收我的数据,“只是不要保存到 csv 并重新加载”不是一个选项。

最佳答案

经过一番折腾,我能够使用 asfreq('H') 设置每小时的频率。在分组数据上,这样每个组都有唯一的 datehour 值指数。

y = pd.read_csv('reprod_example.csv', parse_dates=['datehour'])
y = y.groupby('user').apply(lambda df: df.set_index('datehour').asfreq('H')).y

查看索引值会显示正确的频率。
y.index[0]                                                                                                                                                                                                                          
# ('A', Timestamp('2020-02-01 00:00:00', freq='H'))

所有这些都是在两部分中设置索引。 user首先是嵌套 datehour索引在其中可以是唯一的。曾经 datehour索引是唯一的,那么 asfreq可以毫无困难地使用。

如果您尝试 asfreq在非唯一索引上,它将不起作用。

y_load.set_index('datehour').asfreq('H')
# ---------------------------------------------------------------------------
# ValueError Traceback (most recent call last)
# <ipython-input-433-3ba51b619417> in <module>
# ----> 1 y_load.set_index('datehour').asfreq('H')
# ...
# ValueError: cannot reindex from a duplicate axis

关于python - 在 Pandas MultiIndex 中移动 DateTime 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61297399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com