【问题标题】:Stock data mining for a company一家公司的股票数据挖掘
【发布时间】:2019-11-23 07:10:03
【问题描述】:

python 新手,有一个问题需要解决,我遇到了障碍。 希望计算 Google 的月度和年度平均价格,并告诉我们从 2004 年到 2019 年 10 月 Google 最好和最差的六个月以及最好和最差的六年 平均价格定义为 ((v1*c1)+(v2*c2)+(v3*c3)+(v4*c4)...+(vn*cn)) / (v1+v2+v3+v4。 ..+vn) 其中 vi 是第 i 天的交易量,ci 是第 i 天的调整收盘价。

我已经能够从网络上导入数据,但现在我试图至少将一年变成一个元组,然后从中解决,但不知道如何将我拥有的数据转换为一个元组。 我尝试 function = tuple 但得到错误。我知道如何创建一个元组,但不知道如何从我拥有的数据中创建一个元组,或者我是否缺少将数据放入一个元组的步骤,或者我是否偏离了这种方法

这是我到目前为止的代码,如果有人能指出我正确的方向,将不胜感激

# url = "http://193.1.33.31:88/pa1/GOOGL.csv"


import csv

import begin
from read_from_file_or_net import get_stuff_from_net as gn

def main(csv_file: 'URL of CSV file'):
# def main(csv_file):

    try:
        print(f"{csv_file}")
        my_file = gn(csv_file)
        # with open(f".cache/{my_file}", "w") as output:
        #     output.write(my_file)

        my_file = my_file.split("\n")

        for row in my_file:
            row = row.strip().split(",")
            for cell in row:
                if cell.isalpha():
                    print(f"{cell}"+"", end="")
                elif "-" in cell:
                    print(f"{cell}", end="")
                elif "." in cell:
                    print(f"{float(cell):>10.2f}", end="")
                elif cell.isnumeric():
                    print(f"{int(cell):>15d}", end="")
                elif not cell.isspace():
                    print(f"{cell}", end="  ")
                #elif cell.istitle():
                   # print(f"{cell}", end="")
                #else:
                    #print("?", end="")
            print()

    except Exception as e:
        print(f"{e}")


if __name__ == "__main__":
    main("http://193.1.33.31:88/pa1/GOOGL.csv")

【问题讨论】:

  • 也许更好地使用 pandas - df = pandas.read_csv('http://193.1.33.31:88/pa1/GOOGL.csv') - 你得到的都是 DataFrame (table/array) 有许多强大的功能。
  • 将 csv 中的数据转换为我尝试过的元组 main("http://193.1.33.31:88/pa1/GOOGL.csv") = tup_year_avg2019
  • 您尝试将某个值 tup_year_avg2019 分配给函数 main() 的结果 - 这在任何语言中都不正确。也许您的意思是tup_year_avg2019 = main(),但它需要将数据放在列表中,而不是打印它们,然后使用return 将它们发回。
  • 感谢@furas 的建议,除了阅读它之外,我没有使用熊猫的经验,但据我所见,它可能会让我的生活更轻松,但我认为这样做可能会更好学习经验,但我可能完全错了
  • 如果你想学习Python的基础,你可以尝试自己做。稍后你可以学习如何使用pandas 进行操作,因为pandas 非常强大 - 所以知道它很好 - 而且它可能非常复杂 - 所以还需要时间来学习它。

标签: python


【解决方案1】:

您应该为此使用pandas。它有很多强大的功能,不需要for-loop。

您可以直接从网页阅读csv

import pandas as pd

df = pd.read_csv('http://193.1.33.31:88/pa1/GOOGL.csv')

print(df.columns)
print(df.head())

您可以选择一年 - 即。 2018

year2018 = df[ (df['Date'] >= '2018-01-01') & (df['Date'] < '2019-01-01') ]

然后计算你的价值

result = (year2018['Volume'] * year2018['Adj Close']).sum() / year2018['Volume'].sum()

print(result)

编辑:其他年份的 Silimar

