通过EOD .csv来迭代,在每个文件中创建一个历史高,低的历史

时间:2016-01-25 06:20:30

标签: python csv pandas quandl

我是蟒蛇新手,但随着我的理解变得更好,我爱上了它。话虽这么说,我已经设法拼凑了一个脚本,将Quandl WIKI EOD数据库转储成每个相应股票的CSV。我在下面(Python 2.7)中包含了这些内容:

import pandas as pd
import Quandl

#this ignores the first symbol in tickers.txt, add a header!
symbols_list = list(pd.read_csv('tickers.txt', index_col=0).T)
print symbols_list

df = {}
for ticker in symbols_list:
    stock = str("WIKI/" + ticker + ".11")
    #print stock
    print str(ticker + ".csv")
    df[ticker] = Quandl.get(stock, authtoken="XXXXXXXXXXXXX", trim_start="2016-01-01")
    df[ticker].to_csv(str(ticker + ".csv"))

我的下一个目标是为每个库存csv创建一个历史运行的高低列。这样可以轻松创建历史悠久的燃气表"对于股票市场类似于http://www.finviz.com/的股票市场。新的高/新低规格非常有用。当2000多只股票创下新低时,只有少数股票再创新高,因此很容易判断出抛售的难度。

到目前为止,我已经设法遍历我的工作文件夹中的每个.csv,并保持每个新的高/新低的记录。我挂断了正确的方法将这些信息作为新列输入到每个csv中。 EOD CSV有['日期',' Adj。关闭每个标题,我希望添加['高','低']。

到目前为止我的代码:

import os
import pandas as pd

csv = [f for f in os.listdir('.') if f.endswith('.csv')]
print csv
for i in csv:
    df = pd.read_csv(i, index_col=0, parse_dates=True)
    print df
    j=0
    k=0
    for i in df['Adj. Close']: #for each value in adj close
        if j==0:
            j=i
            k=i

        elif i>j:
            j=i #high

        elif i<k:
            k=i #low

        print j,k #print high & low

我真的很感谢你的帮助! 所有的代码片段和回答的问题都让学习python变得更加愉快。

到目前为止,这是脚本的输出:

['A.csv', 'AA.csv']
            Adj. Close
Date                  
2016-01-04       40.69
2016-01-05       40.55
2016-01-06       40.73
2016-01-07       39.00
2016-01-08       38.59
2016-01-11       37.94
2016-01-12       38.19
2016-01-13       36.86
2016-01-14       37.61
2016-01-15       37.11
2016-01-19       37.20
2016-01-20       37.26
2016-01-21       37.23
2016-01-22       37.98
40.69 40.69
40.69 40.55
40.73 40.55
40.73 39.0
40.73 38.59
40.73 37.94
40.73 37.94
40.73 36.86
40.73 36.86
40.73 36.86
40.73 36.86
40.73 36.86
40.73 36.86
40.73 36.86
            Adj. Close
Date                  
2016-01-04        9.71
2016-01-05        9.27
2016-01-06        8.61
2016-01-07        8.27
2016-01-08        8.07
2016-01-11        8.00
2016-01-12        7.28
2016-01-13        7.13
2016-01-14        7.24
2016-01-15        6.90
2016-01-19        6.74
2016-01-20        6.74
2016-01-21        7.09
2016-01-22        6.87
9.71 9.71
9.71 9.27
9.71 8.61
9.71 8.27
9.71 8.07
9.71 8.0
9.71 7.28
9.71 7.13
9.71 7.13
9.71 6.9
9.71 6.74
9.71 6.74
9.71 6.74
9.71 6.74

这段代码很精彩:

import os
import pandas as pd

csv = [f for f in os.listdir('.') if f.endswith('.csv')]
print csv
for i in csv:
    df = pd.read_csv(i, index_col=0, parse_dates=True)
    #print df
    df['High'] = pd.rolling_max(df['Adj. Close'], window=df.shape[0], min_periods=1)
    df['Low'] = pd.rolling_min(df['Adj. Close'], window=df.shape[0], min_periods=1)
    #print df

    g = os.path.normcase(os.path.join(os.path.dirname(__file__), i)) #os.getcwd()
    print 'full path =', g
    with open(g , "w") as f:
        df.to_csv(f)

现在,我将看到创建每天新高/新低的历史列表

2 个答案:

答案 0 :(得分:1)

您可以将df - shape的长度用作rolling_minrolling_maxwindow

print df
          Date  Adj. Close
0   2016-01-04        9.71
1   2016-01-05        9.27
2   2016-01-06        8.61
3   2016-01-07        8.27
4   2016-01-08        8.07
5   2016-01-11        8.00
6   2016-01-12        7.28
7   2016-01-13        7.13
8   2016-01-14        7.24
9   2016-01-15        6.90
10  2016-01-19        6.74
11  2016-01-20        6.74
12  2016-01-21        7.09
13  2016-01-22        6.87

df['high'] = pd.rolling_max(df['Adj. Close'], window=df.shape[0], min_periods=1)
df['low'] = pd.rolling_min(df['Adj. Close'], window=df.shape[0], min_periods=1)
print df
          Date  Adj. Close  high   low
0   2016-01-04        9.71  9.71  9.71
1   2016-01-05        9.27  9.71  9.27
2   2016-01-06        8.61  9.71  8.61
3   2016-01-07        8.27  9.71  8.27
4   2016-01-08        8.07  9.71  8.07
5   2016-01-11        8.00  9.71  8.00
6   2016-01-12        7.28  9.71  7.28
7   2016-01-13        7.13  9.71  7.13
8   2016-01-14        7.24  9.71  7.13
9   2016-01-15        6.90  9.71  6.90
10  2016-01-19        6.74  9.71  6.74
11  2016-01-20        6.74  9.71  6.74
12  2016-01-21        7.09  9.71  6.74
13  2016-01-22        6.87  9.71  6.74

答案 1 :(得分:0)

你需要pandas rollingmax和rollingmin函数! : - )

http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.rolling_max.html