如何使用 pandas 和 python 以及 ta-lib 从许多 csv 构建数据框以计算技术指标
how to use pandas and python and ta-lib to build dataframe from many csv's in order calculate technical indicators
我可以使用下面的代码从单个文件(包含代码、日期、OHLC 和交易量)构建框架,然后使用 TA-lib 构建技术指标。工作正常。我还可以使用“glob”将数千个 csv 组合成一个 blob 并导入到 SQL 中,然后 运行 python 脚本针对 sql(与其他插件)解析值和构建技术指标值,但是,发生的情况是移动平均线不是针对每个交易品种单独计算的,而是只是计算 SQL table 中的所有交易品种(或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")
我相信有两种方法可以做到。如果你想要单独的文件,你只是循环读取你的 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。
尝试第一个修改后的建议代码,看看你会得到什么。
我可以使用下面的代码从单个文件(包含代码、日期、OHLC 和交易量)构建框架,然后使用 TA-lib 构建技术指标。工作正常。我还可以使用“glob”将数千个 csv 组合成一个 blob 并导入到 SQL 中,然后 运行 python 脚本针对 sql(与其他插件)解析值和构建技术指标值,但是,发生的情况是移动平均线不是针对每个交易品种单独计算的,而是只是计算 SQL table 中的所有交易品种(或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")
我相信有两种方法可以做到。如果你想要单独的文件,你只是循环读取你的 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。
尝试第一个修改后的建议代码,看看你会得到什么。