Python:尝试将dataframe写入XDB并接收消息“IndexError:列表索引超出范围”

Python:尝试将dataframe写入XDB并接收消息“IndexError:列表索引超出范围”,python,indexing,influxdb,bucket,Python,Indexing,Influxdb,Bucket,我试图模仿python、XDB、yfinance和Google Finance,以及最终的graphana。我终于明白了如何使用bucket和下面两个教程中描述的数据库方法 在这里尝试遵循XDB2.0 API说明 我将我的列表合并到一个数据框中,并添加了一个日期和符号列。上面的方法使用json文件,但没有给出适当的示例。。。而yfinance没有给我json。它给了我一个数据帧,我只有一个bucket,所以我不确定如何将每个股票作为一个单独的数据帧写入,所以我将它们合并到一个数据帧中,添加了一个

我试图模仿python、XDB、yfinance和Google Finance,以及最终的graphana。我终于明白了如何使用bucket和下面两个教程中描述的数据库方法

在这里尝试遵循XDB2.0 API说明

我将我的列表合并到一个数据框中,并添加了一个日期和符号列。上面的方法使用json文件,但没有给出适当的示例。。。而yfinance没有给我json。它给了我一个数据帧,我只有一个bucket,所以我不确定如何将每个股票作为一个单独的数据帧写入,所以我将它们合并到一个数据帧中,添加了一个符号列。因为索引是日期,所以这就把我的索引去掉了,所以我创建了一个新的索引。我成功地编写了每个数据帧,并将其结果日期作为索引。。。但恐怕我只是在写每只股票的相同数据。因此,我将这些股票合并到一个巨大的数据框中,添加了一个日期和符号列,这使表格有点士气低落

df = pd.concat(self.stock_prices, ignore_index=True)
在本例中,我试图做的是下载一组股票10,然后将其上传到bucket中,以便最终绘制它的图表。我不确定我是否应该像现在这样做,或者我认为我应该为每只股票编写一个新表的其他方法,但是我的示例w Bucket没有告诉我如何指定一个表。我相信我在API1.8VS中看到了这样的方法。现在我似乎被困在索引上了

_now = df.index
这看起来是正确的,但如果我执行printdf.index。什么也没出现。但如果我做一个lendf.index,它会正确显示。如果我尝试选择手动索引

_now = list(range(0,len(df.index),1))
我也犯了同样的错误

这是我的密码

import concurrent.futures
import json
import time, random
import pandas as pd
import yfinance as yf
import urllib.request
import influxdb_client
import numpy as np
from numpy import inf
from influxdb_client.client.write_api import SYNCHRONOUS
import pandas_market_calendars as mcal

start="2017-01-01"
end="2020-04-30"

nyse = mcal.get_calendar('NYSE')
trading_dates= nyse.schedule(start_date=start, end_date=end)
idx2 = trading_dates.index

influx_bucket = "local"
influx_org = "localdomain"
influx_token = "H60IaJ-9t64Zws296bpkJZNIu7ylUbJxfD6RH-thenW2cvWgxXUpADJN1R4o9PsiUtZAE7KjuK0Wzcu_DypdbQ=="
# Store the URL of your InfluxDB instance
influx_url="http://192.168.3.114:8086"

client = influxdb_client.InfluxDBClient(
    url=influx_url,
    token=influx_token,
    org=influx_org
)

write_api = client.write_api(write_options=SYNCHRONOUS)

url = 'ftp://ftp.nasdaqtrader.com/symboldirectory/nasdaqtraded.txt'
urllib.request.urlretrieve(url, 'nasdaqtraded.txt')
df = pd.read_csv('nasdaqtraded.txt', sep='|')
size=10
symbols = df["Symbol"][0:-1].sample(n=size)

