使用 Pandas 通过数据帧字典计算移动平均线
Calculate moving averages through a dictionary of dataframes with Pandas
我有一个 excel sheet 实时股票价格,我通过 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 都是相同的。以下是示例 table。完整的数据框是 71 行 x 6 列大:
Ticker
Last
Bid
Ask
AEFES
23.06
23.04
23.06
AFYON
4.41
4.40
4.41
AKBNK
6.38
6.38
6.39
现在我需要计算从字典中每个数据帧中选取的 Ticker 下每只股票的移动平均线,并将结果输出到一个新的单个数据帧。
除了为每个时间段的每个单一股票价格创建一个数据帧、计算移动平均线并逐个遍历它们之外,还有其他有效的方法吗?
现在我需要计算
下每只股票的移动平均价格
这可能感觉有点违反直觉,但将所有内容组合到一个数据帧中会更快、更高效。我不确定你为什么将时间戳作为字符串存储在字典中(键也可以只是时间戳),但我暂时保留它。
尝试这样的事情:
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()
我有一个 excel sheet 实时股票价格,我通过 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 都是相同的。以下是示例 table。完整的数据框是 71 行 x 6 列大:
Ticker | Last | Bid | Ask |
---|---|---|---|
AEFES | 23.06 | 23.04 | 23.06 |
AFYON | 4.41 | 4.40 | 4.41 |
AKBNK | 6.38 | 6.38 | 6.39 |
现在我需要计算从字典中每个数据帧中选取的 Ticker 下每只股票的移动平均线,并将结果输出到一个新的单个数据帧。
除了为每个时间段的每个单一股票价格创建一个数据帧、计算移动平均线并逐个遍历它们之外,还有其他有效的方法吗?
现在我需要计算
下每只股票的移动平均价格这可能感觉有点违反直觉,但将所有内容组合到一个数据帧中会更快、更高效。我不确定你为什么将时间戳作为字符串存储在字典中(键也可以只是时间戳),但我暂时保留它。
尝试这样的事情:
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()