【问题标题】:how to use pandas and python and ta-lib to build dataframe from many csv's in order calculate technical indicators如何使用 pandas、python 和 ta-lib 从许多 csv 构建数据框以计算技术指标
【发布时间】:2021-01-05 20:47:58
【问题描述】:

我可以使用下面的代码从单个文件(包含代码、日期、OHLC 和交易量)构建框架,然后使用 TA-lib 构建技术指标。工作正常。我还可以使用“glob”将数千个 csv 组合成一个 blob 并导入 SQL,然后针对 sql(使用其他插件)运行 python 脚本来解析值并构建技术指标值,但是,正在发生的事情是移动不是单独计算每个符号的平均值,而是只计算 SQL 表(或 csv)中所有符号的平均值,从而搞砸了一切。换句话说,在第 11 行,股票代码已经从 A 变为 B,前 10 行都是股票代码 A,TA-lib 只是使用第 11 行上的数据,就好像它是股票代码 A 数据的一部分但现在,它是股票代码 B。它应该从每个独特的股票代码重新开始。如果我能找到一种方法为每个 csv 文件构建单独的数据框,运行计算,然后输出到数千个新创建的 csv 文件(每个唯一代码一个),这将解决问题。我也可以一起避免 SQL。提前致谢。

import pandas as pd
import talib

csv_file = "C:\\Users\\Bob\\IBM.csv"
df = pd.read_csv(csv_file)

Symbol = df['Symbol']
Date = df['Date']
Open = df['Open']
High = df['High']
Low = df['Low']
Close = df['Close']
Volume = df['Volume']

from talib import SMA,T3

SMA = SMA(Close, timeperiod=5)
print(SMA)

T3 = T3(Close, timeperiod=5, vfactor=0)
print(T3)

total_df = pd.concat([Symbol, Date, Open, High, Low, Close, Volume, SMA, T3])
print(total_df)
total_df.to_csv("test.csv")

**************下面是我最新的代码**************

import pandas as pd
import talib
import glob, os
from talib import SMA, T3
import os

csv_file_list = glob.glob(r"H:\EOD_DATA_RECENT\TEST\\*.csv")

print(csv_file_list)

for csv_file in csv_file_list:
    df = pd.read_csv(csv_file)
    print(df)

df['SMA'] = SMA(df['AdjustedClose'], timeperiod=5)
# print(df['SMA'])

df['T3'] = T3(df['AdjustedClose'], timeperiod=5, vfactor=0)
# print(df['T3'])

print(df)
df.to_csv("test.csv")

【问题讨论】:

  • 欢迎来到 SO!你的问题现在有点不清楚,因为你的代码并没有真正显示你正在尝试做的事情是行不通的,它指的是像 SMA() 和 T3() 这样的东西,如果其他人尝试过,它们就无法重现运行这个。尝试创建一个MCWE

标签: python pandas ta-lib


【解决方案1】:

我相信有两种方法可以做到这一点。如果您想要在循环中读取 csv 文件的单独文件,请执行操作并将文件写入磁盘。另外,我在这里做一些假设......

from talib import SMA,T3 # move this up to the top with other modules

csv_file_list = [however you get list of files]

for csv_file in csv_file_list:
    df = pd.read_csv(csv_file)
    
    #I'm not sure why are reading these into series, I think you can call them directly
    #Symbol = df['Symbol']
    #Date = df['Date']
    #Open = df['Open']
    #High = df['High']
    #Low = df['Low']
    #Close = df['Close']
    #Volume = df['Volume']
    
    df['SMA'] = SMA(df['Close'], timeperiod=5) # create column in df automatically
    print(df['SMA'])
    
    df['T3'] = T3(df['Close'], timeperiod=5, vfactor=0) # create column in df automatically
    print(df['T3'])
    
    # df is already built from above, so don't need next line
    #total_df = pd.concat([Symbol, Date, Open, High, Low, Close, Volume, SMA, T3])
    print(df)
    Symbol = df.Symbol[0]
    fn = Symbol + '_indicators.csv
    df.to_csv(fn) 

第二种方法是将所有 csv 文件读入 dfs 和 concat。如果愿意,您可以将此 df 保存到 csv 'master',然后使用 groupby 通过股票代码获取 SMA 和 T3。如果您有数千个代码,这可能太麻烦了,但确实减轻了读取数千个文件的负担。我根据我正在运行的分析类型来执行这两种方法。只要您正在做的事情编码正确,从计算时间的角度来看,500 个代码的 df 是可以管理的。否则,我一次只看一个代码,然后转到更大的 df。

尝试第一个重新设计的建议代码,看看你想出了什么。

【讨论】:

  • 非常感谢。我正在使用以下内容获取文件列表:
  • 我正在使用 glob.glob 获取文件列表:然后,当我打印第一个数据帧时,我看到目录中列出了两个文件" ['H:\\\\EOD_DATA_RECENT\ \\\TEST\\BCV.csv', 'H:\\\\EOD_DATA_RECENT\\\\TEST\\ERH.csv']。这很好,但是当我打印数据帧或打印 SMA 或 T3 的数据帧时,我只从文件夹 (ERH.csv) 中的第二个文件中获得结果
  • 你能用你所有的更新代码更新帖子吗?
  • import pandas as pd import talib import glob, os from talib import SMA,T3 import os csv_file_list = glob.glob(r"H:\\EOD_DATA_RECENT\\TEST\*.csv") print( csv_file_list) 用于 csv_file_list 中的 csv_file: df = pd.read_csv(csv_file) print(df) df['SMA'] = SMA(df['AdjustedClose'], timeperiod=5) df['T3'] = T3(df[ 'AdjustedClose'], timeperiod=5, vfactor=0)
  • 我不知道如何在这个 cmets 框中格式化代码。我贴的时候还好。我什至不能在此框中使用回车,否则它会提交评论。
猜你喜欢
  • 2016-06-29
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多