【问题标题】:How may I append new results from iterating through a list, into a new column in the dataframe如何将遍历列表的新结果附加到数据框中的新列中
【发布时间】:2019-09-04 17:27:55
【问题描述】:

我正在尝试按如下方式创建一个表,其中列表中的股票作为列附加到数据框:

基本原理 CTRP EBAY ...... MPNGF

价格
股息
五年分红
比率
挂钩比率
价格预订 price_to_sales
账面价值
借记
净收入
每股收益 债务股权
三年平均回报

目前,根据下面的代码,只显示列表中的最后一个权益​​:

MPNGF 基础知识

价格
股息
五年分红
比率
挂钩比率
价格预订 price_to_sales
账面价值
借记
净收入
每股收益 债务股权
三年平均回报

from yahoofinancials import YahooFinancials
import pandas as pd
import lxml
from lxml import html
import requests
import numpy as np
from datetime import datetime


def scrape_table(url):
    page = requests.get(url)
    tree = html.fromstring(page.content)
    table = tree.xpath('//table')
    assert len(table) == 1

    df = pd.read_html(lxml.etree.tostring(table[0], method='html'))[0]

    df = df.set_index(0)
    df = df.dropna()
    df = df.transpose()
    df = df.replace('-', '0')

    df[df.columns[0]] = pd.to_datetime(df[df.columns[0]])
    cols = list(df.columns)
    cols[0] = 'Date'
    df = df.set_axis(cols, axis='columns', inplace=False)

    numeric_columns = list(df.columns)[1::]
    df[numeric_columns] = df[numeric_columns].astype(np.float64)

    return df

ecommerce = ['CTRP', 'EBAY', 'GRUB', 'BABA', 'JD', 'EXPE', 'AMZN', 'BKNG', 'MPNGF']

price=[]
dividend=[]
five_year_dividend=[]
pe_ratio=[]
pegRatio=[]
priceToBook=[]
price_to_sales=[]
book_value=[]
ebit=[]
net_income=[]
EPS=[]
DebtEquity=[]
threeYearAverageReturn=[]

for i, symbol in enumerate(ecommerce):     
    yahoo_financials = YahooFinancials(symbol)
    balance_sheet_url = 'https://finance.yahoo.com/quote/' + symbol + '/balance-sheet?p=' + symbol
    df_balance_sheet = scrape_table(balance_sheet_url)
    df_balance_sheet_de = pd.DataFrame(df_balance_sheet, columns = ["Total Liabilities", "Total stockholders' equity"])
    j= df_balance_sheet_de.loc[[1]]   
    j['DebtEquity'] = j["Total Liabilities"]/j["Total stockholders' equity"]
    k= j.iloc[0]['DebtEquity']

    X = yahoo_financials.get_key_statistics_data()
    for d in X.values():
        PEG = d['pegRatio']
        PB = d['priceToBook']
        three_year_ave_return = d['threeYearAverageReturn']

    data = [['price', yahoo_financials.get_current_price()], ['dividend', yahoo_financials.get_dividend_yield()], ['five_year_dividend', yahoo_financials.get_five_yr_avg_div_yield()], ['pe_ratio', yahoo_financials.get_pe_ratio()], ['pegRatio', PEG], ['priceToBook', PB], ['price_to_sales', yahoo_financials.get_price_to_sales()], ['book_value', yahoo_financials.get_book_value()], ['ebit', yahoo_financials.get_ebit()], ['net_income', yahoo_financials.get_net_income()], ['EPS', yahoo_financials.get_earnings_per_share()], ['DebtEquity', mee], ['threeYearAverageReturn', three_year_ave_return]]
    data.append(symbol.text)
    df = pd.DataFrame(data, columns = ['Fundamentals', symbol])
    df

请就上表中我哪里出了问题寻求您的建议?非常感谢!

【问题讨论】:

    标签: python python-3.x list loops dataframe


    【解决方案1】:

    您需要在 for 循环之外调用 df。您当前编写的代码将为每个循环重新创建一个新的 df。

    【讨论】:

    • 感谢您的意见!我现在尝试在循环之外调用 df ,但仍然只获取列表中最后一个权益​​的值.. 也尝试连接,但它只是重复列表中最后一个权益​​的值。 #df = pd.concat([pd.DataFrame(data, columns=['Fundamentals', symbol]) for symbol in enumerate(ecommerce)], ignore_index=False)
    • (我希望我可以为你重写代码,但我现在不能花时间)......我会说你可以尝试的下一件事是将你的 for 循环中的 df 重命名为是“结果”而不是“df”。您的 scrape_table 函数中的局部变量与 for 循环 (df) 中的变量同名,您可能会得到意想不到的后果。
    • 感谢您的建议!我已经这样做了,现在我看到了一个框架很好的数据表,尽管填充此表的结果仍然仅来自最后一个股票,不知道为什么我不能将其他股票的值填充到表中
    猜你喜欢
    • 2021-07-29
    • 1970-01-01
    • 2018-10-28
    • 2019-11-06
    • 2019-08-20
    • 2020-09-12
    • 2016-03-06
    • 1970-01-01
    • 2020-03-22
    相关资源
    最近更新 更多