我正在搜索pandas文档,试图了解如何使用转换,并且可以从文档中获取此示例: http://pandas.pydata.org/pandas-docs/stable/groupby.html(根据'转型")
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
index = pd.date_range('10/1/1999', periods=1100)
ts = pd.Series(np.random.normal(0.5, 2, 1100), index)
ts = ts.rolling(window=100,min_periods=100).mean().dropna()
key = lambda x: x.year
zscore = lambda x: (x - x.mean()) / x.std()
transformed = ts.groupby(key).transform(zscore)
我很困惑的一些事情;首先使用lambda。
key = lambda x: x.year
在这种情况下x应该代表什么数据类型?我不确定哪种数据类型允许调用属性" .year"
至于这种情况:
zscore = lambda x: (x - x.mean()) / x.std()
x将代表ts的每一行(ts.roll?)和x.mean是什么的平均值?
最后,变换究竟在最后一行做了什么? 它只是用zscore替换ts的值吗? 我运行变量"转换"但索引(日期)与ts'相同。指数。那么groupby(key)究竟做了什么呢?
谢谢!
答案 0 :(得分:3)
使用key = lambda x: x.year
表示您的索引为dtype='datetime64[ns]'
这将调用每个索引的年份并按年份对df进行分组。
现在你有了一个groupby对象,你可以转换每个组:
zscore = lambda x: (x - x.mean()) / x.std()
将每个组(即每年)计算平均值(x.mean()
),标准偏差(x.std()
)并为每个数据点应用公式(x - x.mean()) / x.std()
。< / p>
这样做:
ts.groupby(key).mean()
Out[274]:
2000 0.4851
2001 0.2568
2002 0.4544
返回每年的平均值,并执行此操作:
ts.groupby(key).std()
Out[275]:
2000 0.1969
2001 0.1539
2002 0.1881
返回每年的标准差
transform将把它应用于每一行,所以让我们使用位置1进行测试
ts.head()
Out[277]:
2000-01-08 0.7562
2000-01-09 0.7639
2000-01-10 0.7020
2000-01-11 0.6970
2000-01-12 0.6906
由于第一个指数是2000年,我们需要使用该组的均值和标准,如:0.7562-0.4851 /0.1969 = 1.3767
ts.groupby(key).transform(zscore).head(2)
Out[282]:
2000-01-08 1.3767
2000-01-09 1.4159