Python - Pandas - Groupby - 两个日期之间的差值(不是天数)
Python - Pandas - Groupby - Value (not days) difference between two dates
答案:
我找到了一种方法来回答我自己的问题。假设我只查找某一天的位置(然后针对我的具体问题进行推断):
group_by = df.groupby(level='lvl_1')
ans = group_by.nth(df.index.get_level_values('lvl_2').unique().get_loc(day_2, method='nearest'))
理想情况下,考虑到日期时间向量可能不同,我会处理每个 groupid 的位置。但是,我很难弄清楚最后一步...:[=19=]
group_by = df.groupby(level='lvl_1')
loc = group_by.apply(lambda x: x.index.get_level_values('lvl_2').unique().get_loc(day_2, method='nearest'))
ans = group_by.nth(loc.groupby(level='lvl_1'))
但最后一行出现错误:
TypeError: n needs to be an int or a list/set/tuple of ints
如果有人找到解决这个小问题的方法,请加油!谢谢
-------------------------------------------- ---------------------------------------------- ---------------------------------------------- --------------
问题
我一直在四处寻找答案,但大多数帖子都与天数差异有关,但与两个日期之间的价值差异无关。
假设以下代码:
import pandas as pd
import numpy as np
import datetime
np.random.seed(15)
day = datetime.date.today()
day_1 = datetime.date.today() - datetime.timedelta(1)
day_2 = datetime.date.today() - datetime.timedelta(2)
day_3 = datetime.date.today() - datetime.timedelta(3)
ticker_date = [('fi', day), ('fi', day_1), ('fi', day_2), ('fi', day_3),
('di', day), ('di', day_1), ('di', day_2), ('di', day_3)]
index_df = pd.MultiIndex.from_tuples(ticker_date, names=['lvl_1', 'lvl_2'])
df = pd.DataFrame(np.random.rand(8), index_df, ['value'])
输出:
value
lvl_1 lvl_2
fi 2018-02-15 0.848818
2018-02-14 0.178896
2018-02-13 0.054363
2018-02-12 0.361538
di 2018-02-15 0.275401
2018-02-14 0.530000
2018-02-13 0.305919
2018-02-12 0.304474
我正在寻找一种方法来分组 'lvl_1' 然后得到两个给定日期之间的差异。
例如,2 月 14 日和 2 月 12 日之间的差值对于 'fi' 为 -0.1864,对于 'di' 为 0.225526。
我正在处理以下代码行:
group_by = df.groupby(level='lvl_1')
nd = group_by.get_loc(day_3, method='nearest')
st = group_by.get_loc(day_1, method='nearest')
out = group_by.iloc[nd] - group_by.iloc[st]
但看起来这不是一个有效的方法...
AttributeError: 'DataFrameGroupBy' object has no attribute 'get_loc'
有人吗?
这和你的有点精神上的不同,但它应该给你想要的(虽然如果你的数据库很大,它可能会浪费内存):
expanded = df.reset_index().pivot_table(index='lvl_1',columns='lvl_2',values='value')
expanded[day_3] - expanded[day_1]
这个returns系列的区别是:
lvl_1
di -0.225526
fi 0.182643
dtype: float64
答案:
我找到了一种方法来回答我自己的问题。假设我只查找某一天的位置(然后针对我的具体问题进行推断):
group_by = df.groupby(level='lvl_1')
ans = group_by.nth(df.index.get_level_values('lvl_2').unique().get_loc(day_2, method='nearest'))
理想情况下,考虑到日期时间向量可能不同,我会处理每个 groupid 的位置。但是,我很难弄清楚最后一步...:[=13=]
group_by = df.groupby(level='lvl_1')
loc = group_by.apply(lambda x: x.index.get_level_values('lvl_2').unique().get_loc(day_2, method='nearest'))
ans = group_by.nth(loc.groupby(level='lvl_1'))
但是最后一行出现错误:
TypeError: n needs to be an int or a list/set/tuple of ints
如果有人找到解决这个小问题的方法,请加油!同时,我的临时答案可以完成这项工作。谢谢
答案:
我找到了一种方法来回答我自己的问题。假设我只查找某一天的位置(然后针对我的具体问题进行推断):
group_by = df.groupby(level='lvl_1')
ans = group_by.nth(df.index.get_level_values('lvl_2').unique().get_loc(day_2, method='nearest'))
理想情况下,考虑到日期时间向量可能不同,我会处理每个 groupid 的位置。但是,我很难弄清楚最后一步...:[=19=]
group_by = df.groupby(level='lvl_1')
loc = group_by.apply(lambda x: x.index.get_level_values('lvl_2').unique().get_loc(day_2, method='nearest'))
ans = group_by.nth(loc.groupby(level='lvl_1'))
但最后一行出现错误:
TypeError: n needs to be an int or a list/set/tuple of ints
如果有人找到解决这个小问题的方法,请加油!谢谢
-------------------------------------------- ---------------------------------------------- ---------------------------------------------- --------------
问题
我一直在四处寻找答案,但大多数帖子都与天数差异有关,但与两个日期之间的价值差异无关。
假设以下代码:
import pandas as pd
import numpy as np
import datetime
np.random.seed(15)
day = datetime.date.today()
day_1 = datetime.date.today() - datetime.timedelta(1)
day_2 = datetime.date.today() - datetime.timedelta(2)
day_3 = datetime.date.today() - datetime.timedelta(3)
ticker_date = [('fi', day), ('fi', day_1), ('fi', day_2), ('fi', day_3),
('di', day), ('di', day_1), ('di', day_2), ('di', day_3)]
index_df = pd.MultiIndex.from_tuples(ticker_date, names=['lvl_1', 'lvl_2'])
df = pd.DataFrame(np.random.rand(8), index_df, ['value'])
输出:
value
lvl_1 lvl_2
fi 2018-02-15 0.848818
2018-02-14 0.178896
2018-02-13 0.054363
2018-02-12 0.361538
di 2018-02-15 0.275401
2018-02-14 0.530000
2018-02-13 0.305919
2018-02-12 0.304474
我正在寻找一种方法来分组 'lvl_1' 然后得到两个给定日期之间的差异。
例如,2 月 14 日和 2 月 12 日之间的差值对于 'fi' 为 -0.1864,对于 'di' 为 0.225526。
我正在处理以下代码行:
group_by = df.groupby(level='lvl_1')
nd = group_by.get_loc(day_3, method='nearest')
st = group_by.get_loc(day_1, method='nearest')
out = group_by.iloc[nd] - group_by.iloc[st]
但看起来这不是一个有效的方法...
AttributeError: 'DataFrameGroupBy' object has no attribute 'get_loc'
有人吗?
这和你的有点精神上的不同,但它应该给你想要的(虽然如果你的数据库很大,它可能会浪费内存):
expanded = df.reset_index().pivot_table(index='lvl_1',columns='lvl_2',values='value')
expanded[day_3] - expanded[day_1]
这个returns系列的区别是:
lvl_1
di -0.225526
fi 0.182643
dtype: float64
答案:
我找到了一种方法来回答我自己的问题。假设我只查找某一天的位置(然后针对我的具体问题进行推断):
group_by = df.groupby(level='lvl_1')
ans = group_by.nth(df.index.get_level_values('lvl_2').unique().get_loc(day_2, method='nearest'))
理想情况下,考虑到日期时间向量可能不同,我会处理每个 groupid 的位置。但是,我很难弄清楚最后一步...:[=13=]
group_by = df.groupby(level='lvl_1')
loc = group_by.apply(lambda x: x.index.get_level_values('lvl_2').unique().get_loc(day_2, method='nearest'))
ans = group_by.nth(loc.groupby(level='lvl_1'))
但是最后一行出现错误:
TypeError: n needs to be an int or a list/set/tuple of ints
如果有人找到解决这个小问题的方法,请加油!同时,我的临时答案可以完成这项工作。谢谢