假設我有一個每日資料如下:
import pandas as pd
import numpy as np
np.random.seed(2021)
dates = pd.date_range('20130226', periods=90)
df = pd.DataFrame(np.random.randint(0, 100, size=(90, 3)), index=dates, columns=list('ABC'))
df
出去:
A B C
2013-02-26 85 57 0
2013-02-27 94 86 44
2013-02-28 62 91 29
2013-03-01 21 93 24
2013-03-02 12 70 70
.. .. ..
2013-05-22 57 13 81
2013-05-23 43 68 85
2013-05-24 55 50 53
2013-05-25 75 78 66
2013-05-26 70 93 3
對于柱A和B,我需要計算其每月的PCT改變每天的基礎上,例如,每月PCT變化值的A用于2013-05-26將通過下式計算:A在2013年5月26日通過了價值2013年4月26日減去除得值1.
我的想法是這樣的:'A1', 'B1'通過將它們向前移動一個月來創建新列,然后df['A_MoM']將通過df['A']/df['A_shifted'] - 1與 column 相同的邏輯進行計算B。
由于并非所有月份的天數都相同,因此我將使用上個月的最后一天的值,即計算 2013-03-30 的百分比變化將通過以下方式計算:2013-03-30's value/2013-02-28's value - 1。
我嘗試了下面的代碼,但它生成了一個包含所有NaNs的資料幀:
df[['A1', 'B1']] = df[['A', 'B']].shift(freq=pd.DateOffset(months=1)).resample('D').last().fillna(method=ffill)
df[['A_MoM', 'B_MoM']] = df[['A', 'B']].div(df[['A1', 'B1']], axis=0) - 1
出去:
A A1 B B1
2013-02-26 NaN NaN NaN NaN
2013-02-27 NaN NaN NaN NaN
2013-02-28 NaN NaN NaN NaN
2013-03-01 NaN NaN NaN NaN
2013-03-02 NaN NaN NaN NaN
.. .. .. ..
2013-05-22 NaN NaN NaN NaN
2013-05-23 NaN NaN NaN NaN
2013-05-24 NaN NaN NaN NaN
2013-05-25 NaN NaN NaN NaN
2013-05-26 NaN NaN NaN NaN
怎樣才能正確地做到這一點?提前表示衷心的感謝。
編輯:
df = pd.DataFrame(np.random.randint(0, 100, size=(90, 3)), index=dates, columns=['A_values', 'B_values', 'C'])
df.columns
df1 = df.filter(regex='_values$').shift(freq=pd.DateOffset(months=1)).resample('D').last().ffill().add_suffix('_shifted')
df2 = df.filter(regex='_values$').div(df1.to_numpy(), axis=0) - 1
df.join(df2.add_suffix('_MoM'))
出去:
ValueError: Unable to coerce to DataFrame, shape must be (90, 2): given (93, 2)
uj5u.com熱心網友回復:
原因是不同的列名,解決方案是轉換df[['A1', 'B1']]為 numpy 陣列:
df[['A1', 'B1']] = df[['A', 'B']].shift(freq=pd.DateOffset(months=1)).resample('D').last().ffill()
df[['A_MoM', 'B_MoM']] = df[['A', 'B']].div(df[['A1', 'B1']].to_numpy(), axis=0) - 1
print (df)
A B C A1 B1 A_MoM B_MoM
2013-02-26 85 57 0 NaN NaN NaN NaN
2013-02-27 94 86 44 NaN NaN NaN NaN
2013-02-28 62 91 29 NaN NaN NaN NaN
2013-03-01 21 93 24 NaN NaN NaN NaN
2013-03-02 12 70 70 NaN NaN NaN NaN
.. .. .. ... ... ... ...
2013-05-22 57 13 81 14.0 50.0 3.071429 -0.740000
2013-05-23 43 68 85 2.0 45.0 20.500000 0.511111
2013-05-24 55 50 53 89.0 52.0 -0.382022 -0.038462
2013-05-25 75 78 66 86.0 54.0 -0.127907 0.444444
2013-05-26 70 93 3 4.0 45.0 16.500000 1.066667
[90 rows x 7 columns]
或者,如果可能,將輸出分配給df1,因此列名稱不會更改,因此可能使用相同的列名稱進行劃分,此處A, B正確:
df1 = df[['A', 'B']].shift(freq=pd.DateOffset(months=1)).resample('D').last().ffill()
df[['A_MoM', 'B_MoM']] = df[['A', 'B']].div(df1, axis=0) - 1
print (df)
A B C A_MoM B_MoM
2013-02-26 85 57 0 NaN NaN
2013-02-27 94 86 44 NaN NaN
2013-02-28 62 91 29 NaN NaN
2013-03-01 21 93 24 NaN NaN
2013-03-02 12 70 70 NaN NaN
.. .. .. ... ...
2013-05-22 57 13 81 3.071429 -0.740000
2013-05-23 43 68 85 20.500000 0.511111
2013-05-24 55 50 53 -0.382022 -0.038462
2013-05-25 75 78 66 -0.127907 0.444444
2013-05-26 70 93 3 16.500000 1.066667
[90 rows x 5 columns]
編輯:之后resample也更改了日期reindex時間索引,因此在兩者中添加了相同的索引DataFrames:
np.random.seed(2021)
dates = pd.date_range('20130226', periods=90)
df = pd.DataFrame(np.random.randint(0, 100, size=(90, 3)), index=dates, columns=['A_values', 'B_values', 'C'])
df1 = df.filter(regex='_values$').shift(freq=pd.DateOffset(months=1)).resample('D').last().ffill()
print (df1.columns)
Index(['A_values', 'B_values'], dtype='object')
df2 = df.filter(regex='_values$').div(df1, axis=0).sub(1).reindex(df.index)
print (df.filter(regex='_values$').columns)
Index(['A_values', 'B_values'], dtype='object')
df = df.join(df2.add_suffix('MoM'))
print (df)
A_values B_values C A_valuesMoM B_valuesMoM
2013-02-26 85 57 0 NaN NaN
2013-02-27 94 86 44 NaN NaN
2013-02-28 62 91 29 NaN NaN
2013-03-01 21 93 24 NaN NaN
2013-03-02 12 70 70 NaN NaN
... ... .. ... ...
2013-05-22 57 13 81 3.071429 -0.740000
2013-05-23 43 68 85 20.500000 0.511111
2013-05-24 55 50 53 -0.382022 -0.038462
2013-05-25 75 78 66 -0.127907 0.444444
2013-05-26 70 93 3 16.500000 1.066667
[90 rows x 5 columns]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/355107.html
上一篇:創建從資料幀行中提取的多條線圖