for year in range(2004, 2019):
    year = str(year)
    data = df[ df['Date'].str.startswith(year) ]
    result = (data['Volume'] * data['Adj Close']).sum() / data['Volume'].sum()

    print(year, result)

结果:

2004 80.44437157567273
2005 137.4076040074354
2006 203.03824165240846
2007 273.04059204266287
2008 227.86912213843564
2009 206.71221450434697
2010 268.65533171697064
2011 283.70689930771306
2012 322.70466840310667
2013 437.32701278816154
2014 567.9540540371448
2015 623.3613056057101
2016 757.9295821975054
2017 940.267270383813
2018 1115.287148437416

编辑:如果您将结果保留为元组(result, year),那么您可以对它们进行排序以获得最好和最差的年份

import pandas as pd

df = pd.read_csv('http://193.1.33.31:88/pa1/GOOGL.csv')
#df['Date'] = pandas.to_datetime(df['Date'])

#print(df.columns)

year2018 = df[ (df['Date'] >= '2018-01-01') & (df['Date'] < '2019-01-01') ]

result = (year2018['Volume'] * year2018['Adj Close']).sum() / year2018['Volume'].sum()

#print(result)

all_results = []
for year in range(2004, 2019):
    year = str(year)
    data = df[ df['Date'].str.startswith(year) ]
    result = (data['Volume'] * data['Adj Close']).sum() / data['Volume'].sum()

    all_results.append( (result, year) )
    #print(year, result)

print('--- sorted by result ---')

sorted_results = sorted(all_results)

for result, year in sorted_results:
    print(year, result)

结果:

--- sorted by result ---
2004 80.44437157567273
2005 137.4076040074354
2006 203.03824165240846
2009 206.71221450434697
2008 227.86912213843564
2010 268.65533171697064
2007 273.04059204266287
2011 283.70689930771306
2012 322.70466840310667
2013 437.32701278816154
2014 567.9540540371448
2015 623.3613056057101
2016 757.9295821975054
2017 940.267270383813
2018 1115.287148437416

使用切片sorted_results[:6] 可以获得最差的六年,使用sorted_results[-6:] 可以获得最好的六年。如果你想要不同的顺序,你也可以使用reversed()


编辑:几乎没有pandas

import requests
import csv

def main(url):
    r = requests.get(url)

    lines = r.text.split('\n')

    headers = lines[0].split(',')

    data = []

    for line in lines[1:]:
        line = line.strip()
        if line: # skip empty lines
            row = line.strip().split(',')

            # convert string to float/int
            row[1] = float(row[1])
            row[2] = float(row[2])
            row[3] = float(row[3])
            row[4] = float(row[4])
            row[5] = float(row[5])
            row[6] = int(row[6])

            data.append(row)

    return headers, data


if __name__ == "__main__":    
    headers, data = main('http://193.1.33.31:88/pa1/GOOGL.csv')

    print(headers)

    print('--- data ---')
    print(data[0])
    print(data[-1])

    # get only year 2018

    year2018 = []
    for row in data:
        if '2018-01-01' <= row[0] < '2019-01-01':
           year2018.append(row)

    print('--- year 2018 ---')
    print(year2018[0])
    print(year2018[-1])

    # your calculation

    a = 0
    b = 0
    for row in year2018:
        a += row[5] * row[6]
        b += row[6]

    result = a/b

    print(result)

【讨论】:

  • 只是出于好奇,如何有效地使用滚动窗口来完成这项工作?如果他要求最好的六个月,那不能从每个月的开始计算六个月吗?
  • @poorpractice 一开始我只做了一年,后来我把它调整为所有年份。后来我添加了排序和切片,只得到了六年。所以我没有考虑如何以更有效的方式立即完成。我只是在考虑groupby,但最后我一次跳过了它,因为对于初学者来说太多新东西了:)如果你知道如何更有效地做到这一点,那么将它添加为另一个答案——它对 OP 和其他用户很有用.
猜你喜欢
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 2023-04-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
相关资源
最近更新 更多