Гистограмма Python Matplotlib очень медленно - PullRequest
0 голосов
/ 09 сентября 2018

Я пытался построить гистограмму для данных из файла .csv. Но когда я запускаю его, это очень, очень медленно. Я ждал около 20 минут, но все еще не могу понять сюжет. Могу я спросить, в чем проблема?

Следующие строки - мой код.

import pandas as pd
import matplotlib.pyplot as plt

spy = pd.read_csv( 'SPY.csv' )
stock_price_spy = spy.values[ :, 5 ]

n, bins, patches = plt.hist( stock_price_spy, 50 )
plt.show()

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Я сделал следующее, кажется, что это может решить проблему.

Похоже, что stock_price_spy = spy ['Adj Close'] .values ​​"дает истинный нудистский ндаррэй.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

spy = pd.read_csv( 'SPY.csv' )
stock_price_spy = spy[ 'Adj Close' ].values

plt.hist( stock_price_spy, bins = 100, label = 'S&P 500 ETF', alpha = 0.8 )
plt.show()
0 голосов
/ 09 сентября 2018

На самом деле, вы используете довольно несовершенный способ достижения своей цели, вам нужно использовать numpy для повышения производительности.

import numpy as np
import matplotlib.pyplot as plt

stock_price_spy = np.loadtxt('SPY.csv', dtype=float, delimiter=',', skiprows=1, usecols=4)

#here you have nothing else than the 5th column of your csv, this cuts the bottleneck in memory.

n, bins, patches = plt.hist( stock_price_spy, 50 )
plt.show()

Я не проверял, но это должно работать.

И я рекомендую вам использовать оптимизированную версию python от intel. Лучше управлять таким процессом. Дистрибутив Intel Python

Добавление кода для тестирования. Поскольку некоторые ребята пытаются дезинформировать и пропускают истинные аргументы, panda использует Dataframes, которые являются словарями, а не массивами. И числовые массивы почти в два раза быстрее.

import numpy as np
import pandas as pd
import random
import csv
import matplotlib.pyplot as plt
import time

#Creating a random csv file 6 x 4871, simulating the problem.
rows = 4871
columns = 6
fields = ['one', 'two', 'three', 'four', 'five', 'six']

write_a_csv = csv.DictWriter(open("random.csv", "w"), 
fieldnames=fields)
for i in range(0, rows):
    write_a_csv.writerow(dict([
    ('one', random.random()),
    ('two', random.random()),
    ('three', random.random()),
    ('four', random.random()),
    ('five', random.random()),
    ('six', random.random())
    ]))

start_old = time.clock()
spy = pd.read_csv( 'random.csv' )
print(type(spy))
stock_price_spy = spy.values[ :, 5 ]
n, bins, patches = plt.hist( stock_price_spy, 50 )

plt.show()
end_old = time.clock()
total_time_old = end_old - start_old
print(total_time_old)

start_new = time.clock()

stock_price_spy_new = np.loadtxt('random.csv', dtype=float, 
delimiter=',', skiprows=1, usecols=4)
print(type(stock_price_spy_new))
#here you have nothing else than the 5th column of your csv, this cuts the bottleneck in memory.

n, bins, patches = plt.hist( stock_price_spy_new, 50 )
plt.show()
end_new = time.clock()

total_time_new = end_new - start_new
print(total_time_new)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...