【问题标题】:Time Series Regression Model Issue时间序列回归模型问题
【发布时间】:2018-11-22 04:19:37
【问题描述】:

我是 Python 新手,试图做一个时间序列回归模型。我有 3 列,X、Y 和日期。我导入了下面的所有内容,但我遇到了一个错误。

import numpy as np
from sklearn import linear_model
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 15, 6
import statsmodels.api as sm
import statsmodels.formula.api as smf
from statsmodels.tsa.stattools import adfuller
raw_data = pd.read_csv("IMF and BBG Fair Values.csv")
ISO_TH = raw_data[["IMF_VALUE", "BBG_FV", "IMF_DATE"]]

过滤掉NaN:

filtered_TH = ISO_TH[np.isfinite(raw_data['BBG_FV'])]

我收到此错误:

C:\Program Files\Anaconda3\lib\site-packages\pandas\core\generic.py:2698: >SettingWithCopyWarning: 试图在 DataFrame 中的切片副本上设置值。 尝试改用 .loc[row_indexer,col_indexer] = value

查看documentation中的注意事项

【问题讨论】:

  • 我实际上得到了这行代码的错误:filtered_TH.IMF_DATE = pd.DatetimeIndex(filtered_TH.IMF_DATE)
  • import numpy as np from sklearn import linear_model import matplotlib.pyplot as plt import pandas as pd %matplotlib inline from matplotlib.pylab import rcParams rcParams['figure.figsize'] = 15, 6 import statsmodels. api as sm import statsmodels.formula.api as smf from statsmodels.tsa.stattools import adfuller raw_data=pd.DataFrame([[np.inf,22,333,44], [3,4,5,2],[1,2 ,3,4],[np.inf,0,0,0]],columns=["BBG_FV", "IMF_VALUE", "IMF_DATE", "未使用"]) ISO_TH = raw_data.loc[:,["IMF_VALUE ", "BBG_FV", "IMF_DATE"]] ISO_TH.IMF_VALUE=[0,0,0,0]

标签: python numpy statistics regression


【解决方案1】:

您的问题与您链接的 pandas 文档中所写的问题完全相同。看看他们在那里提供的最小示例:

def do_something(df):
   foo = df[['bar', 'baz']]  # Is foo a view? A copy? Nobody knows!
   # ... many lines here ...
   foo['quux'] = value       # We don't know whether this will modify df or not!
   return foo 

问题在于foo 可能是数据帧df 的副本或视图。如果是视图,那么foo 上的更改也会影响原始数据框df。如果foo 是一个副本,那么foo['quux'] = value 行将不会影响df

这现在如何转化为您的问题?

您首先从*.csv 文件创建数据框:

raw_data = pd.read_csv("IMF and BBG Fair Values.csv")

然后按以下方式从数据框raw_data 中选择列“IMF_VALUE”、“BBG_FV”、“IMF_DATE”:

ISO_TH = raw_data[["IMF_VALUE", "BBG_FV", "IMF_DATE"]]

现在,这看起来与文档中的第二行非常相似:

foo = df[['bar', 'baz']]

您的ISO_THraw_data 的视图还是副本?我们现在没有!那么如果我们更改ISO_TH 的列会发生什么? raw_data 是否也会改变?我们现在不这样做,因此发出警告。

玩具示例:

import pandas as pd
import numpy as np
raw_data=pd.DataFrame([[np.inf,22,333,44], [3,4,5,2],[1,2,3,4],[np.inf,0,0,0]],columns=["BBG_FV", "IMF_VALUE", "IMF_DATE", "unused"])
ISO_TH = raw_data[["IMF_VALUE", "BBG_FV", "IMF_DATE"]]
# if we now change ISO_TH, we get a warning
ISO_TH.IMF_VALUE=[0,0,0,0] # SettingWithCopyWarning

您从 ISO_TH 创建中间对象 filtered_TH 的事实在这里没有任何改变。

我们如何解决这个问题?很简单,我们阅读文档并执行那里写的内容!

ISO_TH = raw_data.loc[:,["IMF_VALUE", "BBG_FV", "IMF_DATE"]]

然后像以前一样继续。

补充资料:What rules does Pandas use to generate a view vs a copy?

【讨论】:

  • 非常感谢 - 我仍然通过在读取 csv 的 raw_data 之后添加该行来收到警告。我知道为什么 - 我可以忽略它吗?
  • 如果您使用我提出的解决方案,则不会出现警告。如果您仍然收到警告,请在您的初始帖子中添加一个功能齐全的最小示例,以便我们可以查看此警告的来源。以我的最小示例为例,我的机器上没有出现任何警告。
  • 感谢您的澄清 - 替换了我的代码并使用了上面的玩具代码,我没有错误。我现在的问题是,当我运行 ISO_TH 时,我得到以下数据(我的数字发生了什么变化?) IMF_VALUE BBG_FV IMF_DATE 0 0 inf 1970-01-01 00:00:00.000000333 1 0 3.000000 1970-01-01 00:00 :00.000000005 2 0 1.000000 1970-01-01 00:00:00.000000003 3 0 inf 1970-01-01 00:00:00.000000000
  • 从代码中可以看出,我生成了一些玩具数据。您必须用您的行替换以“raw_data =”开头的行并加载 csv。由于我没有您的数据,因此无法包含这些数据。
猜你喜欢
  • 2020-08-26
  • 2015-08-09
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 2019-01-17
  • 2020-07-26
  • 1970-01-01
相关资源
最近更新 更多