python - 根据所选窗口聚合数据框
问题描述
我正在使用带有熊猫数据框的python。我有一个从 CSV 文件导入的数据框。
volume temperature(c)
time(sec)
1000.1 10.4 26.5
1000.2 12.5 30.2
1000.3 13.2 40.5
.
.
.
8000.1 78 50.8
8000.2 79 51.5
我想创建一个新的数据框,我们定义一个时间窗口 W(例如 5 秒),并且每 W 秒将每一列的值聚合到一行,并在特定窗口上进行不同的计算,例如,平均值,输出数据帧的标准 z-score 等示例:
time(sec) mean_volume mean_temperature std_volume
1000.1 12.0. 32.4 1.4
1005.1 12.5 30.2 1.7
1010.1 11.7 30.1 1.5
.
.
.
我熟悉df['new col'] = data['source'].rolling(W).mean()
,这不是我附上示例的解决方案
T,H,L,C,label
1000.1,23.18,27.272,426,1
1000.2,23.15,27.2675,429.5,1
1000.3,23.15,27.245,426,1
1000.4,23.15,27.2,426,1
1000.5,23.1,27.2,426,1
1000.6,23.1,27.2,419,1
1000.7,23.1,27.2,419,1
1000.8,23.1,27.2,419,1
1000.9,23.1,27.2,419,1
1001,23.075,27.175,419,1
1001.1,23.075,27.15,419,1
1001.2,23.1,27.1,419,1
1001.3,23.1,27.16666667,419,1
1001.4,23.05,27.15,419,1
1001.5,23,27.125,419,1
1001.6,23,27.125,418.5,1
1001.7,23,27.2,0,0
1001.8,22.945,27.29,0,0
1001.9,22.945,27.39,0,0
1002,22.89,27.39,0,0
1002.1,22.89,27.39,0,0
1002.2,22.89,27.39,0,0
1002.3,22.89,27.445,0,0
对于上面的示例,我希望新的数据框将包含以下列: H_mean,H_std ,L_mean,C_mean,L_std,C_std
此外,我如何在每个段上应用自定义函数(例如 z-score)。
谢谢,
解决方案
鉴于您的数据在pd.DataFrame
被调用df
,以下应该可以解决问题:
import pandas as pd
import numpy as np
step = 5
df.groupby(pd.cut(df.index,
np.arange(start=df.index.min(), stop=df.index.max(), step=step,
dtype=float)))\
.agg({'volume':['mean', 'std'], 'temperature':['mean']})
我们正在使用 pd.cut 来创建一个IntervalIndex
我们可以的groupby
。最后我们pd.DataFrame.agg
用来计算每个组的汇总统计;mean
和std
列volume
,只是mean
列temperature
。
我没有对此进行测试,但如果您提供一个最小、完整且可验证的示例,我可以做到。
编辑
鉴于更新的数据,我编写了以下代码:
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: from io import StringIO
In [4]: s = """T,H,L,C,label
...: 1000.1,23.18,27.272,426,1
...: 1000.2,23.15,27.2675,429.5,1
...: 1000.3,23.15,27.245,426,1
...: 1000.4,23.15,27.2,426,1
...: 1000.5,23.1,27.2,426,1
...: 1000.6,23.1,27.2,419,1
...: 1000.7,23.1,27.2,419,1
...: 1000.8,23.1,27.2,419,1
...: 1000.9,23.1,27.2,419,1
...: 1001,23.075,27.175,419,1
...: 1001.1,23.075,27.15,419,1
...: 1001.2,23.1,27.1,419,1
...: 1001.3,23.1,27.16666667,419,1
...: 1001.4,23.05,27.15,419,1
...: 1001.5,23,27.125,419,1
...: 1001.6,23,27.125,418.5,1
...: 1001.7,23,27.2,0,0
...: 1001.8,22.945,27.29,0,0
...: 1001.9,22.945,27.39,0,0
...: 1002,22.89,27.39,0,0
...: 1002.1,22.89,27.39,0,0
...: 1002.2,22.89,27.39,0,0
...: 1002.3,22.89,27.445,0,0"""
In [5]: df = pd.read_csv(StringIO(s), index_col='T')
我们再次使用IntervalIndex
and 和groupby
agg 来计算汇总统计信息。
In [6]: step = 0.5
...:
...: grouped = df.groupby(pd.cut(df.index,
...: np.arange(start=df.index.min(), stop=df.index.max(), step=step, dtype=float
...: )))
...:
In [7]: grouped.agg({'H':['mean', 'std'], 'L':['mean', 'std'], 'C':['mean', 'std']})
Out[7]:
H L C
mean std mean std mean std
(1000.1, 1000.6] 23.130 0.027386 27.222500 0.031820 425.3 3.834058
(1000.6, 1001.1] 23.090 0.013693 27.185000 0.022361 419.0 0.000000
(1001.1, 1001.6] 23.050 0.050000 27.133333 0.025685 418.9 0.223607
(1001.6, 1002.1] 22.934 0.046016 27.332000 0.085557 0.0 0.000000
这不会给你想要的列名,所以让我们展平列MultiIndex
来调整它们。
In [8]: aggregated = grouped.agg({'H':['mean', 'std'], 'L':['mean', 'std'], 'C':['mean', 'std']})
In [9]: ['_'.join(col).strip() for col in aggregated.columns.values]
Out[9]: ['H_mean', 'H_std', 'L_mean', 'L_std', 'C_mean', 'C_std']
In [10]: aggregated.columns = ['_'.join(col).strip() for col in aggregated.columns.values]
In [11]: aggregated
Out[11]:
H_mean H_std L_mean L_std C_mean C_std
(1000.1, 1000.6] 23.130 0.027386 27.222500 0.031820 425.3 3.834058
(1000.6, 1001.1] 23.090 0.013693 27.185000 0.022361 419.0 0.000000
(1001.1, 1001.6] 23.050 0.050000 27.133333 0.025685 418.9 0.223607
(1001.6, 1002.1] 22.934 0.046016 27.332000 0.085557 0.0 0.000000
我不太清楚应用 Z 分数是什么意思,因为这不是汇总统计数据,不像std
and mean
,所以它不能很好地与 agg 配合使用。如果您只想按列将 Z 分数应用于整个 DataFrame,我建议您可能想看看这个问题:Pandas - Compute z-score for all columns
推荐阅读
- ios - 为什么tableview中的数据总是随机排序的?
- python - 无法腌制“dict_keys”对象 - 带有键规则的 dict 验证器
- mysql - Sql 查询交叉变换或透视?
- python - 使用 BeautifulSoup 进行抓取,值不干净
- python - 在元素个数为偶数的情况下不除以两个元素之和的中位数
- pandas - Groupby 转换到 Pandas 中的列表不起作用
- uuid - UUID 在 Minecraft bungeeCord 网络中为同一个人以不同方式保存
- reactjs - 如何避免 React Hooks 的重新渲染
- java - 我想替换java段落中的整个单词,但它也在替换匹配的字符。不知道该怎么做
- javascript - SyntaxError: 预期的表达式,得到 '&' (Django)