我对np.where
有一个奇怪的问题。我首先加载一个名为df
的数据库,并创建df
,df1
的副本。然后我使用np.where
使df1
中的每个值为1,如果单元格中的数字大于或等于其平均值(在DataFrame df_mean
中找到),则使单元格等于0.我使用for循环迭代df1
中的每个列标题,并通过平均值列表df_mean
。这是我的代码:
#Load the data
df = pd.read_csv('F:\\file.csv')
df.head(2)
>>> A AA AAP AAPL ABC
2011-01-10 09:30:00 -0.000546 0.006528 -0.001051 0.034593 -0.000095 ...
2011-01-10 09:30:10 -0.000256 0.007705 -0.001134 0.008578 -0.000549 ...
# Show list file with columns average
>>> df_mean.head(4)
A 0.000656
AA 0.002068
AAP 0.001134
AAPL 0.001728
...
df_1 = df
for x in list:
df_1[x] = np.where(df_1[x] >= *df_mean[x], 1, 0)
>>> df_1.head(4) #Which is my desired output (but which also makes df = df_1...WHY?)
A AA AAP AAPL ABC
2011-01-10 09:30:00 0 1 0 1 0 ...
2011-01-10 09:30:10 0 1 0 1 0 ...
2011-01-10 09:30:20 0 0 0 1 0 ...
2011-01-10 09:30:30 0 0 0 1 1 ...
现在,我得到了我想要的df_1
的二进制1/0矩阵,但它转变为df
也进入二进制矩阵(与df_1
相同)。为什么?该循环不包含df
...
答案 0 :(得分:1)
虽然这不是你要求的,但是我的狡猾的感觉告诉我,你想找到某种形式的指标,如果一只股票目前已经超过或表现不佳,使用这种“某事”的意思。也许试试这个:
S = pd.DataFrame(
np.array([[1.2,3.4],[1.1,3.5],[1.4,3.3],[1.2,1.6]]),
columns=["Stock A","Stock B"],
index=pd.date_range("2014-01-01","2014-01-04",freq="D")
)
indicator = S > S.mean()
binary = indicator.astype("int")
print S
print indicator
print binary
这给出了输出:
Stock A Stock B
2014-01-01 1.2 3.4
2014-01-02 1.1 3.5
2014-01-03 1.4 3.3
2014-01-04 1.2 1.6
[4 rows x 2 columns]
Stock A Stock B
2014-01-01 False True
2014-01-02 False True
2014-01-03 True True
2014-01-04 False False
[4 rows x 2 columns]
Stock A Stock B
2014-01-01 0 1
2014-01-02 0 1
2014-01-03 1 1
2014-01-04 0 0
[4 rows x 2 columns]
当你在这里时,你应该考虑pd.rolling_mean(S, n_periods_for_mean)
。