【问题标题】:How to calculate simple moving average from list of dicts?如何从字典列表中计算简单的移动平均值?
【发布时间】:2020-07-01 11:50:49
【问题描述】:

我在这里使用 robin_stocks 模块来计算股票历史数据,然后按日期对其进行排序。

import robin_stocks as r

stock_price = r.stocks.get_stock_historicals('F', interval='day', span='week', bounds='regular')
stock_price = sorted(stock_price, key=lambda item: item['begins_at'])
for stock in stock_price:
    print('Stock: {}, Date: {}, Open: {}, Close: {}'.format(stock['symbol'],stock['begins_at'],stock['open_price'],stock['close_price']))

输出:

Stock: F, Date: 2020-06-24T00:00:00Z, Open: 6.060000, Close: 5.950000
Stock: F, Date: 2020-06-25T00:00:00Z, Open: 5.860000, Close: 6.030000
Stock: F, Date: 2020-06-26T00:00:00Z, Open: 6.040000, Close: 5.910000
Stock: F, Date: 2020-06-29T00:00:00Z, Open: 5.910000, Close: 6.010000
Stock: F, Date: 2020-06-30T00:00:00Z, Open: 5.980000, Close: 6.080000

我想知道如何计算'close'的平均值。

【问题讨论】:

  • 看看将您的数据放入pandas.DataFrame。这有一个rolling 函数,您可以在该函数上计算滚动平均值。

标签: python list average


【解决方案1】:
close_prices = [float(stock['close_price']) for stock in stock_price]
avg = sum(close_prices) / len(close_prices)

如果您希望对自定义窗口大小应用滚动平均值并使用pandas,您可以使用pandas.DataFrame.rolling

【讨论】:

  • 嗯我收到这个错误:avg = sum(close_prices) / len(close_prices) TypeError: unsupported operand type(s) for +: 'int' and 'str'
  • close_price 下的值是字符串吗?请改用[float(stock['close_price']) for stock in stock_price]
【解决方案2】:

如果您有标题所说的字典(而不是代码中显示的“打印”),您可以将其转换为数据框:

import pandas as pd

your_df = pd.DataFrame(your_dict)

一旦你有了数据框,你就可以用移动平均线创建一个新列:

your_df['SMA'] = your_df['Close'].rolling(window=10,center=False).mean()

此外,您可以将天窗从 10 更改为您喜欢的任何数字。

【讨论】:

  • 这太棒了!谢谢
【解决方案3】:

您可以在 for 循环中简单地计算总和:

close_sum = 0
for stock in stock_price:
    print('Stock: {}, Date: {}, Open: {}, Close: {}'.format(stock['symbol'],stock['begins_at'],stock['open_price'],stock['close_price']))
    close_sum += float(stock['close_price'])

然后将总和除以库存数量:

close_average = close_sum / len(stock_price)

【讨论】:

  • 我不断收到以下错误:close_sum += stock['close_price'] TypeError: unsupported operand type(s) for +=: 'int' and 'str' 有什么想法吗?
  • @CameronRosenbaum 您必须使用数字而非字符串进行计算。错误来自您的输入,因此它会影响所有答案。只需应用float() 转换,就像suggested in another answer。我的答案已更新。
猜你喜欢
  • 2012-10-04
  • 2021-12-24
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多