【问题标题】:Loop through column with only one function循环遍历只有一个功能的列
【发布时间】:2018-07-10 13:34:15
【问题描述】:

我有一个 Trend_1 、 Trend_2 、 Trend_3 ....到 Trend_2_3。从那我想运行一个返回信号的函数。该功能运行良好,只是我必须多次重复以下代码但只是更改名称。代码相同,只是我必须从 df['Signal_1'] 重复到 df['Signal_2_3']手动。只是想知道任何其他可以返回可以立即读取趋势列的函数的方法

这是我的函数代码,它返回一个信号_1 到信号_2_3

def Signal_processing(df):

signal_1= [None]
for i in range (1,len(df)):
    if df['Trend_1'][i]== 'Up' and df['Trend_1'][i] != df['Trend_1'][i-1]:
        signal_1 += ['Buy']
    elif df['Trend_1'][i] =='Down' and df['Trend_1'][i]!= df['Trend_1'][i-1]:
        signal_1 += ['Sell']
    else :
        signal_1 += [None]

df['Signal_1'] = signal_1 

index=[]
bs=[]
for i in range (len(df)):
    if df['Signal_1'][i] == 'Buy' or df['Signal_1'][i] == 'Sell':
        bs.append(df['Signal_1'][i])
        index.append(i)

for i in range (1,len(bs)):
    if bs[i] == bs[i-1]:
        df['Signal_1'][index[i]]='None'

这样的代码将重复 7 次,只是名称不同。

signal_7=[None]
for i in range (1,len(df)):
    if df['Trend_2_3'][i]=='Up' and df['Trend_2_3'][i]!= df['Trend_2_3'][i-1] :
        signal_7 += ['Buy']
    elif df['Trend_2_3'][i] == 'Down' and df['Trend_2_3'][i]!= df['Trend_2_3'] [i-1]:
        signal_7 += ['Sell']
    else:
        signal_7 += [None]
df['Signal_2_3'] = signal_7   

    index=[]
bs=[]
for i in range (len(df)):
    if df['Signal_2_3'][i] == 'Buy' or df['Signal_2_3'][i] == 'Sell':
        bs.append(df['Signal_2_3'][i])
        index.append(i)

for i in range (1,len(bs)):
    if bs[i] == bs[i-1]:
        df['Signal_2_3'][index[i]]='None'              

return df 

【问题讨论】:

  • 您说“这样的代码将重复 7 次,但名称不同。”,您的意思是 'Trend_1' ...等吗?如果是这样,您是否考虑过将该代码放入函数中并添加参数“名称”?
  • 这意味着我手动重复代码,但只有 df['Trend_1'] 将更改为 df['Trend_2']、df['Trend_3'] 等。代码相同除了 df['Trend_1'] 将从 df['Trend_1'] 重复到 df['Trend_7']
  • df 是熊猫数据框吗?无论df 是什么,大多数数据对象都允许您获取列列表,以便在不知道列名的情况下迭代它们。当前接受的答案将起作用,但如果您添加新列或删除现有列,您的代码将中断。如果您动态地遍历列,则不会。

标签: python python-3.x python-2.7 function loops


【解决方案1】:

你可以改变函数调用

def Signal_processing(df):
    # do some stuff for all trends

def Signal_processing(df):
    sub_signal_processing(df,"1")
    sub_signal_processing(df,"2")
    sub_signal_processing(df,"2_3")
    #etc

def sub_signal_processing(df, no):
    # do some stuff for a specific trend specified by the string 'no'
    # If no = "7", then Trend_7 will be processed to Signal_7,
    # If no = "2_3", then Trend_2_3 will be processed to Signal_2_3 etc.

然后更改每个实例,例如Trend_2_3 和 Signal_2_3 的方式如下:

# Former specific call
df['Trend_2_3']
df['Signal_2_3']
# The same call if no = "2_3"
df['Trend_%s' % no]
df['Signal_%s' % no]

no 是一个字符串。然后,您需要从处理的 Signal_processing 中移动所有内容,例如Trend_1 向下进入 sub_signal_processing 并用上面指定的通用版本替换 _1。下面的代码应该做你想做的:

def Signal_processing(df):
    # Could add more here
    for no in ("1", "2", "3", "1_2_3", "1_2", "1_3", "2_3"):
        sub_signal_processing(df, no)

def sub_signal_processing(df, no):
    signal= [None]
    for i in range (1,len(df)):
        if df['Trend_%s' % no][i]== 'Up' and df['Trend_%s' % no][i] != df['Trend_%s' % no][i-1]:
            signal += ['Buy']
        elif df['Trend_%s' % no][i] =='Down' and df['Trend_%s' % no][i]!= df['Trend_%s' % no][i-1]:
            signal += ['Sell']
        else :
            signal += [None]

    df['Signal_%s' % no] = signal

    index=[]
    bs=[]
    for i in range (len(df)):
        if df['Signal_%s' % no][i] == 'Buy' or df['Signal_%s' % no][i] == 'Sell':
            bs.append(df['Signal_%s' % no][i])
            index.append(i)

    for i in range (1,len(bs)):
        if bs[i] == bs[i-1]:
            df['Signal_%s' % no][index[i]]='None'

【讨论】:

  • # 为字符串'no'指定的特定趋势做一些事情
  • 如何编辑或更改原始代码中的某些内容并将其放在 sub_signal_processing 下?
  • 它给了我很大的帮助!非常感谢人!真的很感激
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 2013-06-22
相关资源
最近更新 更多