Python 数据帧的计算

Python 数据帧的计算,python,pandas,dataframe,Python,Pandas,Dataframe,假设我有这样一个数据帧: data = pd.DataFrame({'stcode': ['001', '002', '001', '002', '001', '002', '001', '002', '001', '002'], 'trade_dt': ['20170101', '20170101', '20170102', '20170102', '20170103', '20170103', '20170104', '20170104', '20170105', '201701

假设我有这样一个数据帧:

data = pd.DataFrame({'stcode': ['001', '002', '001', '002', '001', '002', '001', '002', '001', '002'],
      'trade_dt': ['20170101', '20170101', '20170102', '20170102', '20170103', '20170103', '20170104', '20170104', '20170105', '20170105'],
      'close': [1, 3, 5, 1, 2, 3, 5, 1, 2, 2],
      'trend': []})
我想用规则计算每只股票的收盘价:

if close[i+1] > close[i]: trend[i] = 1
elif close[i+1] < close[i]: trend[i] = -1
else: trend[i] = 0
如果关闭[i+1]>关闭[i]:趋势[i]=1
elif关闭[i+1]<关闭[i]:趋势[i]=-1
其他:趋势[i]=0
然后将其存储在
数据['trend']
中。 我该怎么办?你可以

In [157]: s = data.close.diff()  # data.close - data.close.shift()

In [158]: data['trend'] = np.where(s.gt(0), 1, np.where(s.lt(0), -1, 0))

In [159]: data
Out[159]:
   close stcode  trade_dt  trend
0      1    001  20170101      0
1      3    002  20170101      1
2      5    001  20170102      1
3      1    002  20170102     -1
4      2    001  20170103      1
5      3    002  20170103      1
6      5    001  20170104      1
7      1    002  20170104     -1
8      2    001  20170105      1
9      2    002  20170105      0
你可以

In [157]: s = data.close.diff()  # data.close - data.close.shift()

In [158]: data['trend'] = np.where(s.gt(0), 1, np.where(s.lt(0), -1, 0))

In [159]: data
Out[159]:
   close stcode  trade_dt  trend
0      1    001  20170101      0
1      3    002  20170101      1
2      5    001  20170102      1
3      1    002  20170102     -1
4      2    001  20170103      1
5      3    002  20170103      1
6      5    001  20170104      1
7      1    002  20170104     -1
8      2    001  20170105      1
9      2    002  20170105      0

正如MrT所提到的,空的趋势列使其成为无效的数据帧。 我已经用np.nan填充了它

因此:

将熊猫作为pd导入
将numpy作为np导入
data=pd.DataFrame({'stcode':['001','002','001','002','001','001','002','001','002','001','002'],
“贸易数据”:['20170101','20170101','20170102','20170102','20170103','20170103','20170103','20170104','20170104','20170105','20170105'],
“关闭”:[1,3,5,1,2,3,5,1,2,2],
“趋势”:np.nan})
数据['diff']=数据['close'].diff()
data.loc[(data['diff'])>0,“trend']=1
data.loc[(data['diff'])小于0,“trend']=-1

如MrT所述,空趋势列使其成为无效数据帧。 我已经用np.nan填充了它

因此:

将熊猫作为pd导入
将numpy作为np导入
data=pd.DataFrame({'stcode':['001','002','001','002','001','001','002','001','002','001','002'],
“贸易数据”:['20170101','20170101','20170102','20170102','20170103','20170103','20170103','20170104','20170104','20170105','20170105'],
“关闭”:[1,3,5,1,2,3,5,1,2,2],
“趋势”:np.nan})
数据['diff']=数据['close'].diff()
data.loc[(data['diff'])>0,“trend']=1
data.loc[(data['diff'])小于0,“trend']=-1

好了,但上面的Yorian答案是一个更好的答案,因为他没有遍历数据帧中的所有记录,所以效率更高

import pandas
data = pandas.DataFrame({'stcode': ['001', '002', '001', '002', '001', '002', '001', '002', '001', '002'], 'trade_dt': ['20170101', '20170101', '20170102', '20170102', '20170103', '20170103', '20170104', '20170104', '20170105', '20170105'], 'close': [1, 3, 5, 1, 2, 3, 5, 1, 2, 2]})
data['trend'] = 0
for i in data.index:
    if i+1 in data.index:
      if data.loc[i+1, 'close'] > data.loc[i, 'close']:
          data.loc[i, 'trend'] = 1
      elif data.loc[i+1, 'close'] < data.loc[i, 'close']:
          data.loc[i, 'trend'] = -1
导入熊猫
数据框({'stcode':['001','002','001','002','001','002','001','002','001','002','002'],'trade_dt':['20170101','20170101','20170102','20170102','20170103','20170104','20170104','20170105','close':[1,3,5,5,2]})
数据['trend']=0
对于data.index中的i:
如果data.index中的i+1:
如果data.loc[i+1',close']>data.loc[i',close']:
data.loc[i,'趋势']=1
elif data.loc[i+1,'close']
好了,但上面的Yorian答案是一个更好的答案,因为他没有遍历数据帧中的所有记录,所以效率更高

import pandas
data = pandas.DataFrame({'stcode': ['001', '002', '001', '002', '001', '002', '001', '002', '001', '002'], 'trade_dt': ['20170101', '20170101', '20170102', '20170102', '20170103', '20170103', '20170104', '20170104', '20170105', '20170105'], 'close': [1, 3, 5, 1, 2, 3, 5, 1, 2, 2]})
data['trend'] = 0
for i in data.index:
    if i+1 in data.index:
      if data.loc[i+1, 'close'] > data.loc[i, 'close']:
          data.loc[i, 'trend'] = 1
      elif data.loc[i+1, 'close'] < data.loc[i, 'close']:
          data.loc[i, 'trend'] = -1
导入熊猫
数据框({'stcode':['001','002','001','002','001','002','001','002','001','002','002'],'trade_dt':['20170101','20170101','20170102','20170102','20170103','20170104','20170104','20170105','close':[1,3,5,5,2]})
数据['trend']=0
对于data.index中的i:
如果data.index中的i+1:
如果data.loc[i+1',close']>data.loc[i',close']:
data.loc[i,'趋势']=1
elif data.loc[i+1,'close']
对不起,这里是说明:stcode表示股票代码;trade_dt指交易日期时间;收盘指股票在该交易日的收盘价;趋势意味着股票价格的上涨或下跌a的要点是你创建了一个重现你的问题的例子,但不包含不相关的信息。请在以后的问题中考虑这一点。谢谢你的建议。对不起,下面是说明:stcode表示股票代码;trade_dt指交易日期时间;收盘指股票在该交易日的收盘价;趋势意味着股票价格的上涨或下跌a的要点是你创建了一个重现你的问题的例子,但不包含不相关的信息。今后的问题请考虑到这一点。谢谢你的建议。