Search code examples
pythonpandasmatplotlibanalyticsfinance

DRY in python matplotlib plotting using one single command


import pandas as pd
import matplotlib.pyplot as plt

> importing csv files
january = pd.read_csv('divident_month/january.csv')
april = pd.read_csv('divident_month/april.csv')
july = pd.read_csv('divident_month/july.csv')
october = pd.read_csv('divident_month/october.csv')

> substracting column 'Open' to column close
jangain = january['Open']-january['Close']
aprgain = april['Open']-april['Close']
julgain = july['Open']-july['Close']
octgain = october['Open']-october['Close']

>plotting  
medium=[jangain, aprgain, julgain, octgain]
plt.plot(medium)
plt.show()

## jan = plt.plot(jangain, label='january')
## apr =plt.plot(aprgain, label='april')
## jul =plt.plot(julgain, label='july')
## oct =plt.plot(octgain, label='october')
## plt.legend()

how can i plot multiple items into a graph without repeating myself as i have in the ##. i have multiple files with repetitive code for diferent months(their grouped in different files for Before div months,div months, and after div months ).

i have tried grouping them into a list(medium) and passing the list into plt.plot(medium) but that doesn't seem to work.

i have also given the plots names(such as Jan, apr...)because im importing them into a different file for q1,q2,q3,q4 analysis(just in case that info confusing)

this is me trying to do finance with python btw


Solution

  • You can do this:

    import os
    import pandas as pd, collections as co, matplotlib.pyplot as plt
    
    the_dir = 'divident_month/'
    months = co.OrderedDict() # use if order of csv files is important 
    
    # iterate over files in directory
    for a_file in sorted(os.listdir(the_dir)):
        if os.path.splitext(a_file)[-1] == '.csv':
            # add DataFrame entries to dictionary 
            months[a_file.rstrip('.csv')] = pd.read_csv(os.path.join(the_dir,a_file))
    
    # perform gain calculation (k: dictionary `k`ey, v: dictionary `v`alue)
    for k,v in months.items():
        months[k] = v['Open'] - v['Close']
    
    # get an axes handle from matplotlib so you can re-use it
    fig,ax = plt.subplots()
    
    # plot without manual repetition of plot command
    for k,v in months.items():
        ax = v.plot(ax=ax,label=k) 
    
    # add title and show plot
    plt.gcf().suptitle('Gain')
    plt.show()