class Stocks():
    def __init__(self, db="stocks", stocks_file="stocks.json"):
        self.stocks=None
        self.db=db
        self.stock_prices = list()
        #column_names = ["Open", "High", "Low", "Close", "Volume", "Dividends", "Stock Splits", "Symbol"]

        #df = pd.DataFrame(columns = column_names)        
        #self.load_stocks_from_json(stocks_file)
        self.stocks=symbols
        with concurrent.futures.ProcessPoolExecutor() as executor:
            for out1 in executor.map(self.dl_stocks, self.stocks):            
                self.stock_prices.append(out1)                
        
    def load_stocks_from_json(self, stocks_file):
        with open(stocks_file) as f:
            data=json.load(f)
            self.stocks=data['stocks'] 
            
    def dl_stocks(self, stock):
        ticker = yf.Ticker(stock)
        _data_frame = ticker.history(start=start, end=end, interval="1d", auto_adjust=True)
        #history = ticker.history()
        #last_quote = (history.tail(1)['Close'].iloc[0])
    
        idx1 = _data_frame.index  
        
        merged = idx1.union(idx2)
        s = _data_frame.reindex(merged)
        #s['New_Price'] = (1/s['Stock Splits']).replace(inf,1).cumprod() * s['Close']
        df = s.interpolate()  
        df['Symbol'] = stock
        df['Date'] = s.index
        
        return (df)
    
    def print_stocks(self):
        print(self.stock_prices) 
        
    def write_db(self):
        df = pd.concat(self.stock_prices, ignore_index=True)
        
        #df.reset_index()
        #_now = list(range(0,len(df.index),1))
        _now = df.index
        print(_now)
        _data_frame = pd.DataFrame(data=df,index=_now,columns=['Date','Open','High','Low','Close','Volume','Symbol'])
        #print(_data_frame)
        #_write_client.write(bucket.name, record=data_frame, data_frame_measurement_name='h2o_feet', data_frame_tag_columns=['location'])
        #return(_data_frame)
        write_api.write(influx_bucket, record=_data_frame, data_frame_measurement_name=['Date','Open','High','Low','Close','Volume','Symbol'],data_frame_tag_columns=['Date','Open','High','Low','Close','Volume','Symbol'])

    def return_stocks(self):
        return(self.stock_prices)

def main():
    s=Stocks()
    #set = s.return_stocks()
    s.write_db()
    
    """
    Prepare data
    """

    """
    Query: using Table structure
    """
    #query_api = client.query_api()
    #tables = query_api.query('from(bucket:"local") |> range(start: -1y)')

    #for table in tables:
        #print(table)
        #for record in table.records:
            #print(record.values)
    
    #result = client.query_api().query(org=influx_org, query=query)
    #results = []
    #for table in result:
        #for record in table.records:
            #results.append((record.get_field(), record.get_value()))

    #print(results)

if __name__ == '__main__':
    main()
    
有人建议,执行器多重处理可能是导致该问题的原因。。。但即使我使用一个简单的for循环来下载股票,我也会遇到同样的错误

   def __init__(self, db="stocks", stocks_file="stocks.json"):
        self.stocks=None
        self.db=db
        self.stock_prices = list()
        #column_names = ["Open", "High", "Low", "Close", "Volume", "Dividends", "Stock Splits", "Symbol"]

        #df = pd.DataFrame(columns = column_names)        
        #self.load_stocks_from_json(stocks_file)
        self.stocks=symbols
        for i in self.stocks:
            stock = self.dl_stocks(i)
            self.stock_prices.append(stock)
        
        #with concurrent.futures.ProcessPoolExecutor() as executor:
            #for out1 in executor.map(self.dl_stocks, self.stocks):            
                #self.stock_prices.append(out1)  
self.stock_prices是并发池的输出。在流程完成并返回结果之前,这些值不会存在。你不是在等他们。您真的需要同时运行吗?为什么是单独的进程,而不是线程


在任何情况下,我建议您在开始时不要同时使用。一旦你有了工作,你就可以决定它是否运行得足够快。如果确实切换回并发,则必须使用.wait或.as_completed或.result来等待实际结果。

我计划扩大规模,并行处理是一个很难满足的要求。事实上,我后来运行了write函数。。。我以为平行的工作会完成。这就是问题所在吗?在并行过程完成之前,python是否对索引进行某种库存检查?我可以试着删除并行部分,看看这是否解决了我的问题。我做了一个简单的for循环,得到了完全相同的错误,然后编辑原始帖子以反映这一点