python - 在 for 循环中声明类的实例:Python
问题描述
我一直在从事一个涉及股票市场的项目,并为它创建了自己的类,但是当我运行此代码时出现错误
import stock_class as st
for i in names:
string = str(i)
stonk = st.stock(string, datetime.datetime(2016,12,31),datetime.datetime.now())
wSTD = stonk.standard_deviation() * weight[0]
当我在循环之外运行相同的代码时,它工作得很好,所以我认为这可能是一个奇怪的 python 事情,你不能用迭代变量声明一个实例类。不管它看起来多么奇怪。这是我在响应以下代码运行时得到的错误:
pandas_datareader._utils.RemoteDataError: No data fetched for symbol CHOLF using YahooDailyReader
如果有人需要更多信息,请告诉我,谢谢。
这是我制作并调用的库:
import numpy as np
import pandas as pd
import yfinance as yf
import datetime as datetime
import pandas_datareader.data as web
import os
import math
class stock:
def __init__(self, name, start, end):
self.name = name #string
self.start = start
self.end = end # datetime funtion
def history_data(self):
hist = web.DataReader(self.name,'yahoo',self.start, self.end)
return hist
def returnP(self):
stonk = self.history_data()
close = stonk['Close']
returnlist = []
for i in range(len(close)):
if i != 0:
returnVal = (close[i]/close[i-1])-1
returnlist.append(returnVal)
else:
returnlist.append(0)
stonk['Return'] = returnlist #hopefully places a new column for the return rate
return stonk
def standard_deviation(self):
stonk = self.returnP()
array = []
mean = sum(stonk['Return'])/stonk.count()['Return']
for i in range(stonk.count()['Return']):
array.append((stonk['Return'][i] - mean)**2)
std = math.sqrt(sum(array)/len(array))
return std
def cum_return(self):
stonk = self.returnP()
stonk['Cumreturn'] = (stonk['Return']+1).cumprod()
return stonk
def yfticker(self): #should not be called by user
stonk = yf.Ticker(self.name)
info = stonk.info
return info
def PEG(self):
info = self.yfticker()
PEG = info['pegRatio']
return PEG
def FPE(self):
info = self.yfticker()
FPE = info['forwardPE']
return FPE
def price_book(self):
info = self.yfticker()
priceToBook = info['priceToBook']
return priceToBook
如前所述,此代码自行工作,这是在 buy() 函数中发生错误的代码
import stock_class as st
import pandas as pd
import pandas_datareader.data as web
import yfinance as yf
import datetime
import time
class descision:
def __init__(self, names, money): # takes an array of stocks so we can value
self.names = names # dem bitches ['tsla', 'fb', 'aapl', ... ]
self.money = money
def buy(self):
weight = [.5, .25, .25] # weights for STD, FPE, and PEG
money = self.money
split = money/10
names = self.names
pair = {}
buying = [] #going into dataframe
FPE = []
PEG = []
STD = []
price = [] # going into dataframe
date = []
amtBought = []
for i in names:
string = str(i)
print(i)
stonk = st.stock(string, datetime.datetime(2016,12,31),datetime.datetime.now())
print('1')
wSTD = stonk.standard_deviation() * weight[0]
print(wSTD)
wFPE = stonk.FPE() * weight[1]
wPEG = stonk.PEG() * weight[2]
heafty = (wSTD + wFPE + wPEG)
pair[i] = heafty
for i in range(10):
buying.append(max(pair))
pair.pop(max(pair))
for i in buying:
stock = yf.Ticker(i)
hist = stock/history('1d')
buyPrice = hist['Close'][-1]
price.append(buyPrice)
date.append(datetime.datetime.now())
amtBought.append(split/buyPrice)
tuples = list(zip(buying, price, date, amtBought))
df = pd.DataFrame(tuples, columns = ['Names', 'Buy Price',
'Date Purchased' ,' Amount'])
return df
# buy from the stocks in the growers with the least volitility,
# PE, and PEG
#def sell(self):
file = open('growers.txt','r')
names = []
money = 1000
for i in file:
names.append(str(i))
y = descision(names, money)
y.buy()
我希望我的编辑提供足够的信息
解决方案
在 for 循环的每次迭代中创建该类的对象似乎没有什么问题……它更有可能与股票市场回报值有关,而不是对象。
只是为了向您展示您可以在循环内创建对象:
class Kid:
def __init__(self, age, name, city):
self.age = age
self.name = name
self.city = city
def AgeIn5Years(self):
return self.age + 5
kids = [Kid(i, f'Jhon {i}', 'London') for i in range(11, 16)]
[print(kid.AgeIn5Years()) for kid in kids]
推荐阅读
- python - 自定义气流运算符:是否可以覆盖 __new__ 方法?
- asp.net - 如何在控制器 ASP.NET 中返回大量对象
- vue.js - HTTP post 返回 400(错误请求)
- asp.net - 如何从 ASP.NET HttpHandler 中获取嵌入式资源 URL
- linux - 生成新下载文件的哈希
- c# - 将 MVC 视图呈现为 Parallel.ForEach 中的字符串时的依赖注入问题
- python - LSTM.weight_ih_l[k] 维度与 proj_size
- dynamic - 使用球拍宏动态定义符号和宏
- java - 尝试在java中使用while循环来不断询问用户输入
- kubernetes - 无法访问 Mongo Express 服务的 EKS LoadBalancer 外部 IP(链接)