个人笔记~
pandas、matplotlib库
1.读取文件
df = pd.read_csv("I:\Anacoda3\AcondaProject\data\MAOTAI.CSV")
2.单张数据
用法: df[‘列名’].函数名
目的: 求【取决于函数功能】
df = pd.read_csv("I:\Anacoda3\AcondaProject\data\MAOTAI.CSV")
print(df['Volume'].max())
print (df['Volume'].mean())
用法: ①df[‘列名’].plot ②df.plot()
目的: ①取列名数据进行画图 ②默认取所有列名画图
#df[['Close','Volume']].plot()
#df.plot()
3.创建DataFrame
DataFrame:可以理解成一个二维数组的表格或者矩阵,需要设置index,columns(理解成行、列),这样就可以通过两者定位某个数据。也可以通过其中之一进行更多操作。
#pd.date_range(开始时间,结束时间),也可以pd.date_range(开始时间,periods=数字)
dates = pd.date_range(start_date,end_date)
#以时间作为索引,创建一个空的DataFrame
df1=pd.DataFrame(index=dates)
#把指数数据读入(这里的指数不是数学里的那个指数,仅仅是一个表中的属性或者理解成列)
#这个是只读指定的数据,取:
#index_col='Date' 以MAOTAI.CSV 文件中的 Date 为索引,可以理解成这些行的数据都取到了
#usecols=['Date','Adj Close'] 取指数:也就是 取MAOTAI.CSV 文件中的 列名为Date、Adj Close所在列的数据
#parse_dates=True,将所取的这些列解析为 **时间索引**
dfMT = pd.read_csv("I:\Anacoda3\AcondaProject\data\MAOTAI.CSV",index_col='Date',
usecols=['Date','Adj Close'],parse_dates=True)
#把 取到的MAOTAI的数据 dfMT 放进DataFrame
df1=df1.join(dfMT)
#去掉空的数据
df1=df1.dropna()
3.多个文件数据处理
import pandas as pd
import os
def symbol_to_path(symbol, base_dir="I:\Anacoda3\AcondaProject\data"):
#调用这个函数:传入一个文件名symbol,就会返回该文件的目录
#base_dir 是你的文件的父目录,也就是你的文件在哪个文件夹下
#symbol 是你要读取的文件名
return os.path.join(base_dir,"{}.CSV".format(str(symbol)))
def get_data(symbols,dates):
#函数作用:传入文件名,日期作为索引,返回对应读取的数据放入同一个DataFrame表中
df = pd.DataFrame(index = dates)
#循环遍历文件
for symbol in symbols:
# 因为要读多个文件中的数据,所以用df_temp来暂时存放每次循环读出的数据
df_temp=pd.read_csv(symbol_to_path(symbol),index_col='Date',
usecols=['Date','Adj Close'],parse_dates=True)
#多个数据放入同一个DataFrame中,列名不能重复,所以进行改名
df_temp=df_temp.rename(columns = {'Adj Close':symbol})
#将每次按条件读取到的数据放入DataFrame中,并去除空的数据,dropna()
df = df.join(df_temp)
df = df.dropna()
#返回DataFrame,注意这个return的位置,别放在for循环里了!!!
return df
def test_run():
symbols = ['MAOTAI','PINGAN']
dates=pd.date_range('2019-07-01',periods=10)
df = get_data(symbols,dates)
print(df)
test_run()
4.根据所得多个文件中的数据进行画图
在上述基础上加两个函数,再测试方法中调用,就可以了
def plot_data(df,title='Stock Prices'):
#函数作用:传入DataFrame,并设置图的名称title为 Stock Prices,进行画图
a=df.plot(title=title,fontsize=12)
#设置x,y坐标名称,并设置字体大小
a.set_xlabel("Date",fontsize=12)
a.set_ylabel("Price",fontsize=12)
plt.show()
#归一化,使图像更加清晰(在0~n之间)
def normalize(df):
return df/df.ix[0,:]
运行如下:
完整代码:
import pandas as pd
import os
import matplotlib.pyplot as plt
def symbol_to_path(symbol, base_dir="I:\Anacoda3\AcondaProject\data"):
#返回文件的路径
return os.path.join(base_dir,"{}.CSV".format(str(symbol)))
def get_data(symbols,dates):
df = pd.DataFrame(index = dates)
for symbol in symbols:
df_temp=pd.read_csv(symbol_to_path(symbol),index_col='Date',
usecols=['Date','Adj Close'],parse_dates=True)
df_temp=df_temp.rename(columns = {'Adj Close':symbol})
df = df.join(df_temp)
df = df.dropna()
#注意这个return的位置,别放在循环里了!!!
return df
def plot_data(df,title='Stock Prices'):
a=df.plot(title=title,fontsize=12)
a.set_xlabel("Date",fontsize=12)
a.set_ylabel("Price",fontsize=12)
plt.show()
#归一化,使图像更加清晰(在0~n之间)
def normalize(df):
return df/df.ix[0,:]
def test_run():
symbols = ['MAOTAI','PINGAN']
dates=pd.date_range('2018-07-01',periods=1000)
df = get_data(symbols,dates)
print(df)
plot_data(normalize(df))
test_run()