我正在學習 Python,我正在嘗試制作一個簡單的回圈,以將臟價格添加到我的資料框 bond_df 中。
Days_left 是一個系列,bond_df 是一個 pandas 資料框,其中包含以下公式中使用的收盤價。
如果我運行命令:
days = days_left[1].days
我得到一個大小為 1、值為 2 的整數,這正是我所需要的。我需要天數作為整數,并且上面沒有任何其他時間戳(見附圖)。所以,我使用“.days”,這樣我就可以提取天的整數值,并去掉小時和秒等的時間戳。
因此,我想我可以在回圈中使用它來構建我的 dirty-prices 列,在我的 df 中:
for i, number in days_left:
days = days_left[i].days
bond_df['dirty_price'][i] = bond_df['closing_price'][i] ((365 - days)/365)
然而,這不起作用并回傳訊息:
“TypeError:無法解壓不可迭代的 Timedelta 物件”
然后我想,我可以使用范圍來構造一個回圈:
for i in range(0, len(days_left)):
days = days_left[i].days
bond_df['dirty_price'][i] = bond_df['closing_price'][i] ((365 - days)/365)
print(days, bond_df['dirty_price'])
這似乎按預期作業。
但我還是想知道,我一開始做錯了什么。
有人可以解釋這兩個回圈之間的區別以及為什么我不能像上面那樣做嗎?
一切順利, 尼克

uj5u.com熱心網友回復:
您可以使用 pandas 矢量化功能來簡化:
import pandas as pd
DAYS_IN_YEAR = 365 # this actually isn't constant; adjust as needed
df = pd.DataFrame(
{
"days_left": [pd.Timedelta(days=1), pd.Timedelta(days=2), pd.Timedelta(days=3)],
"closing_price": [1, 2, 3],
}
)
df["dirty_price"] = df["closing_price"] (
(DAYS_IN_YEAR - df["days_left"].dt.total_seconds() / 86400)
/ DAYS_IN_YEAR
# could also use df["days_left"].dt.days here if hours minutes etc. don't matter
)
df
days_left closing_price dirty_price
0 1 days 1 1.997260
1 2 days 2 2.994521
2 3 days 3 3.991781
uj5u.com熱心網友回復:
這里:
for i, number in days_left:
你的意思是
for i, number in enumerate(days_left):
最有可能的...
uj5u.com熱心網友回復:
你所擁有的可能是這樣的:
In [20]: dt = pd.timedelta_range("1 day", "5 day", freq="1d")
In [21]: type(dt)
Out[21]: pandas.core.indexes.timedeltas.TimedeltaIndex
在 Python 中,迭代為您提供值:
In [22]: [i for i in dt]
Out[22]:
[Timedelta('1 days 00:00:00'),
Timedelta('2 days 00:00:00'),
Timedelta('3 days 00:00:00'),
Timedelta('4 days 00:00:00'),
Timedelta('5 days 00:00:00')]
要在迭代期間也訪問索引,您需要使用enumerate。
In [23]: [(i, day) for i, day in enumerate(dt)]
Out[23]:
[(0, Timedelta('1 days 00:00:00')),
(1, Timedelta('2 days 00:00:00')),
(2, Timedelta('3 days 00:00:00')),
(3, Timedelta('4 days 00:00:00')),
(4, Timedelta('5 days 00:00:00'))]
也就是說,你不應該迭代。使用向量運算;是這樣的:
bond_df['dirty_price'] = bond_df['closing_price'] ((365 - days_left)/365)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/534478.html
