2012-11-20 70 views
1

尋找一些小項目的幫助。我正在學習Python,而且我完全迷失在一個問題上。請讓我解釋一下。在Python中導入CSV和分析

我有一個包含'Apple股價'的csv文件,到目前爲止我可以使用csv模塊導入Python,但是,我需要分析數據並生成每月平均值並確定最佳和最差的6個月。我的csv列是日期,價格。

非常感謝幫助。

"Date","Open","High","Low","Close","Volume","Adj Close" 
"2012-11-14",660.66,662.18,650.5,652.55,1668400,652.55 
"2012-11-13",663,667.6,658.23,659.05,1594200,659.05 
"2012-11-12",663.75,669.8,660.87,665.9,1405900,665.9 
"2012-11-09",654.65,668.34,650.3,663.03,3114100,663.03 
"2012-11-08",670.2,671.49,651.23,652.29,2597000,652.29 
"2012-11-07",675,678.23,666.49,667.12,2232300,667.12 
"2012-11-06",685.48,686.5,677.55,681.72,1582800,681.72 
"2012-11-05",684.5,686.86,675.56,682.96,1635900,682.96 
"2012-11-02",694.79,695.55,687.37,687.92,2324400,687.92 
"2012-11-01",679.5,690.9,678.72,687.59,2050100,687.59 
"2012-10-31",679.86,681,675,680.3,1537000,680.3 
"2012-10-26",676.5,683.03,671.2,675.15,1950800,675.15 
"2012-10-25",680,682,673.51,677.76,2401100,677.76 
"2012-10-24",686.8,687,675.27,677.3,2496500,677.3 

等等

+1

你能告訴我們一些輸入數據和你到目前爲止的代碼嗎?什麼阻止了你? –

+1

查看http://stackoverflow.com/a/5830435/299031使用namedtuples加載csv數據 – rorycl

+2

查看[pandas](http://pandas.pydata.org/)庫,它可讓您將CSV數據加載到一個表格結構,你可以很容易地計算平均值等等。 – BrenBarn

回答

1

您已經閱讀項目,並在列表保存到[月份,mean_price]對後,可以對列表進行排序:

import operator 
values_list.sort(key=operator.itemgetter(1)) 

這將整理價格按價格。爲了獲得最高的n個值:

print values_list[-n:] 

或者底部N:

print values_list[:n] 
+0

我認爲最後兩個代碼片斷是錯誤的順序。然而,操作是要求每月的平均值,而不是第一或最後的值。 – bmu

+0

我認爲正確順序的最後一個片段。排序將最低的項目放在第一位,因此採取列表的尾部可以讓您獲得最大的價值。沒錯,我沒有看到op的日期是幾天而不是幾個月。編輯答案。 – BoppreH

+0

好吧,我明白了,你是對的。但是如果你說'最高n值'並切分最後的值,那就有點奇怪了。 – bmu

2

隨着pandas這將是

In [28]: df = pd.read_csv('my_data.csv', parse_dates=True, index_col=0, sep=',') 

In [29]: df 
Out[29]: 
       Open High  Low Close Volume Adj Close 
Date               
2012-11-14 660.66 662.18 650.50 652.55 1668400  652.55 
2012-11-13 663.00 667.60 658.23 659.05 1594200  659.05 
2012-11-12 663.75 669.80 660.87 665.90 1405900  665.90 
2012-11-09 654.65 668.34 650.30 663.03 3114100  663.03 
2012-11-08 670.20 671.49 651.23 652.29 2597000  652.29 
2012-11-07 675.00 678.23 666.49 667.12 2232300  667.12 
2012-11-06 685.48 686.50 677.55 681.72 1582800  681.72 
2012-11-05 684.50 686.86 675.56 682.96 1635900  682.96 
2012-11-02 694.79 695.55 687.37 687.92 2324400  687.92 
2012-11-01 679.50 690.90 678.72 687.59 2050100  687.59 
2012-10-31 679.86 681.00 675.00 680.30 1537000  680.30 
2012-10-26 676.50 683.03 671.20 675.15 1950800  675.15 
2012-10-25 680.00 682.00 673.51 677.76 2401100  677.76 
2012-10-24 686.80 687.00 675.27 677.30 2496500  677.30 

In [30]: monthly = df.resample('1M') 

In [31]: monthly 
Out[30]: 
       Open  High  Low  Close Volume Adj Close 
Date                 
2012-10-31 680.790 683.2575 673.745 677.6275 2096350 677.6275 
2012-11-30 673.153 677.7450 665.682 670.0130 2020510 670.0130 

可以比排序爲列你想

In [33]: monthly.sort('Close') 
Out[33]: 
       Open  High  Low  Close Volume Adj Close 
Date                 
2012-11-30 673.153 677.7450 665.682 670.0130 2020510 670.0130 
2012-10-31 680.790 683.2575 673.745 677.6275 2096350 677.6275 

你甚至可以從雅虎財務取數據:

In [37]: from pandas.io import data as pddata 

In [40]: df = pddata.DataReader('AAPL', data_source='yahoo', start='2012-01-01') 

In [41]: df.resample('1M').sort('Close') 
Out[44]: 
        Open  High   Low  Close   Volume Adj Close 
Date                     
2012-01-31 428.760000 431.008500 425.810500 428.578000 12249740.000000 424.804500 
2012-02-29 494.803000 500.849000 491.437500 497.571000 20300990.000000 493.191000 
2012-11-30 560.365385 566.118462 548.523846 555.789231 24861884.615385 554.970769 
2012-05-31 565.785000 572.141364 558.397273 564.673182 18029781.818182 559.702273 
2012-06-30 574.660952 578.889048 569.213333 574.562381 13360247.619048 569.504762 
2012-03-31 576.858182 582.064545 570.245909 577.507727 25299250.000000 572.424545 
2012-07-31 599.610000 604.920952 594.680476 601.068095 15152466.666667 595.776667 
2012-04-30 609.607500 615.487500 598.650000 606.003000 27855340.000000 600.668500 
2012-10-31 638.667143 643.650476 628.213810 634.714286 20651071.428571 631.828571 
2012-08-31 641.527826 646.655217 637.138261 642.696087 12851252.173913 639.090870 
2012-09-30 682.118421 687.007895 676.095263 681.568421 17291363.157895 678.470526