小编Jes*_*her的帖子

具有每月偏移量的熊猫滚动()函数

我正在尝试在带有月度数据的 Pandas 数据框上使用滚动()函数。但是,我删除了一些 NaN 值,所以现在我的时间序列中有一些差距。因此,基本窗口参数给出了一个误导性的答案,因为它只是查看之前的观察结果:

import pandas as pd
import numpy as np
import random
dft = pd.DataFrame(np.random.randint(0,10,size=len(dt)),index=dt)
dft.columns = ['value']
dft['value'] = np.where(dft['value'] < 3,np.nan,dft['value'])
dft = dft.dropna()
dft['basic'] = dft['value'].rolling(2).sum()
Run Code Online (Sandbox Code Playgroud)

例如,参见 2017-08-31 条目,其总和为 3.0 和 9.0,但上一个条目是 2017-03-31。

In [57]: dft.tail()
Out[57]:
            value  basic
2017-02-28    8.0   12.0
2017-03-31    3.0   11.0
2017-08-31    9.0   12.0
2017-10-31    7.0   16.0
2017-11-30    7.0   14.0
Run Code Online (Sandbox Code Playgroud)

自然的解决方案(我认为)是使用“2M”偏移量,但它给出了一个错误:

In [58]: dft['basic2M'] = dft['value'].rolling('2M').sum()
...<output omitted>...
ValueError: <2 * MonthEnds> is a non-fixed frequency
Run Code Online (Sandbox Code Playgroud)

如果我移动每日偏移量,我可以让它工作,但这似乎是一个奇怪的解决方法:

In [59]: dft['basic32D'] …
Run Code Online (Sandbox Code Playgroud)

python window-functions pandas rolling-computation

7
推荐指数
1
解决办法
2221
查看次数

在多索引中移位时间以合并

我想合并两个由time和索引的数据集id.问题是,每个数据集的时间略有不同.在一个数据集中,时间(每月)是月中,因此是每个月的第15个月.在其他数据集中,这是最后一个工作日.这应该仍然是一对一的匹配,但日期并不完全相同.

我的方法是将月中日期转换为工作日的月末日期.

数据:

dt = pd.date_range('1/1/2011','12/31/2011', freq='D')
dt = dt[dt.day == 15]
lst = [1,2,3]
idx = pd.MultiIndex.from_product([dt,lst],names=['date','id'])
df = pd.DataFrame(np.random.randn(len(idx)), index=idx)
df.head()
Run Code Online (Sandbox Code Playgroud)

输出:

                      0
date       id
2011-01-15 1  -0.598584
           2  -0.484455
           3  -2.044912
2011-02-15 1  -0.017512
           2   0.852843
Run Code Online (Sandbox Code Playgroud)

这就是我想要的(我删除了性能警告):

In[83]:df.index.levels[0] + BMonthEnd()
Out[83]:
DatetimeIndex(['2011-01-31', '2011-02-28', '2011-03-31', '2011-04-29',
               '2011-05-31', '2011-06-30', '2011-07-29', '2011-08-31',
               '2011-09-30', '2011-10-31', '2011-11-30', '2011-12-30'],
              dtype='datetime64[ns]', freq='BM')
Run Code Online (Sandbox Code Playgroud)

但是,索引是不可变的,因此这不起作用:

In: df.index.levels[0] = df.index.levels[0] + BMonthEnd()

TypeError: 'FrozenList' does not support mutable operations.
Run Code Online (Sandbox Code Playgroud)

我得到的唯一解决方案是reset_index(),更改日期,然后再次set_index():

df.reset_index(inplace=True)
df['date'] = …
Run Code Online (Sandbox Code Playgroud)

python merge multi-index pandas datetimeindex

6
推荐指数
3
解决办法
62
查看次数

使用NaN在熊猫中按列对数据进行Winsoring

我想对熊猫数据框中的几列数据进行解冻。每列都有一些NaN,这会影响winsorization,因此需要将其删除。我知道如何执行此操作的唯一方法是针对所有数据删除它们,而不是仅逐列删除它们。

MWE:

import numpy as np
import pandas as pd
from scipy.stats.mstats import winsorize

# Create Dataframe
N, M, P = 10**5, 4, 10**2
dates = pd.date_range('2001-01-01', periods=N//P, freq='D').repeat(P)
df = pd.DataFrame(np.random.random((N, M))
                  , index=dates)
df.index.names = ['DATE']
df.columns = ['one','two','three','four']
# Now scale them differently so you can see the winsorization
df['four'] = df['four']*(10**5)
df['three'] = df['three']*(10**2)
df['two'] = df['two']*(10**-1)
df['one'] = df['one']*(10**-4)
# Create NaN
df.loc[df.index.get_level_values(0).year == 2002,'three'] = np.nan
df.loc[df.index.get_level_values(0).month == 2,'two'] = np.nan
df.loc[df.index.get_level_values(0).month …
Run Code Online (Sandbox Code Playgroud)

python nan scipy missing-data pandas

3
推荐指数
1
解决办法
2537
查看次数