Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在数据帧上应用函数_Python 3.x_Pandas_Pandas Datareader - Fatal编程技术网

Python 3.x 在数据帧上应用函数

Python 3.x 在数据帧上应用函数,python-3.x,pandas,pandas-datareader,Python 3.x,Pandas,Pandas Datareader,在数据帧上应用函数 我有一个代码(C01),用于计算股票交易所(IBOV-B3-BRAZIL)上给定股票(个人)的移动平均数(21个周期)。然后,我创建了一个for循环,在该循环中,它确定资产在6个高点之后处于上升趋势,然后是移动平均线(假设,考虑到有更多的变量来确定这一点) 但是,我希望对多个资产执行此循环,在本例中为C02,也就是说,它在代码的每一列中应用一个函数,并仅返回呈上升趋势的资产的名称(在本例中为列名)。我尝试将for循环转换为一个函数,并使用pandas“apply”将该函数应用

在数据帧上应用函数

我有一个代码(C01),用于计算股票交易所(IBOV-B3-BRAZIL)上给定股票(个人)的移动平均数(21个周期)。然后,我创建了一个for循环,在该循环中,它确定资产在6个高点之后处于上升趋势,然后是移动平均线(假设,考虑到有更多的变量来确定这一点)

但是,我希望对多个资产执行此循环,在本例中为C02,也就是说,它在代码的每一列中应用一个函数,并仅返回呈上升趋势的资产的名称(在本例中为列名)。我尝试将for循环转换为一个函数,并使用pandas“apply”将该函数应用于每个列(axis=1,我尝试了tbm axis=“columns”)。但是我在创建函数时出错。当我使用apply执行函数时,会出现消息“ValueError:长度必须匹配才能比较”。我怎样才能解决这个问题

谢谢你的关注

import numpy as np
import pandas as pd
from pandas_datareader import data as wb
from mpl_finance import candlestick_ohlc
from pandas_datareader import data as wb
from datetime import datetime
import matplotlib.dates as mpl_dates
import matplotlib.pyplot as plt
import matplotlib.dates as mdates 

#STOCK
ativo = 'WEGE3.SA'
acao2 = ativo.upper()

#START AND END ANALYSIS
inicio = '2020-1-1'
fim = '2021-1-27'

#MAKE DATAFRAME
df00 = wb.DataReader(acao2, data_source='yahoo', start=inicio, end=fim)

df00.index.names = ['Data']
df= df00.copy(deep=True)
df['Data'] = df.index.map(mdates.date2num)

# MOVING AVERAGE
df['ema21'] = df['Close'].ewm(span=21, adjust=False).mean()
df['ema72'] = df['Close'].ewm(span=72, adjust=False).mean()

#DF PLOT
df1=df
df2=df[-120:]

#TREND RULE
alta=1
for i in range(6):
  if(df2.ema21[-i-1] < df2.ema21[-i-2]):
    alta=0

baixa=1
for i in range(6):
  if(df2.ema21[-i-1] > df2.ema21[-i-2]):
    baixa=0

if (alta==1 and baixa==0):
  a1 = ativo.upper()+ ' HIGH TREND'
elif (alta==0 and baixa==1):
  a1 = ativo.upper()+ ' LOW TREND!'
else:
  a1 = ativo.upper()+ ' UNDEFINED'
  
#PLOT RESULTS
print("---------------------------------------") 
print(a1)
print("---------------------------------------")

ohlc = df[['Data', 'Open', 'High', 'Low', 'Close']]

f1, ax = plt.subplots(figsize=(14, 8))

# plot the candlesticks
candlestick_ohlc(ax, ohlc.values, width=.6, colorup='green', colordown='red')
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))

label_ = acao2.upper() + ' EMA26'
label_2 = acao2.upper() + ' EMA09'
ax.plot(df.index, df1['ema21'], color='black', label=label_)
ax.plot(df.index, df1['ema72'], color='blue', label=label_)

ax.grid(False)
ax.legend()
ax.grid(True)

plt.title(acao2.upper() + ' : Gráfico Diário')
plt.show(block=True)

#C02

#START/END ANALISYS
inicio = '2020-1-1'
fim = '2021-1-27'

#STOCKS
ativos = ['SAPR11.SA','WEGE3.SA']

