首页 > 解决方案 > 使用 Pandas 通过数据框字典计算移动平均值

问题描述

我有一张包含实时股票价格的 Excel 表格,我通过 XLWings 将其提取到数据框中。我以设定的时间间隔拍摄此数据帧的快照,并将每个快照数据帧添加到以快照时间为键的字典中。

t = datetime.datetime.now()
tn = t + datetime.timedelta(seconds=1800)
dict_of_df = {}
while datetime.datetime.now()<tn:
    key_name = 'df_' + str(datetime.datetime.now().strftime("%H:%M:%S"))
    dict_of_df[key_name] = copy.deepcopy(df)
    print(dict_of_df.keys())
    time.sleep(300)

然后我可以从中提取一个包含当时股票价格的数据框。示例输出如下。字典中每个 df 的数据帧结构都是相同的。以下是示例表。完整的数据框是 71 行 x 6 列大:

股票代码 最后的 投标
AEFES 23.06 23.04 23.06
阿永 4.41 4.40 4.41
AKBNK 6.38 6.38 6.39

现在我需要计算从字典中每个数据帧中选取的 Ticker 下的每只股票的移动平均值,并将结果输出到一个新的单个数据帧。

除了为每个时间框架的每个股票价格创建一个数据框架,计算移动平均线并一个一个地遍历它们之外,是否有一种有效的方法来做到这一点?

现在我需要计算下每只股票的移动平均价格

标签: pythonpandasdataframemoving-average

解决方案


这可能会让人觉得有点反直觉,但是将所有内容组合到一个数据帧中会更快更高效。我不确定您为什么将时间戳作为字符串存储在 de 字典中(键也可能只是时间戳),但我暂时保留它。

尝试这样的事情:

import pandas
import random
import string

# Create some test data (should look similar to yours)
tickers = ["AEFES", "AFYON", "AKBNK"] + [''.join(random.choices(string.ascii_uppercase + string.digits, k=5)) for _ in range(68)]
dfs = {
    f"df_{timestamp.strftime('%H:%M:%S')}": pandas.DataFrame(
        [
            {
                "Ticker": ticker,
                "Last": random.randint(0, 50),
                "Bid": random.randint(0, 50),
                "Ask": random.randint(0, 50),
                "Other_1": random.randint(0, 50),
                "Other_2": random.randint(0, 50),
                "Other_3": random.randint(0, 50),
            }
            for ticker in tickers
        ]
    ).set_index("Ticker")
    for timestamp in pandas.date_range("2020-01-01", periods=100, freq="5min")
}

# Combine all dataframes into a single dataframe
df = pandas.concat([df.unstack().rename(key) for key, df in dfs.items()], axis=1).T

# Take the rolling mean (= moving average) over 6 periods (= 1/2 hour)
moving_averages = df.rolling(6).mean()

推荐阅读