簡體   English   中英

Python-熊貓-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的位置。 但是,我很難找出最后一步...:

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

如果有人找到解決此微小問題的方法,請開火! thxs

-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------

我一直在尋找答案,但大多數帖子與天數差異有關,但與兩個日期之間的價值差異無關。

假設以下代碼:

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]

這將返回具有以下區別的系列:

lvl_1

迪-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的位置。 但是,我很難找出最后一步...:

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

如果有人找到解決此微小問題的方法,請開火! 在此期間,我的臨時答復已完成工作。 thxs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM