首页 > 解决方案 > 在 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()

我希望我的编辑提供足够的信息

标签: pythonpandas-datareader

解决方案


在 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]

推荐阅读