Объединение кадров данных Pandas разных частот Периода - PullRequest
0 голосов
/ 22 сентября 2019

Предположим, у меня есть два следующих кадра данных:

np.random.seed(1)
annual = pd.DataFrame(data=np.random.random((2, 4)), index=index, columns=pd.period_range(start="2015", end="2018", freq="Y"))
quarterly = pd.DataFrame(data=np.random.random((2,3)), index=index, columns=pd.period_range('2019', freq='Q', periods=3))

Annual:

    2015        2016        2017        2018
A   0.417022    0.720324    0.000114    0.302333
B   0.146756    0.092339    0.186260    0.345561

Quarterly:

    2019Q1      2019Q2      2019Q3
A   0.396767    0.538817    0.419195
B   0.685220    0.204452    0.878117

Возможно ли, чтоЯ объединяю два кадра данных так, чтобы результирующий кадр данных df выглядел как-то ниже?Если нет, есть ли обходные пути, которые позволяют мне объединить два кадра данных, чтобы я мог сделать что-то вроде df['2019Q2'] - df['2018']?

    2015        2016        2017        2018        2019Q1      2019Q2      2019Q3
A   0.417022    0.720324    0.000114    0.302333    0.396767    0.538817    0.419195   
B   0.146756    0.092339    0.186260    0.345561    0.685220    0.204452    0.878117

1 Ответ

1 голос
/ 22 сентября 2019

Сначала concat с axis=1, а затем необходимо преобразовать имена столбцов в строки, если потребуется обработка позже:

df = pd.concat([annual,quarterly], axis=1).rename(columns=str)
print (df)
       2015      2016      2017      2018    2019Q1    2019Q2    2019Q3
A  0.417022  0.720324  0.000114  0.302333  0.396767  0.538817  0.419195
B  0.146756  0.092339  0.186260  0.345561  0.685220  0.204452  0.878117

print (df.columns)
Index(['2015', '2016', '2017', '2018', '2019Q1', '2019Q2', '2019Q3'], dtype='object')

print (df['2019Q2'] - df['2018'])
A    0.236484
B   -0.141108
dtype: float64

Если вы хотите работать с периодами, это возможно, ноболее сложный:

df = pd.concat([annual,quarterly], axis=1)
print (df)
       2015      2016      2017      2018    2019Q1    2019Q2    2019Q3
A  0.417022  0.720324  0.000114  0.302333  0.396767  0.538817  0.419195
B  0.146756  0.092339  0.186260  0.345561  0.685220  0.204452  0.878117

print (df[pd.Period('2018', freq='A-DEC')])
A    0.302333
B    0.345561
Name: 2018, dtype: float64

print (df[pd.Period('2019Q2', freq='Q-DEC')])
A    0.538817
B    0.204452
Name: 2019Q2, dtype: float64

print (df[pd.Period('2019Q2', freq='Q-DEC')] - 
       df[pd.Period('2018', freq='A-DEC')])

IncompatibleFrequency: вход имеет другое значение freq = A-DEC от периода (freq = Q-DEC)

Изменитьимя Series для предотвращения ошибки:

print (df[pd.Period('2019Q2', freq='Q-DEC')].rename('a') - 
       df[pd.Period('2018', freq='A-DEC')].rename('a'))

A    0.236484
B   -0.141108
Name: a, dtype: float64

На мой взгляд, если нужно обрабатывать значения с последним с Periods, то лучшее работает с той же частотой:

annual.columns = annual.columns.to_timestamp('Q').to_period('Q')
df = pd.concat([annual,quarterly], axis=1)
print (df)
     2015Q1    2016Q1    2017Q1    2018Q1    2019Q1    2019Q2    2019Q3
A  0.417022  0.720324  0.000114  0.302333  0.396767  0.538817  0.419195
B  0.146756  0.092339  0.186260  0.345561  0.685220  0.204452  0.878117

print (df[pd.Period('2019Q2', freq='Q-DEC')] - 
       df[pd.Period('2018Q1', freq='Q-DEC')])

A    0.236484
B   -0.141108
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...