我写了一个函数,它创建了一个周期表,给出了一个比较值从一个系列以及一个特定的最小持续时间。
现在我最近清理了我的环境,不知何故,同一个函数不再像以前那样赋值了。然而,它仍然创建了一个正确形状的数据框架,只是不赋值,我不知道为什么。
上一次输出:
电流输出:
from datetime import datetime
import pandas as pd
pd.options.mode.chained_assignment = None
import pandas_datareader.data as web
import dataframe_image as dfi
# getting the last periods of increasing interest rates (Federal Funds Effective MONTHLY Rate) from 1965 onwards
fed_rates = web.DataReader("FEDFUNDS", "fred", 1965)
fed_rates.set_index(pd.to_datetime(fed_rates.index.date), inplace=True)
# test for empty values
print(fed_rates.index.isna().sum())
def period_df(start, duration, fed_rates=fed_rates):
fed_rates = fed_rates[fed_rates.index >= start]
df = pd.DataFrame(columns=["Name", "Start", "Last"])
df.loc[df.shape[0]] = [None, None, None]
period = 0
j = 0
for i in range(0, len(fed_rates) - 1):
if (fed_rates.iloc[i + 1]["FEDFUNDS"] <= fed_rates.iloc[i]["FEDFUNDS"]) and (
i - j >= duration
):
df.loc[period]["Last"] = datetime.strftime(fed_rates.index[i], "%Y-%m-%d")
period += 1
if (fed_rates.index[-1] - fed_rates.index[i]).days >= 365:
df.loc[len(df)] = [None, None, None]
j = i
elif (fed_rates.iloc[i + 1]["FEDFUNDS"] <= fed_rates.iloc[i]["FEDFUNDS"]) and (
i - j < duration
):
df.iloc[period]["Name"] = "Period " + str(period + 1)
df.loc[period]["Start"] = datetime.strftime(fed_rates.index[i], "%Y-%m-%d")
j = i
# add last date
df.loc[period]["Last"] = datetime.strftime(fed_rates.index[-1], "%Y-%m-%d")
# add duration column
df["Duration"] = (
pd.to_datetime(df["Last"]) - pd.to_datetime(df["Start"])
) / np.timedelta64(1, "M")
# export df as image
dfi.export(
df.style.set_properties(
**{"background-color": "white", "color": "black", "border-color": "#948b8b"}
),
"periods" + start + ".png",
)
return df
period_df(start="1995", duration=9)
1条答案
按热度按时间s8vozzvw1#
在pandas中,
loc
/iloc
操作,当它们没有设置任何东西时,只是返回数据的副本。当你按照
df.loc[row][col] = value
的思路做一些事情时,它可能看起来像是loc
操作设置了一些东西,但是这个“赋值”分两个阶段发生:1.首先,
df.loc[row]
检索相关行的副本1.然后,将副本的
col
设置为value
您可以通过将
row
和col
传递给loc
/iloc
或甚至使用at
/iat
来避免此问题: