Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Pandas数据读取器的Python回归建模_Python_Pandas_Numpy_Matplotlib - Fatal编程技术网

使用Pandas数据读取器的Python回归建模

使用Pandas数据读取器的Python回归建模,python,pandas,numpy,matplotlib,Python,Pandas,Numpy,Matplotlib,我正在尝试构建一个函数,它可以提取任何股票的数据,然后绘制回归曲线。然而,我遇到了源数据的问题。我的问题是-我如何在熊猫数据框架中获取时间序列并绘制随时间变化的线性趋势?我的代码如下: 此代码将生成回归: import matplotlib.pyplot as plt import seaborn as sns; sns.set() import numpy as np rng = np.random.RandomState(1) x = 10 * rng.rand(50) y = 2 * x

我正在尝试构建一个函数,它可以提取任何股票的数据,然后绘制回归曲线。然而,我遇到了源数据的问题。我的问题是-我如何在熊猫数据框架中获取时间序列并绘制随时间变化的线性趋势?我的代码如下:

此代码将生成回归:

import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
rng = np.random.RandomState(1)
x = 10 * rng.rand(50)
y = 2 * x - 5 + rng.randn(50)
plt.scatter(x, y);
plt.show()
from sklearn.linear_model import LinearRegression
model = LinearRegression(fit_intercept=True)

model.fit(x[:, np.newaxis], y)

xfit = np.linspace(0, 10, 1000)
yfit = model.predict(xfit[:, np.newaxis])

plt.scatter(x, y)
plt.plot(xfit, yfit);
plt.show()
这是我通过数据帧传递数据的尝试

from datetime import datetime
import pandas_datareader.data as web

start = datetime(2017, 8, 1)
end = datetime(2018, 7, 30)
data_SP = web.DataReader('JPM', 'iex', start, end)

y = dates # not sure how to get here?
plt.scatter(data['close'], y);
plt.show()

from sklearn.linear_model import LinearRegression
model = LinearRegression(fit_intercept=True)

model.fit(data['close'][:, np.newaxis], y)

xfit = np.linspace(0, 10, 1000)
yfit = model.predict(xfit[:, np.newaxis])

plt.scatter(data['close'], y)
plt.plot(xfit, yfit);
plt.show()

回归无法获取datetime对象,必须转换为数字类型:

import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from datetime import datetime
import pandas as pd
pd.core.common.is_list_like = pd.api.types.is_list_like
from sklearn.linear_model import LinearRegression
import pandas_datareader.data as web

start = datetime(2017, 8, 1)
end = datetime(2018, 7, 30)
data_SP = web.DataReader('JPM', 'iex', start, end)

dates = list(map(lambda x: datetime.strptime(x,"%Y-%m-%d"),list(data_SP.index)))
days_since = list(map(lambda x: (x-start).days,dates))

model = LinearRegression(fit_intercept=True)
model.fit(np.array(days_since)[:, np.newaxis],data_SP['close'])

yfit = model.predict(np.array(days_since)[:, np.newaxis])

plt.figure()
plt.scatter(dates, yfit)
plt.scatter(dates, data_SP['close'])
plt.xlabel('date')
plt.ylabel('close')
plt.show()
如果使用百分比变化,则需要考虑唠叨的NaN

import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from datetime import datetime
import pandas as pd
pd.core.common.is_list_like = pd.api.types.is_list_like
from sklearn.linear_model import LinearRegression
import pandas_datareader.data as web

start = datetime(2017, 8, 1)
end = datetime(2018, 7, 30)
data_SP = web.DataReader('JPM', 'iex', start, end)

dates = list(map(lambda x: datetime.strptime(x,"%Y-%m-%d"),list(data_SP.index)))
days_since = list(map(lambda x: (x-start).days,dates))

model = LinearRegression(fit_intercept=True)
model.fit(np.array(days_since)[1:][:, np.newaxis],data_SP['close'].pct_change(1)[1:]) # <------------

yfit = model.predict(np.array(days_since)[:, np.newaxis])

plt.figure()
plt.scatter(dates, yfit)
plt.scatter(dates, data_SP['close'].pct_change(1))
plt.xlabel('date')
plt.ylabel('close')
plt.show()
导入matplotlib.pyplot作为plt
作为sns导入seaborn;sns.set()
将numpy作为np导入
从日期时间导入日期时间
作为pd进口熊猫
pd.core.common.is_list_like=pd.api.types.is_list_like
从sklearn.linear\u模型导入线性回归
以web形式导入datareader.data
开始=日期时间(2017年8月1日)
结束=日期时间(2018年7月30日)
data_SP=web.DataReader('JPM','iex',start,end)
日期=列表(映射(lambda x:datetime.strtime(x,“%Y-%m-%d”),列表(数据索引)))
天\自=列表(映射(lambda x:(x-start).天,日期))
模型=线性回归(拟合截距=真)

model.fit(np.array(days_since)[1:[:,np.newaxis],data_SP['close'].pct_change(1)[1:])#我假设您要求的是能够绘制随时间变化的股票数据。正如我在评论中所建议的,你的x轴应该是日期,y轴应该是收盘价

从这里,我们将简单地绘制图表:

plt.scatter(data_SP.index,data_SP['close'])
我在您的代码中的导入还有一些其他问题,因此如果您遇到这些问题,我将在此处发布我使用的完整代码:

import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime
pd.core.common.is_list_like = pd.api.types.is_list_like
from pandas_datareader import data, wb

start = datetime(2017, 8, 1)
end = datetime(2018, 7, 30)
data_SP = data.DataReader('JPM', 'iex', start, end)

plt.scatter(data_SP.index,data_SP['close'])
您必须重新设置x轴的格式,以便能够看到和,如果您想进行其他操作。如果你想使用回归模型,你必须使用数值数据,而不是日期时间数据。(我会给你发一封邮件)

线性回归对日期数据不起作用。因此,我们需要 将其转换为数值。以下代码将转换 日期转换为数值:


这是链接中的第一个答案(Chandan的全部学分)

我已将代码调整为以下内容。它将产生显示超过基准回报的视觉效果。代码中有很多说明。例如,我们可以让它对标准普尔500只股票进行循环,并根据指数计算出最佳回报股票,或者我们可以让它对所有500只股票进行1个月的循环,并根据历史计算出什么时候最好持有什么股票。视觉效果对分析很有帮助

import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime
import pandas
from sklearn.linear_model import LinearRegression
import pandas_datareader.data as pdr

def close_price_trending(analysis):
    model = LinearRegression(fit_intercept=True)
    model.fit(np.array(days_since)[:, np.newaxis],data_sample_processed[analysis])
    yfit = model.predict(np.array(days_since)[:, np.newaxis])
    plt.scatter(dates, data_sample_processed[analysis])
    plt.scatter(dates, yfit)
    plt.xlabel('date')
    plt.ylabel('close')
    plt.show()

def return_excess_benchmark1(analysis, benchmark):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    fig.subplots_adjust(top=0.85)
    ax.set_title(str(analysis) + ' O/U ' + str(benchmark))
    plt.scatter(dates, (1 + data_sample_processed[analysis]).cumprod() - (1 + data_sample_processed[benchmark]).cumprod())
    model = LinearRegression(fit_intercept=True)
    model.fit(np.array(days_since)[:, np.newaxis],(1 + data_sample_processed[analysis]).cumprod() - (1 + data_sample_processed[benchmark]).cumprod())
    yfit = model.predict(np.array(days_since)[:, np.newaxis])
    plt.scatter(dates, yfit)
    plt.xlabel('date')
    plt.ylabel('close')
    fig.show()


# get and process data
start = datetime(2015, 8, 1)
end = datetime(2018, 7, 30)

Symbol_List = ['GSLC', 'AGG', 'JPM','CAR', 'IVV', 'DSI', 'VTI']

data = pandas.concat([pdr.DataReader(s, 'iex', start, end).rename(columns={'close': s})
                      for s in Symbol_List], axis=1)
data_sample = data[Symbol_List]
data_sample_processed = data_sample.pct_change()
data_sample_processed = data_sample_processed.fillna(0)
dates = list(map(lambda x: datetime.strptime(x,"%Y-%m-%d"),list(data_sample_processed.index)))
days_since = list(map(lambda x: (x-start).days,dates))

# start analysis
analysis_symbol_1 = 'DSI'
analysis_symbol_2 = 'GSLC'
benchmark_1 = 'VTI'

return_excess_benchmark1(analysis_symbol_1, benchmark_1)
return_excess_benchmark1(analysis_symbol_2, benchmark_1)

y列应该是因变量(如股票价值),而不是自变量(如日期)。x值应该是日期,y值应该是数据['close'],这很有效-但是当我将model.fit(np.array(days_since)[:,np.newaxis],data_SP['close'])调整到…data_SP['close'].pct_change(1))时,我得到了错误值error:Input包含NaN、无穷大或对dtype('float64')来说太大的值。我猜我这里有一个被零除的数字,在什么地方-如何处理?第一个元素数据是NaN。删除日期数组并相应修改日期数组后,它将再次工作。我将修改答案以显示这一点。
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime
import pandas
from sklearn.linear_model import LinearRegression
import pandas_datareader.data as pdr

def close_price_trending(analysis):
    model = LinearRegression(fit_intercept=True)
    model.fit(np.array(days_since)[:, np.newaxis],data_sample_processed[analysis])
    yfit = model.predict(np.array(days_since)[:, np.newaxis])
    plt.scatter(dates, data_sample_processed[analysis])
    plt.scatter(dates, yfit)
    plt.xlabel('date')
    plt.ylabel('close')
    plt.show()

def return_excess_benchmark1(analysis, benchmark):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    fig.subplots_adjust(top=0.85)
    ax.set_title(str(analysis) + ' O/U ' + str(benchmark))
    plt.scatter(dates, (1 + data_sample_processed[analysis]).cumprod() - (1 + data_sample_processed[benchmark]).cumprod())
    model = LinearRegression(fit_intercept=True)
    model.fit(np.array(days_since)[:, np.newaxis],(1 + data_sample_processed[analysis]).cumprod() - (1 + data_sample_processed[benchmark]).cumprod())
    yfit = model.predict(np.array(days_since)[:, np.newaxis])
    plt.scatter(dates, yfit)
    plt.xlabel('date')
    plt.ylabel('close')
    fig.show()


# get and process data
start = datetime(2015, 8, 1)
end = datetime(2018, 7, 30)

Symbol_List = ['GSLC', 'AGG', 'JPM','CAR', 'IVV', 'DSI', 'VTI']

data = pandas.concat([pdr.DataReader(s, 'iex', start, end).rename(columns={'close': s})
                      for s in Symbol_List], axis=1)
data_sample = data[Symbol_List]
data_sample_processed = data_sample.pct_change()
data_sample_processed = data_sample_processed.fillna(0)
dates = list(map(lambda x: datetime.strptime(x,"%Y-%m-%d"),list(data_sample_processed.index)))
days_since = list(map(lambda x: (x-start).days,dates))

# start analysis
analysis_symbol_1 = 'DSI'
analysis_symbol_2 = 'GSLC'
benchmark_1 = 'VTI'

return_excess_benchmark1(analysis_symbol_1, benchmark_1)
return_excess_benchmark1(analysis_symbol_2, benchmark_1)