pandas - 如何优化熊猫中的日期框处理?
问题描述
我有一个以下 DF。
Date Time Open High Low Close
0 2010-01-03 17:00:00 1.4301 1.4304 1.4301 1.4304
1 2010-01-03 17:01:00 1.4303 1.4303 1.4303 1.4303
我需要将每天的价格标准化,因此有必要将每天的价格除以当天的第一个值,所以每天都从 1.0 开始。我已经编写了以下代码,但是它的运行速度非常慢,我该如何改进它?我觉得它太复杂了,有没有优雅的方法?
for year in range(2010, 2021):
for month in range(1, 13):
for day in range(1, 31):
mutdf = dfc.loc[(dfc['Date'].dt.year == year) & (dfc['Date'].dt.month == month) & (dfc['Date'].dt.day == day),
['Open', 'High', 'Low', 'Close']]
if mutdf.empty:
continue
mutdf['Open'] = mutdf['Open'].divide(mutdf.iloc[0, 0])
mutdf['High'] = mutdf['High'].divide(mutdf.iloc[0, 1])
mutdf['Low'] = mutdf['Low'].divide(mutdf.iloc[0, 2])
mutdf['Close'] = mutdf['Close'].divide(mutdf.iloc[0, 3])
dfc.loc[(dfc['Date'].dt.year == year) & (dfc['Date'].dt.month == month) & (dfc['Date'].dt.day == day),
['Open', 'High', 'Low', 'Close']] = mutdf
期望的输出:
Date Time Open High Low Close
0 2010-01-03 17:00:00 1.00000 1.00000 1.00000 1.000000
1 2010-01-03 17:01:00 1.00014 0.99993 1.00014 0.999930
2 2010-01-03 17:02:00 1.00007 0.99993 1.00000 0.999930
3 2010-01-03 17:03:00 1.00007 0.99986 1.00007 0.999860
4 2010-01-03 17:04:00 1.00000 0.99986 0.99979 0.999720
5 2010-01-03 17:06:00 1.00000 0.99979 0.99993 0.999790
6 2010-01-03 17:08:00 0.99993 0.99986 0.99993 0.999790
7 2010-01-03 17:09:00 0.99993 0.99979 0.99979 0.999581
8 2010-01-03 17:10:00 0.99986 0.99979 0.99986 0.999790
9 2010-01-03 17:12:00 1.00007 0.99993 1.00007 0.999930
解决方案
groupby
打开Date
并除以第一个值:
df["Open"] = df.groupby("Date")["Open"].transform(lambda d: d/d.iat[0])
print (df)
Date Time Open High Low Close
0 2010-01-03 17:00:00 1.00000 1.4304 1.4301 1.4304
1 2010-01-03 17:01:00 1.00014 1.4303 1.4303 1.4303
一口气处理所有列:
col = ['Open', 'High', 'Low', 'Close']
print (df.set_index(["Date","Time"])
.groupby("Date").apply(lambda d: d[col]/df[col].iloc[0])
.reset_index())
Date Time Open High Low Close
0 2010-01-03 17:00:00 1.00000 1.00000 1.00000 1.00000
1 2010-01-03 17:01:00 1.00014 0.99993 1.00014 0.99993
推荐阅读
- html - Qt QML WebEngineView 默认工具提示在html内容中显示不正确
- kubernetes - 为什么通过 kubernetes 部署创建的 pod 名称会在其名称后附加 5 个随机字母数字字符?
- android - 找不到参数的方法 kotlin() [gradle-plugin, 1.3.20]
- swift4 - 有没有一种简单的方法可以将故事板中已经定义的约束转换为 Swift 代码?
- python - 在 Ubuntu 中为 weasyprint 安装最新的 cairo lib
- python - 如何在具有多个条件的python中快速对数字进行分类
- c# - System.OperationCanceledException 偶尔发生在带有 try catch 的异步函数中
- angular - 如何修复来自 Heroku MEAN stack CRUD App 教程的 put 请求
- python - 从熊猫数据框中删除所有数字
- java - 在 Java 中何时何地使用 throws 而不是 try catch?