#DATAFRAME
mydata = pd.DataFrame()
for t in ativos:
    mydata[t] = wb.DataReader(t, data_source='yahoo', start=inicio, end=fim)['Close']
df2 = mydata

#MOVING AVERAGE
df3 = df2.apply(lambda x: x.rolling(window=21).mean())

#MAKE FUNCTION
def trend(x):
  tendencia_alta=1
  for i in range(6):
    if(df3.columns[-i-1:] > df3.columns[-i-2:]):
      tendencia_alta=0

  print()
  if (alta==1 and baixa==0):
      a1 = ativo.upper()+ ' HIGH TREND'
  elif (alta==0 and baixa==1):
      a1 = ativo.upper()+ ' LOW TREND!'
  else:
      a1 = ativo.upper()+ ' UNDEFINED'

#TRYING TO APPLY THE FUNCTION IN EVERY DF3 COLUMN
df3.apply(trend, axis=1)´´´
将numpy导入为np
作为pd进口熊猫
从数据读取器将数据作为wb导入
来自mpl_finance进口烛台ohlc
从数据读取器将数据作为wb导入
从日期时间导入日期时间
将matplotlib.dates导入为mpl_日期
将matplotlib.pyplot作为plt导入
将matplotlib.dates导入为mdates
#股票
ativo='WEGE3.SA'
acao2=上一代
#起点和终点分析
inicio='2020-1-1'
职能指令手册='2021-1-27'
#生成数据帧
df00=wb.DataReader(acao2,数据来源=yahoo',开始=inicio,结束=fim)
df00.index.names=['Data']
df=df00.copy(deep=True)
df['Data']=df.index.map(mdates.date2num)
#移动平均线
df['ema21']=df['Close'].ewm(span=21,adjust=False).mean()
df['ema72']=df['Close'].ewm(span=72,adjust=False).mean()
#测向图
df1=df
df2=df[-120:]
#趋势规律
alta=1
对于范围(6)中的i:
如果(df2.ema21[-i-1]df2.ema21[-i-2]):
baixa=0
如果(alta==1和baixa==0):
a1=主动上()
elif(alta==0和baixa==1):
a1=ativo.upper()+“低趋势!”
其他:
a1=ativo.upper()+“未定义”
#绘图结果
打印(“---------------------------------------”)
印刷品(a1)
打印(“---------------------------------------”)
ohlc=df[[‘数据’、‘打开’、‘高’、‘低’、‘关闭’]]
f1,ax=plt.子批次(figsize=(14,8))
#画烛台
烛台_ohlc(ax,ohlc.values,width=.6,colorup='绿色',colordown='红色'))
ax.xaxis.set\u major\u格式化程序(mdates.DateFormatter(“%Y-%m”))
标签=acao2.upper()+'EMA26'
label_2=acao2.upper()+'EMA09'
ax.plot(df.index,df1['ema21'],color='black',label=label_)
ax.plot(df.index,df1['ema72'],color='blue',label=label)
ax.grid(假)
ax.图例()
ax.grid(真)
plt.title(acao2.upper()+':Gráfico Diário')
plt.show(块=真)
#二氧化碳
#开始/结束分析
inicio='2020-1-1'
职能指令手册='2021-1-27'
#股票
ativos=['SAPR11.SA','WEGE3.SA']
#数据帧
mydata=pd.DataFrame()
对于Tivos中的t:
mydata[t]=wb.DataReader(t,data_source='yahoo',start=inicio,end=fim)['Close']
df2=mydata
#移动平均线
df3=df2.apply(lambda x:x.rolling(window=21.mean())
#制造功能
def趋势(x):
倾向性=1
对于范围(6)中的i:
如果(df3.columns[-i-1:]>df3.columns[-i-2:]):
倾向性=0
打印()
如果(alta==1和baixa==0):
a1=主动上()
elif(alta==0和baixa==1):
a1=ativo.upper()+“低趋势!”
其他:
a1=ativo.upper()+“未定义”
#尝试在每个DF3列中应用该函数
df3.应用(趋势,轴=1)`
类似于:

def myfunc(x):
   #do things here where x is the group of rows sent to function
   #instead of df['column'], you'll use x['column'] 
   #because you are passing the rows into x
   return x

df.groupby('yourcolumn').apply(myfunc)