Когда я впервые вошел в дверь анализа данных, я почувствовал, что знаний слишком много, чтобы их можно было дополнить. Не рекомендуется заливать систему всевозможными знаниями, потому что велика вероятность, что она сорвется на полпути.
Ориентация на проект, разобраться в общем процессе и примерно изучить точки знаний, необходимые в процессе, и вернуться, чтобы восполнить пробелы в знаниях в будущем.
Далее я возьму анализ акций в качестве примера, чтобы понять процесс анализа данных.
Лично я думаю, что биржевой анализ есть не что иное, как деление на获取数据
,数据处理
,数据可视化
Три части, основанные на мощных сторонних библиотеках Python с открытым исходным кодом, очень усложняют начало работы.
Требуемые знания
- База
- Python
- окрестности
- anaconda
- Сбор данных
- pandas_datareader
- обработка данных
- numpy
- pandas
- визуализация данных
- matplotlib seaborn
Цель
- Анализируйте тенденции акций
- взаимосвязь между несколькими акциями
Базовый синтаксис Python
рекомендуется посмотретьУчебное пособие по Python от Ляо Сюэфэна, легко понять и легко использовать.
установить анаконду
Anaconda — это дистрибутив Python с открытым исходным кодом, содержащий более 180 научных пакетов и их зависимостей.
Чтобы установить Anaconda, перейдите непосредственно кофициальный сайт анакондыЗагрузить и установить.
После того, как анаконда будет успешно установлена, она будет установлена сама.Jupyter, Jupyter в основном используется для написания и запуска нашего кода.
Создать новую папкуstock-market-analysis
, введите текущий каталог и запустите jupyter.
# 启动 jupyter
conda notebook
Запуск прошел успешно, открываем в браузереhttp://localhost:8888/tree)
, нажмитеnew
, создайте новый блокнот и начните веселиться!
numpy
numpy— это библиотека Python для научных вычислений.
Основное использование
# 引入 numpy
import numpy as np
# 创建一个长度为15,3乘5的二维数组
a = np.arange(15).reshape(3, 5)
# 打印a
a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
# 创建一个长度为15,间隔10,3乘5的二维数组
b = np.arange( 1, 150, 10 ).reshape(3, 5)
# 打印b
b
array([[ 1, 11, 21, 31, 41],
[ 51, 61, 71, 81, 91],
[101, 111, 121, 131, 141]])
# 两个二维数组相加
a + b
array([[ 1, 12, 23, 34, 45],
[ 56, 67, 78, 89, 100],
[111, 122, 133, 144, 155]])
Перейдите на официальный сайт, чтобы узнать больше
pandas
pandasЭто мощный пакет анализа данных Python, основанный на numpy, который предоставляет очень высокоуровневые структуры данных и большое количество методов для обработки данных. Конечная цель состоит в том, чтобы мы лучше понимали и обрабатывали данные.
Основное использование
pandas предоставляет две структуры данных: Series и DataFrame.
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
Series
Серия похожа на словарь, найти соответствующее значение можно по индексу
# 创建一个长度为4,1到10的随机整数
Series(np.random.randint(1,10,4))
0 4
1 2
2 3
3 1
dtype: int64
# 指定index
s = Series(np.random.randint(1,10,4), index=['a','b','c','d'])
s
a 4
b 5
c 5
d 8
dtype: int64
# 根据 index 查找
s['a']
4
DataFrame
DataFrame – это двумерная структура данных, которая может быть представлена строками и столбцами. Думайте об этом как о таблице Excel.
# 生成值为时间的数组
dates = pd.date_range('20130101', periods=6)
dates
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
# 生成 index 为日期,列名为 ABCD 的 DataFrame
df = DataFrame(np.random.randint(1,10,24).reshape(6,4), index=dates, columns=list('ABCD'))
df
A | B | C | D | |
---|---|---|---|---|
2013-01-01 | 4 | 3 | 5 | 3 |
2013-01-02 | 3 | 1 | 1 | 8 |
2013-01-03 | 6 | 1 | 8 | 6 |
2013-01-04 | 8 | 8 | 9 | 2 |
2013-01-05 | 1 | 5 | 1 | 8 |
2013-01-06 | 2 | 4 | 9 | 5 |
Перейдите на официальный сайт, чтобы узнать больше
matplotlib seaborn
matplotlib— очень важная библиотека визуализации данных для Python, иseabornЭто библиотека визуализации, разработанная на основе matplotlib, которая является более мощной и простой в использовании.
Основное использование
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
import seaborn as sns
# 创建一个 Series,1000个从1到100间隔均匀的数组
s = Series(np.linspace(1, 100, 1000))
s.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x1a226a23c8>
# 创建一个 DataFrame,1到10的随机整数,10乘4的二维数组,列名为 a,b,c,d
df = DataFrame(np.random.randint(1,10,40).reshape(10,4),columns=list("abcd"))
df
a | b | c | d | |
---|---|---|---|---|
0 | 3 | 6 | 8 | 9 |
1 | 2 | 6 | 9 | 9 |
2 | 8 | 9 | 2 | 9 |
3 | 7 | 4 | 5 | 4 |
4 | 7 | 9 | 5 | 8 |
5 | 9 | 9 | 3 | 3 |
6 | 5 | 2 | 3 | 1 |
7 | 1 | 8 | 3 | 7 |
8 | 3 | 1 | 7 | 2 |
9 | 2 | 1 | 9 | 7 |
# matpoltlib 画图
df.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x11fe2ab38>
# 对每列进行求和
df_sum = df.sum()
# 指定柱状图
df_sum.plot(kind='bar')
<matplotlib.axes._subplots.AxesSubplot at 0x1a22821668>
# seaborn 画图
index = df_sum.index
values = df_sum.values
sns.barplot(index, values)
<matplotlib.axes._subplots.AxesSubplot at 0x1a229041d0>
Перейдите на официальный сайт matplotlib, чтобы узнать больше.
Перейдите на официальный сайт Seaborn, чтобы узнать больше
Обладая некоторыми базовыми знаниями, приведенными выше, вы можете приступить к анализу акций.
анализ запасов
Этапы анализа акций:
- получить данные
- Обработка данных
- визуализация данных
- анализировать данные
# basic
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
# get data
import pandas_datareader as pdr
# visual
import matplotlib.pyplot as plt
import seaborn as sns
# time
from datetime import datetime
# pandas_datareader 这个库提供 API 来获取股票数据
# get_data_yahoo 代表数据源来自 yahoo,'BABA' 是阿里巴巴的股票代码
df = pdr.get_data_yahoo('BABA')
# 由于数据较多,我们只取头部的五条数据来看
# high 表示最高价,low 表示最低价,open 表示开盘价,close 表示收盘价,volume 表示交易量
df.head()
High | Low | Open | Close | Volume | Adj Close | |
---|---|---|---|---|---|---|
Date | ||||||
2014-09-19 | 99.699997 | 89.949997 | 92.699997 | 93.889999 | 271879400 | 93.889999 |
2014-09-22 | 92.949997 | 89.500000 | 92.699997 | 89.889999 | 66657800 | 89.889999 |
2014-09-23 | 90.480003 | 86.620003 | 88.940002 | 87.169998 | 39009800 | 87.169998 |
2014-09-24 | 90.570000 | 87.220001 | 88.470001 | 90.570000 | 32088000 | 90.570000 |
2014-09-25 | 91.500000 | 88.500000 | 91.089996 | 88.919998 | 28598000 | 88.919998 |
# 我们取五家从2015年1月1号至今的股票数据进行分析
# 'MSFT':微软, 'AAPL':苹果, 'AMZN':亚马逊, 'FB':脸书, 'GOOG':谷歌
start = datetime(2015,1,1)
company = ['MSFT', 'AAPL', 'AMZN', 'FB', 'GOOG']
top_df = pdr.get_data_yahoo(company, start=start)
# 得到一个数据集合,这个数据集合是 pandas.core 数据结构
type(top_df)
pandas.core.frame.DataFrame
# 看一下他们最近几日的收盘价
top_df['Close'].tail()
Symbols | AAPL | AMZN | FB | GOOG | MSFT |
---|---|---|---|---|---|
Date | |||||
2018-10-30 | 213.300003 | 1530.420044 | 146.220001 | 1036.209961 | 103.730003 |
2018-10-31 | 218.860001 | 1598.010010 | 151.789993 | 1076.770020 | 106.809998 |
2018-11-01 | 222.220001 | 1665.530029 | 151.750000 | 1070.000000 | 105.919998 |
2018-11-02 | 207.479996 | 1665.530029 | 150.350006 | 1057.790039 | 106.160004 |
2018-11-05 | 201.589996 | 1627.800049 | 148.679993 | 1040.089966 | 107.510002 |
# 直接用 matplotlib 画它们的股价走势
top_df['Close'].plot()
<matplotlib.axes._subplots.AxesSubplot at 0x1a1741f748>
# 根据他们的股价走势,画出股价波动
top_df_dr = top_df['Close'].pct_change()
top_df_dr.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x1a173004a8>
# 上面的估计波动图太密集,不容易开出问题,我们选亚马逊和谷歌的进行对比
# 利用 seaborn 画出亚马逊和谷歌的散点图
# 每个点对应的横坐标和纵坐标,分别对应谷歌和亚马逊当日的涨跌情况,如果都为负数说明当日股价均为下跌
sns.jointplot('AMZN', 'GOOG', top_df_dr)
<seaborn.axisgrid.JointGrid at 0x1a172d8048>
# 我们还可以利用强大的 seaborn 对五家公司进行相互对比
sns.pairplot(top_df_dr.dropna())
<seaborn.axisgrid.PairGrid at 0x1a1786ada0>