首页 > 解决方案 > 时间序列回归模型问题

问题描述

我是 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

请参阅文档中的警告

标签: pythonnumpystatisticsregression

解决方案


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

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_TH是视图还是副本raw_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

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

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

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

并像以前一样继续。

附加信息:Pandas 使用什么规则来生成视图和副本?


推荐阅读