根据计算条件更新 DataFrame 中的值
Update values in DataFrame based on criteria with calculation
最终目标是我试图修改原始股票价格数据作为 20:1 股票拆分的结果。
从 raw_data
我使用下面的代码提取了相关的 ticker
('IPL') 和 date
(< '2008-10-01'):
raw_data[(raw_data['ticker'] =='IPL') & (raw_data['date']<'2008-10-01')]
结果数据框如下:
ticker date open high low close volume return
687 IPL 2008-01-02 117.00 118.48 116.81 117.16 150971.0 NaN
2146 IPL 2008-01-03 117.16 123.82 116.80 120.96 240929.0 0.032434
3617 IPL 2008-01-04 123.06 127.24 120.20 125.60 329834.0 0.038360
5156 IPL 2008-01-07 125.60 126.21 121.61 121.63 266578.0 -0.031608
6731 IPL 2008-01-08 119.70 121.93 118.75 119.58 362860.0 -0.016854
... ... ... ... ... ... ... ... ...
259572 IPL 2008-09-10 126.00 130.50 125.10 129.00 1046421.0 -0.030075
260940 IPL 2008-09-11 133.50 134.55 131.82 132.50 599706.0 0.027132
262251 IPL 2008-09-12 136.00 142.00 134.03 139.01 475591.0 0.049132
263608 IPL 2008-09-15 139.00 143.00 135.50 139.93 390052.0 0.006618
264980 IPL 2008-09-16 136.00 137.40 131.11 132.00 489557.0 -0.056671
我尝试遍历 for 循环和 .loc[]
但我完全卡住了。
我还尝试了以下 &
和 and
:
for i, row in raw_data.iterrows():
close_val = ['close']
if raw_data[(raw_data['ticker'] =='IPL') and (raw_data['date']<'2008-10-01')]:
close_val = ['close'] * 0.05
df.at[i,'close'] = close_val
但是我得到以下错误:
"ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."
基本上,我需要将 2008-09-17 之前的所有价格 open, high, low, close
乘以 0.05,然后将 volume
除以 0.05。
Pandas 很聪明,可以让您将 DataFrame 列(即系列)视为向量。因此,如果您将一列乘以一个数字,pandas 会将该列中的每一行乘以该数字。这甚至适用于整个 DataFrame,因此您可以 select 任何您喜欢的子帧(例如,通过使用列名列表进行索引),然后乘以一个标量,如下所示(假设 DataFrame 具有您提取的感兴趣的日期从原始数据中调用 df
).
df[['open', 'high', 'low', 'close']] = 0.05 * df[['open', 'high', 'low', 'close']]
df['volume'] = 20 * df['volume']
df
结果:
ticker date open high low close volume return
687 IPL 2008-01-02 5.850 5.9240 5.8405 5.8580 3019420.0 NaN
2146 IPL 2008-01-03 5.858 6.1910 5.8400 6.0480 4818580.0 0.032434
3617 IPL 2008-01-04 6.153 6.3620 6.0100 6.2800 6596680.0 0.038360
5156 IPL 2008-01-07 6.280 6.3105 6.0805 6.0815 5331560.0 -0.031608
6731 IPL 2008-01-08 5.985 6.0965 5.9375 5.9790 7257200.0 -0.016854
...
259572 IPL 2008-09-10 6.300 6.5250 6.2550 6.4500 20928420.0 -0.030075
260940 IPL 2008-09-11 6.675 6.7275 6.5910 6.6250 11994120.0 0.027132
262251 IPL 2008-09-12 6.800 7.1000 6.7015 6.9505 9511820.0 0.049132
263608 IPL 2008-09-15 6.950 7.1500 6.7750 6.9965 7801040.0 0.006618
264980 IPL 2008-09-16 6.800 6.8700 6.5555 6.6000 9791140.0 -0.056671
最终目标是我试图修改原始股票价格数据作为 20:1 股票拆分的结果。
从 raw_data
我使用下面的代码提取了相关的 ticker
('IPL') 和 date
(< '2008-10-01'):
raw_data[(raw_data['ticker'] =='IPL') & (raw_data['date']<'2008-10-01')]
结果数据框如下:
ticker date open high low close volume return
687 IPL 2008-01-02 117.00 118.48 116.81 117.16 150971.0 NaN
2146 IPL 2008-01-03 117.16 123.82 116.80 120.96 240929.0 0.032434
3617 IPL 2008-01-04 123.06 127.24 120.20 125.60 329834.0 0.038360
5156 IPL 2008-01-07 125.60 126.21 121.61 121.63 266578.0 -0.031608
6731 IPL 2008-01-08 119.70 121.93 118.75 119.58 362860.0 -0.016854
... ... ... ... ... ... ... ... ...
259572 IPL 2008-09-10 126.00 130.50 125.10 129.00 1046421.0 -0.030075
260940 IPL 2008-09-11 133.50 134.55 131.82 132.50 599706.0 0.027132
262251 IPL 2008-09-12 136.00 142.00 134.03 139.01 475591.0 0.049132
263608 IPL 2008-09-15 139.00 143.00 135.50 139.93 390052.0 0.006618
264980 IPL 2008-09-16 136.00 137.40 131.11 132.00 489557.0 -0.056671
我尝试遍历 for 循环和 .loc[]
但我完全卡住了。
我还尝试了以下 &
和 and
:
for i, row in raw_data.iterrows():
close_val = ['close']
if raw_data[(raw_data['ticker'] =='IPL') and (raw_data['date']<'2008-10-01')]:
close_val = ['close'] * 0.05
df.at[i,'close'] = close_val
但是我得到以下错误:
"ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."
基本上,我需要将 2008-09-17 之前的所有价格 open, high, low, close
乘以 0.05,然后将 volume
除以 0.05。
Pandas 很聪明,可以让您将 DataFrame 列(即系列)视为向量。因此,如果您将一列乘以一个数字,pandas 会将该列中的每一行乘以该数字。这甚至适用于整个 DataFrame,因此您可以 select 任何您喜欢的子帧(例如,通过使用列名列表进行索引),然后乘以一个标量,如下所示(假设 DataFrame 具有您提取的感兴趣的日期从原始数据中调用 df
).
df[['open', 'high', 'low', 'close']] = 0.05 * df[['open', 'high', 'low', 'close']]
df['volume'] = 20 * df['volume']
df
结果:
ticker date open high low close volume return
687 IPL 2008-01-02 5.850 5.9240 5.8405 5.8580 3019420.0 NaN
2146 IPL 2008-01-03 5.858 6.1910 5.8400 6.0480 4818580.0 0.032434
3617 IPL 2008-01-04 6.153 6.3620 6.0100 6.2800 6596680.0 0.038360
5156 IPL 2008-01-07 6.280 6.3105 6.0805 6.0815 5331560.0 -0.031608
6731 IPL 2008-01-08 5.985 6.0965 5.9375 5.9790 7257200.0 -0.016854
...
259572 IPL 2008-09-10 6.300 6.5250 6.2550 6.4500 20928420.0 -0.030075
260940 IPL 2008-09-11 6.675 6.7275 6.5910 6.6250 11994120.0 0.027132
262251 IPL 2008-09-12 6.800 7.1000 6.7015 6.9505 9511820.0 0.049132
263608 IPL 2008-09-15 6.950 7.1500 6.7750 6.9965 7801040.0 0.006618
264980 IPL 2008-09-16 6.800 6.8700 6.5555 6.6000 9791140.0 -0.056671