Взятие среднего из списка целых чисел - PullRequest
0 голосов
/ 27 января 2019

Я собираю список ежедневных номеров объема запасов и хочу взять среднее из первых 20 результатов в столбце объема страницы.Мой код выглядит так:

from bs4 import BeautifulSoup
import re, csv, random, time
import pandas as pd
import os
import requests

    page = requests.get('https://finance.yahoo.com/quote/BDSI/history?period1=1517033117&period2=1548569117&interval=1d&filter=history&frequency=1d')
    soup = BeautifulSoup(page.text, 'html.parser')
    rows = soup.select('table[class="W(100%) M(0)"] tr')

    for row in rows[1:20]:
        col = row.find_all("td")
        numbers = col[6].text.replace(',', '')
        numbers2 = int(numbers)
        print(numbers2)

        avg20vol = sum(numbers2(1,20))/len(numbers2)

... но я застреваю при попытке получить среднее из возвращенных чисел2.Получите либо «TypeError: объект int не может быть вызван», либо «TypeError: объект int не является итеративным» с решениями, которые я пробовал.Как справиться с усреднением списка?Включает ли это сначала преобразование в информационный блок?Спасибо!

ОБНОВЛЕНИЕ

Вот рабочий пример применимого сегмента кода:

    numberslist=[]

    for row in rows[1:21]:
        col = row.find_all("td")
        numbers = col[6].text.replace(',', '')
        numbers2 = int(numbers)
        numberslist.append(numbers2)
        print(numbers2)
        average = sum(numberslist)/len(numberslist)


    print('Average = ',average)

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Ваш css-селектор также неверен и дал мне ошибку.

from bs4 import BeautifulSoup
import requests
page = requests.get('https://finance.yahoo.com/quote/BDSI/history?period1=1517033117&period2=1548569117&interval=1d&filter=history&frequency=1d')
soup = BeautifulSoup(page.text, 'html.parser')
rows = soup.find('table',class_="W(100%) M(0)").find_all('tr')
numbers=[]
for row in rows[1:20]:
    col = row.find_all("td")
    print(col[6].text)
    number = col[6].text.replace(',', '')
    number = int(number)
    numbers.append(number)

avg20vol =sum(numbers)/len(numbers)
print("Average: ",avg20vol)

Выход

650,100
370,500
374,700
500,700
452,500
1,401,800
2,071,200
1,005,800
441,500
757,000
901,200
563,400
1,457,000
637,100
692,700
725,000
709,000
1,155,500
496,400
Average:  808584.2105263158
0 голосов
/ 27 января 2019

При очистке фактически создайте список чисел, например так:

# stuff before

number_list = []  # empty list

for row in rows[1:20]:
    # get the number
    number_list.append(int(number_as_string))  # add the new number at the end of the list

average = sum(number_list)/len(number_list)

Вы также можете .append() сформировать строку и затем преобразовать в int s с помощью list(map(int(list_of_strings)) или [int(x) for x in list_of_strings].

Примечание: rows[1:20] пропустит первый элемент, в вашем случае, как вы сказали, первая строка - заголовок.Используйте rows[:20], чтобы получить первые 20 предметов в целом.

...