我有一个看起来像
的熊猫系列Attribute DateEvent Value
Type A 2015-04-01 4
2015-04-02 5
2015-04-05 3
Type B 2015-04-01 1
2015-04-03 4
2015-04-05 1
如何确保在我的DateEvent索引中考虑缺少日期(假设其开始日期和结束日期是全部范围?),如何将值转换为滚动金额(例如,过去两天)?(例如类型A缺少2015-04-03
和2015-04-04
,B类缺少2015-04-02
和2015-04-04
。
答案 0 :(得分:4)
我对你想要的东西做了几个假设,请澄清:
v.toString()
。Value = NaN
。NaN
和Type A
如果我没假设,
Type B
这就是它的样子。 import pandas as pd
import numpy as np
import io
datastring = io.StringIO(
"""
Attribute,DateEvent,Value
Type A,2017-04-02,1
Type A,2017-04-03,2
Type A,2017-04-04,3
Type A,2017-04-05,4
Type B,2017-04-02,1
Type B,2017-04-03,2
Type B,2017-04-04,3
Type B,2017-04-05,4
""")
s = pd.read_csv(
datastring,
index_col=['Attribute', 'DateEvent'],
parse_dates=True)
print(s)
和Type A
中的每一个都缺少Type B
。
2017-04-01
根据this answer,您必须重新构建索引,然后重新索引 Value
Attribute DateEvent
Type A 2017-04-02 1
2017-04-03 2
2017-04-04 3
2017-04-05 4
Type B 2017-04-02 1
2017-04-03 2
2017-04-04 3
2017-04-05 4
以获取包含所有日期的索引。
Series
使用# reconstruct index with all the dates
dates = pd.date_range("2017-04-01","2017-04-05", freq="1D")
attributes = ["Type A", "Type B"]
# create a new MultiIndex
index = pd.MultiIndex.from_product([attributes,dates],
names=["Attribute","DateEvent"])
# reindex the series
sNew = s.reindex(index)
添加了缺少的日期。
Value = NaN
现在将 Value
Attribute DateEvent
Type A 2017-04-01 NaN
2017-04-02 1.0
2017-04-03 2.0
2017-04-04 3.0
2017-04-05 4.0
Type B 2017-04-01 NaN
2017-04-02 1.0
2017-04-03 2.0
2017-04-04 3.0
2017-04-05 4.0
分组到Series
索引列,并应用大小为Attribute
的滚动窗口2
sum()
# group the series by the `Attribute` column
grouped = sNew.groupby(level="Attribute")
# Apply a 2 day rolling window
summed = grouped.rolling(2).sum()
最后注意:不知道为什么现在有两个 Value
Attribute Attribute DateEvent
Type A Type A 2017-04-01 NaN
2017-04-02 NaN
2017-04-03 3.0
2017-04-04 5.0
2017-04-05 7.0
Type B Type B 2017-04-01 NaN
2017-04-02 NaN
2017-04-03 3.0
2017-04-04 5.0
2017-04-05 7.0
索引列,如果有人想出来,请告诉我。
编辑:结果发出类似问题here。看看吧。