Есть ли функция Python для построения средней цены, которая принимает 2 массива в качестве аргументов - PullRequest
1 голос
/ 20 мая 2019

Прежде всего, я абсолютно новичок в Python и попробую выучить это сам.Я получил следующее упражнение, чтобы попрактиковаться и попытаться решить его с помощью NumPy и Pandas.

Сделки с акциями записываются с использованием 2 массивов.Имя торгуемой доли входит в первый массив.Цена акции в той же позиции переходит во второй массив.Например, массивы могут выглядеть так:

String[] shares = {"HSBC","o2","Vodafone","Vodafone","HSBC","o2","Vodafone"};
double[] prices = {6.40,9.99,2.40,2.45,6.37,10.10,2.50};

Мне нужно написать метод с именем averagePrices, который принимает 2 массива в качестве аргументов.Метод должен распечатать среднюю цену акций для каждой компании, округленную до 2 знаков после запятой.Приведенные выше массивы будут производить:

Vodafone: £2.45
HSBC: £6.39
o2: £10.05

Используя просто циклы Lists и For, я получаю правильные результаты, но я хочу справиться с этой проблемой, как если бы списки были длиннее и недостаточно удобны длявведите все позиции отдельных значений шаг за шагом самостоятельно.Поэтому я ищу функцию типа VLookup в Excel или что-то подобное, используя pandas, которая может суммировать соответствующие цены для разных акций, чтобы построить среднее значение.

import numpy as np

shares = np.array(["HSBC", "o2", "Vodafone", "Vodafone", "HSBC", "o2", "Vodafone"])
prices = np.array([6.40, 9.99, 2.40, 2.45, 6.37, 10.10, 2.50])

HSBC_bool = shares == "HSBC"
o2_bool = shares == "o2"
Vodafone_bool = shares == "Vodafone"

HSBC = shares[HSBC_bool]
o2 = shares[o2_bool]
Vodafone = shares[Vodafone_bool]

HSBC_count = HSBC.shape
o2_count = o2.shape
Vodafone_count = Vodafone.shape

HSBC_share = []
o2_share = []
Vodafone_share = []

if HSBC_bool.any == True:
    HSBC_share.append(prices[:])

if o2_bool.any == True:
    o2_share.append(prices[:])

if Vodafone_bool.any == True:
    Vodafone_share.append(prices[:])

print(Vodafone_share)
print(o2_share)
print(HSBC_share)


avg_HSBC = sum(HSBC_share) / HSBC_count
avg_o2 = sum(o2_share) / o2_count
avg_Vodafone = sum(Vodafone_share) / Vodafone_count

print(round(avg_HSBC, 2))
print(round(avg_o2, 2))
print(round(avg_Vodafone, 2))

Ответы [ 3 ]

3 голосов
/ 20 мая 2019

Попробуйте использовать pandas и функцию groupby().mean(). Я предлагаю вам почитать онлайн и поиграть с ним некоторое время, прежде чем спрашивать в SO, иначе вы не узнаете так много.

Ссылка: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.groupby.GroupBy.mean.html

В вашем случае:

shares = np.array(["HSBC", "o2", "Vodafone", "Vodafone", "HSBC", "o2", "Vodafone"])
prices = np.array([6.40, 9.99, 2.40, 2.45, 6.37, 10.10, 2.50])

df = pd.DataFrame({'shares': shares,
                   'prices': prices})

df.groupby('shares').mean()

Что приводит к:

          prices
shares
HSBC       6.385
Vodafone   2.450
o2        10.045
1 голос
/ 20 мая 2019

Вы можете перебирать разные имена, используя функцию np.unique.Затем используйте np.argwhere для вычисления соответствующего среднего.

Вот рабочий пример:

shares = np.array(["HSBC", "o2", "Vodafone", "Vodafone", "HSBC", "o2", "Vodafone"])
prices = np.array([6.40, 9.99, 2.40, 2.45, 6.37, 10.10, 2.50])

def Average_price(shares, prices):
    average_price={}
    for share in np.unique(shares):
        value = 0
        for indice in np.argwhere(shares == share):
            value += prices[indice]
        average_price[share] = value / len(np.argwhere(shares == "HSBC"))
    return average_price

average_price = Average_price(shares, prices)
In [1] : print(average_price)
Out[1] : {'HSBC': array([ 6.385]), 'Vodafone': array([ 2.450]), 'o2': array([10.045])}
0 голосов
/ 20 мая 2019

хитрым способом было бы вычислить количество, а затем разделить цену на это количество, вычислить сумму и создать окончательный словарь :)

Кстати, пакеты не нужны


shares = ["HSBC", "o2", "Vodafone", "Vodafone", "HSBC", "o2", "Vodafone"]
prices = [6.40, 9.99, 2.40, 2.45, 6.37, 10.10, 2.50]

# Get unique shares 
unique_shares = list(set(shares))
# Get count of shares
count_shares = [shares.count(x) for x in shares]
# Get average price with corresponding share
avg_shares = [round(x/y, 2) for x, y in zip(prices, count_shares)]
# Zip result into single list of tuple
avg_prices_per_share = list(zip(shares, avg_shares))
# Get average based on count of shares and computed averaprice for each share
result  = {unique_key: round(sum(v for k, v in avg_prices_per_share if k==unique_key), 2)
    for unique_key in unique_shares}

Выход:

{'HSBC': 6.39, 'Vodafone': 2.45, 'o2': 10.05}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...